X-Git-Url: http://git.nguyen.vg/gitweb/?p=tatoo.git;a=blobdiff_plain;f=src%2Fata.ml;h=a4ea306d87267dbd91713ca53e5e275effbf06c9;hp=2f20b1417067b856aeff85e75b6d5f3add9602aa;hb=da84ba92e452d4d2a3eaf89f7638db25a7f84909;hpb=021fdd8af4067ec57cdbf5c2dbc903252cbd4707 diff --git a/src/ata.ml b/src/ata.ml index 2f20b14..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 = @@ -492,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) +