Определение отношений на основе фактов
Prolog — это язык программирования для символических, нечисловых вычислений. Он особенно хорошо приспособлен для решения проблем, которые касаются объектов и отношений между объектами. На рис. 1.1 приведен подобный пример: семейные отношения. Тот факт, что Том является одним из родителей Боба, можно записать на языке Prolog следующим образом: parent { torn, bob).
В данном случае в качестве имени отношения выбрано слово parent; torn и bob являются параметрами этого отношения. По причинам, которые станут понятными позже, такие имена, как tor., записываются со строчной буквой в начале. Все дерево семейных отношений, показанное на рис. 1.1, определено с помощью следующей программы Prolog:
parent ( pamr bob) . parent f tom, bob). parent! torn, liz|I. parent! bob, ann). parent; bob, pat). parent! pat, jim).
Эта программа состоит из шести предложений, каждое из которых объявляет один факт об отношении parent. Например, факт parent ( tom, bob) представляет собой конкретный экземпляр отношения parent. Такой экземпляр называют также связью. В целом отношение определяется как множество всех своих экземпляров.
Рис. 1.1. Дерево семейных отношений
После передачи соответствующей программы в систему Prolog последней можно задать некоторые вопросы об отношении parent, например, является ли Боб одним из родителей Пэт? Этот вопрос можно передать системе Prolog, введя его на терминале: ?- parent! bob, pat).
Обнаружив, что это — факт, о существовании которого утверждается в программе, Prolog отвечает: yes
После этого можно задать еще один вопрос: 7- parent( liz, pat) .
Система Prolog ответит: no
поскольку в программе нет упоминания о том, что Лиз является одним из родителей Пэт. Система ответит также "по" на вопрос ?- parent ( torn, ben). поскольку в программе даже не встречалось имя Бэн.
Кроме того, системе можно задать более интересные вопросы. Например, кто является родителями Лиз? 1- parent! X, liz) .
На этот раз Prolog ответит не просто "yes" или "по", а сообщит такое значение X, при котором приведенное выше утверждение является истинным. Поэтому ответ будет таковым: X= t от
Вопрос о том, кто является детьми Боба, можно сообщить системе Prolog следующим образом: ?- parent! bob, X).
На этот раа имеется больше одного возможного ответа. Система Prolog вначале выдаст в ответ одно решение:
Глава 1.Введение в Prolog
X — aim
Теперь можно потребовать у системы сообщить еще одно решение {введя точку с запятой), и Prolog найдет следующий ответ:
X - pat
Если после этого будут затребованы дополнительные решения, Prolog ответит "по", поскольку все решения уже исчерпаны.
Этой программе может быть задан еще более общий вопрос о том, кто является чьим родителем? Этот вопрос можно также сформулировать иным образом: Найти X и if, такие, что X является одним иэ родителей X,
Этот вопрос может быть оформлен на языке Prolog следующим образом: ?- parent ( х, Y) .
После этого Prolog начнет отыскивать все пары родителей и детей одну за другой. Решения отображаются на дисплее по одному до тех пор, пока Prolog получает указание найти следующее решение (в виде точки запятой) или пока не будут найдены асе решения. Ответы выводятся следующим образом:
X • раш
Y - bob; X « torn Y- bob; X = torn
Y = lia;
Чтобы прекратить вывод решений, достаточно нажать клавишу <Enter> вместо точки с запятой.
Этой программе, рассматриваемой в качестве примера, можно задать еще более сложный вопрос, например, спросить о том, кто является родителями родителей Джима (дедушками и бабушками). Поскольку в программе непосредственно не предусмотрено использование соответствующего отношения grandparent, этот запрос необходимо разбить на следующие два этапа (рис. 1.2).
1. Кто является одним из родителей Джима? Предположим, что это - некоторый объект Y.
2. Кто является одним из родителей .' Предположим, что это - некоторый объект X
Parent
/\7\ grandparent
parent /
/
Pitc. 1.2. Отношение grandparent, выраженное как композиция двух отношений parent
Подобный сложный запрос записывается на языке Prolog как последовательность двух простых: ?- parent ( Y, jim), parent ( X, Y) .
Ответ должен быть следующим: х - bob Y = pat
Часть I.Язык Prolog
Этот составной запрос можно прочитать таким образом: найти такие X и Y, которые удовлетворяют следующим двум требованиям: parent ( Y, jim} и parent ( X, У)
Если же будет изменен порядок следования этих двух требований, то логический смысл всего выражения останется тем же: parent! Xr У) и parent( Y, jim)
Безусловно, такое же действие может быть выполнено и в программе Prolog, поэтому запрос:
?- parent! X, Y) , parent С У, jim).
выдаст тот же результат.
Аналогичным образом, программе можно задать вопрос о том, кто является внуками Тома:
?- parent! torn, X), parent; X, Y).
Система Prolog ответит следующим образом:
х = bob Y - ann; X =bob Г = pat
Могут быть также заданы и другие вопросы, например, имеют ли Энн и Пэт общих родителей. Эту задачу также можно разбить на два этапа.
1. Кто является одним из родителей Энн (X)?
2. Является ли (тот же) X одним из родителей Пэт?
Поэтому соответствующий вопрос в языке Prolog выглядит следующим образом: ?- parent!" X, ann), parent! х, pat).
Ответом на него является; X = bob
Рассматриваемый пример программы позволяет проиллюстрировать перечисленные ниже важные понятия.
• В языке Prolog можно легко определить отношение, такое как parent, задавая л-злементные кортежи объектов, которые удовлетворяют этому отношению.
• Пользователь может легко запрашивать систему Prolog об отношениях, определенных в программе.
• Программа Prolog состоит из предложений. Каждое предложение оканчивается
точкой.
• Параметрами отношений могут быть (кроме всего прочего) определенные объекты, или константы (такие как torn и ann), а также объекты более общего характера (такие как X и Y). Объекты первого типа, применяемые в рассматриваемой программе, называются атомами. Объекты второго типа называются переменными,
• Вопросы к системе состоят из одной или нескольких целей. Последовательность целей, такая как
parent! X ann} , parent! X, pat)
означает конъюнкцию целей:
X является одним из родителей Энн и
X является одним из родителей Пэт.
Слово "цель" (goal) используется для обозначения таких вопросов потому, что система Prolog воспринимает вопросы как цели, которых необходимо достичь.
• Ответ на вопрос может быть положительным или отрицательным, в зависимо
сти от того, может ли быть достигнута соответствующая цель или нет. В слу-
Глава 1. Введение в Prolog
чае положительного ответа считается, что соответствующая цель была достижимой и что цель достигнута. В противном случае цель была недостижимой и не достигнута.
• Если вопросу соответствует несколько ответов, Prolog отыскивает столько ответов, сколько потребует пользователь (в пределах возможного).