trace
domains
 L=symbol*.
 L1=integer*.
 ss=imp1(symbol,symbol,symbol,symbol,symbol,symbol,symbol,integer).
database
 evendanc(symbol,integer).
 danswer(symbol,integer).
 infer_summary(ss,integer).
predicates
 terminal_node(symbol).
 
 all_infer(symbol,integer).
 find_mult(symbol,integer,symbol,integer).
 hypo_node(symbol).
 infer(symbol,integer)
 super_combine(L1,integer).
 super_combine(L1,integer).
 combine(L1,integer).
 append(L1,L1,L1).
 quali(symbol,integer,integer).
 absvalue(integer,integer).
 min(integer,integer,integer).
 max(integer,integer,integer).
 ex_driver.
 all_ans.
 showresults.
 pre_ans.
 answer(symbol,integer).
 allresult.
 display_one.
 how_describer(symbol).
 how_explain(symbol).
 imp(ss).
 
 gettype(symbol,symbol).
clauses
 hypo_node(c1).
 
 terminal_node(e1).
 terminal_node(e2).
 terminal_node(e3).
 terminal_node(e4).
 terminal_node(e5).
 
 imp(imp1(o,r,c2,pos,e1,pos,e2,1)).
 imp(imp1(a,r,c3,pos,e2,pos,e3,1)).
 imp(imp1(s,r,c3,pos,e4,d,d,1)).
 imp(imp1(s,r,c4,pos,e4,d,d,1)).
 imp(imp1(s,r,c4,pos,e5,d,d,1)).
 imp(imp1(a,r,c1,pos,c2,pos,c3,1)).
 imp(imp1(s,r,c1,pos,c4,d,d,1)). 
 
 find_mult(pos,1,d,0).
 find_mult(neg,-1,d,0).
 find_mult(pos,1,pos,1).
 find_mult(pos,1,neg,-1).
 find_mult(neg,-1,pos,1).
 find_mult(neg,-1,neg,-1).
              
 ex_driver:-retractall(_),all_ans,showresults.
 
 all_ans:-not(pre_ans).
 pre_ans:-write("enter the node "),nl,
          readln(X),
          answer(X,_),fail.
 
 showresults:-not(allresult).
 allresult:-display_one,fail.
 
 display_one:-danswer(X,Y),
              write("the node is :",X," and the cost of node is :",Y),nl,
              not(how_describer(X)).
 how_describer(Node):-write("enter h(how) ",Node," c(continue)"),nl,
                      readln(R),
                      how_explain(R).
 how_explain(R):-R=c.
 how_explain(R):-fronttoken(R,_,X1),
                 fronttoken(X1,X,_),
                 infer_summary(imp1(_,_,X,_,_,_,_,_),_),
                 write("the rule of this conclusion is "),nl,
                 infer_summary(imp1(A,A1,X,R,S,C,D,E),F),
                 write("concluded: ",X),
                 gettype(A,Z),
                 write("from on ",Z," ",A1,R,S,D,E,C),
                 write("the certaintly is :",F),fail.


how_explain(R):-fronttoken(R,_,X),
                fronttoken(X,X1,_),
                terminal_node(X1),
                evendanc(X1,_),
                write("you told me that the ",X," is  certently of ",X),fail.
 answer(X,Y):-hypo_node(X),
              all_infer(X,Y),
              assert(danswer(X,Y)).
 gettype("a","and ").
gettype("o","or").
gettype("s","simple").            
 all_infer(Node,Ct):-findall(C,infer(Node,C),Ctlist),
                    super_combine(Ctlist,Ct).
 super_combine([Ct],Ct):-!.
 super_combine([C1,C2],Ct):-combine([C1,C2],Ct).
 super_combine([C1,C2|T],Ct):-combine([C1,C2],C3),
                              append([C3],T,Tl),
                              super_combine(Tl,Ct).
 append([H],T,[H|T]).
 quali(Use,_,Qmult):-Use=r,Qmult=1.
 quali(Use,Cx,Qmult):-Use=n,Cx>=0,Qmult=1.
 quali(Use,Cx,Qmult):-Use=n,Cx<=0,Qmult=0.
 combine([Ct],Ct).
 combine([-1,1],0).
 combine([1,-1],0).
 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,
                      absvalue(C1,Z1),absvalue(C2,Z2),
                      min(Z1,Z2,Z3),
                      Ct=(C1+C2)/(1-Z3).                                                 
 combine([C1,C2],Ct):-C2<0,C1>=0,
                      absvalue(C1,Z1),absvalue(C2,Z2),
                      min(Z1,Z2,Z3),
                      Ct=(C1+C2)/(1-Z3).                                                                     
 min(Z1,Z2,Z1):-Z1<=Z2.                      
 min(Z1,Z2,Z2):-Z1>=Z2.
 
 max(Z1,Z2,Z2):-Z1<=Z2.                      
 max(Z1,Z2,Z1):-Z1>=Z2.
 
 absvalue(X,Y):-X=0,Y=0,!.
 absvalue(X,Y):-X>0,Y=X,!.
 absvalue(X,Y):-X<0,Y=-X,!.

 infer(Node1,Ct):-imp(imp1(s,Use,Node1,Sign,Node2,_,_,C1)),
                  all_infer(Node2,C2),
                  find_mult(Sign,Mult,_,0),
                  Ct=Mult*C1*C2,
                  assert(infer_summary(imp1(s,Use,Node1,Sign,Node2,d,d,C1),Ct)).
 infer(Node1,Ct):-imp(imp1(a,Use,Node1,Signl,Node2,Signr,Node3,C1)),
                  all_infer(Node2,C2),
                  all_infer(Node3,C3),
                  find_mult(Signl,Multl,Signr,Multr),
                  C2s=C2*Multl,
                  C3s=C3*Multr,
                  min(C2s,C3s,Cx),
                  quali(Use,Cx,Qmult),
                  Ct=Cx*C1*Qmult,
                  assert(infer_summary(imp1(a,Use,Node1,Signl,Node2,Signr,Node3,C1),Ct)).                 
 infer(Node1,Ct):-imp(imp1(o,Use,Node1,Signl,Node2,Signr,Node3,C1)),
                  all_infer(Node2,C2),
                  all_infer(Node3,C3),
                  find_mult(Signl,Multl,Signr,Multr),
                  C2s=C2*Multl,
                  C3s=C3*Multr,
                  max(C2s,C3s,Cx),
                  quali(Use,Cx,Qmult),
                  Ct=Cx*C1*Qmult,
                   assert(infer_summary(imp1(o,Use,Node1,Signl,Node2,Signr,Node3,C1),Ct)).                                
 infer(Node1,C):-terminal_node(Node1),
                 evendanc(Node1,C),!.
 infer(Node1,C):-terminal_node(Node1),
                 write("what is the cost of node ",Node1),nl,
                 readreal(C),nl,
                 asserta(evendanc(Node1,C)).                

                 
                                               