Процедура present
Процедура present! Answer)
приведенная в листинге 16.5, отображает окончательный результат сеанса экспертной консультации и вырабатывает объяснение последовательности рассуждений. Параметр Answer включает и ответ на вопрос пользователя, и дерево доказательства, показывающее, как было получено это заключение. Процедура present вначале выдает заключение. А если пользователь затем пожелает увидеть, как было сформировано это заключение, введя вопрос "how", то в некоторой приемлемой форме отображается дерево доказательства, которое представляет собой объяснение последовательности рассуждений. Форма такого объяснения показана на примерах в разделах 16.2.1 и 16.2.4.
Листинг 16.5. Командный интерпретатор экспертной системы: процедура, которая отображает окончательный результат и выводит объяснение последовательности рассуждений
% Процедура, которая отображает результат экспертной консультации и выводит % объяснение последовательности рассуждений
present; Answer) :-
nl, show-conclusion ( Answer) ,
nl, write( 'Would you like to see how? '),
getreply( Reply) ,
( Reply = yes, ! ,
show( Answer) % Показать дерево решения
true ) . showconclusion ( Answerl and Answer2) :- !, showconclusion; Answerl) , write ( 'and ' ) , showconclusion ( Answer2) .
376 Часть II. Применение языка Prolog в области искусственного интеллекта
showconclusion( Conclusion was Found) :-write( Conclusion).
% Процедура show отображает полное дерево решения
! . |
show( Solution) :-
show( Solution, 0) ,
show( Answerl and Answer2, H) :- !, show( Answerl, H) , tab( H) , write( and), nl, show( Answer2, H) .
show( Answer was Found, H) :-tab( H) , writeans( Answer), nl, tab( H) , write ( 'was ' ) , showl( Found, H) .
showl( Derived from Answer, H) :- !, write( Derived), write ( 'from'),
nl, HI is H + 4, show( Answer, HI).
% Установить отступ, равный 0 % Установить отступ, равный Н
% Отступ на Н
% Показать экспертное заключение
% Показать подтверждение
% Вывести имя правила
% Показать исходное высказывание
showl( Found, _) :- % Переменная Found может принимать значения 'told' % (указано пользователем) или 'found as fact' (найдено как факт) write( Found), nl.
writeans( Goal is true) :- !, write( Goal) .
writeans( Answer) :-write( Answer).
%
%
%
Исключить в выводе слова 'is true' (является истинным) Это - отрицательный ответ
16.3.5. Управляющая процедура верхнего уровня
Для обеспечения удобного доступа к командному интерпретатору экспертной системы из среды интерпретатора Prolog требуется управляющая процедура, образцом которой может служить процедура expert (листинг 16.6). После вызова на выполнение процедура expert координирует работу трех основных модулей командного интерпретатора (см. листинги 16.3-16.5), например, следующим образом: ?- expert.
Question, please: % Приглашение пользователю к вводу вопроса X isa animal and goliath isa X. % Вопрос пользователя Is it true: goliath has hair?