- •Введение
- •Принципы логического программирования
- •1.2. Математическая основа языка Пролог
- •1.2. Организация вычислительного процесса
- •1.2.2. Использование переменных
- •1.2.1. Синтаксис фактов и правил
- •1.3. Бэктрекинг
- •2.2. Типы данных
- •2.3. Константы и переменные
- •2.4. Программные секции Пролога
- •2. Основные элементы языка
- •2.1. Имена
- •2.4.1. Секция Domains
- •2.4.2. Секция Predicates
- •2.4.3. Секция Database
- •2.4.4. Секция Clauses
- •2.4.5. Секция Goal
- •3. Язык Пролог в задачах и примерах
- •3.1. Программирование с помощью фактов и правил
- •3.1.2. Первая формулировка задачи поиска в пространстве состояний 51 ад
- •3.1.3. Реализация на Прологе простой вопросно-ответной системы
- •It_is(“отказать в приеме на работу”):- not(this(“есть диплом”)).
- •It_is(“должность научного сотрудника”):- this(“есть диплом”),
- •3.2. Рекурсии
- •Упражнения
- •3.3. Программирование циклических процессов
- •3.4. Работа со списками
- •3.4.1. Описание списков в программе
- •3.4.2. Добавление элемента в список
- •3.4.3. Удаление элемента
- •3.4.4. Принадлежность элемента списку
- •3.4.5. Сцепление (конкатенация) списков
- •3.4.6. Удаление из списка повторяющихся элементов
- •3.4.7. Вычисление суммы элементов списка
- •3.4.8. Обращение списка
- •3.4.9. Нахождение максимального элемента списка
- •3.4.10. Перестановки
- •3.4.11. Примеры использования списков
- •Упражнения
- •3.5. Виды рекурсии
- •3.6. Поиск в пространстве состояний
- •Vshir ( [ [ V | Way ] | _ ], [ V | Way ] ) :- % Голова списка – полученное решение
- •Vshir ( Ways, Resh ). % Продолжение поиска в случае тупикового пути
- •Упражнения
- •3.6. Использование структур
- •3.6.1. Объявление структур
- •База данных с использованием структур.
- •Vife(X) :– family( _ , X , _ ). % X – жена
- •3.6.4. Планирование воздушного путешествия (143 Бр)
- •3.6.5. Реализация Планировщика в терминах структур
- •3.6.6. Задача «Зебра»
- •Упражнения
- •3.7. Динамическая база данных
- •3.7.1. Использование стандартных предикатов динамической базы данных
- •Упражнения
- •3.8. Средства управления
- •3.9. Представление множеств двоичными деревьями
- •3.9. Программы классификации
- •3.9.1. Программа классификации с обратной цепочкой рассуждений
- •Xpositive( X, y ), !. % в базе данных
- •Xnegative( X, y ), !, fail. % Отрицательный ответ обнаружен в базе данных
- •Xpositive("имеет","перья").
- •3.9.2. Программы классификации с прямой цепочкой рассуждений.
- •It_is( X ) :- write( X, “?”), % Механизм диалога
- •3.9. Обработка текстов
- •Verb( string ) % Глагол
- •Упражнения
- •4. Стандартные предикаты
- •4.1. Ввод/вывод
- •4.2. Управление экраном и оконная система
- •4.3. Обработка строк
- •4.4. Преобразование типов
- •4.5. Работа с базой данных
- •4.6. Управляющие предикаты
- •4.7. Прочие стандартные предикаты
- •4.8. Арифметические и логические предикаты
- •Приложение Приложение 1. Примерные варианты лабораторных заданий
- •1. Родословное дерево
- •2. Вопросно-ответная система
- •3. Работа со списками
- •4. Поиск пути на графе.
- •5. Разработайте прототип классификационной экспертной системы
- •6. Построение синтаксического анализатора
- •Рекомендуемая литература
3.9.1. Программа классификации с обратной цепочкой рассуждений
Первой приведем пример версии программы с обратной цепочкой рассуждений, т.к. она ближе к встроенному в Пролог механизму вывода, и, следовательно, реализуется достаточно прямолинейно.
Обратная цепочка рассуждений предполагает продвижение от цели, в нашем случае от распознаваемого животного. Структура версии с обратной цепочкой рассуждений проектируется введением группы правил высокого уровня, т.е. включающих в себя несколько правил. Каждое такое правило описывает одно животное, Дадим описание нескольких животных:
animal_is(“тигр”) :– i
t_is(“млекопитающее”),
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("кормит", "детенышей молоком").
it_is("хищник") :–
positive("имеет", "острые зубы"),
positive("имеет", "когти"),
positive("имеет", "глаза, направленные вперед").
it_is("копытное") :–
it_is("млекопитающее"),
positive("имеет", "копыта"),
positive("жует", "жвачку").
Свою работу программа начинает с использования правила
Goal animal_is(X), !,
write("Отгаданное животное ", X),
retractall( _ ).
Далее система пытается по очереди установить истинность или ложность правил высокого уровня, т.е. найти кандидата, которого она сможет проверить на соответствие предикату 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 ) :– % Задается вопрос, для которого
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. Если же фактов нет среди истинных и ложных, программа задает вопрос пользователю, при этом любой полученный ответ запоминается с целью непосредственного или последующего применения.
Все факты, что программа помещает в базу данных, всегда имеет вид пары, состоящей из глагола и свойства, например:
