trace
nowarnings
domains
     

   
   r=real
   rr=real*
   s=symbol
   ss=string
   imm=imp(s,s,s,s,s,s,s,r)
   impl=impl1(imm)
    
    database
    evidence(s,r)
    infer_summary(imm,s)
    danswer(s,r)
    
    infer_summary(imp(A,A1,X,R1,S,C,D,E),F)). 
    
    
predicates
 % Rrepeat
  append(rr,rr,rr)
  min(r,r,r)
  max(r,r,r)
  abs(r,r)
  combine(rr,r)
  supercombine(rr,r)
  all_infer(s,r)
  infer(s,r)
  qualifier(s,r,integer)
  find_multipler(s,integer,s,integer)
  imp(s,s,s,s,s,s,s,r)
  terminal_node(s)
  hypothesis_node(s)
  exsys_driver.
  showresults.
  displayall.
  prepare_ans.
  answer(s,r).
  display_one_ans.
  how_describer(s)
  how_explain(ss)
  gettype(s,ss)
  all_ans.
  repeat.

 
clauses     
    
terminal_node(e1).
terminal_node(e2).
terminal_node(e3).
terminal_node(e4).
terminal_node(e5).

/*evidence(e1,0.3)
evidence(e2,0.2)
evidence(c1,0.4)
evidence(c2,0.1)*/
hypothesis_node(c1).

imp(s,r,c1,pos,c4,dummy,dummy,0.3).
imp(s,r,c4,pos,e4,dummy,dummy,0.4).
imp(s,r,c4,pos,e5,dummy,dummy,0.5).
imp(a,r,c1,pos,c2,pos,c3,0.1).
imp(a,r,c3,pos,e2,pos,e3,2.0).
imp(s,r,c3,pos,e4,dummy,dummy,1.0).
imp(o,r,c2,pos,e1,pos,e2,2.0).

exsys_driver:-all_ans,showresults.
all_ans:-not(prepare_ans).
prepare_ans:-answer(X,Y),fail.
answer(X,Y):- hypothesis_node(X),all_infer(X,Y),
              assert(danswer(X,Y)),fail.
showresults:-not(displayall).
displayall:-display_one_ans,fail.
display_one_ans:-danswer(X,Y),clearwindow,
                 write("FOR THIS HYPOTHESIS:"),nl,
                 write("",X),nl,write("THE CERTAINTY IS:",Y),
                 nl,nl,not(how_describer(X)).
 repeat:-!.
 repeat:-repeat.
 how_describer(NODE):-repeat,nl,
                      write("TYPE H(HOW)NODENAME,OR C(TO CONTINUE)."),nl,readln(R),
                      nl,how_explain(R),!.
how_explain(R):-R="c".   
how_explain(R):-fronttoken(R,_,X1),fronttoken(R,X,_),                              
                infer_summary(imp(_,_,X,_,_,_,_,_),_),
                clearwindow,!,write("THE RULE(S) THAT BEAR UPON THIS CONCLUSION ARE :"),nl,nl,
                 infer_summary(imp(A,A1,X,R1,S,C,D,E),F),
                 write("CONCLUDED :",x),nl,gettype(A,Z),
                 write("FROME AN ",Z),nl,
                 write("PROMISE 1 WAS :",S),nl,                     
                 write("PROMISE 1 WAS :",D),nl,
                 write("THE CERTAINTY FROME USE OF THIS RULE ALONE WAS :",F),nl,nl,fail.
how_explain(R):-fronttoken(R,_,X1),fronttoken(R,X,_),                              
                terminal_node(X),evidence(X,C),
                write(" YOU TOLD ME THAT :"),nl,
                write("",X),nl,write("HAS A CERTAINTY OF :",C),nl,fail.                                   
                                                       

all_infer(NODE,CT):-findall(C,infer(NODE,C),Ctlist),
                    combine(Ctlist,CT).

