ЛАБОРАТОРНАЯ РАБОТА №4
Декларативное (логическое) программирование
«Ознакомление со средой программирования Visual Prolog. Логический вывод и логическое следствие. Унификация и сопоставление»
Теория:
Решение задачи средствами языка Visual Prolog осуществляется путем логического вывода необходимых сведений из уже известных.
Программа на VP представляет собой конечную последовательность определенных фактов, относящихся к определенной предметной области и правил вывода логических заключений из этих фактов.
Программа состоит из следующих блоков, начало которых обозначается различными ключевыми словами:
domains – раздел описания доменов (начинается со строчной буквы!), которые позволяют задавать разные имена различным видам данных, чтобы они не выглядели одинаково и программист помнил что и в каком порядке используется для обработки
predicates – раздел определения фактов и правил. Объявление предиката начинается с имени предиката (начинается с буквы, можно использовать знак «_», но нельзя знаки «–« , «*» , пробел), а затем в () перечисления доменов (стандартных, т.е. типов и описанных ранее в разделе доменов)
clauses – раздел записи фактов, отношений фактов и правил. Правило создается с помощью логических выражений. В VP дизъюнкция обозначается «;», конъюнкция «,», если «:-». Каждое правило и факт заканчивается точкой.
goal – раздел запросов, как и в правилах использует переменные, логические операции и имена фактов и правил.
Для более комфортного запуска программ на VP рекомендуется использовать утилиту среды визуальной разработки Test Goal (Ctrl+G), создав специальный TestGoal – проект. Выполните следующую последовательность операций:
Создайте новый проект Project – New Project.
В появившемся диалоговом окне Application Expert введите следующие данные
После нажатия кнопки Create следует установить требуемые опции компилятора для созданного TestGoal-проекта:
Options – Project – Compiler Option.
Откройте вкладку Warnings. Установите переключатель Nondeterm, чтобы компилятор все определенные пользователем предикаты как недетерминированные.
Снимите флажки Non Quoted Symbols, Strong Type Conversion Check, Check Type of Predicates. Это будет подавлять некоторые возможные предупреждения компилятора, которые не важны для выполнения несложных программ.
Теперь все программы следует открывать в запущенном командой Project – Open project проекте командой File – Open.
Задача:
Рассмотрим предметную область «Родственные связи»:
Двустороння стрелка указывает на то, что пары женаты.
Требуется узнать, у кого из мужчин есть дети и кто они. А так же вывести список замужних женщин.
Ход работы:
Запустите среду Visual Prolog.
Откройте новое окно редактирования программы (File - New), файлы программ имеют расширение *.pro
Наберите расположенный ниже текст программы, сохраните во избежание утери и нажмите Ctrl+G, а затем Continue Evaluation
Далее в окне сообщений (внизу экрана) вы увидите происходящий процесс, который закончится либо выдачей списка ошибок, либо полной компиляцией.
Если необходимо, исправьте ошибки, проверьте правильность результата и выполните самостоятельное задание, для которого возможно потребуется добавить связи, отмеченные на рисунке красным цветом..
domains
name=symbol
predicates
men(name)
women(name)
married(name,name)
son(name,name)
daughter(name,name)
father(name,name)
wife(name,name)
clauses
%определяем факты-свойства – кто является
%мужчиной
men(sergey).men(petr).men(lev).men(dima).
men(kolya).men(fedya).men(borya).
%определяем факты-свойства – кто является
%женщиной
women(tanya).women(anna).women(lena).women(masha).
women(eva).women(nadya).women(rita).
%определяем факты-отношения женатых пар
married(sergey,tanya).married(petr,anna).
married(lev,lena).married(dima,masha).married(kolya,eva).
%определяем факты-отношения сыновей
son(lev,tanya).son(fedya,masha).son(kolya,lena).
son(borya,masha).
%определяем факты-отношения дочерей
daughter(anna, tanya).daughter(masha, anna).
daughter(nadya, lena).daughter(rita, masha).
%выводим правило, по которому возможно определить %отношение отец-дочь или отец-сын
father(X,Y):-men(X),married(X,Z),son(Y,Z);men(X),married(X,Z),
daughter(Y,Z).
%выводим правило определения жен
wife(X,Y):-married(Y,X).
goal
write("\t\t\tFathers and сhildes"),nl,father(X,Y);
write("\t\t\tWifes"),nl,wife(X,_).
Do'stlaringiz bilan baham: |