Программирование на языке Пролог для искусственного интеллекта | страница 13
>родительродителя( X, Z) :- родитель( X, Y),
> родитель( Y, Z).
Здесь уместно сделать несколько замечаний о внешнем виде нашей программы. Пролог дает почти полную свободу расположения текста на листе. Так что можно вставлять пробелы и переходить к новой строке в любом месте текста по вкусу. Вообще мы хотим сделать так, чтобы наша программа имела красивый и аккуратный вид, а самое главное, легко читалась. Для этого мы часто будем помещать голову предложения и каждую цель на отдельной строке. При этом цели мы будем писать с отступом, чтобы сделать разницу между головой и целями более заметной. Например, правило >родительродителя
в соответствии с этими соглашениями запишется так:
>родительродителя( X, Z) :-
> родитель( X, Y),
> родитель( Y, Z).
На рис. 1.4 показано отношение >сестра
:
Для любых X и Y
X является сестрой Y, если
(1) у X и Y есть общий родитель, и
(2) X — женщина.
Рис. 1.4. Определение отношения >сестра
.
Граф на рис. 1.4 можно перевести на Пролог так:
>сестра( X, Y) :-
> родитель( Z, X),
> родитель( Z, Y),
> женщина( X).
Обратите внимание на способ, с помощью которого выражается требование "у X и Y есть общий родитель". Была использована следующая логическая формулировка: "некоторый Z должен быть родителем X и этот же самый Z должен быть родителем Y". По-другому, менее красиво, можно было бы сказать так: "Z1 - родитель X, Z2 - родитель Y и Z1 равен Z2".
Теперь можно спросить:
>?- сестра( энн, пат).
Как и ожидается, ответ будет ">yes
" (да) (см. рис. 1.1). Мы могли бы заключить отсюда, что определенное нами отношение >сестра
работает правильно. Тем не менее в нашей программе есть маленькое упущение, которое обнаружится, если задать вопрос: "Кто является сестрой Пат?"
>?- сестра( X, пат).
Система найдет два ответа, один из которых может показаться неожиданным:
>X = энн;
>X = пат
Получается, что Пат — сестра себе самой?! Наверное, когда мы определяли отношение >сестра
, мы не имели этого ввиду. Однако ответ Пролога совершенно логичен, поскольку он руководствовался нашим правилом, а это правило ничего не говорит о том, что, если X — сестра Y, то X и Y не должны совпадать. Пролог (с полным правом) считает, что X и Y могут быть одним и тем же объектом и в качестве следствия из этого делает вывод, что любая женщина, имеющая родителя, является сестрой самой себе.
Чтобы исправить наше правило о сестрах, его нужно дополнить утверждением, что X и Y должны различаться. В следующих главах мы увидим, как это можно сделать, в данный же момент мы предположим, что отношение