This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
courses:knowledge_base_and_expert_system:lab2 [2019/08/27 21:24] andrey.suchkov [Цель работы] |
courses:knowledge_base_and_expert_system:lab2 [2019/09/09 06:49] andrey.suchkov [Основные теоретические положения] |
||
---|---|---|---|
Line 2: | Line 2: | ||
===== Цель работы ===== | ===== Цель работы ===== | ||
Получение необходимых навыков для разработки и отладки простейшей программы на языке Visual Prolog. | Получение необходимых навыков для разработки и отладки простейшей программы на языке Visual Prolog. | ||
- | ====== Основные теоретические положения ====== | + | ===== Основные теоретические положения ===== |
Пролог (англ. Prolog) -- язык и система логического программирования, основанные на языке предикатов математической логики дизъюнктов Хорна, представляющей собой подмножество логики предикатов первого порядка. | Пролог (англ. Prolog) -- язык и система логического программирования, основанные на языке предикатов математической логики дизъюнктов Хорна, представляющей собой подмножество логики предикатов первого порядка. | ||
Prolog является декларативным языком программирования: логика программы выражается в терминах отношений, представленных в виде фактов и правил. Для того чтобы инициировать вычисления, выполняется специальный запрос к базе знаний, на которые система логического программирования генерирует ответы «истина» и «ложь». Для обобщённых запросов с переменными в качестве аргументов созданная система Пролог выводит конкретные данные в подтверждение истинности обобщённых сведений и правил вывода. | Prolog является декларативным языком программирования: логика программы выражается в терминах отношений, представленных в виде фактов и правил. Для того чтобы инициировать вычисления, выполняется специальный запрос к базе знаний, на которые система логического программирования генерирует ответы «истина» и «ложь». Для обобщённых запросов с переменными в качестве аргументов созданная система Пролог выводит конкретные данные в подтверждение истинности обобщённых сведений и правил вывода. | ||
- | Иначе говоря, предикат можно определить как функцию, отображающую множество произвольной природы в множество булевых значений {ложно, истинно}. Задача пролог–программы заключается в том, чтобы доказать, является ли заданное целевое утверждение следствием из имеющихся фактов и правил. | + | Иначе говоря, предикат можно определить как функцию, отображающую множество произвольной природы в множество булевых значений {ложно, истинно}. Задача пролог-программы заключается в том, чтобы доказать, является ли заданное целевое утверждение следствием из имеющихся фактов и правил. |
Язык программирования, реализованный в Visual (а ранее в Turbo) Prolog'е отличается от классического пролога тем, что он основан на строгой статической типизации. В него также добавлены средства объектно-ориентированного программирования, анонимные предикаты (лямбда-предикаты), факты-переменные и разрушающее присваивание для них, аргументы-домены (''Generic Interfaces and Classes'') и параметрический полиморфизм, мониторы (''Monitors with guards''), императивные конструкции (''foreach'', ''if<nowiki>...</nowiki>then<nowiki>...</nowiki>else''), коллекторы списков (''[<nowiki>...</nowiki>||<nowiki>...</nowiki>]'') и пр. | Язык программирования, реализованный в Visual (а ранее в Turbo) Prolog'е отличается от классического пролога тем, что он основан на строгой статической типизации. В него также добавлены средства объектно-ориентированного программирования, анонимные предикаты (лямбда-предикаты), факты-переменные и разрушающее присваивание для них, аргументы-домены (''Generic Interfaces and Classes'') и параметрический полиморфизм, мониторы (''Monitors with guards''), императивные конструкции (''foreach'', ''if<nowiki>...</nowiki>then<nowiki>...</nowiki>else''), коллекторы списков (''[<nowiki>...</nowiki>||<nowiki>...</nowiki>]'') и пр. | ||
- | ====== Постановка задачи ====== | + | ===== Постановка задачи ===== |
+ | Разработать программу на языке 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//, удалите все содержимое и наберите текст программы: <code prolog>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). | ||
+ | </code> | ||
+ | - Установите опции компилятора **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 разных запросов. | ||
+ | * Общий вывод по проделанной работе. | ||
+ | * Коды программ. |