infer(NODE1,CT):-terminal_node(NODE1),evidence(NODE1,CT),!.
infer(NODE1,CT):-terminal_node(NODE1),
                 write("WHAT IS THE CERTAINTY FOR NODE",NODE1),  
                 nl,readreal(CT),
                asserta(evidence(NODE1,CT)),!.
infer(NODE1,CT):-imp(s,USE,NODE1,SIGN,NODE2,_,_,C1),
                 all_infer(NODE2,C2),
                 find_multipler(SIGN,MULT,_,_),
                 qualifier(USE,C2,QMULT),
                 CT=C1*MULT*C2*Qmult,
                 assert(infer_summary(imp(A,A1,X,R1,S,C,D,E),F)).
                 
infer(NODE1,CT):-imp(a,USE,NODE1,SIGNl,NODE2,SIGNr,NODE3,C1),
                  all_infer(NODE2,C2),
                  all_infer(NODE3,C3),
                 find_multipler(SIGNl,MULTl,SIGNr,MULTr),
                 C2s=MULTl*C2,C3s=MULTr*C3,
                 min(C2s,C3s,Cx),qualifier(USE,CX,QMULT),
                 CT=CX*C1*Qmult,
                  assert(infer_summary(imp(A,A1,X,R,S,C,D,E),F)). 
                 
infer(NODE1,CT):-imp(o,USE,NODE1,SIGNl,NODE2,SIGNr,NODE3,C1),
                 all_infer(NODE2,C2), all_infer(NODE3,C3),
                 find_multipler(SIGNl,MULTl,SIGNr,NULTr),
                 %C2s=MULTl*C2, C3s=MULTr*C3,max(C2s,C3s,Cx),
                 qualifier(USE,CX,QMULT),
                 CT=Cx*C1*QMULT,
                  assert(infer_summary(imp(A,A1,X,R,S,C,D,E),F)).
   
   find_multipler(pos,1,dummy,0).
   find_multipler(neg,-1,dummy,0).                              

  find_multipler(neg,-1,pos,1).                              
  find_multipler(neg,-1,neg,-1).                              
  find_multipler(pos,1,neg,-1).                                                     
  find_multipler(pos,1,pos,1).                              

qualifier(USE,C,QMULT):-USE="r",QMULT=1,!.
qualifier(USE,C,QMULT):-USE="n",C>=0,QMULT=1,!.
qualifier(USE,C,QMULT):-USE="n",C<0,QMULT=0,!.

supercombine([CT],CT):-!.
supercombine([C1,C2],CT):-combine([C1,C2],CT),!.
supercombine([C1,C2|T],CT):-combine([C1,C2],C3),
                             append([C3],T,TL),
                             supercombine(TL,CT),!.
/*combine([-1,1],0).
combine([1,-1],0).*/
combine([CT],CT):-!.
combine([C1,C2],CT):-C1>=0,C2>=0,CT=(C1+C2)-(C1*C2).                             
combine([C1,C2],CT):-C1<0,C2<0,CT=(C1+C2)+(C1*C2).    
/*combine([C1,C2],CT):-C1<0,C2>=0,abs(C1,Z1),abs(C2,Z2),
                     min(Z1,Z2,Z3),CT=((C1+C2)/(1-Z3)).
combine([C1,C2],CT):-C1>=0,C2<0,abs(C1,Z1),abs(C2,Z2),
                     min(Z1,Z2,Z3),
                     CT=(C1+C2)/(1-Z3).*/                     

min(X,Y,X):-X<Y,!.
min(X,Y,X):-Y<=X,!.

max(X,Y,X):-X>Y,!.
max(X,Y,X):-Y>=X,!.    

append([],X,X):-!.
append([H|T],X,[H|T1]):-append(T,X,T1).

abs(X,Y):-X>=0,Y=X,!.                         
abs(X,Y):-X<0,Y=-X,!.         
gettype("a","AND IMPLICATION").   
gettype("o","OR IMPLICATION").   
gettype("s","SIMPLE IMPLICATION").   
             