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