let type_cond_auto (st,tr as auto) =
let otherwise = List.filter (fun t -> t.cross = Otherwise) tr in
let add_if_needed acc st =
if List.memq st acc then acc else st::acc
in
let type_trans (states,transitions) tr =
let (intermediate_states, trans) = type_trans auto [] tr in
Aorai_option.debug
"Considering parsed transition %s -> %s" tr.start.name tr.stop.name;
Aorai_option.debug
"Resulting transitions:@\n%a@\nEnd of transitions"
(Pretty_utils.pp_list ~sep:"@\n"
(fun fmt tr ->
Format.fprintf fmt "%s -> %s: %a"
tr.start.name tr.stop.name print_epsilon_trans tr.cross))
trans;
(List.fold_left add_if_needed states intermediate_states,
transitions @ trans)
in
let auto =
List.fold_left type_trans (st,[]) tr
in
let auto = propagate_epsilon_transitions auto in
let (states, transitions as auto) = add_default_trans auto otherwise in
if Aorai_option.debug_atleast 1 then
Promelaoutput.output_dot_automata auto "aorai_debug_typed.dot";
let (nb_trans,trans) =
List.fold_left
(fun (i,l as acc) t ->
let cond, action = t.cross in
let cond = fst (Logic_simplification.simplifyCond cond)
in match cond with
TFalse -> acc
| _ -> (i+1,{ t with cross = (cond,action); numt = i } :: l))
(0,[]) transitions
in
let nb_state, states =
List.fold_left
(fun (i,l as acc) s ->
if
List.exists
(fun t -> t.start.nums = s.nums || t.stop.nums = s.nums)
trans
then begin
s.nums <- i;
(i+1, s :: l)
end else acc)
(0,[]) states
in
setNumberOfStates nb_state;
setNumberOfTransitions nb_trans;
(List.rev states, List.rev trans)