- •Руководство пользователя турбо пролог 2.0.
- •Часть 1: Введение в Турбо Пролог 2.0 18
- •Часть 2. Изучение турбо пролога 2.0 44
- •Глава 3. Основы пролога 44
- •Глава 4. Программы турбо пролога 65
- •Глава 5. Унификация и поиск с возвратом. 84
- •Глава 6. Простые и составные объекты 116
- •Глава 7. Повтор и рекурсия 132
- •Глава 8. Списки и рекурсия 160
- •Глава 9. Внутренняя база данных турбо пролога 180
- •Глава 10. Трассировка и отладка 189
- •Часть 3. Описание турбо пролога 2.0 203
- •Глава 11. Арифметические вычисления и сравнения 203
- •Глава 12. Запись, чтение и файлы 215
- •Глава 13. Обработка строк в турбо прологе 240
- •Глава 14. Окна в ваших программах 249
- •Глава 15. Система внешних баз данных 269
- •Глава 16. Программирование на системном уровне 298
- •Глава 17. Графический интерфейс borland 309
- •Глава 18. Примеры программ 347
- •Глава 19. Сложные приемы программирования 365
- •Введение
- •О Прологе
- •Для чего может быть использован Турбо Пролог?
- •Чем Турбо Пролог отличается от других языков?
- •Минимальные требования к системе
- •Поддерживаемое оборудование
- •О руководствах по Турбо Пролог 2.0
- •Том I: Руководство пользователя
- •Рекомендуемая литература
- •Используемые шрифты
- •Торговые марки.
- •Как связаться с фирмой Borland.
- •Часть 1 введение в турбо пролог 2.0 глава 1. Установка турбо пролога 2.0
- •Что хранится на ваших дисках
- •Теперь сделаем резервные копии
- •Установка Турбо Пролога на вашу систему
- •Установка на систему с гибкими магнитными дисками
- •Установка на жесткий диск
- •Использование данного руководства
- •Глава 2. Начало
- •Загрузка Турбо Пролога
- •Краткое руководство по меню и "горячим" клавишам.
- •Главное меню
- •Спускающиеся меню
- •"Горячие" клавиши и командные клавиши
- •"Горячие" клавиши главного меню
- •Командные клавиши редактора
- •Командные клавиши компиляции
- •Стирание текста
- •Манипулирование текстовыми блоками
- •Ваша первая программа на Турбо Прологе
- •Ввод вашей программы в редактор
- •Корректирование ввода
- •Просмотр в редакторе
- •Запуск вашей программы
- •Что происходит, когда вы делаете синтаксическую ошибку
- •Сохранение вашей программы на диске
- •Просмотр файлов на диске
- •Трассирование вашей программы
- •Пользователям с гибкими магнитными дисками: создание автономных программ.
- •Контроль установки системы
- •Часть 2. Изучение турбо пролога 2.0 глава 3. Основы пролога
- •ПрОграммирование в лоГике
- •Предложения: Факты и Правила.
- •Факты: То что известно
- •Правила: То что вы можете получить из заданных фактов
- •Запросы
- •Совместное задание фактов, правил и запросов
- •Переменные: основные положения
- •Упражнения
- •Из естественного языка в программы на Прологе
- •Упражнения
- •Предикаты (связи)
- •Переменные (обобщенные предложения)
- •Как переменные получают свои значения
- •Анонимные переменные
- •Цели (запросы)
- •Составные цели: Конъюнкция и Дизъюнкция
- •Комментарии
- •Что такое Сопоставление?
- •Глава 4. Программы турбо пролога
- •Основные секции программы на Турбо Прологе
- •Секция предложений
- •Секция предикатов
- •Как объявить предикат пользователя
- •Имена предикатов
- •Аргументы предикатов
- •Секция доменов
- •Примеры.
- •Секция цели
- •Подробнее о декларациях и правилах
- •Задание типов аргументов при декларации предикатов
- •Упражнения
- •Арность (размерность)
- •Синтаксис правил
- •Ключевое слово Пролога "if" и "if" в других языках
- •Автоматическое преобразование типов
- •Другие секции программы
- •Секция базы данных
- •Секция констант
- •Глобальные секции
- •Директивы компилятора
- •Директива include
- •Директивы trace и shorttrace
- •Глава 10 подробно объясняет трассирование, однако еще до того, как
- •Глава 5. Унификация и поиск с возвратом.
- •Сопоставление и унификация
- •Поиск с возвратом.
- •Поиск всех решений
- •Упражнение на поиск с возвратом.
- •Детальный обзор поиска с возвратом.
- •Четыре основных принципа поиска с возвратом.
- •Поиск с возвратом для внутреннего целевого утверждения
- •Управление поиском решений.
- •Использование предиката fail.
- •Упражнения.
- •Прерывание поиска с возвратом: отсечение.
- •Как использовать отсечение.
- •Предотвращение поиска с возвратом к предыдущей подцели в правиле.
- •Предотвращение поиска с возвратом к следующему предложению.
- •Детерминизм и отсечение.
- •Пример, использующий отсечение
- •Предикат not.
- •Упражнения.
- •Пролог с процедурной точки зрения.
- •Как представлять факты и правила в качестве процедур
- •Использование правил для условного ветвления (case).
- •Представление проверки в правиле.
- •Отсечение как goto.
- •Возврат вычисленного значения.
- •Глава 6. Простые и составные объекты
- •Простые объекты данных.
- •Переменные как объекты данных.
- •Константы как объекты данных.
- •Литеры.
- •Составные объекты данных и функторы
- •Унификация составных объектов.
- •Использование знака равенства для унификации составных объектов.
- •Рассмотрение нескольких значений как единое целое.
- •Примеры использования функторов.
- •Пример использования составных объектов.
- •Упражнение.
- •Объявление доменов составных объектов.
- •Запись определений доменов: Обзор.
- •Многоуровневые составные объекты.
- •Пример, иллюстрирующий структуру предложения.
- •Упражнения.
- •Определения составных смешанных доменов.
- •Аргументы множественных типов.
- •Сравнение составных объектов.
- •Глава 7. Повтор и рекурсия
- •Процесс повторения
- •Снова поиск с возвратом
- •Упражнение
- •Предварительные и последующие операции
- •Упражнение
- •Использование поиска с возвратом в замкнутых системах
- •Упражнения
- •Рекурсивные процедуры
- •Что же все-таки делает компьютер?
- •Преимущества рекурсии
- •Оптимизация хвостовой рекурсии
- •Как задать хвостовую рекурсию
- •Упражение
- •Как избежать хвостовой рекурсии
- •На помощь приходит команда "cut"
- •Использование аргументов в качестве переменных цикла
- •Упражнения
- •Рекурсивные структуры данных
- •Деревья - как типы данных
- •Обход дерева
- •Создание дерева
- •Бинарные поисковые деревья
- •Сортировка на основе дерева
- •Упражнения
- •Глава 8. Списки и рекурсия
- •Что такое списки?
- •Объявление списков
- •Голова и хвост списка
- •Работа со списками
- •Использование списков
- •Печать списков
- •Упражнение
- •Подсчет элементов списка
- •Упражнение
- •Хвостовая рекурсия
- •Упражнение
- •Другой пример - изменения в списках
- •Снова о хвостовой рекурсии
- •Еще об изменении списков
- •Принадлежность к списку
- •Упражнение
- •Объединение одного списка с другим: декларативное и процедурное программирование
- •Рекурсии с процедурной точки зрения
- •Упражнение
- •Один предикат может иметь несколько вариантов использования
- •Упражнение
- •Немедленный поиск всех решений
- •Составные списки
- •Упражнение
- •Грамматический разбор списков
- •Заключение
- •Глава 9. Внутренняя база данных турбо пролога
- •Использование внутренней базы данных
- •Объявление внутренней базы данных
- •Обновление внутренней базы данных
- •Занесение фактов во время исполнения
- •Удаление фактов во время выполнения программы
- •Удаление нескольких фактов сразу
- •Считывание новых фактов из файла во время выполнения программы
- •Сохранение базы данных с фактами во время работы программы
- •Примеры
- •Глава 10. Трассировка и отладка
- •Синтаксическая проверка
- •Трассировка
- •Директива трассировки
- •Пример использования директивы trace
- •Трассировка в режиме оптимизации: shorttrace
- •Трассировка указанных предикатов
- •Пример использования директивы shorttrace
- •Сохранение результатов трассировки
- •Предикат trace
- •Пример использования предиката trace
- •Диалоговое управление трассировкой
- •Состояние ( Status )
- •Окно Трассировки ( Trace Window )
- •Окно Редактора ( Edit Window )
- •Предикаты, с особым значением в режиме трассировки
- •Упражнение по трассировке
- •Директивы компилятора, используемые для отладки
- •Директивы check_determ и nondeterm
- •Упражнение
- •Директива diagnostics
- •Директива nowarnings
- •Собщения об ошибках во время выполнения программы
- •Опции компилятора из меню
- •Integer Overflow Check (Проверка целого)
- •Stack Check (Проверка стека)
- •Часть 3. Описание турбо пролога 2.0 глава 11. Арифметические вычисления и сравнения
- •Арифметические выражения
- •Операции
- •Порядок вычислений
- •Функции и предикаты
- •Генератор случайных чисел
- •Предикат random/1
- •Предикат random/2
- •Целочисленная и вещественная арифметика
- •Равенство и предикат равенства
- •Упражнения
- •Сравнение символов, строк и идентификаторов
- •Символы
- •Идентификаторы
- •Примеры, демонстрирующие предикат write
- •Упражнение
- •Предикат writef/*
- •Турбо Пролог распознает следующие спецификаторы формата поля f:
- •Примеры форматного вывода
- •Предикат readln/1
- •Предикаты readint/1, readreal/1 и readchar/1
- •Предикат readterm/2
- •Предикат file_str/2
- •Предикат inkey/1
- •Предикат keypressed/0
- •Предикат unreadchar/1
- •Примеры
- •Упражнение
- •Открытие и закрытие файлов
- •Предикат openread/2
- •Предикат readdevice/1
- •Предикат writedevice/1
- •Примеры
- •Работа с файлами
- •Примеры
- •Предикат eof/1
- •Предикат flush/1
- •Предикат existfile/1
- •Предикат deletefile/1
- •Предикат renamefile/2
- •Предикат disk/1
- •Расширение базы данных с помощью файлов
- •Работа с фактами, как с термами
- •Примеры
- •Глава 13. Обработка строк в турбо прологе
- •Обработка строк
- •Основные предикаты управления строкой
- •Frontchar/3
- •Fronttoken/3
- •Frontstr/4
- •Concat/3
- •Str_lеn/2
- •Str_char/2
- •Str_int/2
- •Str_real/2
- •Upper_lower/2
- •Примеры.
- •Глава 14. Окна в ваших программах
- •Основные операторы управления окном.
- •Задание атрибутов экрана дисплея.
- •Черно-белый дисплей.
- •Цветной дисплей.
- •Makewindow/8
- •Пример.
- •Shiftwindow/1
- •Clearwindow/0
- •Removewindow/0
- •Cursor/2
- •Пример.
- •Игра в угадывание слов с использованием окон.
- •Усовершенствованные предикаты обработки окон.
- •Textmode/2
- •Makewindow/11
- •Existwindow/1
- •Gotowindow/1
- •Removewindow/2
- •Resizewindow/0
- •Resizewindow/4
- •Пример.
- •Framewindow/1
- •Framewindow/4
- •Colorsetup/1
- •Scr_char/3
- •Scr_attr/3
- •Field_str/4
- •Field_attr/4
- •Window_str/1
- •Window_attr/1
- •Простая игра.
- •Использование редактора и dir из программы.
- •Editmsg/8
- •Edit/2 и edit/13
- •Аргументы предиката edit.
- •Display/1
- •Пример доступа к редактору и каталогу.
- •Заключение.
- •Глава 15. Система внешних баз данных
- •Внешние базы данных в Турбо Прологе.
- •Обзор: что такое внешние базы данных?
- •Соглашения об именовании.
- •Селекторы внешних баз данных.
- •Домены, связанные с внешними базами данных.
- •Указатели базы данных.
- •Домен ref.
- •Обработка целых баз.
- •Db_create/3
- •Db_open/3
- •Db_copy/3
- •Db_openinvalid/3
- •Db_flush/1
- •Db_close/1
- •Db_delete/1
- •Db_garbagecollect/1
- •Db_btrees/2
- •Db_chains/2
- •Db_statistics/5
- •Обработка цепочек.
- •Chain_inserta/5 и chain_insertz/5
- •Chain_insertafter/5
- •Term_replace/4
- •Term_delete/3
- •Ref_term/4
- •Пример полной программы.
- •B-деревья.
- •Страницы, порядок и длина ключа.
- •Двойные ключи.
- •Множественный просмотр.
- •Стандартные предикаты для b-деревьев
- •Bt_create/5
- •Bt_open/3
- •Bt_clost/2 и bt_delete/2
- •Bt_statistics/8
- •Key_insert/4 и key_delete/4
- •Key_first/3, key_last/3 и key_search/4
- •Key_next/3 и key_prev/3
- •Key_current/4
- •Пример: Доступ к базе данных через b-деревья
- •Программирование внешних баз данных
- •Просмотр базы данных
- •Вывод содержания базы данных
- •Создание защищенной базы данных
- •Обновление базы данных
- •Использование внутреннего указателя b-дерева.
- •Использование key-search с дублируемыми ключами
- •Изменение структуры базы данных.
- •Глава 16. Программирование на системном уровне
- •Доступ к операционной системе
- •System/1
- •System/3
- •Пример:
- •Envsymbol/2
- •Date/3 и time/4
- •Пример.
- •Comline/1
- •Операции на уровне бит
- •Bitnot/2
- •Bitand/3
- •Bitor/3
- •Bitxor/3
- •Bitleft/3
- •Bitright/3
- •Упражнение:
- •Доступ к аппаратуре: поддержка низкого уровня.
- •Bios/3 и bios/4
- •Ptr_dword/3
- •Membyte/3 и memword/3
- •Port_byte/2
- •Примеры:
- •Глава 17. Графический интерфейс borland
- •Что такое bgi?
- •Несколько слов о видео режимах.
- •Несколько слов о полях вывода (графических окнах).
- •Файл grapdecl.Pro
- •Как начинать
- •Инициализация и выключение системы bgi
- •Предикаты
- •Initgraph/5
- •Detectgraph/2
- •Getgraphmode/1
- •Getmaxmode/1
- •Graphdefaults/0
- •Closegraph/0
- •Restorecrtmode/0
- •Текущая позиция (тп)
- •Getlinesettings/3
- •Окружности
- •Circle/3
- •Getarccoords/6
- •Прямоугольники, многоугольники и полосы.
- •Rectangle/4
- •Bar3d/6
- •Drawpoly/1
- •Fillpoly/1
- •Setfillpattern/2
- •Getfillpattern
- •Floodfill/3
- •Пример заполнения области.
- •Управление цветом.
- •Палитра
- •Цвет фона и цвет рисования.
- •Управление цветом в cga.
- •Низкое разрешение cga.
- •Высокое разрешение cga.
- •Предикаты палитры cga.
- •Управление цветом в ega.
- •Управление цветом в дисплеях системы rgb.
- •Предикаты
- •Шрифты: загружать или компоновать
- •Предикаты
- •Settstyle/3
- •Setusercharsize/4
- •Пример использования различных видов текста
- •Экраны и поля вывода.
- •Предикаты.
- •Setviewport/5
- •Getviesettings/5
- •Управление пикселами и образами
- •Предикаты
- •Ограничения на использование драйвера 8514.
- •Использование bgi
- •Графические драйверы и символьные шрифты.
- •Программа, загружающая драйверы
- •Построение и запуск загружаемых .Exe файлов
- •Сообщения bgi об ошибках
- •Новые драйверы bgi
- •Задача выбора кратчайшего пути
- •Приключения в опасной пещере
- •Моделирование элементов аппаратуры
- •Ханойские башни.
- •Деление слов на слоги
- •Проблема расстановки n ферзей
- •Использование клавиатуры.
- •Чтение и распознавание клавиш
- •Простой редактор полей
- •Применение предиката inkey
- •Глава 19. Сложные приемы программирования
- •Ошибки, исключительные ситуации и прерывания
- •Обработка исключительных ситуаций, связанных с ошибками
- •Exit/o и exit/1
- •Errorsg/4
- •Обработка ошибок при чтении термов
- •Consulterror/3
- •Readtermerror/2
- •Управление режимом break
- •Break/1
- •Breakpressed/0
- •Углубленный контроль ошибок в .Exe файлах
- •Criticalerror/4
- •Fileerror/2
- •Анализ потока параметров
- •Контроль потока параметров
- •Ссылочные типы
- •Объявление ссылочных типов
- •Ссылочные типы и массив trail
- •Применение ссылочного типа
- •Динамическое отсечение
- •Примеры
- •Применение ссылочных типов при реализации бинарных деревьев
- •Сортировка с помощью ссылочных типов
- •Стиль программирования
- •Определение1
- •Определение 2
- •Определение 3.
- •Использование предиката fail
- •Детерминизм и отсечение
Сообщения bgi об ошибках
6000 BGI-графическая система не загружена
6001 Графическое физическое устройство не обнаружено
6002 Файл драйвера устройства не найден
6003 Неверный файл драйвера устройства
6004 Недостаточно памяти для загрузки драйвера
6005 Выход за границы памяти при сканирующем заполнении
6006 Выход за границы памяти при лавинном заполнении
6007 файл со шрифтом не найден
6008 Недостаточно памяти для загрузки шрифта
6009 Неверный графический режим для выбранного драйвера
6010 Графическая ошибка
6011 Графическая ошибка ввода/вывода
6012 Неверный файл шрифта
6013 Неверный номер шрифта
6014 Неверный номер устройства
Новые драйверы bgi
Графическая система BGI содержится в различных продуктах фирмы
Borland и вы можете ожидать появление новых драйверов и шрифтов. Они бу-
дут распространяться только как .BGI и .CHR файлы. Программа BGIOBJ.EXE
может преобразовать эти файлы в .OBJ файлы. Следовательно, при помощи
программы TLIB.EXE, описанной в приложении к Справочному Руководству по
Турбо Прологу, вы можете пополнить свою BGI-библиотеку (BGI.LIB), добав-
ляя новые драйверы и шрифтовые обЪектные модули.
"Черепашья" графика в версии 2.0
Предикаты "черепашьей" графики - графической системы из Турбо Проло-
га версии 1.x поддерживаются и в версии 2.0 для более полной совместимос-
ти, хотя предикаты "черепашьей" графики не совместимы с BGI. В этом раз-
деле кратко описываются все эти старые графические предикаты.
graphics/3
graphics переводит систему в режим Turtle Graphics.
graphics(Mode,Palette,Background) /*(i,i,i)*/
(integer,integer,integer)
dot/3
dot устанавливает цвет одного пиксела с координатами Row и Column
(виртуальная система координат размером 3200 на 3200 в пределах окна).
dot(Row,Column,Color) /*(i,i,i)*/
(integer,integer,integer)
line/5
line рисует на экране прямую линию между (Row1,Col1) и (Row2,Col2)
указанным цветом (виртуальная система координат размером 3200 на 3200 в
пределах окна).
line(Row1,Col1,Row2,Col2,Color) /*(i,i,i,i,i)*/
(integer,integer,integer,integer,integer)
forward/1
forward передвигает карандаш вперед на расстояние Step.
forward(Step) /*(i)*/
(integer)
back/1
back передвигает карандаш назад на расстояние Step.
back(Step) /*(i)*/
(integer)
left/1
left изменяет направление движения карандаша на Angle градусов про-
тив часовой стрелки.
left(Angle) /*(i)*/
(integer)
right/1
right изменяет направление движения карандаша на Angle градусов по
часовой стрелке.
right(Angle) /*(i)*/
(integer)
pencolor/1
pencolor устанавливает цвет карандаша равным Color или возвращает
текущий цвет.
pencolor(Color) /*(i)(o)*/
(integer)
penup/0
penup деактивизирует карандаш, используемый для рисования в предика-
тах forward и back.
pendown/0
pendown активизирует карандаш, используемый для рисования в предика-
тах forward и back.
penpos/3
penpos устанавливает положение карандаша и начальный угол или возв-
ращает текущие положение карандаша и значение угла.
penpos(Row,Col,Angle) /*(i,i,i)(o,o,o)*/
(integer,integer,integer)
ГЛАВА 18. ПРИМЕРЫ ПРОГРАММ
В этой главе будет представлен ряд программ, предназначенных для
стимулирования ваших собственных идей и для углубления знаний, полученных
в предыдущих главах. Практически все примеры позволяют реализовать ваши
замыслы и создать свои собственные, необходимые для вас программы, ис-
пользуя данные примеры в качестве основы. Полные и подробные сведения о
системе Турбо Пролог приведены в Руководстве программиста.
Построение небольшой экспертной системы.
В этом первом примере мы воспользуемся Турбо Прологом для построения
маленькой экспертной системы, которая будет угадывать одно из семи живот-
ных, задуманное пользователем-разработчиком (если такое существует). Сис-
тема будет задавать ряд вопросов и строить логические умозаключения на
основе полученных ей ответов. Этот пример демонстрирует поиск с возвра-
том, использование базы данных и порядок эффективного применения not.
В качестве примера мы можем привести типичный диалог экспертной сис-
темы с пользователем (для большего понимания дан перевод):
Goal: run.
Оно имеет шерсть?
да
Оно ест мясо?
да
Оно желтовато-коричневой масти?
да
Оно имеет темные пятна?
да
Ваше животное должо быть гепард!
Способность Турбо Пролога проверять факты и правила обеспечивает ва-
шей программе свойства, присущие экспертной системе. Первым шагом при
построении такой системы является обеспечение ее знаниями, необходимыми
для выполнения рассуждений, пример таких знаний приведен в программе
СH18EX01.PRO.
/*Program СH18EX01.PRO - Процессор вывода для маленькой
экспертной системы*/
predicates
animal_is(symbol)
it_is(symbol)
positive(symbol, symbol)
negative(symbol, symbol)
clauses
animal_is(cheetah) :-
it_is(mammal),
it_is(carnivore),
positive(has, tawny_color),
positive(has, dark_spots).
animal_is(tiger) :-
it_is(mammal),
it_is(carnivore),
positive(has, tawny_color),
positive(has, black_stripes).
animal_is(giraffe) :-
it_is(ungulate),
positive(has, long_neck),
positive(has, long_legs),
positive(has, dark_spots).
animal_is(zebra) :-
it_is(ungulate),
positive(has,black_stripes).
animal_is(ostrich) :-
it_is(bird),
negative(does, fly),
positive(has, long_neck),
positive(has, long_legs),
positive(has, black_and_white_color).
animal_is(penguin) :-
it_is(bird),
negative(does, fly),
positive(does, swim),
positive(has, black_and_white_color).
animal_is(albatross) :-
it_is(bird),
positive(does, fly_well).
it_is(mammal) :- positive(has, hair).
it_is(mammal) :- positive(does, give_milk).
it_is(bird) :- positive(has, feathers).
it_is(bird) :- positive(does, fly), positive(does,lay_eggs).
it_is(carnivore) :-
positive(does, eat_meat).
it_is(carnivore) :-
positive(has, pointed_teeth),
positive(has, claws),
positive(has, forward_eyes).
it_is(ungulate) :-
it_is(mammal), positive(has, hooves).
it_is(ungulate) :-
it_is(mammal), positive(does, chew_cud).
Каждое животное описывается рядом признаков, которыми оно обладает
(или нет). Ответы на вопросы пользователя описываются через positive(X,Y)
и negative(X,Y). Следовательно система может задать, например, такой воп-
рос
У него есть шерсть ?
Получив ответ на этот вопрос, вы должны иметь возможность сохранить
его в базе данных так, чтобы система могла их использовать в своих рас-
суждениях.
Для простоты в этом примере программы были включены только положи-
тельные и отрицательные ответы. Для их использования в базу данных вклю-
чены два предиката:
database
xpositive(symbol,symbol)
xnegative(symbol,symbol)
Факт, что животное не имеете шерсти будет записан так:
xnegative(has,hair).
Правила positive и negative используются для контроля ответов поль-
зователя и задания новых вопросов.
positive(X, Y) :-
xpositive(X, Y), !.
positive(X, Y) :-
not(xnegative(X, Y)),
ask(X, Y, yes).
negative(X, Y) :-
xnegative(X, Y), !.
negative(X, Y) :-
not(xpositive(X, Y)),
ask(X, Y, no).
Заметьте, что второе правило как для positive, так и для negative
гарантирует, что противоречие не возникнет при задании вопроса пользова-
телю.
Предикат ask служит для задавания вопросов и запоминает ответы. Если
ответ начинается с буквы "д", то предполагается да ("yes"), а если "н" -
то нет ("no").
/* Задание вопросов и анализ ответов */
ask(X, Y, yes) :- !, write(X, " it ", Y, '\n'),
readln(Reply),
frontchar(Reply, 'y', _),
remember(X, Y, yes).
ask(X, Y, no) :- !, write(X, " it ", Y, '\n'),
readln(Reply),
frontchar(Reply, 'n', _),
remember(X, Y, no).
remember(X, Y, yes) :- assertz(xpositive(X,Y)).
remember(X, Y, no) :- assertz(xnegative(X,Y)).
/* Уничтожение всех старых фактов */
clear_facts :- write("\n\nНажмите пробел для выхода\n"),
retractall(_, dbasedom), readchar(_).
Это заключительная деталь о которой необходимо позаботиться. Между
запусками программы все факты, которые были добавлены в базу данных необ-
ходимо удалить, или же использовать для добавления новых фактов о других
животных, которых вы знаете. Это легко выполняется с помощью предиката
tractall, который встроен на низком уровне в подцель run, подразумеваемую
в предикате clear_facts.
run :-
animal_is(X), !,
write("\nВаше животное должно быть ", X),
nl, nl, clear_facts.
run :-
write("\nВаше животное не возможно"),
write("определить.\n\n"),
clear_facts.
Для практики введите в компьютер приведенные выше процессор вывода и
базу знаний. Прибавьте к ним ряд объявлений, для дополнения программы, и
затем проверьте какой будет получен результат. Полный текст программы с
экспертной системой по животным находится в файле CH18EX01.PRO.
Пример оболочки экспертных систем (GENI.PRO), также разработанной на
Турбо Прологе, находится в каталоге PROGRAMS. Эта оболочка базируется на
технике, которая представлена в данном примере, вместе с дополнительными
возможностями, которые позволяют вам динамически изменять правила.