From: Kim Nguyễn Date: Fri, 15 Mar 2013 22:25:18 +0000 (+0100) Subject: Simplify transition instead of evaluating them to true/false. X-Git-Tag: v0.1~111 X-Git-Url: http://git.nguyen.vg/gitweb/?p=tatoo.git;a=commitdiff_plain;h=57952070c7b8276b042854718020483859caf94a Simplify transition instead of evaluating them to true/false. --- 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