Оболочка экспертной системы, работающая в условиях неопределенности, получена путем непосредственного усовершенствования программы 7. Отношение solve(Goal,Proof,Certainty) истинно, когда цель Goal удовлетворена с определенностью Certainty, а Proof - дерево доказательства Goal. В программе предполагается, что предложения с коэффициентами определенности представлены с использованием предиката clause_cf(A,B,CF).
Чтобы узнать что и как сажать на даче и огороде, читайте книгу http://www.kodges.ru/15141-vash-sad-i-ogorod.html бесплатно.
% программа 10
:- multifile system/1, askable/1, clause_cf/3.
:- dynamic untrue/1, askable/1, clause_cf/3.
% введем стартовый предикат
expert(X):-
solve(X,[],C),nl,
write('доказано с уверенностью '),
write(C).
solve(true,_,1):-!.
solve((A,B),Rules,C):-!,
solve(A,Rules,C1),
solve(B,Rules,C2),
C is min(C1,C2).
solve(not(A),_,1):-!,
not(solve(A,_,_)).
solve(A,Rules,C):-
not system(A),
clause(A,B),
solve(B,[rule(A,B)|Rules],C).
solve(A,Rules,C):-
not system(A),
clause_cf(A,B,C1),
solve(B,[rule(A,B)|Rules],C2),
C is C1*C2.
solve(A,_,1):-
system(A),
A.
solve(A,Rules,C):-
askable(A),
not known(A),
ask(A,Answer),
respond(Answer,A,Rules,C).
system(is(_,_)).
system(_=_).
system(_<_).
system(_>_).
system(write(_)).
system(nl).
ask(A,Answer):-
display_query(A),
read(Answer).
respond(yes,A,_,1):-
assert(A).
respond(no,A,_,0):-
assert(untrue(A)),fail.
respond(why,A,Rules,C):-
var(Rules),!,
write(' хочу использовать ложность '),
write(A),nl,
ask(A,Answer),
respond(Answer,A,[],C).
respond(why,A,[Rule|Rules],C):-
write(' хочу воспользоваться правилом:'),
display_rule(Rule),
ask(A,Answer),
respond(Answer,A,Rules,C).
respond(why,A,[],C):-
write(' <== возможности объяснения исчерпаны '),nl,
ask(A,Answer),
respond(Answer,A,[],C). |