может_украсть(P,T:- вор(P), нравится(P,T), ценный(T).
Предикат может_украсть,который имеет две переменные Pи T, представляет отношение: некоторый человек P может украсть вещь T. Это правило зависит от утверждений, определяющих предикаты вор, нравитсяи ценный.Они могут быть представлены либо как факты, либо как правила в зависимости от того, что является более подходящим. Например, рассмотрим следующую базу данных, составленную в том числе из утверждений, обсуждавшихся ранее. Мы добавим к ним номера утверждений, заключенные между специальными скобками /*… */. Именно таким образом в Пролог-системе записывается комментарий. Комментарии игнорируются Пролог-системой, но мы можем добавить их в программу для удобства. В последующем обсуждении мы будем ссылаться на номера предложений, представленные в виде комментариев.
/*1*/ вор(джон).
/*2*/ нравится(мэри, пища).
/*3*/ нравится(мэри,вино).
/*4*/ нравится(джон,X):- нравится(X,вино).
/*5*/ может_украсть(X,Y):- вор(X), нравится(X,Y).
Отметим, что определение предиката нравитсясодержит три отдельных утверждения: два факта и правило. Для Пролога это не имеет значения. Единственное различие состоит в том, что когда осуществляется поиск в базе данных, чтобы согласовать с ней некоторую цель, то правило вызывает дальнейший поиск, чтобы согласовать его собственные предикаты-подцели. Факт не имеет подцелей, так что при сопоставлении сфактом поиск либо сразу завершается, либо сразу происходит переход к следующему утверждению. Например, давайте проследим за тем, что получится, если обратиться к Прологу с вопросом: Что Джон может украсть? Прежде всего этот вопрос транслируется на Прологе:
?- может_украсть(джон,Х).
Чтобы ответить на этот вопрос, Пролог осуществляет поиск следующим образом:
1. Прежде всего Пролог ищет в базе данных утверждение, описывающее предикат может_украсть,и находит такое утверждение. Оно представлено в виде правила и имеет номер 5. Пролог отмечает это место в базе данных. Так как это утверждение является правилом, то, чтобы установить, согласуется ли заголовок правила с базой данных, необходимо попытаться согласовать с ней тело правила. Тогда переменной Xв правиле 5 присваивается значение джон,которое берется из вопроса. Как и в предыдущих примерах, мы должны сопоставить неконкретизированные переменные ( Xв вопросе и Yв правиле), так что теперь они будут сцеплены. Если вы не уверены, что до конца понимаете, что это значит, то необходимо вернуться назад к примерам с предикатом я вляется_сестрой(X, Y). Для того чтобы правило выполнилось, необходимо согласовать цели с базой данных. Таким образом, теперь проверяется на согласованность с базой данных первое утверждение вор(джон).
2. Эта цель достигается, так как факт вор(джон)содержится в базе данных (утверждение 1). Пролог отмечает это место в базе данных, и при этом присвоения значений переменным не происходит. Далее Пролог пытается достигнуть вторую цель, применяя утверждение 5. Так как X, как и ранее, обозначает джон,то теперь Пролог ищет нравится (джон, Y).Заметим, что к этому моменту Yостается неконкретизированной.
3. Цель нравится(джон, Y)сопоставляется с заголовком правила (утверждение 4). Переменная Y, входящая в цель, сцепляется с Xв заголовке правила, и обе эти переменные остаются неконкретизированными. Чтобы доказать это правило, теперь ищется нравится(Х, вино).
4. Эта цель достигается, так как она сопоставляется с нравится (мэри,вино)- фактом, являющимся утверждением с номером 3. Так что теперь Xстановится мэри.
5. Так как цель в утверждении 4 достигнута, то согласовано и правило в целом. Факт нравится(джон, мэри)следует из утверждения 4, так как переменная Yв утверждении 5 сцеплена с X, и ей тоже присваивается значение мэри.
6. Утверждение 5 теперь согласуется с базой данных при Y, имеющем значение мэри.Так как переменная Yбыла сцеплена со вторым аргументом исходного вопроса, то переменная Xв вопросе конкретизируется, принимая значение мэри.Приведем рассуждение, обосновывающее факт Джон может украсть Мэри:
Для того чтобы украсть что-либо, прежде всего Джон должен быть вором. Из утверждения 1 следует, что это имеет место. Далее, Джону должен нравиться похищаемый предмет. Из утверждения 4 мы видим, что Джону нравится любой, кому нравится вино. Из утверждения 3 мы видим, что Мэри нравится вино. Следовательно, Джону нравится Мэри. Поэтому оба условия для похищения некоторого объекта имеют место, а значит, Джон может украсть Мэри.
Читать дальше