Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Определение предикатов на основе фактов

 

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

parent(tom, bob).

В данном случае в качестве имени предиката выбрано слово parent; tom и bob являются параметрами этого предиката. По причинам, которые станут понятными позже, такие имена, как tom, записываются со строчной буквой в начале. Все дерево семейных отношений определено с помощью следующей программы Prolog:

parent(pam, bob).

parent(tom, bob).

parent(tom, liz).

parent(bob, ann).

parent(bob, pat).

parent(pat, jim).

Эта программа состоит из шести предложений, каждое из которых объявляет один факт о предикате parent. Например, факт

parent (tom, bob)

представляет собой конкретный экземпляр предиката parent. В целом предикат определяется как множество всех своих экземпляров.

После компиляции программы в системе Prolog ей можно задать некоторые вопросы об отношении parent, например, является ли Боб одним из родителей Пэт? Этот вопрос можно передать системе Prolog, введя его на терминале:

?- parent(bob, pat).

Обнаружив, что это — факт, о существовании которого утверждается в программе, Prolog отвечает:

yes

После этого можно задать еще один вопрос:

7- parent(liz, pat).

Система Prolog ответит:

no

поскольку в программе нет упоминания о том, что Лиз является одним из родителей Пэт.

Система ответит также "по" на вопрос

?- patent(torn, ben).

поскольку в программе даже не встречалось имя Бэн.

Кроме того, системе можно задать более интересные вопросы. Например, кто является родителями Лиз?

?- parent(X, liz).

На этот раз Prolog ответит не просто "yes" или "по", а сообщит такое значение X, при котором приведенное выше утверждение является истинным. Поэтому ответ будет:

X = tom

Вопрос о том, кто является детьми Боба, можно сообщить системе Prolog следующим образом:

?- parent(bob, X).

На этот раз имеется больше одного возможного ответа. Система Prolog вначале выдаст в ответ одно решение:

 

Рис. Дерево семейных отношений

 

X = ann

Теперь можно потребовать у системы сообщить еще одно решение {введя точку с запятой), и Prolog найдет следующий ответ:

X = pat

Если после этого будут затребованы дополнительные решения, Prolog ответит "по", поскольку все решения уже исчерпаны.

Этой программе может быть задан еще более общий вопрос о том, кто является чьим родителем? Этот вопрос можно также сформулировать иным образом:

Найти X и Y, такие, что X является одним кэ родителей Y.

Этот вопрос может быть оформлен на языке Prolog следующим образом:

?- parent (X, Y).

После этого Prolog начнет отыскивать все пары родителей и детей одну за другой.

Решения отображаются на дисплее по одному до тех пор, пока Prolog получает указание найти следующее решение (в виде точки запятой) или пока не будут найдены асе решения. Ответы выводятся следующим образом:

X= рат

Y= bob;

X= torn

Y = bob;

X = tom

Y = liz;

Чтобы прекратить вывод решений, достаточно нажать клавишу Enter вместо точки с запятой.

Этой программе, рассматриваемой в качестве примера, можно задать еще более сложный вопрос, например, спросить о том, кто является родителями родителей Джима (дедушками и бабушками). Поскольку в программе непосредственно не предусмотрено использование соответствующего отношения grandparent, этот запрос необходимо разбить на следующие два этапа.

1. Кто является одним из родителей Джима? Предположим, что это — некоторый объект Y.

2. Кто является одним из родителей Y7 Предположим, что это — некоторый объект X.

Подобный сложный запрос записывается на языке Prolog как последовательность двух простых:

?- parent(Y, jim), parent(X, Y).

Ответ должен быть следующим:

X = bob

Y = pat

Аналогичным образом, программе можно задать вопрос о том, кто является внуками Тома:

? - parent(tom, X), parent(X, Y).

Система Prolog ответит следующим образом:

X = bob

Y = ann;

X = bob

У = pat

Могут быть также заданы и другие вопросы, например, имеют ли Энн и Пэт общих родителей. Эту задачу также можно разбить на два этапа.

1. Кто является одним из родителей Энн (X)?

2. Является ли (тот же) X одним из родителей Пэт?

Поэтому соответствующий вопрос в языке Prolog выглядит следующим образом:

? - parent(X, ann), parent (X, pat).

Ответом на него является;

X = bob

Рассматриваемый пример программы позволяет проиллюстрировать перечисленные ниже важные понятия.

• В языке Prolog можно легко определить предикат, такой как parent, задавая n - элементныегруппы параметров, которые удовлетворяют этому предикату.

• Пользователь может легко запрашивать систему Prolog о предикатах, определенных в программе.

• Программа Prolog состоит из предложений. Каждое предложение оканчивается точкой.

• Параметрами предикатов могут быть (кроме всего прочего) определенные объекты или константы (такие как torn и апп), а также объекты более общего характера (такие как X и Y). Объекты первого типа, применяемые в рассматриваемой программе, называются атомами. Объекты второго типа называются переменными,

• Вопросы к системе состоят из одной или нескольких целей. Последовательность целей, такая как parent(X, ann), patent(X, pat) означает конъюнкцию целей:

X является одним из родителей Энн и

X является одним из родителей Пэт.

Слово "цель" (goal) используется для обозначения таких вопросов потому, что система Prolog воспринимает вопросы как цели, которых необходимо достичь.

• Ответ на вопрос может быть положительным или отрицательным, в зависимости от того, может ли быть достигнута соответствующая цель или нет. В случае положительного ответа считается, что соответствующая цель была достижимой и что цель достигнута. В противном случае цель была недостижимой и не достигнута.

• Если вопросу соответствует несколько ответов, Prolog отыскивает столько ответов, сколько потребует пользователь (в пределах возможного).

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...