- •Практическое занятие 1. Основы логического программирования
- •Основные парадигмы программирования
- •Понятие предиката
- •Унификация - процесс нахождения решения в Прологе
- •Факты и правила в Прологе
- •Пример программы на Прологе
- •Практикум 1-1
- •Практикум 1-2
- •Практикум 1-3
- •Контрольное задание 1 Исходные данные
- •Задание 1. Генеалогическое дерево
- •Задание 2. Представление правил
- •Практикум 2-1
- •Практикум 2-2
- •Стандартные предикаты
- •Ввод и вывод
- •Практикум 2-3
- •Описание арифметических операций
- •Практикум 2-4
- •Самостоятельные задания
- •Практическое занятие 3. Управление процессом решения задачи. Поиск с возвратом. Рекурсия
- •Использование предиката fail
- •Практикум 3-1
- •Использование предиката cut
- •Практикум 3-2
- •Использование рекурсии
- •Практикум 3-3
- •Практикум 3-4
- •Практикум 3-5
- •Практикум 3-6
- •Хвостовая рекурсия
- •[Head|Tail] [Голова|Хвост]
- •Практикум 4-1
- •Встроенный предикат findall
- •Практикум 4-2
- •Вычисление длины списка
- •Практикум 4-3
- •Проверка принадлежности элемента списку
- •Практикум 4-4
- •Слияние двух списков
- •Практикум 4-5
- •Вычисление суммы списка чисел
- •Практикум 4-6
- •Практикум 4-7
- •Удаление элемента из списка
- •Практикум 4-8
- •Получение элемента списка по его номеру
- •Практикум 4-9
- •Запись элементов списка в обратном порядке
- •Поиск максимального (минимального) элемента в списке
- •Практикум 4-10
- •Самостоятельные задания
- •Контрольное задание 2 Исходные данные
- •Практическое занятие 5. Решение логических задач
- •Пример простой логической задачи (два измерения)
- •Практикум 5-1
- •Практикум 5-2
- •Пример задачи (три измерения)
- •Практикум 5-3
- •Пример задачи (альтернативные высказывания)
- •Практикум 5-4
- •Практикум 5-5
- •Самостоятельные задания
- •Контрольное задание 3 Исходные данные
- •Задача 1
- •Задача 2
- •Задача 3
- •Задача 4
- •Задача 5
- •Задача 6
- •Задача 7
- •Задача 8
- •Задача 9
- •Задача 10
- •Задача 11
- •Задача 12
- •Задача 13
- •Задача 14
- •Задача 15
- •Задача 16
- •Задача 17
- •Задача 18
- •Задача 19
- •Задача 20
- •Задачи повышенной сложности
Понятие предиката
Теоретической основой Пролога является раздел символьной логики, называемый исчислением предикатов. Предикат - это логическая функция, которая выражает некоторое отношение между своими аргументами и принимает значение "истина", если это отношение имеется или "ложь", если оно отсутствует.
Рассмотрим понятие предиката в Прологе на примере родословной Рюриковичей.
Вначале запишем отношения типа родитель – ребенок. В синтаксисе Пролога выражение «Игорь является родителем Святослава» выглядит следующим образом:
parent (игорь, святослав).
Здесь родитель parent – это имя предиката, а «игорь» и «святослав» – аргументы. Аргументы игорь и святослав являются константами, поэтому записаны строчными буквами. С прописной буквы в Прологе начинаются переменные. Точка означает конец предиката, так же, как и конец предложения на естественном языке.
Рис. 1.1. Родословная Рюриковичей
Запишем также родительские отношения для других членов генеалогического дерева:
parent(рюрик, игорь). parent(ефанда, игорь).
parent(ольга, святослав). parent (игорь, святослав).
parent(святослав, святополк).parent(куно, святополк). и т.д.
Полученный набор предикатов образует базу знаний.
В Прологе запрос на извлечение знаний описывается такими же предикатами, какими эти знания представляются. Если мы подставим Прологу такой предикат цели:
? parent(ефанда, игорь).
Эта цель может быть прочитана следующим образом: Является ли Ефанда родителем Игоря? Сопоставив эту цель с содержимым базы знаний, Пролог установит, что данное утверждение истинно и сообщит об этом.
Запрос «Кто является родителями Игоря?» в Прологе выглядит следующим образом:
? parent(X, игорь).
Здесь X является переменной, которой должны быть присвоены искомые значения. Переменная в Прологе является аналогом местоимения или вопросительного слова. Из приведенной выше базы знаний Пролог извлечет два ответа:
X = рюрик
X = ефанда
Мы можем сформулировать вопрос следующим образом: Есть ли у Игоря родители?
parent(_, игорь).
Пролог выдаст ответ: Yes.
Переменная, начинающаяся со знака подчеркивания называется анонимной переменной и может принимать любые значения (аналог местоимения некто).
Для более сложных запросов в Прологе используются цели, состоящие из нескольких предикатов. Давайте найдем, чьим внуком является Ярослав Мудрый.
Запрос будет выглядеть следующим образом:
? parent(X, ярослав), parent(Y, X).
Данная запись означает: Найти Y, являющийся родителем X, который, в свою очередь, является родителем Ярослава. Запятая в прологе идентична союзу "И" или конъюнкции. В ответ на такой запрос Пролог выдаст следующий ответ:
X = святослав
Y = малуша
Можно выдать следующий запрос:
? parent(ольга, _ ).
Теперь анонимная переменная использована в качестве второго аргумента.
Этот запрос можно прочитать следующим образом: Есть ли у Ольги дети?
Пролог выдаст ответ: Yes.
Поскольку предикат – это бинарная функция, которая может возвращать истину либо ложь, результат работы программы на Прологе – это определение, истинна или ложна цель. Присвоение значение переменным, вывод промежуточных значений - это всего лишь побочные результаты.
Таким образом, программа на Прологе состоит из предикатов.
Программа на Прологе и база знаний - синонимы. Цель формулируется также в виде предикатов. Выполнение программы на Прологе – это резолюция цели.