Механизм вывода в системе Пролог

Страницы работы

Содержание работы

Лекция 5 - Механизм вывода в системе Пролог

Описание данных и знаний в Прологе

Факты. Прежде чем ввести некоторый факт, выражае­мый на естественном языке в БД, нужно его представить, ис­пользуя термины языка Пролог. Например, факт "Виктор яв­ляется отцом Оли" может быть проанализирован следующим образом: "быть отцом кого-нибудь" - отношение; " Виктор, Оля " - объекты.

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

отец(виктор,оля).

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

Заметим, что необходимо учитывать порядок перечис­ления объектов в скобках. Он может быть произвольным, но, выбрав определенный порядок, следует сохранять его и далее.

Рассмотрим примеры фактов, приведенных вместе с возможной их интерпретацией на русском языке:

мужчина (виктор).
нравится (виктор, анна).
изучает(виктор, пролог).
руководит(виктор, работа, сту­дент).

- Виктор - мужчина;
- Виктору нравится Анна;
- Виктор изучает Пролог;
- Виктор руководит работой студента

Имена объектов в круглых скобках называются аргу­ментами, а имя отношения перед круглыми скобками - преди­катом. Таким образом, "изучает" - это предикат, а "виктор" и "пролог" - аргументы. Предложение с одним предикатом и относящимися к нему аргументами называют термом. Имена объектов и отношений выбираются произвольно и вместо тер­ма "изучает (виктор, пролог)" можно написать: а(b,с), где а -изучает, b - виктор, с - пролог.

Отношения могут иметь произвольное число аргумен­тов, например:

играть(виктор,таня,оля,даша), что означает "Виктор играет с Таней, Олей, Дашей".

Совокупность фактов составляет часть БЗ. Рассмотрим БЗ семейных отношений:

мужчина(виктор).
женщина(анна).
муж(виктор,анна).
отец(виктор,таня).
отец(виктор,оля).
отец(виктор,даша).

Имея БЗ, т.е. совокупность фактов, можно обращаться к Прологу с вопросами, которые записываются так же, как и факты, например:

отец(виктор,таня).

Смысл этого вопроса заключается в следующем:

"Является ли Виктор отцом Тани?" На заданный вопрос полу­чаем ответ:

True (истина).

Рассмотрим более сложный вопрос: "Отцом каких детей является Виктор?" Для получения ответа можно было бы за­дать три вопроса (см. последние три факта в БЗ), которые со­ответствуют трем фактам. Более рациональным был бы во­прос: "Является ли Виктор отцом Х ?", где Х - переменная.

Переменные в Прологе начинаются с прописной буквы. Они могут иметь конкретные значения (конкретизированы) или не иметь их. Названный выше вопрос на Прологе имеет вид:

отец(виктор,Х).

Для поиска ответа Пролог просматривает имена всех объектов, отец которых – Виктор. Обнаружив такой факт, сис­тема выдает его на терминал (в нашем случае "таня", "оля","даша")

Вопрос отец(Х,оля) означает "Кто является отцом Оли, т.е. Х=виктор.

Рассмотрим соединение (конъюнкцию) нескольких подвопросов в одном вопросе, используя следующую БЗ:

нравится(виктор, анна).
нравится(виктор, пролог).
нравится(анна, виктор).
нравится(анна, пролог).

Мы хотим узнать, нравятся ли Виктор и Анна друг дру­гу. Для этого требуется сформулировать вопрос, включающий конъюнкцию двух указанных целей, которые необходимо со­гласовать с БЗ.

Обе цели отделяются в вопросе знаком ",".

нравится(виктор, анна), нравится(анна, виктор).

Знак "," применяется в качестве логической операции И для соединения произвольного количества целей.

Сочетая возможности конъюнкции и использования пе­ременных, можно строить достаточно сложные вопросы. На­пример, вопрос " Что нравится обоим - Виктору и Анне?" име­ет вид:

нравится(виктор,Х), нравится(анна,Х).

Пролог находит факт, соответствующий первой цели, и пытается подобрать факт, удовлетворяющий второй цели та­ким образом, чтобы переменная Х имела одинаковые значе­ния.

Рассмотрим теперь полную программу на языке Пролог, включающую помимо фактов описание аргументов и предика­тов (для того, чтобы сделать изложение более понятным, все имена приведены в русской транскрипции).

domains

имя=symbol

predicates

отец(имя,имя)
муж(имя,имя)

clauses

отец(виктор, таня).
отец(виктор, оля).
отец(виктор, даша).
отец(владимир, виктор).
отец(владимир, сергей).
муж(виктор, анна).
муж(владимир, люда).

В первой части программы "domains" дается определе­ние аргументов. Во второй части программы "predicates" ука­зывают формат используемых предикатов. В части программы "clauses" записываются факты и правила. На запрос

Goal: отец(Х,Y). система Пролог отвечает:

Х=виктор, Y=таня
Х=виктор, Y=оля
Х=виктор, Y=даша
Х=владимир, Y=виктор
Х=владимир, Y=сергей

Две выходные переменные Х и Y называют соответст­венно каждого отца и каждого ребенка. В следующем примере используется только одна переменная:

Goal: отец(виктор, Y).

Y=таня
Y=оля
Y=даша

В запросе

Goal: отец (виктор, владимир).

False

применяются только константы. В этом случае запрос требует проверки существования факта в БД. При наличии факта система выдает ответ "True" (истина), при отсутствии - "False" (ложь). На запрос Goal: отец(николай, Х) система отвечает: No solution (нет решения).

Правила. В Прологе правило формируется в том слу­чае, когда некоторый факт зависит от группы других фактов, т.е. когда в естественном языке требуется использовать слово "если", например: "Рейс отменяется, если погода не летная"; "рейс отменяется, если испорчен самолет"; "X является сест­рой Y, если Х является женщиной и Х и Y имеют одних и тех же родителей".

Правило состоит из заголовка и тела. Заголовок и тело соединяются с помощью символа ":-" или if (если). Так, пред­ложение "Виктору нравится любой студент, которому нравит­ся учеба" записывается в виде следующего правила:

нравится(виктор,Х) :- студент(Х), нравится(Х,учеба).

Рассмотрим правила, содержащие более одной пере­менной, для чего используем следующую БД:

мужчина(виктор).
женщина(анна).
женщина(таня).
женщина(оля).
женщина(даша).
родители(виктор, анна, таня).
родители(виктор, анна, оля).
родители(виктор, анна, даша).

Предикат «родители(Х,Y,Z)», имеющий три аргумента, означает «Родителями Z являются Х и Y", где Х - отец; Y –мать».

Утверждение "X является сестрой Y" истинно, если Х -женщина и X, Y имеют одних и тех же родителей. Это можно записать в виде правила:

сестра(X,Y):-
женщина(Х), родители(О,М,Х), родители(О,М,Y).

где переменные О и М - отец и мать соответственно. Эти пе­ременные вначале не конкретизированы и им присваивается значение в момент установления соответствия для предиката родители(O,M,Х).

Правила, состоящие из фактов. Правила в БД могут состоять из фактов. Рассмотрим следующую БД:

domains

имя = symbol

predicates

отец(имя,имя)
мать(имя,имя)

clauses

отец(павел, юлия).
мать(юлия, михаил).

Похожие материалы

Информация о работе