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

стр.

, определяет отношение между двумя объектами; унарные же можно использовать для объявления наличия (отсутствия) простых свойств у объектов. Первое из приведенных выше предложений читается так: Пам — женщина. Можно было бы выразить информацию, представляемую этими двумя унарными отношениями (>мужчина и >женщина), по-другому - с помощью одного бинарного отношения >пол. Тогда новый фрагмент нашей программы выглядел бы так:

>пол( пам, женский).

>пол( том, мужской).

>пол( боб, мужской).

>...

В качестве дальнейшего расширения нашей программы-примера давайте введем отношение >отпрыск, которое обратно отношению >родитель. Можно было бы определить >отпрыск тем же способом, что и >родитель, т.е. представив список простых фактов наличия этого отношения для конкретных пар объектов, таких, что один является отпрыском другого. Например:

>отпрыск( лиз, том).

Однако это отношение можно определить значительно элегантнее, использовав тот факт, что оно обратно отношению >родитель, которое уже определено. Такой альтернативный способ основывается на следующем логическом утверждении:

Для всех X и Y

 Y является отпрыском X, если

 X является родителем Y.

Эта формулировка уже близка к формализму, принятому в Прологе. Вот соответствующее прологовское предложение, имеющее тот же смысл:

>отпрыск( Y, X) :- родитель( X, Y).

Это предложение можно прочитать еще и так:

Для всех X и Y,

  если X — родитель Y, то

  Y — отпрыск X.

Такие предложения Пролога, как

>отпрыск( Y, X) :- родитель( X, Y).

называются правилами. Есть существенное различие между фактами и правилами. Факт, подобный факту

>родитель( том, лиз).

это нечто такое, что всегда, безусловно истинно. Напротив, правила описывают утверждения, которые могут быть истинными, только если выполнено некоторое условие. Поэтому можно сказать, что правила имеют

• условную часть (правая половина правила) и

• часть вывода (левая половина правила).

Вывод называют также головой предложения, а условную часть — его телом. Например:

>отпрыск( Y, X) :- родитель( X, Y).

>голова            тело

Если условие >родитель( X, Y) выполняется (оно истинно), то логическим следствием из него является утверждение >отпрыск( Y, X).

На приведенном ниже примере проследим, как в действительности правила используются Прологом. Спросим нашу программу, является ли Лиз отпрыском Тома:

>?- отпрыск( лиз, том).

В программе нет фактов об отпрысках, поэтому единственный способ ответить на такой вопрос — это применить правило о них. Правило универсально в том смысле, что оно применимо к любым объектам X и Y, следовательно, его можно применить и к таким конкретным объектам, как >лиз и >том. Чтобы это сделать, нужно вместо >Y подставить в него >лиз, а вместо >X — >том. В этом случае мы будем говорить, что переменные X и Y конкретизируются:

>X = том и >Y = лиз

После конкретизации мы получаем частный случай нашего общего правила. Вот он:

>отпрыск( лиз, том) :- родитель( том, лиз).

Условная часть приняла вид:

>родитель( том, лиз)

Теперь пролог-система попытается выяснить, выполняется ли это условие (является ли оно истинным). Для этого исходная цель

>отпрыск( лиз, том)

заменяется подцелью

>родитель( том, лиз)

Эта (новая) цель достигается тривиально, поскольку такой факт можно найти в нашей программе. Это означает, что утверждение, содержащееся в выводе правила, также истинно, и система ответит на вопрос >yes (да).

Добавим теперь в нашу программу-пример еще несколько родственных отношений. Определение отношения >мать может быть основано на следующем логическом утверждении:

Для всех X и Y

  X является матерью Y, если

  X является родителем Y и

  X — женщина.

На Пролог это переводится в виде такого правила:

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

Запятая между двумя условиями указывает на конъюнкцию условий. Это означает, что они должны быть выполнены оба одновременно.

Рис. 1.3.  Графы отношений >родительродителя, >мать и >отпрыск, определенных через другие отношения.

Такие отношения как >родитель, >отпрыск и >мать можно изобразить в виде диаграмм, приведенных на рис. 1.3. Они нарисованы с учетом следующих соглашений. Вершины графа соответствуют объектам, т.е. аргументам отношений. Дуги между вершинами соответствуют бинарным (двуместным) отношениям. Дуги направлены от первого аргумента к второму. Унарные отношения на диаграмме изображаются просто пометкой соответствующих объектов именем отношения. Отношения, определяемые через другие отношения, представлены штриховыми дугами. Таким образом, любую диаграмму следует понимать так: если выполнены отношения, изображенные сплошными дугами, тогда и отношение, изображенное штриховой дугой, тоже выполнено. В соответствии с рис. 1.3, отношение