Скачиваний:
36
Добавлен:
01.05.2014
Размер:
225.79 Кб
Скачать

19.2. Усовершенствованные метаинтерпретаторы для экспертных систем

Общепринятое представление экспертной системы в виде базы знаний и механиз­ма вывода не полностью пригодно для экспертных систем, написанных на Прологе. Многие функции механизма вывода обеспечиваются самим Прологом. Базы знаний, образованные средствами Пролога, являются выполняемыми. Однако Пролог не обеспечивает некоторых важных свойств экспертных систем, обычно встроенных в механизм вывода. Примеры таких свойств "порождение объяснений и рассуждения в условиях неопределенности.

Рассмотрим здесь несколько усовершенствованных метаинтерпретаторов, демонстрирующих три свойства экспертных систем: взаимодействие пользователя и программы, средства объяснения и механизм рассуждении в условиях неопределенности.

Средства объяснения и интерактивная оболочка будут продемонстрированы на примере модельной экспертной системы, представленной программой 19.6.Эта программа способна решить, где в печи должно быть размещено блюдо для выпекания. Комментарии относительно пригодности Пролога для построения экспертных систем даны в конце главы в разделе «Дополнительные сведения».

поместить_в_печь(Блюдо, Полка)

Блюдодолжно быть помещено для выпекания в печь на полкуПолкаопределенного уровня.

поместить_в_печь(Блюдо,верх) 

кондитерское, изделие(Блюдо), размер,(Блюдо,малый). поместить_в_печь(Блюдо,середина) 

кондитерское_изделие(Блюдо),размер(Блюдо,большой). поместить_в_печь(Блюдо,середина) 

главное-блюдо(Блюдо).

поместить_в_печь(Блюдо,низ) 

медленное- выпекание(Блюдо). кондитерское_изделие(Блюдо) тип(Блюдо,торт). кондитерское изделис(Блюдо) тип(Блюдо,хлеб).

главное_блюдо(Блюдо) тип(Блюдо,мясо). медленное_выпекание(Блюдо) тип(Блюдо,молочный_пудинг).

Программа 19.6.Экспертная программа для выбора места ,размещения блюда в печи

Программа 19.7представляет собой интерактивную оболочку, которая может задавать пользователю вопросы в случае нехватки информации. Предполагается, что определена процедура askable/1.которая в случае безуспешного решения цели интерпретатором может направить ее на рассмотрение пользователю. Чтобы реализовать такую возможность, в конце текста метаинтерпретатора (программа19.1)добавлено следующее предложение:

solve(A) 

askable(A), not known(A),

ask (A. Answer), respond (Answer, A).

Предикат askable (Goal)используется для вывода на экран вопроса к пользователю. Например, факт askable(type(Dish,Type))указывает, что можно спросить о типе блюда.

save (Goal)

Goal-цель,выводимая из программы на чистом Прологе, определяемой предложением clause/2.Недостающая информация запрашивается у пользователя.

solve(true).

solve((A,B)) 

solve(A), solve(B).

solve(A) 

clause(A,B),solve(B).

solve(A) 

askable(A), not known(A), ask(A,Answer), respond(Answer,A).

ask(A, Answer) 

display _query(A), read(Answer),

respond(yes,A) 

assert(A), respond(no,A) 

assert(untrue(A)), fail

known(A)  A.

known(A)  untrue(A).

display_query(A)  write(A), write('?'). Программа 19.7.Интерактивная оболочка.

.Чтобы избежать повторения одних и тех же вопросов, программа записывает ответы на вопросы, что обеспечивается предикатом respond/2.Если на вопросА последовал ответ yes,то в программу вводится фактА.Если же получен ответпо,то в программу вводится факт untrue (А).Эта информация используется предикатомknown/l,чтобы избежать задания вопросов, ответы на которые уже известны программе.

Усовершенствованная версия оболочки позволяет так же успешно вести диалоги и с другой стороны. Когда программа задает вопрос, пользователь может ответить своим собственным вопросом. Рассмотрим, как оболочка ответила бы на вопрос пользователя «почему».

Естественным ответом оболочки должно быть правило, на основании которого программа пытается сделать вывод.

Такую возможность легко ввести в оболочку, расширяя все отношения дополнительным аргументом, используемым текущим правилом. Поскольку в Пролог - программах доступ к глобальному состоянию процесса вычислений невозможен, это правило должно быть явно представлено в дополнительном аргументе. Как будет показано ниже. соответствующим образом должна быть расширена и цель solve. Интерфейс для обеспечения ответа на вопрос «почему?» реализуется следующим правилом:

