- •Лабораторная работа № 1. Малая экспертная система.
- •Теоретические сведения
- •Диагностические экспертные системы.
- •Пример применения байесовской стратегии оценки выводов
- •Контрольные задания:
- •Контрольные вопросы:
- •Лабораторная работа № 2. Знакомство с инструментальными средствами для создания экспертных систем.
- •Теоретические сведения
- •Контрольное задание:
- •Контрольное задание:
- •Контрольные вопросы:
- •Лабораторная работа № 4.
- •Теоретические сведения
- •Контрольное задание:
- •Основные стандартные домены
- •Основные стандартные предикаты:
- •Ключевые слова
- •Контрольные задания:
- •Контрольные вопросы:
- •Лабораторная работа №7. Предложения (факты и правила), цели на языке пролог.
- •Теоретические сведения Clauses (условия): Facts (факты) и Rules (правила)
- •О фактах
- •Контрольные вопросы:
- •Лабораторная работа №8. Переменные на языке программирования пролог.
- •Теоретические сведения
- •Анонимные переменные
- •Контрольное задание:
- •Принципы отката:
- •Контрольные задания:
- •Преимущества рекурсии
- •Оптимизация обратной рекурсии
- •Контрольные задания:
- •Объявление списков
- •Головы и хвосты
- •Обработка списков
- •Использование списков
- •Контрольное задание:
- •Контрольные вопросы:
- •Лабораторная работа №13. Секция фактов Лабораторная работа № 1.
- •Теоретические сведения
- •Объявление секций фактов
- •Модификация секции фактов
- •Добавление фактов в период исполнения программы
- •Загрузка фактов из файла в период исполнения программы
- •Удаление фактов в период исполнения программы
- •Удаление нескольких фактов сразу
- •Ключевые слова для объявления фактов
- •Описания Факты, объявленные с ключевым словом nondeterm
- •Факты, объявленные с ключевым словом determ
- •Факты, объявленные с ключевым словом single
- •Сохранение базы данных фактов во время выполнения программы
- •Контрольные задания:
- •Контрольные вопросы:
Основные стандартные домены
Доменом в Прологе называют тип данных аргумента предиката. Существует несколько стандартных доменов:
integer - целые числа.
real - вещественные числа.
string - строки (любая последовательность символов, заключенная в кавычки).
char - одиночный символ, заключенный в апострофы.
symbol - последовательность латинских букв, цифр и символов подчеркивания, начинающаяся с маленькой буквы или любая последовательность символов, заключенная в кавычки.
Основные стандартные предикаты:
write(X) - вывод значения X на экран (по умолчанию) или на другое устройство, где X - переменная;
nl - переход в следующую строку на экране;
readln(X) - ввод строковой переменной;
readint(X) - ввод целочисленной переменной;
readreal(X) - ввод вещественной переменной.
fail - это тождественно-ложный предикат, искусственно создающий ситуацию неуспеха. После выполнения этого предиката управление передается в точку отката и поиск продолжается. Использование предиката fail позволяет найти все решения задачи.
Чтобы ограничить пространство поиска и прервать поиск решений при выполнении какого-либо условия, используется предикат отсечения (!). Однажды пройдя через отсечение, невозможно вернуться назад, т.к. этот предикат является тождественно-истинным. Процесс может только перейти к следующей подцели, если она имеется.
Например, p:- p1, p2, !, p3.
Если достигнуты цели p1 и p2, то возврат к ним для поиска новых решений невозможен.
Синтаксис языка Пролог
Символ «:-» означает «if» (при условии, если), и служит для того, чтобы разделить две части правила: голову и тело.
Символ «,» означает логическую операцию «И», «;» - «ИЛИ».
Все предложения (в разделе clauses) должны обязательно заканчиваться точкой.
Ключевые слова
Следующее зарезервированные слова Вы не должны использовать как определяемые пользователем: and, clauses, constants, database, domains, elsedef, enddef, global, goal, if, ifdef, ifndef, include, or, predicates.
Арифметические вычисления
Хотя Пролог не предназначен для решения вычислительных задач, его возможности вычислений аналогичны соответствующим возможностям таких языков программирования как Basic, C, Pascal.
В языке Пролог имеется ряд встроенных математических операций и функций для вычисления арифметических выражений.
Рассмотрим некоторые из них.
X + Y |
Сумма X и Y |
X – Y |
Разность X и Y |
X * Y |
Произведение X и Y |
X / Y |
Деление X на Y |
X mod Y |
Остаток от деления X на Y |
X div Y |
Целочисленное деление X на Y |
abs(X) |
Абсолютная величина числа X |
sqrt(X) |
Квадратный корень из X |
random(X) |
Случайное число в диапазоне от 0 до 1 |
random(Int,X) |
Случайное целое число в диапазоне от 0 до Int |
round(X) |
Округление Х |
trunc(X) |
Целая часть Х |
sin(X) |
Синус X |
cos(X) |
Косинус X |
arctan(X) |
Арктангенс Х |
tan(X) |
Тангенс X |
ln(X) |
Натуральный логарифм X |
log(X) |
Логарифм Х по основанию 10 |
Совместное использование фактов, правил, и запросов
Рассмотрим программу, оформленную по всем правилам. Этот пример, демонстрирует, как Пролог использует правила для ответов на запросы.
Предположим, Вы хотите спросить у Пролога следующее:
Любит ли Bill бейсбол?
Запустите среду Visual Prolog.
Откройте новый файл (File → New). В появившемся окне наберите программный код, содержащий разделы:
PREDICATES (описание пользовательского предиката)
CLAUSES (перечисляются имеющиеся факты и правила)
GOAL (формулируется запрос).
Опишите предикат likes и типы его аргументов.
nondeterm likes(symbol, symbol)
Замечание: ключевое слово nondeterm определяет недетерминированные предикаты, которые могут совершать откат назад и генерировать множественные решения. Таким образом, если задача предполагает возможность получения несколько решений, следует объявлять предикаты как недетерминированные.
Для реализации программы мы должны задать Прологу базу данных, опираясь на эти данные, Пролог будет искать ответ на поставленный вопрос. Опишите следующие предложения в разделе предложений.
likes(ellen, tennis).
likes(john, football).
likes(tom, baseball).
likes(eric, swimming).
likes(mark, tennis).
likes(bill, Activity):- likes(tom, Activity).
Предложение состоит из фактов и правил. В логике предиката, которую Пролог использует, отношение получено в простой фразе - факте, который состоит из названия отношения (такое отношение называется предикатом), сопровождаемого конкретным объектом или объектами (заключенных в круглых скобках).
Факт, выражающий отношение «likes» в естественном языке:
ellen likes tennis - Эллин любит теннис.
Вот тот же самый факт, написанный на языке Пролог:
likes(ellen, tennis).
Последняя строка в Программе является правилом:
likes(bill, Activity):- likes(tom, Activity).
Это правило соответствует следующему утверждению в естественном языке
Bill likes an activity if Tom likes that activity. - Bill любит занятие, если Tom любит это занятие.
В этом правиле, головой является likes(bill, Activity), а телом - likes(tom, Activity). Заметьте, что в этом примере нет никакого факта о том, что Билл любит бейсбол (Bill likes baseball).
На Прологе, чтобы выяснить, любит ли Билл бейсбол, задайте такой запрос:
likes(bill, baseball).
При попытке найти решение этого запроса, Пролог будет использовать правило:
likes(bill, Activity):- likes(tom, Activity).
В результате программный код должен выглядеть следующим образом:
PREDICATES
nondeterm likes(symbol, symbol)
CLAUSES
likes(ellen, tennis).
likes(john, football).
likes(tom, baseball).
likes(eric, swimming).
likes(mark, tennis).
likes(bill, Activity):- likes(tom, Activity).
GOAL
likes(bill, baseball).
Чтобы проверить написанную программу нажмите пункт меню Project → Test Goal. Система выдаст ответ в диалоговом окне (рис. 1) - Yes.
Рис. 1. Пример программы на Прологе по определению нравится ли Биллу бейсбол
Это результат объединения правила
likes(bill, Activity):- likes(tom, Activity).
с фактом
likes(tom, baseball).
Для того чтобы решить, любит ли Бил бейсбол likes(bill, baseball). Исправьте запрос в разделе GOAL likes(bill, baseball) на likes(bill, tennis). Система ответит (рис. 2) - No.
Рис. 2. Пример программы на Прологе по определению нравится ли Биллу теннис
Visual Prolog ответил No на последний запрос ("Does Bill likes tennis?"), потому что не было факта, что Bill likes tennis (Билл любит теннис). Объекты Bill и tennis не могут быть выведены, используя имеющиеся правила и факты. Конечно, может быть Билл и обожает теннис в реальной жизни, но Visual Prolog отвечает, основываясь только на факты и правила, которые были заданы в программе.
Рассмотрим следующий пример.
Имеется база данных, содержащая следующие факты:
родитель(илья, марина).
родитель(марина, ира).
родитель(елена, иван).
родитель(николай, ира).
родитель(ольга, алексей).
родитель(марина, саша).
родитель(сергей, иван).
Необходимо определить:
верно ли, что Марина является родителем Саши;
верно ли, что Алексей является родителем Ольги;
кто является ребенком Николая;
кто родители Ивана;
всех родителей и их детей.
Для начала опишем разделы доменов и предикатов.
DOMAINS
имя=string
PREDICATES
nondeterm родитель(имя, имя)
Для ответа на вопрос: верно ли, что Марина является родителем Саши, пропишите запрос:
GOAL
родитель(марина, саша).
Илья является родителем Марины, значит, Марина является дочерью Ильи. Марина и Николай являются родителями Иры, Марина является матерью Саши (рис. 3).
Рис. 3. Дерево семейных отношений1
Для ответа на вопрос: верно ли, что Алексей является родителем Ольги, измените запрос:
GOAL
родитель(алексей, ольга).
После запуска программы (Project →Test Goal) будет получен ответ:
No
Для ответа на вопрос: кто является ребенком Николая, запишите цель:
GOAL
родитель(николай, X) .
Результат:
X=ира
1 Solution
13. Для ответа на вопрос: кто родители Ивана, укажите запрос:
GOAL
родитель(X, иван), родитель(Y, иван), X<>Y.
Результат (рис. 4):
X=елена, Y=сергей
X=сергей, Y=елена
2 Solutions
Р
ис.
4. Дерево семейных отношений2
Для определения всех родителей и их детей, запишите:
GOAL
родитель(X, Y).
Результат (рис. 5):
X=илья, Y=марина
X=марина, Y=ира
X=елена, Y=иван
X=николай, Y=ира
X=ольга, Y=алексей
X=марина, Y=саша
X=сергей, Y=иван
7 Solutions
Р
ис.
5. Определение родителей и детей в
программе
