- •Методические указания к выполнению лабораторных работ
- •Лабораторная работа «Установка и проверка работы Visual Prolog»
- •ПрОграммирование в лоГике
- •Описание окон Visual Prolog, перечень окон
- •Задание Создание проекта и настройка компилятора
- •Запуск и тестирование работы программы
- •Вопросы для самоконтроля
- •Лабораторная работа «Создание программы с использованием предложений, предикатов, доменов и целей. Создание составных целей»
- •Файлы используемые в проекте
- •Структура программы на Visual Prolog
- •Создание программы на языке Visual Prolog
- •1. В первую очередь необходимо определить факты.
- •2. Необходимо определить правила
- •3. После определения предложений необходимо сформулировать цель на языке Пролог
- •3. Далее в разделе предикатов необходимо описать пользовательские предикаты. Это можно сделать двумя способами
- •Задание Создание программы с использованием предложений, предикатов, доменов и целей
- •Организация запросов
- •Вопросы для самоконтроля
- •Лабораторная работа «Создание составных целей с конъюнкцией и дизъюнкцией»
- •Сложная цель с конъюнкцией и дизъюнкцией
- •Задание Внесение правил
- •Настроить проект как в лабораторной работе №1. * применить к каждой лабораторной работе
- •Организация запросов
- •Лабораторная работа «Использование отладчика приложения для составления целевого дерева»
- •Унификация и поиск с возвратом
- •Поиск с возвратом
- •Детальный поиск с возвратом
- •Задание
- •Создание программы
- •Использование отладчика приложения (Debugger)
- •Вопросы для самоконтроля
- •Лабораторная работа «Управление поиском решения»
- •Управление поиском решений
- •Прерывание поиска с возвратом (отсечение)
- •Использование предиката Fail
- •Предотвращение поиска с возвратом к предыдущей подцели в правиле
- •Использование предиката Not
- •Задание Создание программы поиска с предикатами !, not
- •Лабораторная работа «Организация пользовательского меню»
- •Детерминизм и отсечение
- •Использование правил для условного ветвления
- •Задание
- •Вопросы для самоконтроля
- •Лабораторная работа «Составные объекты»
- •Простые и составные объекты
- •Простые объекты данных
- •Составные объекты данных и функторы
- •Унификация составных объектов
- •Объявление составных доменов
- •Задание
- •Создание программы
- •Вопросы для самоконтроля
- •Лабораторная работа «Списки»
- •Задание
- •Вопросы для самоконтроля
- •Используемая литература
Детальный поиск с возвратом
Пример.
domains % раздел доменов
title, autor = symbol % домены название и автор – символьные
pages = unsigned % домен страницы – беззнаковое, количественное 0-4294967259
рredicates % раздел предикатов
book (title, pages) % задание предиката книги с указанием названия и количества страниц
written_by (autor, title) % задание писатели с указанием имени автора и названия написанной книги
long_novel (title)
clauses % раздел предложений для задания пользовательских предикатов, правил, фактов
written_by (pushkin, pugahtev). % писатель Пушкин написал книгу Пугачев
written_by (lermontov, mziri). % писатель Лермонтов написал книгу Мцири
book (pugahtev, 100). % книга Пугачев содержит 320 страниц
book (mziri, 370). % книга Мцири содержит 370 страниц
long_novel (Title):-
written_by (_, Title),
book (Title, Pages),
Pages>350. % внутреннее целевое утверждение
goal % раздел целей (запросов)
Рассмотрим следующий запрос с унификацией: показать все названия книг long_novel.
long_novel (T).
Получим ответ
T=mziri
1 Solution
Для разбора этого простого примера в первую очередь построим целевое дерево процесса поиска. Целевое дерево процесса поиска строится по следующим правилам:
Подцели должны быть согласованны по порядку сверху вниз.
Предикатные предложения проверяются в том порядке в каком они появляются в программе, сверху вниз.
Когда подцель соответствует заголовку правила, далее должно быть согласованно тело этого правила: тело правила теперь образует новое множество подцелей для согласования.
Ц
елевое
утверждение считается согласованным,
когда соответствующий факт найден для
каждой оконечности листа целевого
дерева.
Рис. 5. Пример насогласованного целевого дерева
Данное целевое утверждение не согласованно, выполняется поиск с возвратом начиная с точки отката.
Рис. 6. Пример согласованного целевого дерева
Целевое утверждение можно считать согласованным, т.к. найдены соответствующие факты для каждой оконечности листа целевого дерева.
Построим алгоритм работы данной программы (рисунок 7).
Поскольку _ свободная переменная, то она может быть унифицирована с любым другим аргументом. Title в заголовке long_novel так же не связан. Целевое утверждение соответствует заголовку правила, и унификация выполняется.
Visual Prolog пытается согласовать подцели с правилом. В первую очередь Visual Prolog обращается к первой подцели в теле правила written_by (_, Title) . Поскольку авторство книги является несущественным (на месте аргумента title анонимная переменная). Отношение written_by (_, Title) становится текущей подцелью, и Visual Prolog ищет решение для этого обращения. _унифицирована с любым аргументом
Title связана с pugahtev
Visual Prolog ищет соответствие с данной подцелью начиная с вершины программы и до ее конца. Переменная связывается с двумя значениями и обращение к book (Title, Pages) происходит уже с этими значениями переменной.
T=pugahtev
T=mziri
Visual Prolog ищет соответствие с обращением book и Pages>350. После выполнения сравнения значение переменной T=mziri.
Рассмотрим следующий пример: Показать информацию о книгах, количество страниц которых более 350.
book (M, P),
P>350.
Получим ответ
M=mziri, P=370
1 Solution
Рассмотрим пример: Показать читателей, читающих толстые книги (количество страниц которых более 350).
written_by (Autor, Title),
book (Title, Pages),
Pages>350.
Получим ответ
Autor=lermontov, Title=mziri, Pages=370
1 Solution
Рис. 7. Алгоритм работы программы (обратный вывод поиск в глубину)
