Часть I. Язык Prolog
grandparent; X, Z) :-parent ( X, Y), parent ( Y, Z) .
Схема отношения sister (рис. 1.4) имеет следующее определение:
Для любого X и Y
X является сестрой Y, если
1) X и Y имеют общего родителя и
2) X - женщина.
parent / \ parent
femalef X J —{ Y )
sister
Рис, 1.4. Определение отношения sister
Граф, представленный на рис. 1.4, можно перевести на язык Prolog следующим образом: sister( X, Y) :~parent ( Z, X), parent* Z, 1) , female<X>.
Обратите внимание на то, каким способом было выражено требование "X и Y имеют общего родителя". Для этого использовалась следующая логическая формулировка: некоторый Z должен быть родителем X, и тот ж& Z должен быть родителем Y. Альтернативный, но менее изящный способ мог предусматривать использование следующей цепочки утверждений: 21 является родителем X, Z2 является родителем Y к Z1 равно Z2.
Теперь системе можно задать вопрос: ?- sister< arm, pat).
Ответом должно быть "yes", как и следовало ожидать (см. рис. 1.1). Поэтому можно сделать вывод, что отношение sister в том виде, в каком оно определено, действует правильно. Но в рассматриваемой программе имеется незаметный на первый взгляд недостаток, который обнаруживается при получении ответа на вопрос о том, кто является сестрой Пэт: ?- sister {X, pat) .
Prolog находит два ответа, и один из них может оказаться неожиданным.
X ■- arm; X - pat
Итак, Пэт является сестрой самой себя?! По-видимому, такой исход не подразумевался при определении отношения sister. Но согласно правилу, касающемуся сестер, ответ системы Prolog является полностью обоснованным. В правиле о сестрах нет упоминания о том, что X и Y не должны быть одинаковыми, если X рассматривается как сестра Y. Поскольку это требование не предъявляется, система Prolog (вполне обоснованно) предполагает, что X и Y могут быть одинаковыми, и поэтому приходит к заключению, что любая женщина, имеющая родителя, является сестрой самой себя.
Чтобы исправить приведенное выше правило о сестрах, необходимо дополнительно указать, что X и Y должны быть разными. Как показано в следующих главах, такую задачу можно решить несколькими способами, но на данный момент предположим, что системе Prolog уже известно отношение differentи условие different (X, Y)
Глава 1.Введение в Prolog
удовлетворяется, если и только если X и Y не равны. Поэтому усовершенствованное правило для отношения sister может выглядеть следующим образом: sister) X, Y) :-
parent ( Z, x':
female! X), different (X Y) . На основании изложенного в этом разделе можно сделать следующие важные выводы.
• Программы Prolog можно дополнять, вводя новые предложения.
• Предложения Prolog относятся ктрем типам: факты, правила и вопросы.
• С помощью фактов можно вводить в программу сведения, которые всегда и безусловно являются истинными.
• С помощью правил можно вводить в программу сведения, которые являются истинными в зависимости от заданного условия,
• Задавая программе вопросы, пользователь может узнавать, какие сведения являются истинными.
• Предложения языка Prolog состоят из головы и тела. Тело представляетсобой список целей, разделенных запятыми. Запятые рассматриваютсякак знаки конъюнкции.
• Факты представляют собой предложения, которые имеют голову и пустое тело. Вопросы имеют только тело. Правила имеют голову и (непустое) тело.
• В процессе вычисления переменные можно заменять другими объектами. В таком случае переменная становится конкретизированной.
• Предполагается, что на переменные распространяется действие квантора всеобщности, который имеет словесное выражение "для всех". Но если переменные появляются тольков теле, их можно трактовать несколькими способами. Например, предложение
hasachildi X) :- parent ( X, Y) .
можно прочитать двумя приведенными ниже способами. а) Для всех х и Y,
если X является родителем Y, то X имеет ребенка. С) Для всех X,
X имеет ребенка, если
существует некоторый Y, такой, что X является родителем Y.
Упражнения
1.3. Преобразуйте приведенные ниже утверждения в правила Prolog.
а) Каждый, кто имеет ребенка, счастлив (введите отношение happy с одним
параметром).
б) Для всех X, если X имеет ребенка, имеющего сестру, то X имеет двоих детей
(введите новое отношение hastwochildren).
1.4. Определите отношение grandchild с использованием отношения parent. Подсказка: оно должно быть аналогично отношению grandparent (см. рис. 1.8).
1.5. Определите отношение aunt ( X, Y) в терминах отношений parent и sister. Для упрощения этой задачи вы можете вначале нарисовать схему для отношения, определяющего понятие aunt (тетя), в стиле рис. 1.3.
34 Часть I. Язык Prolog