let mk_deterministic_lemma () =
let automaton = Data_for_aorai.getAutomata () in
let make_one_lemma state =
let label = Cil_types.LogicLabel(None, "L") in
let disjoint_guards acc trans1 trans2 =
if trans1.numt <= trans2.numt then acc
else
let subst = Cil_datatype.Logic_var.Hashtbl.create 5 in
let subst_res = Kernel_function.Hashtbl.create 5 in
let guard1 =
pred_of_condition subst subst_res label (fst trans1.cross)
in
let guard2 =
pred_of_condition subst subst_res label (fst trans2.cross)
in
let pred = Logic_const.pnot (Logic_const.pand (guard1, guard2)) in
let quants =
Cil_datatype.Logic_var.Hashtbl.fold
(fun _ lv acc -> lv :: acc) subst []
in
let quants = Kernel_function.Hashtbl.fold
(fun _ lv acc -> lv :: acc) subst_res quants
in
let quants =
List.sort (fun v1 v2 -> String.compare v1.lv_name v2.lv_name) quants
in
Logic_const.pand (acc, (pforall (quants, pred)))
in
let trans = Path_analysis.get_transitions_of_state state automaton in
let prop = Extlib.product_fold disjoint_guards ptrue trans trans in
let name = state.Promelaast.name ^ "_deterministic_trans" in
let lemma =
Dlemma (name, false, [label],[],prop,Cil_datatype.Location.unknown)
in
Globals.Annotations.add_user lemma;
mk_global (GAnnot(lemma,Cil_datatype.Location.unknown))
in
List.iter make_one_lemma (fst automaton)