X-Git-Url: http://git.nguyen.vg/gitweb/?p=tatoo.git;a=blobdiff_plain;f=src%2Fauto%2Fata.ml;h=419ab570c09e9bc839be68d28bd584807a972fd8;hp=ba2f55f9056136a8c1839dfc50fa177d633c8b4b;hb=57952070c7b8276b042854718020483859caf94a;hpb=35415f79b28e321c16ac0922bcae8511e0bcebab diff --git a/src/auto/ata.ml b/src/auto/ata.ml index ba2f55f..419ab57 100644 --- a/src/auto/ata.ml +++ b/src/auto/ata.ml @@ -14,7 +14,7 @@ (***********************************************************************) (* - Time-stamp: + Time-stamp: *) INCLUDE "utils.ml" @@ -230,27 +230,26 @@ let get_trans a tag states = let eval_form phi fcs nss ps ss is_left is_right has_left has_right kind = let rec loop phi = begin match SFormula.expr phi with - Formula.True -> true - | Formula.False -> false + Formula.True | Formula.False -> phi | Formula.Atom a -> - let p, b, q = Atom.node a in - let pos = + let p, b, q = Atom.node a in begin match p with - | First_child -> StateSet.mem q fcs - | Next_sibling -> StateSet.mem q nss - | Parent | Previous_sibling -> StateSet.mem q ps - | Stay -> StateSet.mem q ss - | Is_first_child -> is_left - | Is_next_sibling -> is_right - | Is k -> k == kind - | Has_first_child -> has_left - | Has_next_sibling -> has_right - in - if is_move p && (not b) then - eprintf "Warning: Invalid negative atom %a" Atom.print a; - b == pos - | Formula.And(phi1, phi2) -> loop phi1 && loop phi2 - | Formula.Or (phi1, phi2) -> loop phi1 || loop phi2 + | First_child -> + if b == StateSet.mem q fcs then SFormula.true_ else phi + | Next_sibling -> + if b == StateSet.mem q nss then SFormula.true_ else phi + | Parent | Previous_sibling -> + if b == StateSet.mem q ps then SFormula.true_ else phi + | Stay -> + if b == StateSet.mem q ss then SFormula.true_ else phi + | Is_first_child -> SFormula.of_bool (b == is_left) + | Is_next_sibling -> SFormula.of_bool (b == is_right) + | Is k -> SFormula.of_bool (b == (k == kind)) + | Has_first_child -> SFormula.of_bool (b == has_left) + | Has_next_sibling -> SFormula.of_bool (b == has_right) + end + | Formula.And(phi1, phi2) -> SFormula.and_ (loop phi1) (loop phi2) + | Formula.Or (phi1, phi2) -> SFormula.or_ (loop phi1) (loop phi2) end in loop phi @@ -277,15 +276,20 @@ let eval_trans auto ltrs fcs nss ps ss is_left is_right has_left has_right kind if res == dummy6 then let res = TransList.fold (fun trs (acct, accs) -> - let q, _, phi = Transition.node trs in + let q, lab, phi = Transition.node trs in if StateSet.mem q accs then (acct, accs) else - if eval_form - phi fcs nss ps accs - is_left is_right has_left has_right kind - then + let new_phi = + eval_form + phi fcs nss ps accs + is_left is_right has_left has_right kind + in + if SFormula.is_true new_phi then (acct, StateSet.add q accs) + else if SFormula.is_false new_phi then + (acct, accs) else - (TransList.cons trs acct, accs) + let new_tr = Transition.make (q, lab, new_phi) in + (TransList.cons new_tr acct, accs) ) ltrs (TransList.nil, ss) in Cache.N6.add auto.cache6 i j k l m n res; res