Часть 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

Наши рекомендации