Листинг 16.6. Управляющая процедура командного интерпретатора экспертной системы. Командный интерпретатор можно вызвать на выполнение из системы Prolog с помощью процедуры
expert
% Управляющая процедура верхнего уровня
expert :-
getquestion( Question) , % Вывести приглашение пользователю к вводу вопроса ( answeryes( Question) % Попытаться найти положительный ответ
answerno( Question) ) . |
% Если положительного ответа нет, найти отрицательный
answeryes( Question) :- % Поиск положительных ответов на вопрос Question
mar-kstatus( negative), % Положительных ответов еще нет
explore! Question, [], Answer), % Трассировка пуста
Глава 16. Командный интерпретатор экспертной системы
positive! Answer}, % Выполнить поиск положительных ответов
markstatusC positive), % Положительный ответ найден
present! Answer), nl,
write! 'Mere solutions? ' ) ,
getreply( Reply) , % Получить от пользователя ответ на запрос
Reply = ПО. % В противном случае возвратиться к процедуре explore
answernoC Question) :- % Выполнить поиск отрицательного ответа на вопрос
retract! no_positive_ari5wer_yet) , !, % Положительного ответа не было?
explore] Question, [], Answer),
negative ( Answer) ,
present! Answer), nl,
write( "More negative solutions? ' ) ,
getreply{ Reply),
Reply - no. % В противном случае возвратиться к процедуре
markstatus( negative) :-
assert ( no_positive_answer_yet) * markstatust positive; :-
retract{ no_positive_answer yet} , !
true. getquestion( Question) :-
nl, write{ 'Question, please'), nl, read( Question).
Пояснения к программе командного интерпретатора
Создается впечатление, что в некоторых фрагментах рассматриваемой программы командного интерпретатора отсутствует декларативная ясность, характерная для программ Prolog. Причина этого состоит в том, что в подобном командном интерпретаторе приходится обеспечивать более жесткое управление процессом выполнения, поскольку предполагается, что экспертная система не только находит ответ, но и обеспечивает его поиск таким способом, который представляется разумным для пользователя, постоянно взаимодействующего с системой. Поэтому в программе пришлось реализовать определенный процесс решения задачи, а не просто логический вывод на основе отношений, связывающих между собой входную и выходную информацию. В связи с этим результирующая программа действительно характеризуется наличием более ярко выраженных процедурных свойств, чем обычно. Она относится к одному из таких примеров, в которых нельзя полагаться на собственный процедурный механизм Prolog, поэтому требуется подробно регламентировать процедурное поведение программы.