respond (why, Goal, Rule) 

display_rule(Rule).ask (Goal, Answer). respond (Answer. Goal. Rule).

Эта версия предиката respondпереписывает текущее родительское правило и приглашает пользователя ответить еще раз. Формат, в котором будет представлено это правило, определяется предикатом display_rи1е-модульным расширением оболочки, позволяющим пользователю представлять правила в удобной для него форме.

Повторные ответы на вопрос «почему?», использующие предложение respond, приводят к повторной переформулировке родительского правила. Улучшенное решение состоит в выдаче прародительского правила в ответ на второй вопрос «почему?», прапрародительского правила в ответ на третье «почему?» и так далее вверх по дереву поиска. С этой цель.программа модифицируется так, чтобы аргумент вместо правила содержал список правил, учитывающих предысторию. Новый вариант предиката respondбудет выглядеть так:

respond(why,Goal,[Rule] Rules]) 

write_rule(Rule), ask (Goal, Answer),

respond (Answer. Goal, Rules).

На повторные вопросы «почему?» будут теперь выданы правила, учитывающие предысторию. Для учета случая, когда все правила для ответа исчерпаны, необходимо дополнительное предложение.

Программа 19,8представляет собой полную интерактивную оболочку, включающую средства объяснения. Протокол работы этой программы показан на рис. 19.3. Ответы пользователя набраны курсивом. Объясним еще не рассмотренные предикаты этой программы.

soke(Goal)

Goal -цель, выводимая из программы на чистом Прологе, определенной предложением clause/2.Недостающая информация запрашивается у пользователя, пользователь может просить объяснения «почему?».

solve(Goal)  solve(Goal,[ ]).

solve(true,Rules).

solve((A,B).Rules)

solve(A,Rules), solve(B,Rules). solve(A,Ru1es) 

clause(A,B), solve(B,[rule(A,B) | Rules]). solve(A,Rules) 

askable(A),not know(A),

ask(A,Answer),respond(Answer,A,Rules).

ask(A,Answer) 

display _query(A), read(Answer).

respond(yes, A, Rules) 

assert(A).

respond(no, A, Rules) 

assert(intrue (A)), fail

respond(why,A,[Rule | Rules]) 

display_rule( Rule),

ask(A,Answer),

respond(Answer,A,Rules).

respond(why,A,[ ]) 

writeln(['Возможности объяснения исчерпаны']),

ask(A,Answer),

respond(Answer,A,Ruies).

known(A)  A.

known(A)  untrue(A).

display _query(A) 

why(A),write(‘?’).

display_rule(rule(A,B)) 

