Программирование на языке Пролог для искусственного интеллекта - страница 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, отношение