- end
- type transition = Transitions.t
-
- let equal_trans (q1,t1,m1,f1,_) (q2,t2,m2,f2,_) =
- (q1 == q2) && (TagSet.equal t1 t2) && (m1 == m2) (*&& (equal_form f1 f2) *)
-
-
- module HFEval = Hashtbl.Make(
- struct
- type t = int*Ptset.t*Ptset.t
- let equal (a,b,c) (d,e,f) =
- a==d && (Ptset.equal b e) && (Ptset.equal c f)
- let hash (a,b,c) =
- HASHINT3(a,Ptset.hash b,Ptset.hash c)
- end)
-
-
-
-
- let hfeval = HFEval.create 4097
- let eval_form_bool f s1 s2 =
- let rec eval f = match f.pos with
- (* test some inlining *)
- | True -> true,true,true
- | False -> false,false,false
- | _ ->
- try
- HFEval.find hfeval (f.fid,s1,s2)
- with
- | Not_found -> let r =
- match f.pos with
- | Atom((`Left|`LLeft),b,q) ->
- if b == (Ptset.mem q s1)
- then (true,true,false)
- else false,false,false
- | Atom(_,b,q) ->
- if b == (Ptset.mem q s2)
- then (true,false,true)
- else false,false,false
- | Or(f1,f2) ->
- let b1,rl1,rr1 = eval f1
- in
- if b1 && rl1 && rr1 then (true,true,true)
- else
- let b2,rl2,rr2 = eval f2
- in
- let rl1,rr1 = if b1 then rl1,rr1 else false,false
- and rl2,rr2 = if b2 then rl2,rr2 else false,false
- in (b1 || b2, rl1||rl2,rr1||rr2)
- | And(f1,f2) ->
- let b1,rl1,rr1 = eval f1 in
- if b1 && rl1 && rr1 then (true,true,true)
- else if b1
- then let b2,rl2,rr2 = eval f2 in
- if b2 then (true,rl1||rl2,rr1||rr2)
- else (false,false,false)
- else (false,false,false)
- | _ -> assert false
- in
- HFEval.add hfeval (f.fid,s1,s2) r;
- r
- in eval f
-
-
- let form_list_fold_left f acc fl =
- let rec loop acc fl =
- match fl with
- | Nil -> acc
- | Cons(s,frm,h,m,fll) -> loop (f acc s frm h m) fll
- in
- loop acc fl
-
- let h_formlist = Hashtbl.create 4096
- let rec eval_formlist ?(memo=true) s1 s2 fl =
- match fl with
- | Nil -> Ptset.empty,false,false,false,false
- | Cons(q,f,h,mark,fll) ->
- let k = (h,Ptset.hash s1,Ptset.hash s2,mark)
- in
-
- try
- if memo then Hashtbl.find h_formlist k
- else (raise Not_found)
- with
- Not_found ->
- let s,b',b1',b2',amark = eval_formlist (~memo:memo) s1 s2 fll in
- let b,b1,b2 = eval_form_bool f s1 s2 in
- let r = if b then (Ptset.add q s, b, b1'||b1,b2'||b2,mark||amark)
- else s,b',b1',b2',amark
- in(*
- Format.fprintf Format.err_formatter "\nEvaluating formula (%i) %i %s" h q (if mark then "=>" else "->");
- pr_frm (Format.err_formatter) f;
- Format.fprintf Format.err_formatter " in context ";
- pr_st Format.err_formatter (Ptset.elements s1);
- Format.fprintf Format.err_formatter ", ";
- pr_st Format.err_formatter (Ptset.elements s2);
- Format.fprintf Format.err_formatter " result is %b\n%!" b; *)
- (Hashtbl.add h_formlist k r;r)
-
-