X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2Fformula.ml;h=4690ee0d917e667a56be1b056360c90c3d62c7b5;hb=95f1e34ef0a9dd4c700c15ae3d5a6054a198b0b1;hp=3b344e7b5cf90ec39d1331c488aa4516b2d78f85;hpb=ae485b9f477ede8c98bef85cc01aec369d285f29;p=SXSI%2Fxpathcomp.git diff --git a/src/formula.ml b/src/formula.ml index 3b344e7..4690ee0 100644 --- a/src/formula.ml +++ b/src/formula.ml @@ -12,7 +12,7 @@ type 'hcons expr = type 'hcons node = { pos : 'hcons expr; mutable neg : 'hcons; - st : (StateSet.t*StateSet.t*StateSet.t)*(StateSet.t*StateSet.t*StateSet.t); + st : StateSet.t * StateSet.t; size: int; (* Todo check if this is needed *) } @@ -102,32 +102,33 @@ let cons pos neg s1 s2 size1 size2 = account for hashing ! *) pnode,nnode -let empty_triple = StateSet.empty,StateSet.empty,StateSet.empty -let empty_hex = empty_triple,empty_triple -let true_,false_ = cons True False empty_hex empty_hex 0 0 + +let empty_pair = StateSet.empty, StateSet.empty +let true_,false_ = cons True False empty_pair empty_pair 0 0 let atom_ d p s = let si = StateSet.singleton s in let ss = match d with - | `Left -> (si,StateSet.empty,si),empty_triple - | `Right -> empty_triple,(si,StateSet.empty,si) - | `Epsilon -> empty_triple, empty_triple + | `Left -> si, StateSet.empty + | `Right -> StateSet.empty, si + | `Epsilon -> empty_pair (* TODO CHECK *) in fst (cons (Atom(d,p,s)) (Atom(d,not p,s)) ss ss 1 1) let pred_ p = let fneg = !(p.Tree.Predicate.node) in let pneg = Tree.Predicate.make (ref (fun t n -> not (fneg t n))) in - fst (cons (Pred p) (Pred pneg) empty_hex empty_hex 1 1) + fst (cons (Pred p) (Pred pneg) empty_pair empty_pair 1 1) let not_ f = f.Node.node.neg -let union_hex ((l1,ll1,lll1),(r1,rr1,rrr1)) ((l2,ll2,lll2),(r2,rr2,rrr2)) = - (StateSet.mem_union l1 l2 ,StateSet.mem_union ll1 ll2,StateSet.mem_union lll1 lll2), - (StateSet.mem_union r1 r2 ,StateSet.mem_union rr1 rr2,StateSet.mem_union rrr1 rrr2) + +let union_pair (l1,r1) (l2, r2) = + StateSet.mem_union l1 l2, + StateSet.mem_union r1 r2 let merge_states f1 f2 = let sp = - union_hex (st f1) (st f2) + union_pair (st f1) (st f2) and sn = - union_hex (st (not_ f1)) (st (not_ f2)) + union_pair (st (not_ f1)) (st (not_ f2)) in sp,sn @@ -143,7 +144,7 @@ let or_ f1 f2 = else if is_true f1 || is_true f2 then true_ else if is_false f1 && is_false f2 then false_ else if is_false f1 then f2 - else if is_false f2 then f1 + else if is_false f2 then f1 (* commutativity of | *) else