Встроенные предикаты
И, наконец, поговорим о некоторых побочных эффектах. Раньше мы уже
использовали один встроенный предикат, имющий имя true, для завершения
выполнения базы правил. Другие встроенные предикаты, вызывающие побочные
эффекты или конвертирующие способ представления информации, можно вклю-
чать таким же способом. Рассмотрим очевидное расширение команды call:
call("fail", []):- !, fail.
У нас было true. С помощью fail мы можем передать телу значение "ес-
ли это факт существует, то это неверно" (хотя такую операцию можно было
бы совершить и с помощью not). Или рассмотрим подачу звукового сигнала:
call("beep", []):- !, beep.
"подтверждение" beep приведет к побочному эффекту - компьютер подаст
звуковой сигнал. А вот несколько более полезный предикат, один из тех,
которые используются для объединения строк:
call("concat",[str(A), str(B), str(C)]):- !, concat (A,B,C).
Это - основа других предикатов, котороые можно строить с такой же
легкостью. Необходимо понять очень важную мысль, что можно создать меха-
низм вывода, выполняющий интерпретацию правил с обратной цепочкой рассуж-
дений, который может включать (но не ограничен только ними) любые стан-
дартные предикаты Турбо Пролога. Если вам нужно что-то, чего нет в Турбо
Прологе, вы просто сделаете сами, у вас получится интерпретатор с теми
встроенными предикатами, которые необходимы вашей базе правил.
Уникальные встроенные функции можно писать даже на других языках,
таких как Си и ассемблер. База правил может их вызывать прямо из Турбо
Пролога. В Турбо Прологе есть редко используемые предикаты низкого уров-
ня, с помощью которых можно создать оболочку экспертных систем, использу-
ющих встроенные предикаты, непосредственно взаимодействующие с импортом и
экспортом, вызовом подпрограмм BIOS или даже управляющих модемом. При их
написании пользуйтесь подсказкой, имеющейся в Turbo Prolog Toolbox.
При работе со встроенными предикатами интерпретатора наиболее слож-
ной мыслью для понимания является тот факт, что мы можем создать то, что
пока не поддерживается встроенными предикатами системы Турбо Пролога. Это
будет полностью показано, по мере того как мы продолжим создание механиз-
ма вывода для интерпретатора Пролога.
Сейчас мы обсудим реализацию предиката, совершающего текущую оценку
дерева арифметических выражений. При создании традиционного Пролога этому
предикату дали имя is.
call("is", (int(Res), T2]):- !, eval (T2, Res).
is не может быть вычислен непосредственно в Турбо Прологе, но он
создан с помощью предиката eval:
predicate
eval(aTerm, refInt)
clause
eval(T,_) :- free(T),!, fail.
eval(int(I), I) :- !.
eval(cmp("+",[T1, T2]), R) :- !,
eval(T1, R1), eval(T2, R2), R = R1 + R2.
eval(cmp("-",[T1, T2]), R) :- !,
eval(T1, R1), eval(T2, R2), R = R1 - R2.
eval(cmp("*",[T1, T2]), R) :- !,
eval(T1, R1), eval(T2, R2), R = R1 * R2.
eval(cmp("/",[T1, T2]), R) :- !,
eval(T1, R1), eval(T2, R2), R = R1 div R2.
eval(cmp("-",[T]), R) :- !,
eval(T, R1) R = R1 - R2.
eval(cmp("mod",[T1, T2]), R) :- !,
eval(T1, R1), eval(T2, R2), R = R1 mod R2.
eval(cmp("abs",[T]), R) :- !,
eval(T, R1) R = abs(R1).
Вот пример использования eval:
/* пример оценивающего предиката */
Goal: eval(cmp("+",[int(2), int(3)]), Result)
Result = 5
1 solution
Арифметические выражения - это просто термы Пролога со специальными
функторами, т.е. хорошо известные арифметические операторы. Предикат eval
не включает ничего странного, но обратите внимание на легкость добавления
других предикатов оценки, как, например, мы добавили предикат abs.
Так как мы решили представлять числовые термы в виде целых, то воз-
никают некоторые ограничения на то, что можно успешно добавлять. Однако,
если бы мы выбрали значения с плавающей точкой (что потребует небольших
изменений в объявлениях сканнера и области), то возможности бы резко воз-
росли. Тогда бы вы смогли включить в ваш механизм вывода оценочные преди-
каты, работающие со специальными инженерными или статистическими функция-
ми.
Рассмотрим работу с целыми числами на примере реализации преобразо-
ваний градусов Фаренгейта в градусы Цельсия и наоборот, как арифметичес-
ких функций:
eval(cmp("fahrenheit",[T]), R) :- !,
eval(T, R1) R = R1 * 9 div 5 + 32.
eval(cmp("celsius",[T]), R) :- !,
eval(T, R1) R = (R1 - 32) * 5 div 9.
Эти правила могли бы включать что-либо типа:
..., Triple_far is fahrenheit(Celsius_temp) * 3, ...
(хотя мы и не знаем, зачем это вам потребовалось).
Имея значения с плавающей точкой, можно сделать более полезный при-
мер для гиперболического синуса, косинуса и тангенса:
eval(cmp("sinh",[T]), R) :- !,
eval(T, R1) R = (exp(R1)-exp(-R1))/2.
eval(cmp("cosh",[T]), R) :- !,
eval(T, R1) R = (exp(R1)+exp(-R1))/2.
eval(cmp("tanh",[T]), R) :- !,
eval(T, R1) X = (exp(-R1), R = X/exp(-R1))+X+X+1.
Или напряжение при разряде аккамулятора
eval(cmp("capvolt",[V,T, C, R]), CV) :- !,
eval(V, EV) eval(T, ET),
eval(C, EC) eval(R, ER),
CV = EV*EXP(-ET/(EC*ER)).
Предположим, ваша база правил включает предикат, возвращающий дейст-
вующее напряжение, силу тока и сопротивление земли для данной лучевой
трубки и телевизора. Вам надо определить можно ли коснуться конденсатора
высокого напряжения, вычислив текущее напряжение (Tension), как функцию
этих параметров и время, прошедшее с момента выключения телевизора:
..., params (Brand, Volt, Cap, Leak),
Tension is capvolt(Volt, Time * 60, Cap, Leak)/Humid_fact,
Tension < Safe_lim, ...
Если бы пользователя спросили бы о времени в минутах, то Humid_ fact
стал бы фактором, учитывающим влажность воздуха, Safe _lim - это вопрос,
который мы не будем обсуждать в настоящем приложении.
Конечно оболочка должна будет работать со встроенным предикатом <,
но мы проиллюстрируем это позже. Вероятно, труднее всего будет установить
влияние влажности воздуха, которая должна базироваться на эмпирических
результатах и интуитивных правилах (обратите внимание, что в целях эконо-
мии сил мы советуем использовать терм "эвристика" во всех случах, когда
вы публично обсуждаете подобные вопросы). При действительной реализации
данной задачи ничто не мешает вам соединить гидрометр с компьютером и
позволить оболочке экспертной системы считывать показания с помощью пре-
диката portbyte прямо в Турбо Пролог.
Или, предположим, вам надо оценить скорость поршня в поршневой маши-
не, данной с помощью 2 * stroke * rpm:
eval(cmp("pist_speed", [S, RPM), R) :- !,
eval(S, ES), eval(RPM, ERPM), R = ES * ERPM/360
Код правильный; pist_speed получает stroke в дюймах и ударах в мину-
ту, а возвращает скорость в футах в секунду.
Как вы могли заметить, смонтированный вами специализированный меха-
низм вывода может стать сердцем легко программируемой экспертной системы,
используемой в каком-либо серьезном анализе: финансовом, инженерном или
управляющим и контролирующим работу завода. В дополнение к вводу portbyte
от внешних датчиков, прибавьте некоторые украшения, взяв их из Borland
Grapfics Interface (BGI), и вы получите оболочку, снабжающую вашу базу
правил немедленным сенсорно-топографическим отображением происходящего.
Ваши правила будут определять, нужно ли считать текущие данные нормальны-
ми, а если нет, то используйте встроенную в оболочку модемную коммуника-
цию, чтобы предупредить супервизора и уточнить текущее состояние. Супер-
визором может быть как человек, так и другая машина.
С другой стороны, ничто не смогло бы остановить те компании, произ-
водяшие компьютеры, в чьи контракты по обслуживанию включены регулярная
передача и анализ ошибок пользователя, от перекладывания этой задачи на
специальную оболочку экспертной системы и соответствующей базы данных.
Разумность любой ситстемы зависит от двух причин: встроенных специа-
лизированных особенностей оболочки - которые создаются "инженером по обо-
лочкам" со специальными знаниями в применяемой области, и правилами, ис-
пользующими эти встроенные особенности. Такую оболочку можно было бы наз-
вать "разумная интегрированная среда для базы знаний".
Вероятно не существует области в научных исследованиях и в сфере об-
служивания, которая бы больше проклиналась щедрыми охотниками сильнее чем
рынок ИИ. Так как наступления Borland на разработку систем и работающего
инструментария продолжается, то нам было бы очень приятно услышать от ис-
следователей в области Применений Искусственного Интеллекта, кто развил
систему, основанную на этих идеях. Конечно, не обязательно глубоко прора-
ботать новую область, но все-таки хотелось бы прояснить отличие традици-
онного ИИ от Применений ИИ.
- Справочное руководство по турбо прологу 2.0
- Глава 2. Элементы языка 50
- Глава 3. Интерфейс с другими языками 75
- Часть 2. Стандартные предикаты 91
- Часть 3. Приложения 250
- Введение
- Дистрибутивные диски
- Рекомендуемая литература:
- Часть 1. Руководство программиста по турбо прологу глава 1. Система меню турбо пролога
- Пользователям Турбо Пролога 1.X
- Структура меню Турбо Пролога
- Выбор элементов меню.
- "Горячие" клавиши.
- Системные окна и строки помощи
- Окно редактирования.
- Как войти в окно редактирования
- Компоненты окна редактирования
- Как выйти из окна редактирования.
- Окно трассировки
- Окно сообщений
- Диалоговое окно
- Строка помощи
- Главное меню.
- Окно редактирования.
- Окно вспомогательного редактирования (Xedit).
- Окно просмотра.
- Изменение размера окон.
- Просмотр окон
- Создание нового файла.
- Загрузка существующего файла.
- Команды редактора.
- Сохранение исходного текста в файле.
- Запись исходного текста на диск
- Вспомогательный редактор
- Меню и команды
- Меню файлов (Files)
- Загрузка файлов (Load)
- "Указка" (Pick)
- Новый (New)
- Выход (Quit)
- Команда редактирования (Edit)
- Команда запуска (Run)
- Меню компиляции (Compile)
- Память (Memory)
- Меню опций (Options)
- Опции компоновки (Link Options)
- Стек (Stack)
- Область ссылок (Trail Array)
- "Куча" (Heap)
- Контроль во время исполнения (Run-time check)
- Цвета (Colors)
- Размер окна (Window size)
- Каталоги
- Текущий каталог (Current directory)
- Авто-загрузка сообщений (Avto-Load Message)
- Режим экрана (Screen mode)
- Конфигурация клавиатуры (Keyboard Configuration)
- Перемещение курсора (Cursor movement)
- Глава 2. Элементы языка
- Ключевые слова.
- Специальные предикаты.
- Разделы программы.
- Раздел доменов (domains).
- Стандартные домены.
- Списковые домены.
- Домены составных объектов.
- Файловый домен.
- Специально заданные предопределенные домены.
- Сокращение объявлений доменов.
- Объявление ссылочных доменов.
- Раздел предикатов (predicates).
- Раздел базы данных (database).
- Раздел предложений (clauses).
- Простые константы.
- Переменные.
- Составные объекты.
- Списки - Специальный вид составных объектов.
- Раздел констант.
- Условная компиляция.
- Включение файлов в вашу программу.
- Директивы компилятора.
- Управление памятью в Турбо Прологе.
- Экономия ресурсов памяти.
- Управление распределением памяти.
- Генерирование выполняемых программ.
- Модульное программирование.
- Проекты.
- Глобальные объявления.
- Глобальные домены.
- Глобальная база данных.
- Глобальные предикаты.
- Компиляция и компоновка модулей.
- Пример.
- Глава 3. Интерфейс с другими языками
- Вызов других языков из Турбо Пролога.
- Что делать перед вызовом.
- Объявление внешних предикатов.
- Вызов соглашений и передача параметров.
- Соглашение об обозначениях
- Использование ключевого слова as
- Вызов процедуры, написанной на Си из Пролога.
- Опции компилятора Турбо Си и компоновка.
- Вызов программ на языке ассемблера из Турбо Пролога.
- Использование внутреннего ассемблера Турбо Си.
- Вызов Турбо Пролога из других языков.
- Динамическое распределение памяти.
- Передача составных объектов в другие языки.
- Передача списков.
- Передача структур.
- Примеры.
- Обработка списков.
- Программирование на низком уровне.
- Часть 2. Стандартные предикаты
- Arc/5 Графика
- Bar/4 Графика
- Bt_close/2 Внешняя База Данных
- Bt_create/5 Внешняя База Данных
- Bt_delete/2 Внешняя База Данных
- Bt_open/3 Внешняя База Данных
- Bt_statistics/8 Внешняя База Данных
- Chain_delete/2 Внешняя База Данных
- Chain_first/3 Внешняя База Данных
- Chain_inserta/5 Внешняя База Данных
- Chain_insertafter/5 Внешняя База Данных
- Chain_insertz/5 Внешняя База Данных
- Chain_last/3 Внешняя База Данных
- Chain_next/3 Внешняя База Данных
- Chain_prev/3 Внешняя База Данных
- Chain_terms/5 Внешняя База Данных
- Circle/3 Графика
- Cleardevice/0 Графика
- Clearviewport/0 Графика
- Closegraph/0 Графика
- Db_btrees/2 Внешняя База Данных
- Db_chains/2 Внешняя База Данных
- Db_close/1 Внешняя База Данных
- Db_create/3 Внешняя База Данных
- Db_delete/2 Внешняя База Данных
- Db_flush/1 Внешняя База Данных
- Db_garbagecollect/1 Внешняя База Данных
- Db_open/3 Внешняя База Данных
- Db_openinvalid/3 Внешняя База Данных
- Db_statistics/5 Внешняя База Данных
- Detectgraph/2 Графика
- Drawpoly/1 Графика
- Ellipse/6 Графика
- Fillellipse/4 Графика
- Fillpoly/1 Графика
- Floodfill/3 Графика
- Getarccoords/6 Графика
- Getaspectratio/2 Графика
- Getbkcolor/1 Графика
- Getcolor/1 Графика
- Getdefaultpalette/1 Графика
- Getdrivername/1 Графика
- Getfillpattern/1 Графика
- Getfillsettings/2 Графика
- Getgraphmode/1 Графика
- Getimage/6 Графика
- Getlinesettings/3 Графика
- Getmaxcolor/1 Графика
- Getmaxx/1 Графика
- Getmaxy/1 Графика
- Getmaxmode/1 Графика
- Getmodename/2 Графика
- Getmoderange/3 Графика
- Getpalette/1 Графика
- Getpalettesize/1 Графика
- Getpixel/3 Графика
- Gettextsettings/5 Графика
- Getviewsettings/5 Графика
- Getx/1 Графика
- Gety/1 Графика
- Graphdefaults/0 Графика
- Graphresult/1 Графика
- Imagesize/5 Графика
- Initgraph/5 Графика
- Key_current/4 Внешняя База Данных
- Key_delete/4 Внешняя База Данных
- Key_first/3 Внешняя База Данных
- Key_insert/4 Внешняя База Данных
- Key_last/3 Внешняя База Данных
- Key_next/3 Внешняя База Данных
- Key_prev/3 Внешняя База Данных
- Key_search/4 Внешняя База Данных
- Line/4 Графика
- Linerel/2 Графика
- Lineto/2 Графика
- Moverel/2 Графика
- Moveto/2 Графика
- Outtext/1 Графика
- Outtextxy/3 Графика
- Pieslice/5 Графика
- Pieslicexy/6 Графика
- Putimage/4 Графика
- Putpixel/3 Графика
- Rectangle/4 Графика
- Restorecrtmode/0 Графика
- Setactivepage/1 Графика
- Setallpalette/1 Графика
- Setaspectratio/2 Графика
- Setbkcolor/1 Графика
- Setcolor/1 Графика
- Setfillpattern/2 Графика
- Setfillstyle/2 Графика
- Setgraphmode/1 Графика
- Setgraphbufsize/1 Графика
- Setlinestyle/3 Графика
- Setpalette/2 Графика
- Setrgbcolor/4 Графика
- Settextjustify/2 Графика
- Settextstyle/3 Графика
- Setusercharsize/4 Графика
- Setviewport/5 Графика
- Setvisualpage/1 Графика
- Setwritemode/1 Графика
- Term_delete/3 Внешняя База Данных
- Term_replace/4 Внешняя База Данных
- Textheight/2 Графика
- Textwidth/2 Графика
- Часть 3. Приложения приложение а. Введение вdos
- Что такое dos
- Как загрузить программу?
- Каталоги
- Подкаталоги
- Avtoexec.Bat-файл
- Команда path
- Смена каталогов
- Приложениеb. Интерактивный редактор турбо пролога
- Быстрый вход, быстрый выход
- Служебная строка окна редактора
- Основные команды редактора
- Команды Редактора, совпадающие с командами WordStar Основные команды работы с курсором
- Команды быстрого движения курсора
- Команды вставки и удаления
- Команды работы с блоками
- Остальные команды редактора
- Старые команды
- Поиск и замена
- Редактор Турбо Пролога по сравнению с WordStar
- Корректировка файла на диске.
- Приложение c. Сообщения об ошибках
- Приложение d. Различия между версиями 1.1 и 2.0
- Файл определения проекта
- Новые ограничения по именам
- Новые предопределенные домены
- Контроль состава параметров шаблона (flow pattern)
- Поддержка старых командных клавиш редактора
- Ошибочные ситуации в стандартных предикатах
- Расширение Турбо Пролога 2.0
- Системные расширения
- Приложениеe. Словарь специальных терминов
- Приложение f. Географическая база данных (Geobase)
- Использование Geobase
- Системы с 2-мя флоппи-дисковыми устройствами
- Компиляция Geobase
- Создание автономной программы
- Главное меню Geobase
- Справка
- Команды dos
- Редактор
- Запросы к базе данных
- Просмотр языка
- Корректировка языка
- Принципы Geobase
- Использование принципа Geobase
- Создание вашей базы данных
- Преобразование Geobase
- Предикат "ent"
- Предикат "db"
- Трансляция запросов на естественном языке
- Внутренние имена объектов
- Внутренние имена связей
- Определение структуры предложений
- База данных языка
- Грамматический разбор с помощью разделения списков
- Заключение
- Приложение g. Анализатор предложений на турбо прологе
- Использование анализатора предложений
- Помощь пользователя
- Операционная система
- Редактирование базы данных
- Загрузка базы данных из файла
- Сохранение базы данных
- Анализ предложений
- «Показать/изменить словарь»
- Приложениеh.Geni: оболочка экспертной системы
- Использование geni
- Запросы geni
- Просмотр знаний
- Корректировка базы знаний
- Сохранение базы знаний
- Создание новой базы знаний
- Чистка текущей базы знаний
- Проектирование новой базы знаний
- Приложение I. Tlib: библиотека турбо
- Компоненты командной строки tlib
- Компонент «описание»
- Список операций
- Имена файла и модуля
- Операции tlib
- Создание библиотеки
- Использование файла ответа
- Расширенные возможности: опция /с
- Примеры
- Приложение j. Tlink: компоновщик турбо
- Активизация tlink
- Использование ответных файлов
- Компоновка модулей Турбо Пролога и Турбо Си.
- Модуль инициализации
- Библиотеки
- Опции tlink
- Опция /c
- Опция /d
- Опция /I
- Опция /l
- Опции /m, /s, /X
- Опция /m
- Опция /s
- Опция /X
- Опция /n
- Ограничения
- Сообщения об ошибках
- Предупреждения
- Нефатальные ошибки
- Фатальные ошибки
- Приложение k. Метапрограммирование Введение
- Пролог/Турбо: развитие и философские установки
- Конструкторские решения в Турбо Прологе
- Чем Турбо зарядило Турбо Пролог
- Интерпретатор правил с обратной цепочкой рассуждений
- Термы (горючее для интерпретатора правил)
- Статические термы: область sTerm (статических термов)
- Интерпретирование области термов.
- Что такое интерпретатор?
- Интерпретация правил в Прологе
- Использование sTerm и aTerm для моделирования интерпретатора правил
- Переменные и среда
- Процесс унификации
- Унификация статических и действительных термов
- Интерпретация тела правила
- Выполнение выполняемых термов: предикат call.
- Встроенные предикаты
- Сканнер и транслятор
- Операторы традиционного Пролога
- Использование операторов в Турбо Прологе
- Интерпретатор Пролога
- Реализация трассировки
- Теперь объединим все вместе
- Расширения экспертной системы
- Цепочка с прямым порядком рассуждений
- Стандартные предикаты, реализованные в pie
- Заключение