X-Git-Url: http://git.nguyen.vg/gitweb/?p=tatoo.git;a=blobdiff_plain;f=src%2Fata.ml;h=a4ea306d87267dbd91713ca53e5e275effbf06c9;hp=add27752c0a75530d254e0b5d8af01b71d149732;hb=da84ba92e452d4d2a3eaf89f7638db25a7f84909;hpb=6ca42ffbd541cede6afcc473b563e54b848ee534 diff --git a/src/ata.ml b/src/ata.ml index add2775..a4ea306 100644 --- a/src/ata.ml +++ b/src/ata.ml @@ -175,11 +175,13 @@ let print fmt a = fprintf fmt "Internal UID: %i@\n\ States: %a@\n\ + Number of states: %i@\n\ Starting states: %a@\n\ Selection states: %a@\n\ Alternating transitions:@\n" (a.id :> int) StateSet.print a.states + (StateSet.cardinal a.states) StateSet.print a.starting_states StateSet.print a.selecting_states; let trs = @@ -227,7 +229,14 @@ let get_trans a tag states = ) states TransList.nil - +let get_form a tag q = + try + let trs = Hashtbl.find a.transitions q in + List.fold_left (fun aphi (labs, phi) -> + if QNameSet.mem tag labs then Formula.or_ aphi phi else aphi + ) Formula.false_ trs + with + Not_found -> Formula.false_ (* [complete transitions a] ensures that for each state q @@ -485,3 +494,61 @@ let merge a1 a2 = in a1.transitions } + + +let link a1 a2 q link_phi = + { a1 with + states = StateSet.union a1.states a2.states; + selecting_states = StateSet.singleton q; + starting_states = StateSet.union a1.starting_states a2.starting_states; + transitions = + let () = + Hashtbl.iter (fun k v -> Hashtbl.add a1.transitions k v) a2.transitions + in + Hashtbl.add a1.transitions q [(QNameSet.any, link_phi)]; + a1.transitions + } + +let union a1 a2 = + let a1 = copy a1 in + let a2 = copy a2 in + let q = State.make () in + let link_phi = + StateSet.fold + (fun q phi -> Formula.(or_ (stay q) phi)) + (StateSet.union a1.selecting_states a2.selecting_states) + Formula.false_ + in + link a1 a2 q link_phi + +let inter a1 a2 = + let a1 = copy a1 in + let a2 = copy a2 in + let q = State.make () in + let link_phi = + StateSet.fold + (fun q phi -> Formula.(and_ (stay q) phi)) + (StateSet.union a1.selecting_states a2.selecting_states) + Formula.true_ + in + link a1 a2 q link_phi + +let neg a = + let a = copy a in + let q = State.make () in + let link_phi = + StateSet.fold + (fun q phi -> Formula.(and_ (not_(stay q)) phi)) + a.selecting_states + Formula.true_ + in + let () = Hashtbl.add a.transitions q [(QNameSet.any, link_phi)] in + let a = + { a with + selecting_states = StateSet.singleton q; + } + in + normalize_negations a; a + +let diff a1 a2 = inter a1 (neg a2) +