let get_action_post_cond ?(pre_states=[]) ~post_states kf =
let (_, transitions) = Data_for_aorai.getAutomata () in
let pre_st, pre_tr =
Data_for_aorai.get_func_pre (Kernel_function.get_name kf)
in
let pre_states =
match pre_states with
| [] ->
let (states,_) = Data_for_aorai.getAutomata () in
List.filter (fun x -> pre_st.(x.nums)) states
| _ -> pre_states
in
let pre_states =
List.fold_left
(fun acc tr ->
if pre_tr.(tr.numt) &&
List.exists
(fun x -> Data_for_aorai.Aorai_state.equal x tr.stop) pre_states
then Data_for_aorai.Aorai_state.Set.add tr.start acc else acc)
Data_for_aorai.Aorai_state.Set.empty transitions
in
let pre_states = Data_for_aorai.Aorai_state.Set.elements pre_states in
let treat_one_path pre_state post_state =
let post_conds = Aorai_utils.action_to_pred ~pre_state ~post_state kf in
Aorai_option.debug ~dkey:"action"
"Getting action post-conditions for %a, from state %s to state %s@\n%a"
Kernel_function.pretty kf
pre_state.Promelaast.name post_state.Promelaast.name
(Pretty_utils.pp_list ~sep:Pretty_utils.nl_sep
!Ast_printer.d_predicate_named)
post_conds;
let pre = Aorai_utils.is_state_pred pre_state in
let pre = Logic_const.pold pre in
let post = Aorai_utils.is_state_pred post_state in
List.map
(fun p -> (Logic_const.pimplies (Logic_const.pand (pre,post), p)))
post_conds
in
let post_cond =
List.flatten (Extlib.product treat_one_path pre_states post_states)
in
List.map
(fun post_cond -> (Normal, Logic_const.new_predicate post_cond))
post_cond