- •Введение
- •1. Организация вычислительного процесса
- •2. Основные элементы языка
- •2.1. Имена
- •2.2. Типы данных
- •2.3. Константы и переменные
- •2.4. Программные секции Пролога
- •2.4.1. Секция Domains
- •2.4.2. Секция Ppredicates
- •2.4.3. Секция Database
- •2.4.4. Секция Clauses
- •2.4.5. Секция Goal
- •3. Примеры программ
- •3.1. Программы с фактами и простыми правилами
- •3.2. Рекурсии
- •3.3. Программирование циклов
- •3.4. Работа со списками
- •3.5. Нахождение пути на графе
- •3.6. Использование структур
- •Vife(X):–family(_,X,_). % X – жена
- •3.7. Динамическая база данных
- •It_is("хищник"),
- •Xpositive(X, y), !. % в базе данных
- •3.8. Обработка текстов
- •Verb( string ) % Глагол
- •4. Стандартные предикаты
- •4.1. Ввод/вывод
- •4.2. Управление экраном и оконная система
- •4.3. Обработка строк
- •4.4. Преобразование типов
- •4.5. Работа с базой данных
- •4.6. Управляющие предикаты
- •4.7. Прочие стандартные предикаты
- •4.8. Арифметические и логические предикаты
- •5. Использование языка Пролог для построения экспертных систем
- •5.1. Оболочка экспертной системыGeni
- •5.2. Оболочка экспертной системы pexpert
- •5.2.1. Синтаксис правил
- •5.2.2. Функции
- •5.2.3. Взгляд на работу программы
- •5.2.4. Команды верхнего уровня
- •5.2.5. Команды оценки правил
- •5.2.6. Команды, действующие во время ввода данных
- •Рекомендуемая литература
- •Приложение. Варианты лабораторных работ Лабораторная работа 1. Работа с простой базой данных
- •Лабораторная работа 2. Программа “Родственные отношения”
- •Лабораторная работа 3. Построение простой вопросно-ответной системы
- •Лабораторная работа 4. Работа со списками
- •Лабораторная работа 5. Нахождение пути на графе
- •Лабораторная работа 6. Работа с базой данных с использованием структур
- •Лабораторная работа 7. Построение экспертной системы
- •Лабораторная работа 8. Построение синтаксического анализатора
It_is("хищник"),
positive("имеет","рыжий цвет"),
positive("имеет", "черные пятна").
animal_is(“тигр”) :– it_is(“млекопитающее”),
it_is(“хищник”),
positive(“имеет”, “рыжий цвет”),
positive(“имеет”, “черные полосы”).
animal_is("зебра") :– it_is("копытное"),
positive("имеет","черные полосы").
animal_is("пингвин") :– it_is("птица"),
negative("умеет", "летать"),
positive("умеет", "плавать"),
positive("имеет", "черно-белый цвет").
Сходные правила должны быть для всех животных, которых предстоит классифицировать программе.
Все правила поддерживаются на следующем, более низком уровне некоторыми соподчиненными предикатами:
it_is("хищник") :–
positive("имеет","острые зубы"),
positive("имеет", "когти"),
positive("имеет", "глаза, направленные вперед").
it_is("копытное") :–
it_is("млекопитающее"),
positive("имеет","копыта"),
positive("жует", "жвачку").
Свою работу программа начинает с использования правила
Goal animal_is(X), !,
write("Задуманное вами животное ",X).
Далее система пытается по очереди установить истинность или ложность правил высокого уровня, т.е. найти кандидата, которого она сможет проверить на соответствие предикату animal_is.
Определение истинности такого правила влечет за собой проверку всего дерева подчиненных фактов и свидетельств, которые должны быть истинными, чтобы подтвердить основное заключение. По мере продвижения вниз по дереву программа соответственно ситуации задает нужные вопросы в нужное время для получения недостающей информации, поэтому ее поведение кажется разумным. Большая часть работы совершается правилами positive и negative, xpositive и xnegative. Они используются для проверки конкретных атрибутов животных, которые могут быть обнаружены в процессе диалога и записаны в базу данных.
Здесь задействован механизм вопросов-ответов, поэтому нам необходимо подробно рассмотреть эти правила. Ниже следует соответствующая часть программы.
database
xpositive(symbol, symbol)
xnegative(symbol, symbol)
Clauses
positive(X, Y) :– % Положительный ответ обнаружен
Xpositive(X, y), !. % в базе данных
positive(X,Y):–xnegative(X,Y),!,fail. % Отрицательный ответ обнаружен
positive(X, Y) :– % Задается вопрос, для которого
not(xnegative(X, Y)), % ожидается положительный ответ
ask(X, Y, yes),!.
ask(X, Y, yes) :–
write(X, " оно ", Y, '\n'),
readchar(Reply),
ans_pos(X, Y, Reply).
ans_pos(X,Y,'y'):– assertz(xpositive(X,Y)).
ans_pos(X,Y,'n'):– assertz(xnegative(X,Y)), !, fail.
Когда механизм вывода доходит до места, где требуется узнать, был ли установлен некоторый атрибут животного, он использует правила positive и negative. (Здесь у нас приведен предикат positive, соответствующий положительному значению атрибута. Сходный по работе с ним предикат negative записывается симметрично.)
Первая из статей предиката positiveзаставляет систему непосредственно просмотреть информацию, уже включенную в базу данных. Если атрибут в ней найден, процесс заканчивается. Второе правило этого предиката инициирует поиск отрицания того, что мы пытаемся установить, и если оно найдено, значение атрибута становится ложным, система переходит к проверке следующего правилаanimal_is. Если же фактов нет среди истинных и ложных, программа задает вопрос пользователю, при этом любой полученный ответ запоминается с целью непосредственного или последующего применения.
Все, что программа помещает в базу данных, всегда имеет вид пары, состоящей из глагола и свойства, например:
positive("имеет","перья").
Поэтому легко создать грамматически правильное предложение для предъявления его пользователю, поставив слово "оно" между глаголом и свойством. Пользователь, вероятно, введет символы "y" или "n" в ответ на запрос, а запоминающее правило занесет информацию в базу данных посредством одного из двух предикатов:
xpositive(verb,,attribute)
xnegative(verb,attribute).
Поэтому если вы хотите перезапустить программу, то сначала надо очистить базу данных от ответов на вопросы, заданные при ведении последнего диалога. Они продолжают находиться в базе данных и будут влиять на следующие результаты, если их не удалить.