- •Часть 1
- •1. Введение
- •2. Теоретические основы логического программирования.
- •2.1 Основные определения логики предикатов первого порядка
- •2.2 Стандартные формы представления формул исчисления предикатов.
- •3. Синтаксис языка программирования Пролог.
- •3.1. Основные элементы языка Пролог.
- •3.2.2. Вопросы.
- •3.2. Представление клауз Хорна на языке Пролог. Факты. Правила. Вопросы.
- •3.2.1. Представление фактов в Пролог—программах.
- •3.2.3. Правила.
- •3.2.4. Подстановки и примеры утверждений.
- •3.2.5. Пример Прологпрограммы.
- •4. Семантика языка программирования Пролог.
- •4.1 Декларативная и процедурная семантика программ на языке Пролог.
- •4.2. Вычислительная модель логической программы.
- •4.2.1. Унификация термов.
- •4.2.2. Общая схема согласования целевых утверждений.
- •4.2.3 Механизм поиска с возвратом.
- •5. Рекурсивное программирование на языке Пролог.
- •5.1 Рекурсивные правила.
- •5.2 Схема поиска решений в рекурсивных программах.
- •5.3. Списки и их представление на Прологе.
- •Основные определения.
- •Унификация списков.
- •Предикат list.
- •Типовые процедуры обработки списков на языке Пролог.
- •Предикат length.
- •5.4.2. Предикат member.
- •Предикат first.
- •Предикат last.
- •Предикат next.
- •Предикат append.
- •Предикат add.
- •Предикаты revers1 и revers2.
- •Предикат delete.
- •5.4.10. Предикат number_list.
- •5.4.11. Предикат sumlist.
- •5.4.12. Предикат delrepeat.
- •5.5 Множества и их представление на языке Пролог. Простые программы обработки множеств.
- •Основные определения.
- •Предикат unionset.
- •Пересечение множеств.
- •Разность множеств.
- •Определение подмножества.
- •5.5.6. Декартово произведение множеств.
- •Прологпрограммы сортировки списков.
- •Метод прямого выбора.
- •Метод вставки.
- •5.6.3. Метод перестановок.
- •6. Стандартные предикаты языка Пролог.
- •Арифметические предикаты.
- •6.2. Предикаты сравнения арифметических выражений и символьных термов.
- •6.3. Предикаты определения типов термов.
- •6.4. Примеры программ с использованием арифметических предикатов.
- •6.5. Предикаты вводавывода термов и символов.
- •6.5.1. Ввод/вывод термов.
- •6.5.2. Ввод/вывод символов.
- •6.6. Стандартные предикаты управления логическим выводом.
- •6.7. Стандартные предикаты обработки списков.
- •6.8. Стандартные предикаты обработки строк.
- •7. Система программирования Arity Prolog 5.0.
- •Описание среды программирования Arity Prolog 5.0.
- •Методические указания по лабораторным работам.
- •7.2.1. Лабораторная работа № 1. Простейшая программа на языке Пролог.
- •7.2.2. Лабораторная работа № 2. Использование арифметических операций и унификации арифметических выражений.
- •7.2.3. Лабораторная работа 3.1. Создание базы данных “Cессия” и запросов к этой базе данных на языке Пролог с использованием стандартного предиката fail.
- •Приложение 2. Варианты заданий по лабораторной работе 4.
- •Приложение 3. Варианты заданий по лабораторной работе 5.
- •Список литературы.
3.2.3. Правила.
Кроме фактов, логические программы могут содержать правила, условные предложения языка Пролог. Правила это средство определения новых утверждений, используя уже существующие в Прологпрограмме утверждения (факты и правила).
С точки зрения синтаксиса языка Пролог правило это утверждение вида A: B1,B2,…Bn. (n0) где A заголовок правила, а конъюнкция предикатов B1,B2,…Bn называется телом правила.
В правилах, так же как и в фактах, переменные неявно связаны квантором всеобщности. Например, утверждение «Точка с координатами (X,Y) принадлежит окружности с радиусом, равным 2, и с центром в точке начала координат, если X2+Y2=4.» на Прологе будет записано следующим образом:
circle(X,Y): X^2+X^2=4. что означает для любых X и Y, таких что X^2+X^2=4, точка (X,Y) принадлежит окружности с радиусом, равным 2, и с центром в точке начала координат.
В Прологпрограмме может быть записано произвольное число фактов и правил. Набор правил, заголовки которых имеют одно и то же имя и арность, описывает одно и то же отношение и называется процедурой.
3.2.4. Подстановки и примеры утверждений.
Логические переменные служат для обозначения неопределенных объектов. Областью действия переменной является одно утверждение (факт или правило).
Подстановкой называется конечное (возможно, пустое) множество пар вида Xi = ti, где Xiпеременная, а tiтерм, не содержащий переменную Xi. Результат применения подстановки к утверждению A обозначается A и получается путем замены каждого вхождения в A каждой переменной Xi на соответствующий терм ti.
Утверждение B является примером утверждения A, если найдется такая подстановка , что B=A. Например, факт summa(1,2,3), которое означает, что 1+2=3, является примером утверждения summa(X,Y,3) при применении подстановки ={X=1,Y=2}.
Утверждение С называется общим примером утверждений A B, если найдутся такие подстановки 1 и 2, что C=A1 и C=B2, т.е. C является примером A и B одновременно. Например, факт summa(1,2,3) является общим примером утверждений summa(X,2,Z) и summa(1,Y,Z) при применении подстановок 1={X=1,Z=3} и 2={Y=2,Z=3}.
3.2.5. Пример Прологпрограммы.
П
Эд
рограмма
«Родственники» является примером
простой Прологпрограммы.
На рис 2. показано трехуровневое
генеалогическое дерево.
Родственные отношения можно записать с помощью фактов, соответствующие отношению parent:
parent(‘Памелла’,’Джон’).
parent(‘Памелла’,’Элизабет’).
parent(‘Том’,’Джон’).
parent(‘Том’,’Элизабет’).
parent(‘Джон’,’Анна’).
parent(‘Джон’,’Пат’).
parent(‘Элизабет’,’Эд’).
parent(‘Пат’,’Джим’).
Расширим эту программу фактами, определяемыми схемой отношения person.
person(‘Памелла’,’ж’,72).
person(‘Том’,’м’,78).
person(‘Джон’,’м’,42).
person(‘Элизабет’,’ж’,35).
person(‘Эд’,’м’,14).
person(‘Анна’,’ж’,20).
person(‘Пат’,’ж’,25).
person(‘Джим’,’м’,3).
Теперь мы можем задавать Прологпрограмме вопросы, используя оба отношения.
Вопрос 1.
Вопрос ”Является ли Пат родителем Джима?” на Прологе можно задать следующим образом:
?-parent(‘Пат’,’Джим’).
Пролог-система будет искать в программе факт, совпадающий с вопросом, и, обнаружив такой факт, система выдаст ответ ‘YES’. В случае, когда соответствующий факт не обнаружен, система выдаст ответ ‘NO’.
Вопрос 2.
Вопрос ”Кто отец Элизабет и сколько ему лет?” на Прологе можно задать следующим образом:
?-parent(Х,’ Элизабет’),person(X,’м’, Y).
Пролог-система выдаст ответ:
X=’Том’->
Y=78->
YES
Если возраст не интересует пользователя, то в вопросе используется анонимные переменные, обозначаемые знаками подчеркивания ‘_’.
Вопрос 3.
Вопрос ”Кто отец Элизабет?” на Прологе можно задать следующим образом:
?-parent(Х,’ Элизабет’),person(X,’м’, _).
Пролог-система выдаст ответ:
X=’Том’->
YES
Приведенные примеры вопросов относятся к программе, состоящей из одних фактов. Для того чтобы сократить и упростить вопросы в Пролог—программах задаются правила.
Вопрос 3 можно упростить, если задать следующее правило:
“X является отцом Y, если X является родителем Y, и X – мужчина.”
На языке Пролог это правило записывается так:
father(X,Y):-parent(X,Y),person(X,’м’,_).
А вопрос 3 записывается следующим образом:
?-father(X,’Jim’).
