- •Методические указания к выполнению лабораторных работ
- •Лабораторная работа «Установка и проверка работы Visual Prolog»
- •ПрОграммирование в лоГике
- •Описание окон Visual Prolog, перечень окон
- •Задание Создание проекта и настройка компилятора
- •Запуск и тестирование работы программы
- •Вопросы для самоконтроля
- •Лабораторная работа «Создание программы с использованием предложений, предикатов, доменов и целей. Создание составных целей»
- •Файлы используемые в проекте
- •Структура программы на Visual Prolog
- •Создание программы на языке Visual Prolog
- •1. В первую очередь необходимо определить факты.
- •2. Необходимо определить правила
- •3. После определения предложений необходимо сформулировать цель на языке Пролог
- •3. Далее в разделе предикатов необходимо описать пользовательские предикаты. Это можно сделать двумя способами
- •Задание Создание программы с использованием предложений, предикатов, доменов и целей
- •Организация запросов
- •Вопросы для самоконтроля
- •Лабораторная работа «Создание составных целей с конъюнкцией и дизъюнкцией»
- •Сложная цель с конъюнкцией и дизъюнкцией
- •Задание Внесение правил
- •Настроить проект как в лабораторной работе №1. * применить к каждой лабораторной работе
- •Организация запросов
- •Лабораторная работа «Использование отладчика приложения для составления целевого дерева»
- •Унификация и поиск с возвратом
- •Поиск с возвратом
- •Детальный поиск с возвратом
- •Задание
- •Создание программы
- •Использование отладчика приложения (Debugger)
- •Вопросы для самоконтроля
- •Лабораторная работа «Управление поиском решения»
- •Управление поиском решений
- •Прерывание поиска с возвратом (отсечение)
- •Использование предиката Fail
- •Предотвращение поиска с возвратом к предыдущей подцели в правиле
- •Использование предиката Not
- •Задание Создание программы поиска с предикатами !, not
- •Лабораторная работа «Организация пользовательского меню»
- •Детерминизм и отсечение
- •Использование правил для условного ветвления
- •Задание
- •Вопросы для самоконтроля
- •Лабораторная работа «Составные объекты»
- •Простые и составные объекты
- •Простые объекты данных
- •Составные объекты данных и функторы
- •Унификация составных объектов
- •Объявление составных доменов
- •Задание
- •Создание программы
- •Вопросы для самоконтроля
- •Лабораторная работа «Списки»
- •Задание
- •Вопросы для самоконтроля
- •Используемая литература
Задание
Задача: спланировать турнир между девятилетними членами команды. Каждая пара игроков должна провести между собой две игры. Необходимо спланировать все возможные пары членов клуба, возраст которых 9 лет.
Создание программы
Запустить среду визуальной разработки Visual Prolog.
Создать новое окно редактирования File/New.
domains
child = symbol
age = integer
predicates
player (child, age)
clauses
player (liz, 9).
player (nik, 9).
player (don, 10).
player (sani, 9).
goal
player (Person1, 9),
player (Person2, 9),
Person1<>Person2.
Запустить программу для выполнения запроса (меню Project/ Test Goal).
Получим ответ:
Person1=liz, Person2=nik
Person1=liz, Person2=sani
Person1=nik, Person2=liz
Person1=nik, Person2=sani
Person1=sani, Person2=liz
Person1=sani, Person2=nik
6 Solutions
Сохранить файл с именем lab4.
Использование отладчика приложения (Debugger)
Запустить отладчик приложения (меню Project/Debug).
В появившемся окне отладчика, выбрать команду меню View/Local Variables. Стрелка указывает строку выполнения программы.
Нажатием горячей клавиши F7 или пунктом меню отладчика Run/Trace Into просмотреть работу Visual Prolog при выполнении запроса.
На основе наблюдений составить дерево целей и алгоритм работы программы.
Вопросы для самоконтроля
Перечислите правила используемые для сопоставления.
Дайте трактовку понятию унификация.
Перечислите основные принципы работы механизма поиска с возвратом в Visual Prolog.
Описать правила создания целевого дерева.
Описать правила построения алгоритма работы программы.
Лабораторная работа «Управление поиском решения»
Тема: Управление поиском решения.
Цель работы: изучить методы управления поиском решения в Visual Prolog.
Управление поиском решений
Часто при решении реальной задачи мы придерживаемся определенного пути для ее логического завершения. Если полученный результат не дает искомого ответа, мы должны выбрать другой путь. Так, вам, возможно, приходилось играть в лабиринт. Один из верных способов найти конец лабиринта — это поворачивать налево на каждой развилке лабиринта до тех пор, пока вы не попадете в тупик. Тогда следует вернуться к последней развилке и попробовать свернуть вправо, после чего опять поворачивать налево на каждом встречающемся распутье. Путем методичного перебора всех возможных путей вы, в конце концов, найдете выход.
Прерывание поиска с возвратом (отсечение)
Visual Prolog начинает поиск с возвратом, когда вызов завершается неудачно. В определенных ситуациях бывает необходимо инициализировать выполнение поиска с возвратом, чтобы найти другие решения.
Для прерывания поиска с возвратом Visual Prolog предусматривает возможность отсечения, которая используется; отсечение обозначается восклицательным знаком (!). Через отсечение невозможно совершить откат (поиск с возвратом).
Отсечение помещается в программу таким же образом, как и подцель в теле правила. Когда процесс проходит через отсечение, немедленно удовлетворяется обращение к cut и выполняется обращение к очередной подцели (если таковая имеется). Однажды пройдя через отсечение, уже невозможно произвести откат к подцелям, расположенным в обрабатываемом предложении перед отсечением, и также невозможно возвратиться к другим предложениям, определяющим обрабатывающий предикат (предикат, содержащий отсечение).
Существуют два основных случая применения отсечения:
Если вы заранее знаете, что определенные посылки никогда не приведут к осмысленным решениям (поиск решений в этом случае будет лишней тратой времени), — примените отсечение, — программа станет быстрее и экономичнее. Такой прием называют зеленым отсечением.
Если отсечения требует сама логика программы для исключения из рассмотрения альтернативных подцелей. Это — красное отсечение.
Использование отсечения делает предикат детерминированным
Вызов, который может дать множество решений — недетерминированный, тогда как вызов, дающий одно и только одно решение — детерминированный.
Visual Prolog дает несколько средств для управления направлением логического поиска в программе:
предикат fail, использующийся для поддержания поиска с возвратом;
предикат !, использующийся для предотвращения поиска с возвратом.
предикат not дает успех, когда связанная с ним подцель не может быть доказана.
предикат cut отменяет поиск с возвратом.
