Расширения экспертной системы
В этом разделе мы рассмотрим предикаты unify_body и call, настоящей
оболочки экспертной системы, используемые в механизме вывода, обсужденном
в предыдущих разделах данного приложения.
Используемые оболочкой области термов более или менее совпадают с
уже описнными. Поэтому мы не станем выписывать предложения для
unify_term, т.к. в них нет ничего нового.
Определение этой оболочки включает три требования, выходящие за пре-
делы возможностей цепочки обратных рассуждений, принятой в Прологе:
1. Фактор уверенности формирует часть правил и выводов из них.
2. Если пользователю задан вопрос, то система всегда может объ-
яснить, почему она его задала.
3. Все выводы могут быть объяснены с помощью ссылок на предыду-
щие рассуждения.
Эти требования суммированы в трех дополнительных аргументах предика-
та unify_body.
1. real, являющийся фактором уверенности, созданным заключением
подцели.
2. Терм, являющийся заголовком выполняемого в даныый момент
правила; он позволяет системе сформулировать фразу: "Я задаю
этот вопрос, потому что пытаюсь устаносить <заголовок правила>.
3. Статический терм, осуществляющий продвигающуюся вперед трас-
сировку; он будет получать установленную версию тела, над кото-
рой работает unify_body, подразумевая, что термы, которые явля-
ются переменными в процессе перехода тела в unify_body и call,
будут изменены на те значения, которые они получат в процессе
выполнения.
Поместив эти установки тела в базу данных, любое заключение можно
будет объяснять ссылкой на ранее доказанные положения.
Конечно, мы не приводим здесь всю программу. Это только показ воз-
можного расширения возможностей первоначального механизма вывода. Дейст-
вительный код для unify_body и call выглядит так:
predicates
nondeterm unify_body(sTerm, sTerm, real, env, aTerm)
nondeterm call(string, aTermList, real, aTerm)
unify_body_once(sTerm, sTerm, real, env, aTerm)
clauses
call(true_tok, [], 1.0,_):-!.
call("=", [X, X], 1.0,_):-!.
call(Eval_tok, [Res, T2], 1.0,_):-!.
bound(T2), !,
eval(T2, r),
Res=R.
call(ID, ATermList, Cf,_):-
fact(_, cmp(ID, STermList), Cf),
free(E),
unify_terml(ATermList, STermList, E), !.
call(ID, ATermList, Cf,_):-
rule(Rule_Numder, cmp(ID, ATermList1), Body, Ruke_Cf,_),
free(Env),
unify_terml(ATermList, ATermList1, Env),
FID=ID,
unify_body_once(Body, Sbody, Cf_Out, Env, cmp(FID,ATermList)),
unify_terml(ATermList, STermList, Env),
min(Cf_out, Rule_Cf, Cf),
asserta(fact(Rule_Number, cmp(ID, STermList), Cf)),
conclude(cmp(ID, STermList), Sbody, Cf, Env).
call(ID, ATermList, Cf, Mum):-
question(Rule_Number, cmp(ID, STermList), Proplist),
free(E),
unify_terml(ATermList, STermList, E),
FID =ID,
askuser(cmp(FID, ATermList), Cf, Proplist, Mum, E),
unify_terml(ATermList, STermList1, E),
asserta(fact(Rule_Number, cmp(ID, STermList1), Cf)),
unify_body_once(Body, Sbody, Cf_Out, Env, Mum):-
unify_body(Body, Sbody, Cf_Out, Env, Mum), !.
unify_body(cmp(and_tok, [Term1, Term2]),
cmp(and_tok, [ST1, ST2]), Cout, Env, Mum):- !,
unify_body(Term1, ST1, Cf1, Env, Mum), Cf1>0.0,
unify_body(Term2, ST2, Cf2, Env, Mum), Cf2>0.0,
min(Cf1, Cf2, cout).
unify_body(cmp(or_tok, [T1, T2]), STerm, Cf, Env, Mum):-
unify_body(T1, STerm, Cf, Env, Mum),
Cf>0.0;
unify_body(T2, STerm, Cf, Env, Mum),
Cf>0.0 !.
unify_body(cmp(or_tok, TL1), cmp(or_tok, TL2), 0.0, Env,_):- !,
unify_term1(T, TL1, Env),
unify_term1(T, TL2, Env),
unify_body(cmp(not_tok, [ATerm]), cmp(not_tok,
[NTerm]), Cout, Env, Mum):- !,
unify_body(ATerm, NTerm, Cf, Env, Mum), !,
cout= 1.0-Cf, Cout>0.0.
unify_body(cmp(not_tok, [ATerm]), cmp(not_tok,
[NTerm]), 1.0, Env,_):- !,
unify_term(T, ATerm, Env),
unify_term(T, NTerm, Env).
unify_body(cmp(ID, ATermList), cmp(ID, TL), Cf, Env,Mum):-
unify_term1(Call, ATermList, Env),
FID=ID,
Call(FID, Call, Cf, Mum),
Cf>0.0,
unify_term1(Call, TL, Env).
Символические константы (такие как and_tok) получают свои действи-
тельные значения из расположенных в другом месте объявлений констант, тем
самым облегчая разработку различных статических идентефикаторов.
Первый аргмент unify_body - это аргумент ввода, как и в первоначаль-
ном механизме вывода, в то время как второй - это версия вывода с уста-
новками, используемая для объяснения заключения. Данный принцип показан
на примере трех предложений для дизъюнкции (or_tok): если не выполняются
обе возможности, предусмотренные для дизъюнкции, то нам все равно надо
выполнить двойное объединение термов, чтобы получить какие-либо значения,
которые могут быть в среде, объясняющие терм:
unify_body(cmp(or_tok, TL1), cmp(or_tok, TL2), 0.0, Env,_):- !,
unify_term1(T, TL1, Env), unify_term1(T, TL2, Env),
Невыполнение по-прежнему вызывается успешным выполнением с уверен-
ностью 0.0. То же самое происходит в случае not:
unify_body(cmp(not_tok, [ATerm]), cmp(not_tok,
[NTerm]), Cout, Env, Mum):- !,
unify_body(ATerm, NTerm, Cf, Env, Mum), !,
cout= 1.0-Cf, Cout>0.0.
unify_body(cmp(not_tok, [ATerm]), cmp(not_tok,
[NTerm]), 1.0, Env,_):- !,
unify_term(T, ATerm, Env),
unify_term(T, NTerm, Env).
Если вызывается второе предложение для not, то это означает, что
ATrem не может быть выполнен: поэтому мы достигли успеха с вероятностью
1.0. Это показывает одну из сложностей, связанных с предикатом not; на
самом деле not не генерирует значения, противоположного своему аргументу,
поэтому неуспех при попытке выполнить not может возникнуть только при
факторе уверенности равном 0.0. Фактор уверенности 0.00001 уже будет рас-
ценен как успех.
Последнее предложение unify_body:
unify_body(cmp(ID, ATermList), cmp(ID, TL), Cf, Env,Mum):-
unify_term1(Call, ATermList, Env),
FID=ID,
Call(FID, Call, Cf, Mum), Cf>0.0,
unify_term1(Call, TL, Env).
затем вызывает call и унифицирует терм из списка термов, возвращенного из
call. Мы не станем углубляться в детали работы предиката call (хватит -
значит хватит). Достаточно сказать, что база данных содержит три различ-
ных структуры: факты, правила и вопросы. Это противоречит только одной
структуре, используемой в первоначальном механизме вывода и называемой
предикатом clause.
Когда нужно выполнить требование некоторой подцели, то система пер-
вым делом смотрит, может ли это быть получено как факт. Если нельзя, сис-
тема ищет правило и, если это также не получается, она ищет вопрос, кото-
рый можно задать пользователю. Обратите внимание, что успех или неуспех
правила или вопроса поступает в базу данных как факт, чтобы избежать за-
давания одно и того же вопроса или вычисления одного и того же правила по
нескольку раз.
Запоминание полученных результатов является очень удобной стратеги-
ей, когда база правил работает только с принятием или отвержением гипоте-
зы, т.к. позволяет значительно экономить время работы процессора. Но эта
стратегия становится плохой, если правила включают предикаты, дающие по-
бочные эффекты, как в примерах рассмотренных ранее. Это пример определе-
ния различия, которое следует проводить между логической обоснованностью
гипотезы и побочными эффектами, к которым может привести ее доказательст-
во.
- Справочное руководство по турбо прологу 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
- Заключение