====== Лабораторная работа №2: Разработка и отладка простой программы на языке Visual Prolog ======
===== Цель работы =====
Получение необходимых навыков для разработки и отладки простейшей программы на языке Visual Prolog.
===== Основные теоретические положения =====
Пролог (англ. Prolog) -- язык и система логического программирования, основанные на языке предикатов математической логики дизъюнктов Хорна, представляющей собой подмножество логики предикатов первого порядка.
Prolog является декларативным языком программирования: логика программы выражается в терминах отношений, представленных в виде фактов и правил. Для того чтобы инициировать вычисления, выполняется специальный запрос к базе знаний, на которые система логического программирования генерирует ответы <<истина>> и <<ложь>>. Для обобщённых запросов с переменными в качестве аргументов созданная система Пролог выводит конкретные данные в подтверждение истинности обобщённых сведений и правил вывода.
Иначе говоря, предикат можно определить как функцию, отображающую множество произвольной природы в множество булевых значений {ложно, истинно}. Задача пролог-программы заключается в том, чтобы доказать, является ли заданное целевое утверждение следствием из имеющихся фактов и правил.
Язык программирования, реализованный в Visual (а ранее в Turbo) Prolog'е отличается от классического пролога тем, что он основан на строгой статической типизации. В него также добавлены средства объектно-ориентированного программирования, анонимные предикаты (лямбда-предикаты), факты-переменные и разрушающее присваивание для них, аргументы-домены (''Generic Interfaces and Classes'') и параметрический полиморфизм, мониторы (''Monitors with guards''), императивные конструкции (''foreach'', ''if...then...else''), коллекторы списков (''[...||...]'') и пр.
===== Постановка задачи =====
Разработать программу на языке Visual Prolog, описывающие родственные связи между собаками, а также реализовать генеалогическое древо Вашей семьи.
===== Порядок выполнения работы =====
- Загрузите систему программирования Visual Prolog.
- Установите в опциях среды шрифт с русской раскладкой **Options/Global/Environment**:
- На карточке **Fonts** поменяйте шрифт окна редактора **Editor Windows** на **Courier** с раскладкой Кириллица.
- Либо воспользуйтесь кнопкой **F** (//Font//) на панели инструментов.
- Выполните команду **Project/New Project**. Определите в качестве //Project Name// имя //DOG// и укажите главный каталог (//Base Directory//) в личной папке на диске. Нажмите кнопку **Create**. \\ В созданном проекте удалите модуль //Vpitools.pro//. Откройте модуль //DOG.PRO//, удалите все содержимое и наберите текст программы: domains
name=string
predicates
dog(name)
parent(name, name)
clauses
dog(X) :- parent(X, Y), dog(Y).
dog("Rex").
parent("Jack", "Rex").
goal
dog(Who).
- Установите опции компилятора **Options/Project/Compiler Options**:
- на карточке **Output** установите **Generate Debug Information** и **Disable Optimizations**,
- на карточке **Warnings** установите **Nondeterm**, снимите **Unused Variables** и **Unused Predicates**.
- Запустите программу на выполнение, нажав кнопку **Test Goal** на панели инструментов. Объясните полученный результат.
- Выполните компиляцию (**Compile Module**), построение (**Build**) и запустите отладчик **Debug**.
- В среде отладчика включите окна просмотра переменных (**Local Variables**) и стека вызовов (**Call Stack**). Произведите пошаговую прокрутку программы, нажимая на кнопку **Trace Into** на панели инструментов.
- Запишите и проанализируйте трассу выполнения программы по содержимому окон **Call Stack** и **Variables For Current Clause** для одного решения.
- Напишите на языке Visual Prolog программу //DOG1//, описывающую родственные связи собак в соответствии с вариантом задания. Программа должна использовать предикаты ''dog'' и ''parent'' из программы //DOG.PRO// и содержать не менее двух правил.
- Произведите отладку программы в системе Visual Prolog на следующих запросах:
- Кто является собакой?
- Кто является родителем?
- Кто является внуком (внучкой)?
- Balto -- собака?
- Кто родитель собаки Balto?
- Кому Balto является родителем?
- Постройте трассу выполнения программы для каждого запроса.
- **//Задание для самостоятельной работы.//** Используя предикаты ''parent(symbol, symbol)'', ''man(symbol)'', ''woman(symbol)'', ''married(symbol, symbol)'', записать факты, описывающие Вашу семью. \\ Написать на языке Visual Prolog программу //FAMILY//, содержащую не менее 8 правил вывода для любых родственных отношений в Вашей семье (например: мать, отец, сестра, брат, племянница, племянник, тетя, дядя, внучка, внук, бабушка, дедушка, двоюродная сестра, двоюродный брат и т.д.). \\ Отладить программу на 5-6 различных запросах.
===== Варианты заданий =====
[[.lab2:lab2_vars]]
===== Содержание отчёта =====
* Цель работы.
* Краткое изложение основных теоретических понятий.
* Постановка задачи с кратким описанием порядка выполнения работы.
* Объяснение результатов выполнения программы //DOG.PRO//.
* Трасса выполнения программы //DOG.PRO// и пояснения к ней.
* Трассы выполнения запросов программы //DOG1.PRO// и объяснение результатов их выполнения.
* Описание родственных связей в семье (в виде дерева).
* Результаты работы программы //FAMILY.PRO// для 5-6 разных запросов.
* Общий вывод по проделанной работе.
* Коды программ.