Листинг 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, поэтому требуется подробно регламентировать проце­дурное поведение программы.