module Thompson = (struct type 't labelled = string * 't let (label_with: string -> 't -> 't labelled) = fun string t -> (string,t) let (*USER*) (big_union: (std automaton) list -> (std labelled) automaton) = function | [] -> _empty | automata -> let auts = List.map (fun aut -> lift_states_with (label_with aut.name) aut) automata in let aut_name = "(" ^ (String.concat " + " (List.map (fun aut -> aut.name) auts)) ^ ")" in let new_initial_state = label_with aut_name (state_from_int 1) in let initial_states = List.concat (List.map (fun aut -> aut.initial) auts) in { (List.hd auts) with name = aut_name ; alphabet = Set.big_union (List.map (fun aut -> aut.alphabet) auts) ; initial = [ new_initial_state ] ; accepting = List.concat (List.map (fun aut -> aut.accepting) auts) ; transitions = (List.concat (List.map (fun aut -> aut.transitions) auts)) @ (foreach_in initial_states (fun s -> [ (new_initial_state,"",s) ])) } let (*USER*) (harmonized_big_union: (std automaton) list -> (std labelled) automaton) = fun automata -> big_union (harmonization automata) end)