- •Методические указания к выполнению лабораторных работ
- •Лабораторная работа «Установка и проверка работы Visual Prolog»
- •ПрОграммирование в лоГике
- •Описание окон Visual Prolog, перечень окон
- •Задание Создание проекта и настройка компилятора
- •Запуск и тестирование работы программы
- •Вопросы для самоконтроля
- •Лабораторная работа «Создание программы с использованием предложений, предикатов, доменов и целей. Создание составных целей»
- •Файлы используемые в проекте
- •Структура программы на Visual Prolog
- •Создание программы на языке Visual Prolog
- •1. В первую очередь необходимо определить факты.
- •2. Необходимо определить правила
- •3. После определения предложений необходимо сформулировать цель на языке Пролог
- •3. Далее в разделе предикатов необходимо описать пользовательские предикаты. Это можно сделать двумя способами
- •Задание Создание программы с использованием предложений, предикатов, доменов и целей
- •Организация запросов
- •Вопросы для самоконтроля
- •Лабораторная работа «Создание составных целей с конъюнкцией и дизъюнкцией»
- •Сложная цель с конъюнкцией и дизъюнкцией
- •Задание Внесение правил
- •Настроить проект как в лабораторной работе №1. * применить к каждой лабораторной работе
- •Организация запросов
- •Лабораторная работа «Использование отладчика приложения для составления целевого дерева»
- •Унификация и поиск с возвратом
- •Поиск с возвратом
- •Детальный поиск с возвратом
- •Задание
- •Создание программы
- •Использование отладчика приложения (Debugger)
- •Вопросы для самоконтроля
- •Лабораторная работа «Управление поиском решения»
- •Управление поиском решений
- •Прерывание поиска с возвратом (отсечение)
- •Использование предиката Fail
- •Предотвращение поиска с возвратом к предыдущей подцели в правиле
- •Использование предиката Not
- •Задание Создание программы поиска с предикатами !, not
- •Лабораторная работа «Организация пользовательского меню»
- •Детерминизм и отсечение
- •Использование правил для условного ветвления
- •Задание
- •Вопросы для самоконтроля
- •Лабораторная работа «Составные объекты»
- •Простые и составные объекты
- •Простые объекты данных
- •Составные объекты данных и функторы
- •Унификация составных объектов
- •Объявление составных доменов
- •Задание
- •Создание программы
- •Вопросы для самоконтроля
- •Лабораторная работа «Списки»
- •Задание
- •Вопросы для самоконтроля
- •Используемая литература
Создание программы на языке Visual Prolog
Пролог "сопоставляет вопросы и ответы", "ищет сопоставление", "сопоставляет условия с фактами", "сопоставляет переменные с константами" и т. д. Ниже рассмотрим, что же понимается под термином сопоставление (matching).
В Прологе имеется несколько примеров сопоставления одной вещи с другой. Ясно, что идентичные структуры сопоставимы (сравнимы) друг с другом: parent (joe, tammy) сопоставимо С parent (joe, tammy).
Однако сопоставление (сравнение) обычно использует одну или несколько свободных переменных. Например, если х свободна, то parent (joe, X) сопоставимо с par ent (joe, tammy) и х принимает значение (связывается с) tammy.
Если же х уже связана, то она действует так же, как обычная константа. Таким образом, если X связана со значением tammy, то parent (joe, X) сопоставимо
Cparent (joe, tammy), но parent (joe, X) не сопоставимо с parent (joe, millie).
В предыдущем примере сопоставление не выполняется, т. к. если переменная становится связанной, то ее значение не может изменяться.
Как может переменная оказаться связанной при попытке Пролога сопоставить ее с чем-либо? Вспомним, что переменные не могут хранить значения, т. к. они становятся связанными только на промежуток времени, необходимый для отыскания (или попытки отыскания) одного решения цели. Поэтому имеется только одна возможность для переменной оказаться связанной — перед попыткой сопоставления, если цель требует больше одного шага, и переменная стала связанной на предыдущем шаге. Например:
parent(joe,X), parent(X,jenny)
является корректной целью. Она означает: "Найти кого-либо, являющегося ребенком Joe и родителем Jenny". Здесь при достижении подцели parent (x, jenny) переменная х уже будет связана. Если для подцели parent (x, jenny) нет решений, Про лог "развяжет" переменную х и вернется назад, пытаясь найти новое решение для parent (joe, X), а затем проверит, будет ли "работать" parent (X, jenny) с новым значением х.
Две свободные переменные могут сопоставляться друг с другом. Например,
parent (joe,X) сопоставляется с parent (joe, Y), связывая при этом переменные X
и Y между собой. С момента "связывания" X и Y трактуются как одна переменная, и любое изменение значения одной из них приводит к немедленному соответствующему изменению другой. В случае подобного "связывания" между собой нескольких свободных переменных все они называются совмещенными свободными переменными. Некоторые методы программирования специально используют "взаимосвязывание" свободных переменных, являющихся, на самом деле, различными.
В Прологе связывание переменных (со значениями) производится двумя способами: на входе и выходе. Направление, в котором передаются значения, указывается в шаблоне потока параметров (flow pattern). В дальнейшем (для краткости) будем опускать слово "шаблон" и говорить просто "поток параметров". Когда переменная передается в предложение, она считается входным аргументом и обозначается символом (i). Когда же переменная возвращается из предложения, она является выходным аргументом и обозначается символом (о).
Например дана задача определить что травится Ani. (программа 222.pro)
