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 -> (NormalLogic_const.new_predicate post_cond))
    post_cond