Toggle navigation
?
users online
Logout
Open hangout
Open chat for current file
%%%%%%%%% ОБОЛОЧКА ЭКСПЕРТНОЙ СИСТЕМЫ С МЕХАНИЗМОМ ОБЪЯНЕНИЯ %%%%%%%%% % Данный прект представляет один из возможных вариантов оболочки экспертной системы на Прологе. % Предполагается, что форма представления знаний в виде правил и фактов максимально приближены % к нотации Пролога. % Для написания данной системы использована технология метапрограммирования(см. И. Братко) % Для реализации экспертной системы используется механизм обраного вывода (от цели к данным). % Переменные и константы могут быть представлены термами вида A/B/C.... % Пример константы: лекарство/антибиотик/дозировка/20мгр). % Формы представления знаний - правила. % Пример: % лекарство(антибиотик/дозировка/20мгр):-диагноз(орз),противопоказания(отсутствуют). % Динамические предикаты - те, которые можно сохранять в базе данных :- dynamic is_ans/2. % Определенные для данного приложения инфиксные операторы (см. описание Пролога) :- op(500, xfy, <==). :- op(500, xfy, /). % Метапеременные, % G - цель. % Gs - конъюнкция подцелей, представленная в виде картежа (G1,(G2,(G3,...))). % Р - формируемый след доказательсва цели для объяснения "как получено решение?" % Рs - формируемый след доказательсва для конъюнкции подцелей для объяснения "как получено решение?" % Q - формируемый обратный след доказательства для объяснения "почему задан данный вопрос?" % Рассматривается модифицированный интерпретатор Пролога (см. И. Братко) % Тривиальный случай, когда цель истинна. prove(G, true, _):- G=true,!. % Доказать конъюкцию цели G и конъюкцию оставшихся целей Gs prove((G, Gs),(P, Ps),Q) :-!, prove(G, P, Q), prove(Gs, Ps, Q),!. % Доказать цель G при условии выполнения конъюнкции подцелей Gs. % Встроеный метапредикат clause(G,Gs) находит в базе знаний цель G и проверяет выполение % всех подцелей Gs. В базе данных остается след доказательства G<==Gs. prove(G, (G <== Ps), Q) :- clause(G, Gs), prove(Gs, Ps, [G<==Gs|Q]), my_asserta(is_ans(G,true)). % Если уже доказано, что цель G ложна, то в базе данных имеется факт is_ans(G,false). prove(G, G, _) :- is_ans(G,false),!,false. % Если уже доказано, что цель G истинна, то в базе данных имеется факт is_ans(G,true). prove(G, G, _) :- is_ans(G,true),!,true. % Если невозможно доказать цель G, то следует спросить у пользователя - верна ли она. % Это способ построения диалога с пользователем. prove(G, G, Q) :- ask_ans(G,Q),!. % Формирование запроса к пользователю. % Предикат askable(G) разрешает спрашивать про цель G. ask_ans(G,Q):- askable(G), ask(G,Answer), ans(G,Q,Answer),!. % Вопрос к пользователю ask(G,Answer):- write("Вопрос:"), write(G), writeln('?'), prompt(_,'Ответьте: да/нет/почему'), read(Answer),!. % Ответ пользователя ans(G, _, 'да'):- my_asserta(is_ans( G,true)),!. ans(G, _, 'нет'):-my_asserta(is_ans(G,false)),fail,!. ans(G, Q,'почему'):- Q=[A<==B|_], write("Выдвигается гипотеза: "), writeln(A), write("при комплексе условий: "), writeln(B), prompt(_,'Ответьте: да/нет/почему'), read(Answer), ans(G, Q, Answer),!. ans(_, _, _):-fail. % Сохранение в базе данных выведенного пользователем значения V для цели G my_asserta(is_ans(G,V)):-retract(is_ans(G,V)),assert(is_ans(G,V)),!. my_asserta(is_ans(G,V)):-assert(is_ans(G,V)),!. story:- writeln("История:"), is_ans(G,V), write("G = "),write(G),write(" "), write("V = "),writeln(V), fail. story:-true. % Секция запрашиваемых термов. К этим термам будут заданы вопросы, % Их можно сформировать автоматически, % если определить, что они терминальны, т.е. не являются головами правил. % Как это сделать? Подсказка: использовать встроенный метапредикат clause/2. askable(t(симптом/_)). askable(t(противопоказания/_)). askable(симптом(_)). askable(противопоказания(_)). %База знаний %Другое представление правил диагноз(орв):-симптом(температура),симптом(головная_боль). диагноз(орз):-симптом(температура),симптом(насморк). диагноз(орз):-симптом(боль_в_горле),симптом(кашель). лечение(антивирусный_препарат):-диагноз(орв),противопоказания(нет). лечение(антибиотик/пеницилин/20):-диагноз(орз),противопоказания(нет). лечение(не_найдено). /* Рекомендации по написанию правил: 1) Константы начинаются со строчной буквы. Слова соединяются нижним подчеркиванием _ . Не допускаются спец символы. В противном случае константа берется в ковычки ('$КЕН' или "ПРО.апр") 2) Для краткости желательно вводить сокращения и разъяснять их в комментариях, например: остро-респераторное заболевание - "ОРЗ" или орз 3) Все звапрашиваемые в диалоге термы перечислить в секции askable(). См. выше. */ /** <examples> ?- prove(лечение(Рекомендация), Proof, []),story. */