target(query,2). data(user). values(hiddenstate(_),[s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16]). values(position(_),[l,r]). query(St,Ob) :- size(St,L1), size(Ob,L2), L1=L2, parse_u(_,St,UnSt), parse_u(_,Ob,UnOb), format("~nComputing universal probability - the most time consuming operation.~n"), prob(hmm(UnSt,UnOb),PrUn), format("Universal probability of the occurence of evidence is ~f.~n",PrUn), parse_o(0,1,Ob,PaOb,ok), subst_oqn(L1,1,PaOb,St,states,PrUn), parse_o(0,1,St,PaSt,ok), subst_oqn(L1,1,Ob,PaSt,obsrv,PrUn). size([],0). size([_|W],N) :- size(W,N1), N is N1+1. subst_oqn(L,N,Ob,St,Phase,PrUn) :- ( Phase == states -> parse_o(N,1,St,PaSt,Ret), PaOb = Ob ; parse_o(N,1,Ob,PaOb,Ret), PaSt = St ), ( Ret == ok -> format("~nProcessing query ~w,~w~n",[PaSt,PaOb]), parse_v(PaSt,[s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16],PaOb,[l,r],Phase,PrUn) ; true ), N1 is N+1, ( N1 =< L -> subst_oqn(L,N1,Ob,St,Phase,PrUn); true ). parse_o(N,N,[o|W],[q|Z],ok) :- K1 is N+1, parse_o(N,K1,W,Z,ok). parse_o(N,N,[Wh|W],[x|Z],nok) :- not(Wh==o), K1 is N+1, parse_o(N,K1,W,Z,nok). parse_o(N,K,[o|W],[n|Z],Ret) :- not(K==N), K1 is K+1, parse_o(N,K1,W,Z,Ret). parse_o(N,K,[Wh|W],[Wh|Z],Ret) :- not(K==N), not(Wh==o), K1 is K+1, parse_o(N,K1,W,Z,Ret). parse_o(_,_,[],[],_). parse_v(_,[],_,_,states,_). parse_v(_,_,_,[],obsrv,_). parse_v(St,[Vh|V],Ob,[Wh|W],Phase,PrUn) :- ( Phase == states -> parse_u(Vh,St,PaSt), parse_u(_,Ob,PaOb), Var = Vh ; parse_u(_,St,PaSt), parse_u(Wh,Ob,PaOb), Var = Wh ), prob(hmm(PaSt,PaOb),PrVa), ( PrUn > 0 -> P = PrVa / PrUn; P = 0 ), format("Probability of ~a is ~f.~n",[Var,P]), ( Phase == states -> parse_v(St,V,Ob,[Wh|W],Phase,PrUn) ; parse_v(St,[Vh|V],Ob,W,Phase,PrUn) ). parse_u(_,[],[]). parse_u(X,[q|W],[X|Z]) :- parse_u(X,W,Z). parse_u(X,[n|W],[_|Z]) :- parse_u(X,W,Z). parse_u(X,[o|W],[_|Z]) :- parse_u(X,W,Z). parse_u(X,[Wn|W],[Wn|Z]) :- not(Wn==q), not(Wn==n), not(Wn==o), parse_u(X,W,Z). hmm([W|[]],[O|[]]) :- msw(hiddenstate(0),W), msw(position(W),O). hmm([Wn|[Wm|W]],[Oh|O]) :- hmm([Wm|W],O), msw(hiddenstate(Wm),Wn), msw(position(Wn),Oh). set_params :- set_sw(hiddenstate(s1),[0.7,0.3,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]), set_sw(hiddenstate(s2),[0.3,0.4,0.3,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]), set_sw(hiddenstate(s3),[0.0,0.3,0.4,0.3,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]), set_sw(hiddenstate(s4),[0.0,0.0,0.3,0.4,0.3,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]), set_sw(hiddenstate(s5),[0.0,0.0,0.0,0.3,0.4,0.3,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]), set_sw(hiddenstate(s6),[0.0,0.0,0.0,0.0,0.3,0.4,0.3,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]), set_sw(hiddenstate(s7),[0.0,0.0,0.0,0.0,0.0,0.3,0.4,0.3,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]), set_sw(hiddenstate(s8),[0.0,0.0,0.0,0.0,0.0,0.0,0.3,0.4,0.3,0.0,0.0,0.0,0.0,0.0,0.0,0.0]), set_sw(hiddenstate(s9),[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.3,0.4,0.3,0.0,0.0,0.0,0.0,0.0,0.0]), set_sw(hiddenstate(s10),[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.3,0.4,0.3,0.0,0.0,0.0,0.0,0.0]), set_sw(hiddenstate(s11),[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.3,0.4,0.3,0.0,0.0,0.0,0.0]), set_sw(hiddenstate(s12),[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.3,0.4,0.3,0.0,0.0,0.0]), set_sw(hiddenstate(s13),[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.3,0.4,0.3,0.0,0.0]), set_sw(hiddenstate(s14),[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.3,0.4,0.3,0.0]), set_sw(hiddenstate(s15),[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.3,0.4,0.3]), set_sw(hiddenstate(s16),[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.3,0.7]), set_sw(position(s1),[1.0,0.0]), set_sw(position(s2),[0.93333,0.06667]), set_sw(position(s3),[0.86667,0.13333]), set_sw(position(s4),[0.80000,0.20000]), set_sw(position(s5),[0.73333,0.26667]), set_sw(position(s6),[0.66667,0.33333]), set_sw(position(s7),[0.60000,0.40000]), set_sw(position(s8),[0.53333,0.46667]), set_sw(position(s9),[0.46667,0.53333]), set_sw(position(s10),[0.40000,0.60000]), set_sw(position(s11),[0.33333,0.66667]), set_sw(position(s12),[0.26667,0.73333]), set_sw(position(s13),[0.20000,0.80000]), set_sw(position(s14),[0.13333,0.86667]), set_sw(position(s15),[0.06667,0.93333]), set_sw(position(s16),[0.0,1.0]). :- set_params.