Программирование на языке Пролог для искусственного интеллекта - страница 8

стр.

можно сразу записать на Прологе:

>родительродителя( 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 должны различаться. В следующих главах мы увидим, как это можно сделать, в данный же момент мы предположим, что отношение >различны уже известно пролог-системе и что цель

>различны( X, Y)

достигается тогда и только тогда, когда X и Y не равны. Усовершенствованное правило для отношения >сестра примет тогда следующий вид:

>сестра( X, Y) :-

> родитель( Z, X),

> родители( Z, Y),

> женщина( X),

> различны( X, Y).

Некоторые важные моменты этого раздела:

• Пролог-программы можно расширять, добавляя в них новые предложения.

• Прологовские предложения бывают трех типов: факты, правила и вопросы.

• Факты содержат утверждения, которые являются всегда, безусловно верными.

• Правила содержат утверждения, истинность которых зависит от некоторых условий.

• С помощью вопросов пользователь может спрашивать систему о том, какие утверждения являются истинными.

• Предложения Пролога состоят из головы и тела. Тело — это список целей, разделенных запятыми. Запятая понимается как конъюнкция.

• Факты — это предложения, имеющие пустое тело. Вопросы имеют только тело. Правила имеют голову и (непустое) тело.

• По ходу вычислений вместо переменной может быть подставлен другой объект. Мы говорим в этом случае, что переменная конкретизирована.

Предполагается, что на переменные действует квантор всеобщности, читаемый как "для всех…". Однако для переменных, появляющихся только в теле, возможны и другие формулировки. Например,

>имеетребенка( X) :- родитель( X, Y).

можно прочитать двумя способами:

(а) Для всех X и Y,

     если X — отец Y, то

     X имеет ребенка.

(б) Для всех X,

     X имеет ребенка, если

     существует некоторый