Данная программа является простой экспертной системой с предметной областью ЖУРНАЛЫ. В процессе работы программы Вам будут задаваться вопросы. Вы можете на них отвечать yes,'), если ответ положительный, no, если ответотрицательный, P - вероятность правдивости ответа число от 0 до 1), и why, в случае если Вы хотите узнать зачем Вам задается этот вопрос. Цель вводите в виде magazine(mag_name,X). НЕ ЗАБЫВАЙТЕ ПОСЛЕ КАЖДОГО ОТВЕТА СТАВИТЬ ТОЧКУ.
Исходный код экспертной системы:
:- multifile system/1, askable/1, explainThis/1,clause_cf/3.
:- dynamic askable/1, clause_cf/3, untrue/1,explainThis/1.
expert:-
write('Данная программа является простой экспертной системой с предметной областью ЖУРНАЛЫ'),nl,
write('В процессе работы программы Вам будут задаваться вопросы. Вы можете на них отвечать yes,'),nl,
write('если ответ положительный, no, если ответотрицательный, P - вероятность правдивости ответа'),nl,
write('(число от 0 до 1), и why, в случае если Вы хотите узнать зачем Вам задается этот вопрос.'),nl,
write('Цель вводите в виде magazine(mag_name,X).'),nl,
write('НЕ ЗАБЫВАЙТЕ ПОСЛЕ КАЖДОГО ОТВЕТА СТАВИТЬ ТОЧКУ'),nl,nl,nl,expert1.
expert1:-
write('Введите цель: '), read(X),
solve(X,[],C,Proof),nl,
write('доказано '), write(X), nl,
write('с уверенностью '),write(C),nl,
write('ХОД РЕШЕНИЯ: '),nl,
interpret(Proof),
write('Продолжить работу для новой цели? (yes/no) '),read(Ans),repeat1(Ans).
repeat1(yes):-expert1.
repeat1(no).
solve(true,_,1,_):-!.
solve((A,B),Rules,C,(ProofA,ProofB)):-!,
solve(A,Rules,C1,ProofA),
solve(B,Rules,C2,ProofB),
C is min(C1,C2).
solve(not(A),Rules,1,'не доказуемо'(A)):-!,
not(solve(A,Rules,_,_)).
solve(A,Rules,C,(A:-Proof)):-
not(system(A)),
clause(A,B),
solve(B,[rule(A,B)|Rules],C,Proof).
solve(A,Rules,C,(A:-Proof)):-
not(system(A)),
clause_cf(A,B,C1),
solve(B,[rule(A,B)|Rules],C2,Proof),
C is C1*C2.
solve(A,_,1,(A:-true)):-
system(A),
A.
solve(A,Rules,C,(A:-_)):-
askable(A),
not(known(A)),
ask(A,Answer),
respond(Answer,A,Rules,C).
system(is(_,_)).
system(_=_).
system(_<_).
system(_>_).
system(member(_,_)).
system(write(_)).
system(read(_)).
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):-
nl,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).
respond(C,A,_,C):-
number(C),C>0,
assert(clause_cf(A,true,C)).
respond(0,A,_,0):-
assert(untrue(A)),fail.
known(A):-
clause_cf(A,true,_),!.
known(A):-A,!.
known(A):-
untrue(A).
display_query(A):-
write(A),
write('? ').
display_rule(rule(A,B)):-
nl,write(' Если '),
write_conjunction(B),
write(' то '),
write(A),nl.
write_conjunction((A,B)):-
!,write(A),write(' и '),nl,
write_conjunction(B).
write_conjunction(A):-
write(A),nl.
interpret((ProofA,ProofB)):-!,
interpret(ProofA),
interpret(ProofB).
interpret((A:-'как было сказано')):-!,
nl,write(A),write(' <= как было сказано'),nl.
interpret('не доказуемо'(A)):-!,
nl,write(A),write(' <= не доказуемо'),nl.
interpret(Proof):-
fact(Proof,Fact),
explainFact(Fact).
interpret(Proof):-
rule(Proof,Head,Body,Proof1),
explainRule(Head,Body),
interpret(Proof1).
rule((Goal:-Proof),Goal,Body,Proof):-
not(Proof=true),
extract_body(Proof,Body).
fact((Fact:-true),Fact).
extract_body((ProofA,ProofB),(BodyA,BodyB)):-
!,
extract_body(ProofA,BodyA),
extract_body(ProofB,BodyB).
extract_body((Goal:-_),Goal).
extract_body('не доказуемо'(B),not(B)).
explainFact(Fact):-
explainThis(Fact),!,
nl,write(Fact),write(' - это факт'),nl.
explainFact(_).
explainRule(Head,Body):-
explainThis(Head),!,
write(Head),
write(' доказано с использованием правила: '),
display_rule(rule(Head,Body)).
explainRule(_,_).
explainThis(member(_,_)).
Исходный код базы знаний:
:- op(100,xfx,['является','читать','читают','покупается','нравится','содержит','это']).
:- dynamic 'является'/2,'содержит'/2, 'нравится'/2, 'покупается'/2, 'читают'/2, 'читать'/2.
X 'это' 'кулинарный':-
X 'содержит' 'кулинарные рецепты'.
X 'это' 'научно-поппулярный':-
X 'содержит' 'научные статьи'.
X 'это' 'автомобильный':-
X 'содержит' 'новости о новых автомобилях'.
X 'это' 'рукодельный':-
X 'покупается' 'женским населением'.
X 'это' 'детский':-
X 'содержит' 'комиксы'.
X 'это' 'компьютерный':-
X 'покупается' 'мужским населением'.
X 'это' 'рукодельный':-
X 'содержит' 'выкройки'.
X 'это' 'журнал мод':-
X 'покупается' 'женским населением'.
X 'это' 'компьютерный':-
X 'содержит' 'новости из компьютерного мира'.
X 'это' 'литературный':-
X 'содержит' 'рассказы'.
clause_cf(
X 'это' 'Наука и жизнь',
(X 'это' 'научно-популярный',
X 'содержит' 'раздел олимпиадных задач',
X 'является' 'одним из самых поппулярных в свое области'),0.8).
clause_cf(
X 'это' 'Креативное рукоделие',
(X 'это' 'рукодельный',
X 'содержит' 'приложения',
not(X 'нравится' 'мужчинам')),0.7).
clause_cf(
X 'это' 'За рулем',
(X 'это' 'автомобильный',
X 'является' 'одним из самых поппулярных в своей области',
not(X 'нравится' 'женщинам')),0.95).
clause_cf(
X 'это' 'Мурзилка',
(X 'это' 'детский',
X 'является' 'развивающим',
X 'читают' 'дети'),0.6).
clause_cf(
X 'это' 'Новый мир',
(X 'это' 'литературный',
X 'является' 'одним из самых поппулярных в свое области',
not(X 'покупается' 'широким кругом людей')),0.8).
magazine(X,Y):-
member(Y,['Наука и жизнь','Креативное рукоделие','За рулем','Мурзилка','Новый мир']),
X 'это' Y.
askable(_'читают'_).
askable(_'покупается'_).
askable(_'нравится'_).
askable(_'содержит'_).
askable(_'является'_).
system(member(_,_)).
explainThis(_'это'_).
|