- •Лабораторная работа № 6 Программирование интеллектуальных систем на языке Пролог Управление ходом выполнения программ в системе Турбо-Пролог (1 часть)
- •Работа системы Турбо-Пролог при выполнении запросов
- •Унификация термов
- •I I
- •1 1 1
- •1 1 1
- •Поиск с возвратом при выполнении Пролог-программ
- •Использование отката после неудачи при использовании внутренней цели для организации простейшего интерфейса вывода
- •Include "lab3.Рго"
- •Порядок выполнения лабораторной работы
Лабораторная работа № 6 Программирование интеллектуальных систем на языке Пролог Управление ходом выполнения программ в системе Турбо-Пролог (1 часть)
Работа системы Турбо-Пролог при выполнении запросов
Запрос к системе - это всегда последовательность, состоящая из одной или нескольких целей. Для ответа на запрос система пытается достичь всех целей, т.е. показать, что утверждения, содержащиеся в запросе, истинны в предположении, что все отношения программы истинны. Другими словами, достичь цели - это показать, что она логически следует из фактов и правил программы, а если в запросе есть переменные, то еще и конкретизировать их, т.е. найти те конкретные объекты, которые, будучи подставленные вместо переменных, обеспечат достижение цели.
Для этого система опускается в структуру программы так глубоко, как это необходимо, чтобы найти факты, требующиеся для доказательства истинности запроса. Затем система вернется в исходное состояние, доказав или оказавшись не в состоянии доказать истинность запроса. В основе работы системы лежит рекурсивный циклический процесс унификации (т.е. сопоставления с образцом) и доказательства подцелей.
При задании запроса система просматривает всю программу в поисках первого предложения, заголовок которого будет унифицироваться с запросом. Для того, чтобы запрос и заголовок предложения унифицировались между собой, необходимо:
- совпадение у них имени предиката;
- совпадение количества аргументов предиката;
- возможность унификации всех аргументов предиката (правила унификации термов приведены ниже).
Если предложение, унифицирующееся с запросом, будет обнаружено, то оно начинает обрабатываться:
- если тело предложения является пустым (т.е. это факт), то запрос сразу оказывается успешным, переменные запроса конкретизируются объектами факта, и это решение помечается указателем возврата.
- если тело предложения содержит подцели, то, последовательно слепа направо, каждая из них обрабатывается точно так же, как исходный запрос.
Если система в тексте программы не находит предложения, унифицирующегося с запросом, то она:
- возвратится к последней успешно доказанной подцели;
- ликвидирует конкретизацию всех переменных, явившуюся результатом успешной обработки этой подцели, т.е. делает переменные свободными;
- приступает к поиску во множестве предложений текущей программы заголовка другого предложения, унифицирующегося с данной подцелью.
Такая процедура обработки запроса получила название поиск с возвратом. Применяя ее, при успешном выполнении запроса система выдает:
- либо значения всех переменных, входящих в состав запроса, которые были конкретизированы в результате обработки;
- либо слова да или нет, если переменные в запросе отсутствовали.
Если запрос был сформирован как внешняя цель решения задачи, то система после найденного первого ответа вернется в точку, помеченную указателем возврата и попытается найти иной ответ.
Унификация термов
Наиболее важной операцией над термами является унификация, при которой осуществляется: конкретизация переменных, доступ к структурам данных через общий механизм согласования и определенные виды тестов на равенство. Процесс унификации соответствует передаче параметров в других языках программирования. Унификация термов регулируется следующими правилами:
Свободная переменная унифицируется с константой или структурой. В результате этого переменная становится конкретизированной, т.е. принимает значение этой константы или структуры.
Goal: Х = john Х = john
Переменная унифицируется с переменной, при этом обе они становятся одной и той же переменной.
Goal: X=Y Х=_1 Y=_1
Анонимная переменная унифицируется с чем угодно.
? _ = john
Константа может быть унифицирована с другой константой, если они идентичны или со свободной переменной соответствующего типа.
Goal: "джон" = "джон" True
Структура унифицируется с другой структурой при условии, что их функторы одинаковы, а аргументы могут попарно унифицироваться.
? father(X) = father(john) X = john
Для того, чтобы познакомиться с процессом унификации различных классов объектов Пролога, рассмотрим выполнение программой 7 нескольких запросов.
/* Программа 7 */
domains
title , author = symbol pages = integer publication = book(title , pages)
predicates
written_by(author,publication) long_novel(publication)
clauses
written_by("И.Бpaтко", book("Программирование на языке Пролог",5б0)). written_by("Ц.Ин,Д.Соломон" ,book( "Использование Турбо-Пролога",608)). long_novel(book(Title,Lcngth)) :- written_by( _ , book(Title , Length)), Length > 600.
Рассмотрим запрос вида: written_by(X,Y) . При решении задачи система должна поочередно согласовать цель с предложениями программы, пытаясь достичь соответствия между параметрами Х и Y с одной стороны и параметрами предложений программы с другой, выполняя операцию унификации.
Так как в данном запросе переменные Х и Y являются свободными и могут согласовываться с любой константой, то самое первое предложение для предиката written_by дает желаемое соответствие:
written_by( Х , Y )