123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305(******************************************************************************)(* *)(* Alt-Ergo: The SMT Solver For Software Verification *)(* Copyright (C) 2013-2018 --- OCamlPro SAS *)(* *)(* This file is distributed under the terms of the license indicated *)(* in the file 'License.OCamlPro'. If 'License.OCamlPro' is not *)(* present, please contact us to clarify licensing. *)(* *)(******************************************************************************)[@@@ocaml.warning"-33"]openOptionsopenParsed(* helper functions *)letmk_localizedpp_locpp_desc={pp_loc;pp_desc}letmk_infixe1ope2=PPinfix(e1,op,e2)letmk_prefixope=PPprefix(op,e)(** Declaration of types **)letmk_non_rec_type_decllocty_varstyty_kind=TypeDecl[loc,ty_vars,ty,ty_kind]letmk_rec_type_decll=TypeDecllletmk_abstract_type_decllocty_varsty=mk_non_rec_type_decllocty_varstyAbstractletmk_enum_type_decllocty_varstyenums=mk_non_rec_type_decllocty_varsty(Enumenums)letmk_algebraic_type_decllocty_varstyenums=tryletl=List.rev_map(fun(c,l)->ifl!=[]thenraiseExit;c)enumsinmk_non_rec_type_decllocty_varsty(Enum(List.revl))withExit->mk_non_rec_type_decllocty_varsty(Algebraicenums)letmk_record_type_decllocty_varsty?(constr="{")fields=mk_non_rec_type_decllocty_varsty(Record(constr,fields))(** Declaration of symbols, functions, predicates, and goals *)letmk_logiclocis_acnamed_identsty=Logic(loc,is_ac,named_idents,ty)letmk_function_deflocnamed_identargstyexpr=Function_def(loc,named_ident,args,ty,expr)letmk_ground_predicate_deflocnamed_identexpr=Predicate_def(loc,named_ident,[],expr)letmk_non_ground_predicate_deflocnamed_identargsexpr=Predicate_def(loc,named_ident,args,expr)letmk_goallocnameexpr=Goal(loc,name,expr)(** Declaration of theories, generic axioms and rewriting rules **)letmk_theorylocnameextexpr=Theory(loc,name,ext,expr)letmk_generic_axiomlocnameexpr=Axiom(loc,name,Util.Default,expr)letmk_rewritinglocnameexpr=Rewriting(loc,name,expr)(** Declaration of theory axioms and case-splits **)letmk_theory_axiomlocnameexpr=Axiom(loc,name,Util.Propagator,expr)letmk_theory_case_splitlocnameexpr=Axiom(loc,name,Util.Default,expr)(** Making pure and logic types *)letint_type=PPTintletbool_type=PPTboolletreal_type=PPTrealletunit_type=PPTunitletmk_bitv_typesize=PPTbitv(int_of_stringsize)letmk_external_typelocargsty=PPTexternal(args,ty,loc)letmk_logic_typeargs_tyres_ty=matchres_tywith|None->PPredicateargs_ty|Someres->PFunction(args_ty,res)letmk_var_typelocalpha=PPTvarid(alpha,loc)(** Making arithmetic expressions and predicates **)letmk_int_constlocn=mk_localizedloc(PPconst(ConstIntn))letmk_real_constlocr=mk_localizedloc(PPconst(ConstRealr))letmk_addloce1e2=mk_localizedloc(mk_infixe1PPadde2)letmk_subloce1e2=mk_localizedloc(mk_infixe1PPsube2)letmk_mulloce1e2=mk_localizedloc(mk_infixe1PPmule2)letmk_divloce1e2=mk_localizedloc(mk_infixe1PPdive2)letmk_modloce1e2=mk_localizedloc(mk_infixe1PPmode2)letmk_minusloce=mk_localizedloc(mk_prefixPPnege)letmk_pred_ltloce1e2=mk_localizedloc(mk_infixe1PPlte2)letmk_pred_leloce1e2=mk_localizedloc(mk_infixe1PPlee2)letmk_pred_gtloce1e2=mk_localizedloc(mk_infixe1PPgte2)letmk_pred_geloce1e2=mk_localizedloc(mk_infixe1PPgee2)(** Making Record expressions **)letmk_recordlocfields=mk_localizedloc(PPrecordfields)letmk_with_recordlocefields=mk_localizedloc(PPwith(e,fields))letmk_dot_recordlocelabel=mk_localizedloc(PPdot(e,label))(** Making Array expressions **)letmk_array_getloce1e2=mk_localizedloc(PPget(e1,e2))letmk_array_setloce1e2e3=mk_localizedloc(PPset(e1,e2,e3))(** Making Bit-vector expressions **)letmk_bitv_const=letcheck_binary_modes=String.iter(funx->matchxwith|'0'|'1'->()|_->raiseParsing.Parse_error)s;sinfunlocconst->mk_localizedloc(PPconst(ConstBitv(check_binary_modeconst)))letmk_bitv_extractloceij=leti=mk_int_constlociinletj=mk_int_constlocjinmk_localizedloc(PPextract(e,i,j))letmk_bitv_concatloce1e2=mk_localizedloc(PPconcat(e1,e2))(** Making Boolean / Propositional expressions **)letmk_true_constloc=mk_localizedloc(PPconstConstTrue)letmk_false_constloc=mk_localizedloc(PPconstConstFalse)letmk_andloce1e2=mk_localizedloc(mk_infixe1PPande2)letmk_orloce1e2=mk_localizedloc(mk_infixe1PPore2)letmk_xorloce1e2=mk_localizedloc(mk_infixe1PPxore2)letmk_iffloce1e2=mk_localizedloc(mk_infixe1PPiffe2)letmk_impliesloce1e2=mk_localizedloc(mk_infixe1PPimpliese2)letmk_notloce=mk_localizedloc(mk_prefixPPnote)letmk_pred_eqloce1e2=mk_localizedloc(mk_infixe1PPeqe2)letmk_pred_not_eqloce1e2=mk_localizedloc(mk_infixe1PPneqe2)letmk_distinctloce2=matche2with|[a;b]->mk_pred_not_eqlocab|_->mk_localizedloc(PPdistincte2)(** Making quantified formulas **)letmk_foralllocvs_tytriggersfiltersexpr=mk_localizedloc(PPforall_named(vs_ty,triggers,filters,expr))letmk_existslocvs_tytriggersfiltersexpr=mk_localizedloc(PPexists_named(vs_ty,triggers,filters,expr))(** Naming and casting types of expressions **)letmk_namedlocnamee=mk_localizedloc(PPnamed(name,e))letmk_type_castlocety=mk_localizedloc(PPcast(e,ty))(** Making vars, applications, if-then-else, and let expressions **)letmk_varlocvar=mk_localizedloc(PPvarvar)letmk_applicationlocappargs=mk_localizedloc(PPapp(app,args))letmk_patternpat_locpat_appargs={pat_loc;pat_desc=(pat_app,args)}letmk_iteloccondthel=mk_localizedloc(PPif(cond,th,el))letmk_letlocbinderse=mk_localizedloc(PPlet(binders,e))letmk_voidloc=mk_localizedloc(PPconstConstVoid)(** Making particular expression used in semantic triggers **)letmk_in_intervallocexprlow_breiejup_br=mk_localizedloc(PPinInterval(expr,notlow_br,ei,ej,up_br))letmk_maps_tolocvexpr=mk_localizedloc(PPmapsTo(v,expr))(** Making cuts and checks **)letmk_checklocexpr=mk_localizedloc(PPcheckexpr)letmk_cutlocexpr=mk_localizedloc(PPcutexpr)letmk_matchlocexprcases=mk_localizedloc(PPmatch(expr,cases))letmk_algebraic_testlocexprcstr=mk_localizedloc(PPisConstr(expr,cstr))letmk_algebraic_projectloc~guardedexprcstr=mk_localizedloc(PPproject(guarded,expr,cstr))