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

       

Определение отношения сестра



Рисунок 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 имеет ребенка, если
                существует некоторый Y, такой, что
                X - родитель Y.



Содержание раздела