====== Лабораторная работа №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 разных запросов. * Общий вывод по проделанной работе. * Коды программ.