Prolog
Шрифт:
отобр( Ответ1 и Ответ2, Н) :- !, % Отступ Н
отобр( Ответ1, Н),
tab( H), write( 'и'), nl,
отобр( Ответ2, Н).
отобр( Ответ был Найден, Н) :- % Отступ Н
tab( H), печответ( Ответ), % Показ заключения
nl, tab( H),
write( 'было'),
отобр1( Выведено из Ответ, Н) :- !,
write( Выведено), write( 'из'), % Показ имени правила
nl, H1 is H + 4,
отобр( Ответ, H1). % Показ "предшественника"
отобр1( Найдено, _ ) :-
% Найдено = 'сказано' или 'найдено как факт'
write( Найдено), nl.
печответ( Цель это правда) :- !,
write( Цель). % На выходе 'это правда' опускается
печответ( Ответ) :- % Отрицательный ответ
write( Ответ).
Рис. 14. 12. Оболочка экспертной системы:
Отображение окончательного результата и
объяснение типа "как".
?- эксперт.
Пожалуйста, спрашивайте: % Приглашение пользователю
X это животное и голиаф это Х. % Вопрос пользователя
Это правда: голиаф имеет шерсть?
. . .
14. 5. 6. Одно замечание по поводу программы-оболочки
В некоторых местах нашей программы-оболочки обнаруживается недостаток той "декларативной ясности", которая так характерна для программ, написанных на Прологе. Причина состоит в том, что нам пришлось предусмотреть в этой программе довольно жесткое управление процессом функционирования оболочки. Ведь, согласно нашему замыслу, экспертная система должна была не только находить ответы на вопросы, но и делать это некоторым разумным с точки зрения пользователя способом. В связи с этим нам пришлось реализовать вполне определенное поведение системы в процессе решения задач, а не просто некоторое отношение ввода-вывода. В результате получилась программа более процедурного характера, чем обычно. Все это может послужить примером ситуации, когда, не имея возможности рассчитывать на собственные
14. 5. 7. Цели с отрицанием
Использование знака отрицания в левых частях правил, а следовательно, и в вопросах, обрабатываемых процедурой рассмотреть, представляется естественным и его следует разрешить. В качестве первой попытки можно предложить следующий способ работы с отрицанием целей:
% Процедура-драйвер верхнего уровня
эксперт :-
принять_вопрос( Вопрос),
% Ввести вопрос пользователя
( ответ_да( Вопрос);
% Попытка найти положительный ответ
ответ_нет( Вопрос) ).
% Если нет положительного ответа, то найти отрицательный
ответ_да( Вопрос) :-
% Искать положительный ответ на Вопрос
статус( отрицательный),
% Пока еще нет положительного ответа
рассмотреть( Вопрос, [ ], Ответ), % Трасса пуста
положительный( Ответ), % Искать положительный ответ
статус( положительный),
% Найден положительный ответ
выдать( Ответ), nl,
write( 'Нужны еще решения?' ),
принять( Ответ1), % Прочесть ответ пользователя
Ответ1 = нет.
% В противном случае возврат к "рассмотреть"
ответ_нет( Вопрос):-
% Искать отрицательный ответ на Вопрос
retract( пока_нет_положительного_решения), !,
% Не было положительного решения?
рассмотреть( Вопрос, [ ], Ответ),
отрицательный( Ответ),
выдать( Ответ), nl,
write( 'Нужны еще решения?' ),
Том 4. Солнце ездит на оленях
4. Кожевников А.В. Собрание сочинений в 4 томах
Проза:
советская классическая проза
рейтинг книги
Третий Генерал: Тома I-II
1. Третий Генерал
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
рейтинг книги
К востоку от Эдема
Проза:
классическая проза
рейтинг книги
Богатырские фамилии. Красные и белые (Сборники рассказов)
3. Собрание сочинений в трех томах
Проза:
историческая проза
рейтинг книги
Твори
Проза:
классическая проза
рейтинг книги
Я уже бог. Книга XL
40. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
рейтинг книги
Цикл "Пограничная трилогия"+Романы вне цикла. Компиляция. 1-5
Приключения:
вестерны
рейтинг книги
Гражданский процесс
Научно-образовательная:
юриспруденция
рейтинг книги