Вопрос к системе - это всегда
последовательность, состоящая из одной или
нескольких целей. Для того, чтобы ответить на
вопрос, система пытается достичь всех целей. Что
значит достичь цели? Достичь цели - это значит
показать, что утверждения, содержащиеся в
вопросе, истинны в предположении, что все
отношения программы истинны. Другими словами,
достичь цели - это значит показать, что она
Таким образом, подходящей интерпретацией
пролог-программы в математических терминах
будет следующая: пролог-система рассматривает
факты и правила в качестве множества аксиом, а
вопрос пользователя - как
Проиллюстрируем этот подход на классическом примере. Пусть имеются следующие аксиомы:
Все люди смертны.
Сократ - человек.
Теорема, логически вытекающая из этих двух аксиом:
Сократ смертен.
Первую из вышеуказанных аксиом можно переписать так:
Для всех X, если X - человек, то X смертен.
Соответственно наш пример можно перевести на Пролог следующим образом:
смертен( X) :- человек( X). % Все люди смертны
человек( сократ). % Сократ - человек
?- смертен( сократ). % Сократ смертен?
yes (да)
Более сложный пример из программы о родственных отношениях, приведенной на рис. 1.8:
?- предок( том, пат)
Мы знаем, что родитель( боб, пат) - это
факт. Используя этот факт и правило
родитель( боб, пат) ==> предок( боб, пат)
Эту запись можно прочитать так: из родитель(
боб, пат) следует предок( боб, пат)
на основании правила
родитель(боб, пат) ==> предок( боб, пат)
родитель(том, боб)
предок( том, пат)
Таким образом, мы показали,
Пролог-система строит цепочку доказательства в порядке, обратном по отношению к тому, которым мы только что воспользовались. Вместо того, чтобы начинать с простых фактов, приведенных в программе, система начинает с целей и, применяя правила, подменяет текущие цели новыми, до тех пор, пока эти новые цели не окажутся простыми фактами. Если задан вопрос
?- предок( том, пат).
система попытается достичь этой цели. Для того,
чтобы это сделать, она пробует найти такое
предложение в программе, из которого немедленно
следует упомянутая цель. Очевидно, единственными
подходящими для этого предложениями являются
Рис. 1. 9. Первый шаг вычислений. Верхняя цель истинна, если истинна нижняя.
Это правила, входящие в отношение предок. Будем говорить, что головы этих правил сопоставимы с целью.
Два предложения
предок( X, Z) :- родитель( X, Z).
Поскольку цель - предок( том, пат), значения переменным должны быть приписаны следующим образом:
X = том, Z = пат
Тогда исходная цель предок( том, пат) заменяется новой целью:
родитель( том, пат)
Такое действие по замене одной цели на другую
на основании некоторого правила показано на рис.
1.9. В программе нет правила, голова которого была
бы сопоставима с целью родитель(том, пат),
поэтому такая цель оказывается неуспешной.
Теперь система делает
предок( X, Z) :-