%DATABASE :-dynamic xpositive/2. :-dynamic xnegative/2. %xpositive(s,int) %xnegative(s,int) %do_expert. % %do_expert_:-makewindow(1,7,7,"",1,3,22,71), %nl,write(" ---------------------------------------------------"), %nl,write(" Medical expert "),nl,write(" "), %nl,write(" ---------------------------------------------------"),nl,nl, do_expert:-do_consulting,write("Press space bar."),nl,read(_), clear_db. clear_db:-retractall(xpositive(_,_)), retractall(xnegative(_,_)). do_consulting:-bolezn_is(X,KU),!,nl,write(['U Vas ',X,'(',KU,'%)','.']),nl,becauseof. do_consulting:-nl,write('Sorry !'),nl,becauseof. ask(X,Y,KU):-write(["expert> ",X," ",Y,"? "]),read(Reply),askku(KU),remember(X,Y,Reply,KU). positive(_,Y,KU):-xpositive(Y,KU),!. positive(X,Y,KU):-not(negative(X,Y,_)),!,ask(X,Y,KU). negative(_,Y,KU):-xnegative(Y,KU),!. remember(_,Y,yes,KU):-asserta(xpositive(Y,KU)). remember(_,Y,no,KU):-asserta(xnegative(Y,KU)),fail. /*Knowledge base*/ bolezn_is("Gripp",KURes):-positive(have,"nasmork",KU1),positive(have,"kashel'",KU2), min(KU1,KU2,KU3),positive(have,"t>38",KU4),min(KU3,KU4,KU5),positive(is,"dolgo",KU6), min(KU5,KU6,KU7),getku(KU7,80,KURes),!. bolezn_is("Sinusit",KURes):-positive(have,"nasmork",KU1),negative(have,"kashel'",KU2), min(KU1,KU2,KU3),getku(KU3,75,KURes),!. bolezn_is("ORVI",KURes):-positive(have,"nasmork",KU1),positive(have,"kashel'",KU2), min(KU1,KU2,KU3),positive(have,"t>38",KU4),min(KU3,KU4,KU5),getku(KU5,95,KURes),!. bolezn_is("Difteriya",KURes):-positive(have,"kashel'",KU1),positive(have,"t>38",KU2), min(KU1,KU2,KU3),positive(is,"bolit gorlo",KU4),min(KU3,KU4,KU5), positive(have,"nalet na glandah",KU6),min(KU5,KU6,KU7),positive(is,"dolgo",KU8), min(KU7,KU8,KU9),getku(KU9,60,KURes),!. bolezn_is("Angina",KURes):-positive(have,"kashel'",KU1),positive(have,"t>38",KU2), min(KU1,KU2,KU3),positive(is,"bolit gorlo",KU4),min(KU3,KU4,KU5), positive(is,"dolgo",KU6),min(KU5,KU6,KU7),getku(KU7,70,KURes),!. bolezn_is("Tonzillit",KURes):-positive(have,"kashel'",KU1),negative(have,"t>38",KU2), min(KU1,KU2,KU3),positive(is,"bolit gorlo",KU4),min(KU3,KU4,KU5), positive(is,"dolgo",KU6),min(KU5,KU6,KU7),getku(KU7,55,KURes),!. bolezn_is("Otit",KURes):-negative(have,"nasmork",KU1),negative(have,"kashel'",KU2), min(KU1,KU2,KU3),positive(have,"t>38",KU4),min(KU3,KU4,KU5), positive(is,"bolyat ushi",KU6),min(KU5,KU6,KU7),positive(is,"dolgo",KU8), min(KU7,KU8,KU9),getku(KU9,60,KURes),!. becauseof :- xpositive(Str,KU), write([" + ",Str," (",KU,"%)","\n"]), fail. becauseof :- xnegative(Str,KU), write([" - ",Str," (",KU,"%)","\n"]), fail. becauseof :- retractall(xpositive(_,_)),retractall(xpositive(_,_)),!. min(KU1,KU2,KU1):-KU1 =< KU2. min(KU1,KU2,KU2):-KU1 > KU2. askku(KU):-write(" KU?(%)-"),read(KU),KU=<100,KU>=0,!. askku(KU):-write(" ! Only integer between 0 & 100 !\n"),askku(KU). getku(KU1,KU2,KURes):- KURes is KU1*KU2/100.