write('lF'),write_conjunction(B),writeln(['THEN’,A]).

write_conjunction((A,B)) 

!,write('AND'),wnte„conjunction(B).

write_conjunction(A) 

write(A),nl.

Программа 19.8.Интерактивная оболочка со средствами объяснения «почему?>;

Solve(поместить_в_печь(блюдо1,X))?

тип (блюдо1, торт)? да.

размер (блюдо1, малый)? нет.

тип (блюдо1,хлеб)?нет.

размер (блюдо1, большой)? почему.

IFкондитерское изделие (блюдо1)

ANDразмер (блюдо1,большой)

THENпоместить_в_печь(блюдо1, середина)

размер (блюдо1, большой)? да.

Х =середина

Рис 19.3.Протокол работы с интерактивной оболочкой.

Вторым аргументом предиката solve (Goal, Rules)в программе 19,8-является список правил, используемых для редукции предковых вершин цели Goalв текущем дереве доказательства. Список правил обновляется с помощью предиката solveв процессе редукции цели. Для представления правил выбрана структура rule(А, В). Единственным предикатом, на который влияет выбор представления правила, является предикат display_rule.

Ответы на вопрос «почему?» -это простое средство объяснения, описывающее одну локальную цепочку рассуждений. Следующий пример представляет собой более интересное средство объяснения, поясняющее полное доказательство решенного вопроса.

Основная идея состоит в интерпретации доказательства цели, где доказательство представлено в метаинтерпретаторе программы 19.2.Вопрос, как доказывается цельGoal-how(Goal)?,обрабатывается метаинтерпретатором, который производит интерпретацию полученного доказательства. Простое средство объяснения «как» представлено в виде программы 19.9.

На рис. 19.4показан протокол, использующий программу .19.9для объясненияhow (поместить_в_печь(блюдо1, верх))? сиспользованием фактовтип (блюдо1,хлеб) иразмер (блюдо1, малый).

Хотя объяснение на рис. 19.4 исчерпывающе понятно, оно имеет скрытые

how(Goal)

Объясняет, как была доказана цель Goal.

how(Goal) 

solve(Goal,Proof),interpret(Proof).

solve(Goal,Proof)  См. программу 19.2.

interpret((Proofl,Proof2)) 

interpret(Proofl),interpret(Proor2).

interpret(Proof)

fact(Proof,Fact),

nl,writeln([Fact,'факт в базе данных.']).

interpret(Proof) 

rule(Proof,Head,Body,Proofl),

nl,writeln([Head,’доказывается с помощью правила’]).

display _ru1e(rule(Head, Body)),

interpret(Proof).

fact((Fact  true),Fact).

ru1e((Goal  Proof,Goal,Body,Proof)

Proof  true,extract,body(Proof,Body).

extract_body((Proofl,Proof2),(Bodyl,Body2))

!, extract _body(Proofl ,Body 1 ),extract_body(Proof2,Body2).

extract, body((Goal  Proof),Goal).

disp1ay_rule(Ru1e)  Cм.программу 19.8. Программа 19.9.Объяснение доказательства.

поместить_в _печь(блюдо1,верх) доказано с использованием правила

IFкондитерское_изделие (блюдо1) и размер (блюдо1, малый)

THENпоместить_в__печь (блюдо1, верх)

кондитерское.изделие (блюдо1) доказано с использованием правила

IFтип (блюдо1, хлеб)

THENкондитерское_изделие (блюдо1)

тип (блюдо1, хлеб) -факт, содержащийся в базе данных размер (блюдо1, малый) -факт, содержащийся в базе данных

Рис. 19.4.Формирование объяснения.

недостатки. Один из них-чрезмерная полнота объяснения, что приводит, даже для очень маленькой базы знаний, к выводу слишком большого объема информации. Экранный текст, произведенный экспертной системой, имеющей сотни правил, становится невразумительным. Практичная модификация программы 19.9ограничивает объяснения одним уровнем при одном обращении, но разрешает пользователю запрашивать при необходимости более детальную информацию. На рис. 19.5 представлен текст модифицированного объяснения.

поместить_в_печь (блюдо1, середина) доказано с использованием правила

IFкондитерское_изделие(блюдо1) и размер [блюдо1, большой)

THENпоместить_в_печь (блюдо1,середина)

кондитерское_изделие (блюдо1) может быть объяснено в дальнейшем размер(блюдо1,большой)-факт, содержащийся в базе данных

Рис. 19.5.Объяснение одного правила при одном обращении.

Объяснение, данное на рис. 19.4,точно отражает процесс вычисления на Прологе, но может не удовлетворять пользователя. Использование метаинтерпретатора позволяет добиться большей гибкости. Объяснения могут не отражать логику самой программы, однако должны содержать обоснование выбора правила. Для иллюстрации этого принципа рассмотрим очень простой пример.

Предположим, что объяснение связано с некоторым экспертом-пекарем, которому знакома классификация блюд, т.е. он знает, что является кондитерским изделием и т. п. Хотя программа все же проводит рассуждения, устанавливая, что если блюдо-торт и т.п., то оно должно быть кондитерским изделием, они не представляют интереса для пекаря. Указанная возможность может быть реализо­вана в программе с помощью специального предложения interpret,в теле которого содержится предикат classification (Goal)для целей, связанных с классификацией. Это предложение имеет вид

interpret((Goal  Proof))

classification(Goal),

writeln([Goal,'является примером классификации']).

Факт classificationявляется примером проблемно-зависимых метазнаний. Использование таких метазнаний позволяет эксперту строить теорию объяснения, которое скорее дополняет, а не повторяет доказательство, выполняемое экспертной системой. Несоответствие между тем. что говорится, и тем, что делается, характерно для экспертов-людей.

Специально выделенные объяснения полезны для описания выполнения системных предикатов, например арифметических или предикатов ввода-вывода. Такие цели Пролога имеют статус, отличающийся от точки зрения пользователя экспертной системы. Вообще все подпрограммы Пролога, реализующие алгоритмы, не нуждаются в объяснении: вместо этого может быть предложен более сжатый отчет о том, что делает соответствующий алгоритм.

Последний пример использования метаинтерпретаторов для экспертных систем связан с применением механизма рассуждении в условиях неопределенности. Причиной для введения такого механизма является наличие неопределенной информации - правил и фактов. Дедуктивный вывод при неопределенных предположениях должен приводить к неопределенным заключениям. Существует несколько способов представления неопределенности в правилах и способов вычисления неопределен­ности заключений. Основное требование состоит в том, чтобы в предельном случае, когда все правила определенные, поведение системы повторяло стандартный ме­ханизм дедукции.

Остановимся на следующем подходе. С каждым фактом или правилом свяжем коэффициент определенности с, 0 < с 1.Логическая программа с неопределен­ностями-это множество пар <Clause, Factor>,где Clause-предложение, a Factor -коэффициент определенности. Для вычисления неопределенностей будем использовать следующие правила:

certainty((A,B)) = min{certainty(A),certainty(B)}

certainty(A) = max{certainty(B)-F| <A В, F> -некоторая пара в программе}.

Простой интерпретатор, работающий в условиях неопределенности (программа 19,10),получен путем непосредственного усовершенствования базового метаинтерпретатора, представленного программой 19.1,Отношение верхнего уровняsolve(Goal,Certainty)истинно, когда цель Goalудовлетворена с определенностьюCertainty.

Метан" .':лпр-ч ipвычисляет комбинацию коэффициентов определенности в конъюнкции как минимумиз коэффициентов определенности элементов конъюнк-

solve (Goal, Certainty)

Certainly-наша уверенность в том, что цельGoal истинна.

solve(true,1). solvc((A.B),C) 

solve(A,Cl),solve(B,C2),minimum(Cl,C2,C). solve(A,C) 

clause_cf(A,B,Cl),solve(B,C2),С: = Cl *C2. minimun(Nl,N2.M)  Cм.программу 11.3.

Программа 19.10.Метаинтерпретатор для выполнения рассуждении в условиях неопределенности.

ции. Также легко могут быть определены и использованы другие правила вычисления коэффициента определенности. В программе 19.10предполагается, что предложения с коэффициентами определенности представлены с использованием предиката clause_cf(A, В, CF ).

Метаинтерпретатор, реализуемый программой 19.10,можно расширить так, чтобы отсекались пути вычислений, не приводящие к желаемому порогу определенности. Для этого необходимо добавить дополнительный аргумент-размер порога отсечения. Модифицированный метаинтерпретатор (программа 19.11)будет содержать новое отношение solve (Goal,Certainty,Threshold).

Порог определенности используется в третьем предложении программы 19.11. Определенность любой цели должна превышать текущее значение порога. .Если это происходит, то вычисления продолжаются с новым значением порога, равным частному от деления предыдущего значения порога на величину определенности этого предложения.

solve (Goal,Certainly,Threshold)

Certainty-наша.уверенность в том, что цель Goalистинна. Определенность выше порога Threshold.

solve(True,l,T).

solve((A,B),C,T) 

solve(A,C,T),solve(B,C2,T),minimum(C1,C2,C).

solve(A,C,T) 

clause_cf(A,B,Cl),

Cl >T,

T1:=T/C1,

solve(B,C2,Tl),

C:=C1*C2.

minimum(Nl,N2,M)  См.программу 11.3.

Программа 19.11.Метаинтерпретатор для выполнения рассуждении в условиях неопределенности с отсечением по порогу определенности.

Упражнения к разд. 19.2

1. Усовершенствуйте предикат display_rи1е таким образом, чтобы с его помощью генерировались не термы Пролога, а английский текст.

2. В программах 19.7 и 19.8 расширьте предикат known так, чтобы он обеспечивал обработку функциональных понятий.

3. Внесите в программу 19.8 такие изменения, которые позволили бы обрабатывать ответы, отличающиеся от дa, нет и почему?.

4. Модифицируйте программу 19.9 так. чтобы она давала протокол, представленный на pix. 19.5.

5.Введите в интерактивную оболочку механизм рассуждении в условиях неопределенности, с тем чтобы запрашивать пользователя о неопределенности фактов и правил. Записывайте значения так, чтобы они могли использоваться повторно.

Соседние файлы в папке prolog14_end