Лекция 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
отец(павел,
юлия).
мать(юлия, михаил).
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.