let mk_decl_axiomatized_automata () =
let getNamedOffset s =
Logic_const.term (TConst (CEnum (find_enum s.nums))) (Ctype Cil.intType)
in
let (_,trans_l) = getAutomata() in
let param=(Cil_const.make_logic_var "tr" Linteger) in
let logic=mk_global_logic transStart [param] (Some Linteger) in
let tr_start_log_info = Data_for_aorai.get_logic transStart in
let annotlist=List.fold_left
(fun res tr ->
(mk_global_axiom
(transStart^(string_of_int tr.numt))
(Prel(Req,
Logic_const.term
(Tapp(tr_start_log_info,[],[mk_int_term tr.numt]))
(Ctype Cil.intType),
(getNamedOffset tr.start)
))
)::res
)
[logic]
trans_l in
globals_queue:=
(GAnnot(Daxiomatic(transStart,List.rev annotlist, Location.unknown),
Location.unknown))
:: !globals_queue;
let logic=mk_global_logic transStop [param] (Some Linteger) in
let tr_stop_log_info = Data_for_aorai.get_logic transStop in
let annotlist=List.fold_left
(fun res tr ->
(mk_global_axiom
(transStop^(string_of_int tr.numt))
(Prel(Req,
Logic_const.term
(Tapp(tr_stop_log_info,[],[mk_int_term tr.numt]))
(Ctype Cil.intType),
(getNamedOffset tr.stop)))
)::res
)
[logic]
trans_l in
globals_queue:=
(GAnnot(Daxiomatic(transStop, List.rev annotlist, Location.unknown),
Location.unknown))
:: !globals_queue;
let num= Cil_const.make_logic_var "_aorai_numTrans" Linteger in
let op = Cil_const.make_logic_var "_aorai_op" Linteger in
let st = Cil_const.make_logic_var "_aorai_status" Linteger in
let pred =
mk_conjunction
(List.map
(fun tr ->
Pimplies(
unamed (Prel(Req, mk_term_from_logic_var num, mk_int_term tr.numt)),
unamed (crosscond_to_pred true tr.cross op st)
)
)
trans_l
)
in
mk_global_predicate transCondP ["L"] [num;op;st] pred;
let pred2 =
Papp(
Data_for_aorai.get_predicate transCondP,
[(LogicLabel(None,"L"),LogicLabel(None,"L"))],
[mk_term_from_logic_var num;
mk_term_from_logic_var (Cil.cvar_to_lvar (Data_for_aorai.get_varinfo curOp));
mk_term_from_logic_var (Cil.cvar_to_lvar (Data_for_aorai.get_varinfo curOpStatus))
]
)
in
mk_global_predicate transCond ["L"] [num] pred2