- •Методические указания к выполнению лабораторных работ
- •Лабораторная работа «Установка и проверка работы Visual Prolog»
- •ПрОграммирование в лоГике
- •Описание окон Visual Prolog, перечень окон
- •Задание Создание проекта и настройка компилятора
- •Запуск и тестирование работы программы
- •Вопросы для самоконтроля
- •Лабораторная работа «Создание программы с использованием предложений, предикатов, доменов и целей. Создание составных целей»
- •Файлы используемые в проекте
- •Структура программы на Visual Prolog
- •Создание программы на языке Visual Prolog
- •1. В первую очередь необходимо определить факты.
- •2. Необходимо определить правила
- •3. После определения предложений необходимо сформулировать цель на языке Пролог
- •3. Далее в разделе предикатов необходимо описать пользовательские предикаты. Это можно сделать двумя способами
- •Задание Создание программы с использованием предложений, предикатов, доменов и целей
- •Организация запросов
- •Вопросы для самоконтроля
- •Лабораторная работа «Создание составных целей с конъюнкцией и дизъюнкцией»
- •Сложная цель с конъюнкцией и дизъюнкцией
- •Задание Внесение правил
- •Настроить проект как в лабораторной работе №1. * применить к каждой лабораторной работе
- •Организация запросов
- •Лабораторная работа «Использование отладчика приложения для составления целевого дерева»
- •Унификация и поиск с возвратом
- •Поиск с возвратом
- •Детальный поиск с возвратом
- •Задание
- •Создание программы
- •Использование отладчика приложения (Debugger)
- •Вопросы для самоконтроля
- •Лабораторная работа «Управление поиском решения»
- •Управление поиском решений
- •Прерывание поиска с возвратом (отсечение)
- •Использование предиката Fail
- •Предотвращение поиска с возвратом к предыдущей подцели в правиле
- •Использование предиката Not
- •Задание Создание программы поиска с предикатами !, not
- •Лабораторная работа «Организация пользовательского меню»
- •Детерминизм и отсечение
- •Использование правил для условного ветвления
- •Задание
- •Вопросы для самоконтроля
- •Лабораторная работа «Составные объекты»
- •Простые и составные объекты
- •Простые объекты данных
- •Составные объекты данных и функторы
- •Унификация составных объектов
- •Объявление составных доменов
- •Задание
- •Создание программы
- •Вопросы для самоконтроля
- •Лабораторная работа «Списки»
- •Задание
- •Вопросы для самоконтроля
- •Используемая литература
Задание
Задача: создать программу Домашние животные с использованием составных объектов.
Создание программы
Создать программу:
domains
person=person (p_name,address) % функтор персона состоит из функтора
имя персоны и функтора адрес персоны
p_name=p_name (name, fameli) % функтор имя персоны состоит из
объектов имени и фамилии
address =address (hous,street,sity) % функтор адрес персоны состоит из
объектов дом,улица, город
animal=animal(vid,a_name) % функтор животные состоит из объектов вид
животного, кличка животного
hous=integer % домен дом – числовой
vid,a_name,name,fameli,street,sity=symbol % домены вид животного,
кличка животного, имя персоны, фамилия
персоны, улица, город – символьные
predicates
owns(person,animal) % описание составного объекта персона имеет
животного (состоит из функторов
персона и животное)
clauses
owns(person(p_name(oleg,petrov),address(12,mira,toliatti)),animal(horse,leo)).
owns(person(p_name(oleg,petrov),address(12,mira,toliatti)),animal(dog,dik)).
owns(person(p_name(liza,rizova),address(15,matrosova,toliatti)),animal(dog,bim)).
owns(person(p_name(olga,ivanova),address(46,mira,toliatti)),animal(cat,vacia)).
owns(person(p_name(sergei,orlova),address(16,sovetskai,toliatti)),animal(dog,mili)).
owns(person(p_name(pasha,nikolaev),address(55,matrosova,toliatti)),animal(dac,kra)).
goal
owns(person(p_name(Name_person,Famili_person),address(_,_,_)),animal(dog,Name_dog)). % показать всех хозяев собак и клички собак
Получим результат:
Name_person=oleg, Famili_person=petrov, Name_dog=dik
Name_person=liza, Famili_person=rizova, Name_dog=bim
Name_person=sergei, Famili_person=orlova, Name_dog=mili
3 Solutions
В данной программе использовались многоуровневые составные объекты. На рисунке 10 представлено дерево многоуровневого составного объекта owns.
Рисунок 10 - Дерево многоуровневого составного объекта owns
Добавим в программу выражение: персонам нравятся те виды животных, которые они содержат.
like(Name,Fameli,Vid):-owns (person (p_name (Name,Fameli), address(_,_,_)), animal(Vid,_)).
Определить какие животные нравятся Олегу Петрову, если ему нравятся те же животные что и Ольге Ивановой.
Показать всех персон содержащих лошадей, проживающих не в городе Тольятти.
Добавить в функтор персона составной объект дата рождения, дерево составного объекта дата рождения представлено на рисунке 11.
Рисунок 11 - Дерево составного объекта birthday
Показать всех персон именинников в мае месяце на содержащих кошек.
Организовать 2-3 запроса с составной целью.
Вопросы для самоконтроля
Перечислите и опишите виды объектов в Visual Prolog.
Дайте определение простому объекту данных.
Перечислите простые виды объектов в Visual Prolog.
Дайте определение составному объекту данных.
Дайте определение функтору.
Лабораторная работа «Списки»
Тема: работа со списками.
Цель работы: изучить основные принципы работы со списками в Visual Prolog.
Списки
Предположим, вы хотите заполнить расписание занятий по различным предметам, которые могут проводить разные преподаватели. Вы можете написать следующую программу:
predicates
teacher(symbol First_name, symbol Last_name, symbol Class) % учитель (имя,
фамилия, класс)
clauses
teacher(ed, willis, englishl). teacher(ed, willis, mathl). teacherfed, willis, historyl). teacher(тагу, maker, history2). teacher(тагу, maker, math2). teacher(chris, grahm, geometry).
Здесь повторяется имя учителя для каждого предмета, который он или она ведет. Для каждого предмета приходится добавлять факт к базе данных. Хотя это и совершенно правильно в такой ситуации, но можно найти школу, где преподают сотни предметов; такой тип данных становится слишком сложным. Здесь было бы удобно создать аргумент для предиката, который содержит одно или несколько значений.
Список в Прологе предлагает упростить решение данной задачи. В следующей программе аргумент class (класс) имеет тип "список". Мы покажем здесь, как список представляется в Прологе, а предикаты, работающие со списками.
domains
classes = symbol* % объявляем домен-список
predicates
teacher(symbol First, symbol Last, classes Classes) %( имя, фамилия, предметы)
clauses
teacher(ed, willis, [englishl, mathl, historyl]). teacher(тагу, maker, [history2, math2]). teacher(chris, grahm, [geometry]).
В этом примере текст программы более краток и понятен, чем в предыдущем. Обратите внимание на определение домена:
domains
classes = symbol*
Звездочка (*) обозначает, что classes — это список идентификаторов. Так же просто можно объявить список целых:
domains
integer_list = integer*
После того, как домен определен, его очень просто использовать; поместите его в качестве аргумента в предикат в разделе predicates. Ниже приведен пример использования списка целых:
domains
integer_list = integer*
predicates
test_scores(symbol First, symbol Last, integer_list Test_Scores) /* список_результатов (имя, фамилия, список_результатов */
clauses
test_scores(lisa, lavender, [86, 91, 75]).
test_scores(libby, dazzner, [79, 75]).
test_scores(jeff, zheutlin, []).
В случае Jeff zheutlin обратите внимание, что список может вообще не иметь элементов.
