Программирование на языке Пролог | страница 22
/*1*/ вор(джон).
/*2*/ нравится(мэри, пища).
/*3*/ нравится(мэри,вино).
/*4*/ нравится(джон,X):- нравится(X,вино).
/*5*/ может_украсть(X,Y):- вор(X), нравится(X,Y).
Отметим, что определение предиката нравится содержит три отдельных утверждения: два факта и правило. Для Пролога это не имеет значения. Единственное различие состоит в том, что когда осуществляется поиск в базе данных, чтобы согласовать с ней некоторую цель, то правило вызывает дальнейший поиск, чтобы согласовать его собственные предикаты-подцели. Факт не имеет подцелей, так что при сопоставлении с фактом поиск либо сразу завершается, либо сразу происходит переход к следующему утверждению. Например, давайте проследим за тем, что получится, если обратиться к Прологу с вопросом: Что Джон может украсть? Прежде всего этот вопрос транслируется на Прологе:
?- может_украсть(джон,Х).
Чтобы ответить на этот вопрос, Пролог осуществляет поиск следующим образом:
1. Прежде всего Пролог ищет в базе данных утверждение, описывающее предикат может_украсть, и находит такое утверждение. Оно представлено в виде правила и имеет номер 5. Пролог отмечает это место в базе данных. Так как это утверждение является правилом, то, чтобы установить, согласуется ли заголовок правила с базой данных, необходимо попытаться согласовать с ней тело правила. Тогда переменной X в правиле 5 присваивается значение джон, которое берется из вопроса. Как и в предыдущих примерах, мы должны сопоставить неконкретизированные переменные (X в вопросе и Y в правиле), так что теперь они будут сцеплены. Если вы не уверены, что до конца понимаете, что это значит, то необходимо вернуться назад к примерам с предикатом является_сестрой(X, Y). Для того чтобы правило выполнилось, необходимо согласовать цели с базой данных. Таким образом, теперь проверяется на согласованность с базой данных первое утверждение