(* File generated from z3.idl *) type context and symbol and ast and sort = private ast and func_decl = private ast and app = private ast and pattern = private ast and params and param_descrs and model and func_interp and func_entry and fixedpoint and ast_vector and ast_map and goal and tactic and probe and apply_result and solver and stats and constructor and constructor_list and lbool = | L_FALSE | L_UNDEF | L_TRUE and symbol_kind = | INT_SYMBOL | STRING_SYMBOL and parameter_kind = | PARAMETER_INT | PARAMETER_DOUBLE | PARAMETER_RATIONAL | PARAMETER_SYMBOL | PARAMETER_SORT | PARAMETER_AST | PARAMETER_FUNC_DECL and sort_kind = | UNINTERPRETED_SORT | BOOL_SORT | INT_SORT | REAL_SORT | BV_SORT | ARRAY_SORT | DATATYPE_SORT | RELATION_SORT | FINITE_DOMAIN_SORT | UNKNOWN_SORT and ast_kind = | NUMERAL_AST | APP_AST | VAR_AST | QUANTIFIER_AST | SORT_AST | FUNC_DECL_AST | UNKNOWN_AST and decl_kind = | OP_TRUE | OP_FALSE | OP_EQ | OP_DISTINCT | OP_ITE | OP_AND | OP_OR | OP_IFF | OP_XOR | OP_NOT | OP_IMPLIES | OP_OEQ | OP_ANUM | OP_AGNUM | OP_LE | OP_GE | OP_LT | OP_GT | OP_ADD | OP_SUB | OP_UMINUS | OP_MUL | OP_DIV | OP_IDIV | OP_REM | OP_MOD | OP_TO_REAL | OP_TO_INT | OP_IS_INT | OP_POWER | OP_STORE | OP_SELECT | OP_CONST_ARRAY | OP_ARRAY_MAP | OP_ARRAY_DEFAULT | OP_SET_UNION | OP_SET_INTERSECT | OP_SET_DIFFERENCE | OP_SET_COMPLEMENT | OP_SET_SUBSET | OP_AS_ARRAY | OP_BNUM | OP_BIT1 | OP_BIT0 | OP_BNEG | OP_BADD | OP_BSUB | OP_BMUL | OP_BSDIV | OP_BUDIV | OP_BSREM | OP_BUREM | OP_BSMOD | OP_BSDIV0 | OP_BUDIV0 | OP_BSREM0 | OP_BUREM0 | OP_BSMOD0 | OP_ULEQ | OP_SLEQ | OP_UGEQ | OP_SGEQ | OP_ULT | OP_SLT | OP_UGT | OP_SGT | OP_BAND | OP_BOR | OP_BNOT | OP_BXOR | OP_BNAND | OP_BNOR | OP_BXNOR | OP_CONCAT | OP_SIGN_EXT | OP_ZERO_EXT | OP_EXTRACT | OP_REPEAT | OP_BREDOR | OP_BREDAND | OP_BCOMP | OP_BSHL | OP_BLSHR | OP_BASHR | OP_ROTATE_LEFT | OP_ROTATE_RIGHT | OP_EXT_ROTATE_LEFT | OP_EXT_ROTATE_RIGHT | OP_INT2BV | OP_BV2INT | OP_CARRY | OP_XOR3 | OP_PR_UNDEF | OP_PR_TRUE | OP_PR_ASSERTED | OP_PR_GOAL | OP_PR_MODUS_PONENS | OP_PR_REFLEXIVITY | OP_PR_SYMMETRY | OP_PR_TRANSITIVITY | OP_PR_TRANSITIVITY_STAR | OP_PR_MONOTONICITY | OP_PR_QUANT_INTRO | OP_PR_DISTRIBUTIVITY | OP_PR_AND_ELIM | OP_PR_NOT_OR_ELIM | OP_PR_REWRITE | OP_PR_REWRITE_STAR | OP_PR_PULL_QUANT | OP_PR_PULL_QUANT_STAR | OP_PR_PUSH_QUANT | OP_PR_ELIM_UNUSED_VARS | OP_PR_DER | OP_PR_QUANT_INST | OP_PR_HYPOTHESIS | OP_PR_LEMMA | OP_PR_UNIT_RESOLUTION | OP_PR_IFF_TRUE | OP_PR_IFF_FALSE | OP_PR_COMMUTATIVITY | OP_PR_DEF_AXIOM | OP_PR_DEF_INTRO | OP_PR_APPLY_DEF | OP_PR_IFF_OEQ | OP_PR_NNF_POS | OP_PR_NNF_NEG | OP_PR_NNF_STAR | OP_PR_CNF_STAR | OP_PR_SKOLEMIZE | OP_PR_MODUS_PONENS_OEQ | OP_PR_TH_LEMMA | OP_RA_STORE | OP_RA_EMPTY | OP_RA_IS_EMPTY | OP_RA_JOIN | OP_RA_UNION | OP_RA_WIDEN | OP_RA_PROJECT | OP_RA_FILTER | OP_RA_NEGATION_FILTER | OP_RA_RENAME | OP_RA_COMPLEMENT | OP_RA_SELECT | OP_RA_CLONE | OP_FD_LT | OP_LABEL | OP_LABEL_LIT | OP_DT_CONSTRUCTOR | OP_DT_RECOGNISER | OP_DT_ACCESSOR | OP_UNINTERPRETED and param_kind = | PK_UINT | PK_BOOL | PK_DOUBLE | PK_SYMBOL | PK_STRING | PK_OTHER | PK_INVALID and search_failure = | NO_FAILURE | UNKNOWN | TIMEOUT | MEMOUT_WATERMARK | CANCELED | NUM_CONFLICTS | THEORY | QUANTIFIERS and ast_print_mode = | PRINT_SMTLIB_FULL | PRINT_LOW_LEVEL | PRINT_SMTLIB_COMPLIANT | PRINT_SMTLIB2_COMPLIANT and error_code = | OK | SORT_ERROR | IOB | INVALID_ARG | PARSER_ERROR | NO_PARSER | INVALID_PATTERN | MEMOUT_FAIL | FILE_ACCESS_ERROR | INTERNAL_FATAL | INVALID_USAGE | DEC_REF_ERROR | EXCEPTION and goal_prec = | GOAL_PRECISE | GOAL_UNDER | GOAL_OVER | GOAL_UNDER_OVER external finalize_Z3_context : context -> unit = "finalize_Z3_context";; let _ = Callback.register "finalize_Z3_context" finalize_Z3_context external finalize_Z3_ast : ast -> unit = "finalize_Z3_ast";; let _ = Callback.register "finalize_Z3_ast" finalize_Z3_ast external finalize_Z3_params : params -> unit = "finalize_Z3_params";; let _ = Callback.register "finalize_Z3_params" finalize_Z3_params external finalize_Z3_param_descrs : param_descrs -> unit = "finalize_Z3_param_descrs";; let _ = Callback.register "finalize_Z3_param_descrs" finalize_Z3_param_descrs external finalize_Z3_model : model -> unit = "finalize_Z3_model";; let _ = Callback.register "finalize_Z3_model" finalize_Z3_model external finalize_Z3_func_interp : func_interp -> unit = "finalize_Z3_func_interp";; let _ = Callback.register "finalize_Z3_func_interp" finalize_Z3_func_interp external finalize_Z3_func_entry : func_entry -> unit = "finalize_Z3_func_entry";; let _ = Callback.register "finalize_Z3_func_entry" finalize_Z3_func_entry external finalize_Z3_fixedpoint : fixedpoint -> unit = "finalize_Z3_fixedpoint";; let _ = Callback.register "finalize_Z3_fixedpoint" finalize_Z3_fixedpoint external finalize_Z3_ast_vector : ast_vector -> unit = "finalize_Z3_ast_vector";; let _ = Callback.register "finalize_Z3_ast_vector" finalize_Z3_ast_vector external finalize_Z3_ast_map : ast_map -> unit = "finalize_Z3_ast_map";; let _ = Callback.register "finalize_Z3_ast_map" finalize_Z3_ast_map external finalize_Z3_goal : goal -> unit = "finalize_Z3_goal";; let _ = Callback.register "finalize_Z3_goal" finalize_Z3_goal external finalize_Z3_tactic : tactic -> unit = "finalize_Z3_tactic";; let _ = Callback.register "finalize_Z3_tactic" finalize_Z3_tactic external finalize_Z3_probe : probe -> unit = "finalize_Z3_probe";; let _ = Callback.register "finalize_Z3_probe" finalize_Z3_probe external finalize_Z3_apply_result : apply_result -> unit = "finalize_Z3_apply_result";; let _ = Callback.register "finalize_Z3_apply_result" finalize_Z3_apply_result external finalize_Z3_solver : solver -> unit = "finalize_Z3_solver";; let _ = Callback.register "finalize_Z3_solver" finalize_Z3_solver external finalize_Z3_stats : stats -> unit = "finalize_Z3_stats";; let _ = Callback.register "finalize_Z3_stats" finalize_Z3_stats let del_constructor _ _ = () let del_constructor_list _ _ = () let del_model _ _ = () let del_context _ = () let reset_memory () = () (** Exceptions raised by Z3. It is safe to continue interacting with Z3 after catching [Error] exceptions. - {b See also}: {!get_error_msg} *) exception Error of context * error_code let _ = Callback.register_exception "Z3.Error" (Error (Obj.magic None, OK)) external mk_context: (string * string) list -> context = "caml_z3_mk_context" external update_param_value : context -> string -> string -> unit = "camlidl_z3_Z3_update_param_value" external get_param_value : context -> string -> string option = "camlidl_z3_Z3_get_param_value" external interrupt : context -> unit = "camlidl_z3_Z3_interrupt" external mk_params : context -> params = "camlidl_z3_Z3_mk_params" external params_set_bool : context -> params -> symbol -> bool -> unit = "camlidl_z3_Z3_params_set_bool" external params_set_uint : context -> params -> symbol -> int -> unit = "camlidl_z3_Z3_params_set_uint" external params_set_double : context -> params -> symbol -> float -> unit = "camlidl_z3_Z3_params_set_double" external params_set_symbol : context -> params -> symbol -> symbol -> unit = "camlidl_z3_Z3_params_set_symbol" external params_to_string : context -> params -> string = "camlidl_z3_Z3_params_to_string" external params_validate : context -> params -> param_descrs -> unit = "camlidl_z3_Z3_params_validate" external param_descrs_get_kind : context -> param_descrs -> symbol -> param_kind = "camlidl_z3_Z3_param_descrs_get_kind" external param_descrs_size : context -> param_descrs -> int = "camlidl_z3_Z3_param_descrs_size" external param_descrs_get_name : context -> param_descrs -> int -> symbol = "camlidl_z3_Z3_param_descrs_get_name" (** Refined view of a {!symbol}. - {b See also}: {!mk_symbol} - {b See also}: {!symbol_refine} *) type symbol_refined = | Symbol_int of int | Symbol_string of string external mk_int_symbol : context -> int -> symbol = "camlidl_z3_Z3_mk_int_symbol" external mk_string_symbol : context -> string -> symbol = "camlidl_z3_Z3_mk_string_symbol" (** A datatype constructor descriptor. *) type datatype_constructor_desc = { constructor_desc : symbol; (** name of the constructor function *) recognizer_desc : symbol; (** name of the recognizer function *) accessor_descs : (symbol * sort) array; (** names and sorts of the fields *) } (** A datatype is described by a name and constructor descriptors. *) type datatype_desc = symbol * datatype_constructor_desc array (** A datatype constructor representation. *) type datatype_constructor = { constructor : func_decl; (** constructor function *) recognizer : func_decl; (** recognizer function *) accessors : func_decl array; (** field accessor functions *) } (** A datatype is represented by a sort and constructors. *) type datatype = sort * datatype_constructor array (** Refined view of a {!sort}. - {b See also}: {!mk_sort} - {b See also}: {!sort_refine} *) type sort_refined = | Sort_uninterpreted of symbol | Sort_bool | Sort_int | Sort_bv of int | Sort_finite_domain of symbol * int64 | Sort_real | Sort_array of sort * sort | Sort_datatype of datatype_constructor array | Sort_relation of sort array | Sort_unknown external mk_uninterpreted_sort : context -> symbol -> sort = "camlidl_z3_Z3_mk_uninterpreted_sort" external mk_bool_sort : context -> sort = "camlidl_z3_Z3_mk_bool_sort" external mk_int_sort : context -> sort = "camlidl_z3_Z3_mk_int_sort" external mk_real_sort : context -> sort = "camlidl_z3_Z3_mk_real_sort" external mk_bv_sort : context -> int -> sort = "camlidl_z3_Z3_mk_bv_sort" external mk_finite_domain_sort : context -> symbol -> int64 -> sort = "camlidl_z3_Z3_mk_finite_domain_sort" external mk_array_sort : context -> sort -> sort -> sort = "camlidl_z3_Z3_mk_array_sort" external mk_tuple_sort : context -> symbol -> symbol array -> sort array -> sort * func_decl * func_decl array = "camlidl_z3_Z3_mk_tuple_sort" external mk_enumeration_sort : context -> symbol -> symbol array -> sort * func_decl array * func_decl array = "camlidl_z3_Z3_mk_enumeration_sort" external mk_list_sort : context -> symbol -> sort -> sort * func_decl * func_decl * func_decl * func_decl * func_decl * func_decl = "camlidl_z3_Z3_mk_list_sort" external mk_constructor : context -> symbol -> symbol -> symbol array -> sort option array -> int array -> constructor = "camlidl_z3_Z3_mk_constructor_bytecode" "camlidl_z3_Z3_mk_constructor" external del_constructor : context -> constructor -> unit = "camlidl_z3_Z3_del_constructor" external mk_datatype : context -> symbol -> constructor array -> sort * constructor array = "camlidl_z3_Z3_mk_datatype" external mk_constructor_list : context -> constructor array -> constructor_list = "camlidl_z3_Z3_mk_constructor_list" external del_constructor_list : context -> constructor_list -> unit = "camlidl_z3_Z3_del_constructor_list" external mk_datatypes : context -> symbol array -> constructor_list array -> sort array * constructor_list array = "camlidl_z3_Z3_mk_datatypes" external query_constructor : context -> constructor -> int -> func_decl * func_decl * func_decl array = "camlidl_z3_Z3_query_constructor" external mk_func_decl : context -> symbol -> sort array -> sort -> func_decl = "camlidl_z3_Z3_mk_func_decl" external mk_app : context -> func_decl -> ast array -> ast = "camlidl_z3_Z3_mk_app" external mk_const : context -> symbol -> sort -> ast = "camlidl_z3_Z3_mk_const" external mk_fresh_func_decl : context -> string -> sort array -> sort -> func_decl = "camlidl_z3_Z3_mk_fresh_func_decl" external mk_fresh_const : context -> string -> sort -> ast = "camlidl_z3_Z3_mk_fresh_const" external mk_true : context -> ast = "camlidl_z3_Z3_mk_true" external mk_false : context -> ast = "camlidl_z3_Z3_mk_false" external mk_eq : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_eq" external mk_distinct : context -> ast array -> ast = "camlidl_z3_Z3_mk_distinct" external mk_not : context -> ast -> ast = "camlidl_z3_Z3_mk_not" external mk_ite : context -> ast -> ast -> ast -> ast = "camlidl_z3_Z3_mk_ite" external mk_iff : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_iff" external mk_implies : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_implies" external mk_xor : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_xor" external mk_and : context -> ast array -> ast = "camlidl_z3_Z3_mk_and" external mk_or : context -> ast array -> ast = "camlidl_z3_Z3_mk_or" external mk_add : context -> ast array -> ast = "camlidl_z3_Z3_mk_add" external mk_mul : context -> ast array -> ast = "camlidl_z3_Z3_mk_mul" external mk_sub : context -> ast array -> ast = "camlidl_z3_Z3_mk_sub" external mk_unary_minus : context -> ast -> ast = "camlidl_z3_Z3_mk_unary_minus" external mk_div : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_div" external mk_mod : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_mod" external mk_rem : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_rem" external mk_power : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_power" external mk_lt : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_lt" external mk_le : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_le" external mk_gt : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_gt" external mk_ge : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_ge" external mk_int2real : context -> ast -> ast = "camlidl_z3_Z3_mk_int2real" external mk_real2int : context -> ast -> ast = "camlidl_z3_Z3_mk_real2int" external mk_is_int : context -> ast -> ast = "camlidl_z3_Z3_mk_is_int" external mk_bvnot : context -> ast -> ast = "camlidl_z3_Z3_mk_bvnot" external mk_bvredand : context -> ast -> ast = "camlidl_z3_Z3_mk_bvredand" external mk_bvredor : context -> ast -> ast = "camlidl_z3_Z3_mk_bvredor" external mk_bvand : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvand" external mk_bvor : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvor" external mk_bvxor : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvxor" external mk_bvnand : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvnand" external mk_bvnor : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvnor" external mk_bvxnor : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvxnor" external mk_bvneg : context -> ast -> ast = "camlidl_z3_Z3_mk_bvneg" external mk_bvadd : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvadd" external mk_bvsub : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvsub" external mk_bvmul : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvmul" external mk_bvudiv : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvudiv" external mk_bvsdiv : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvsdiv" external mk_bvurem : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvurem" external mk_bvsrem : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvsrem" external mk_bvsmod : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvsmod" external mk_bvult : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvult" external mk_bvslt : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvslt" external mk_bvule : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvule" external mk_bvsle : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvsle" external mk_bvuge : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvuge" external mk_bvsge : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvsge" external mk_bvugt : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvugt" external mk_bvsgt : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvsgt" external mk_concat : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_concat" external mk_extract : context -> int -> int -> ast -> ast = "camlidl_z3_Z3_mk_extract" external mk_sign_ext : context -> int -> ast -> ast = "camlidl_z3_Z3_mk_sign_ext" external mk_zero_ext : context -> int -> ast -> ast = "camlidl_z3_Z3_mk_zero_ext" external mk_repeat : context -> int -> ast -> ast = "camlidl_z3_Z3_mk_repeat" external mk_bvshl : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvshl" external mk_bvlshr : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvlshr" external mk_bvashr : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvashr" external mk_rotate_left : context -> int -> ast -> ast = "camlidl_z3_Z3_mk_rotate_left" external mk_rotate_right : context -> int -> ast -> ast = "camlidl_z3_Z3_mk_rotate_right" external mk_ext_rotate_left : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_ext_rotate_left" external mk_ext_rotate_right : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_ext_rotate_right" external mk_int2bv : context -> int -> ast -> ast = "camlidl_z3_Z3_mk_int2bv" external mk_bv2int : context -> ast -> bool -> ast = "camlidl_z3_Z3_mk_bv2int" external mk_bvadd_no_overflow : context -> ast -> ast -> bool -> ast = "camlidl_z3_Z3_mk_bvadd_no_overflow" external mk_bvadd_no_underflow : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvadd_no_underflow" external mk_bvsub_no_overflow : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvsub_no_overflow" external mk_bvsub_no_underflow : context -> ast -> ast -> bool -> ast = "camlidl_z3_Z3_mk_bvsub_no_underflow" external mk_bvsdiv_no_overflow : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvsdiv_no_overflow" external mk_bvneg_no_overflow : context -> ast -> ast = "camlidl_z3_Z3_mk_bvneg_no_overflow" external mk_bvmul_no_overflow : context -> ast -> ast -> bool -> ast = "camlidl_z3_Z3_mk_bvmul_no_overflow" external mk_bvmul_no_underflow : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_bvmul_no_underflow" external mk_select : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_select" external mk_store : context -> ast -> ast -> ast -> ast = "camlidl_z3_Z3_mk_store" external mk_const_array : context -> sort -> ast -> ast = "camlidl_z3_Z3_mk_const_array" external mk_map : context -> func_decl -> int -> ast -> ast = "camlidl_z3_Z3_mk_map" external mk_array_default : context -> ast -> ast = "camlidl_z3_Z3_mk_array_default" external mk_set_sort : context -> sort -> sort = "camlidl_z3_Z3_mk_set_sort" external mk_empty_set : context -> sort -> ast = "camlidl_z3_Z3_mk_empty_set" external mk_full_set : context -> sort -> ast = "camlidl_z3_Z3_mk_full_set" external mk_set_add : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_set_add" external mk_set_del : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_set_del" external mk_set_union : context -> ast array -> ast = "camlidl_z3_Z3_mk_set_union" external mk_set_intersect : context -> ast array -> ast = "camlidl_z3_Z3_mk_set_intersect" external mk_set_difference : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_set_difference" external mk_set_complement : context -> ast -> ast = "camlidl_z3_Z3_mk_set_complement" external mk_set_member : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_set_member" external mk_set_subset : context -> ast -> ast -> ast = "camlidl_z3_Z3_mk_set_subset" (** Summary: \[ [ numeral_refined ] \] is the refined view of a numeral . *) type numeral_refined = | Numeral_int of int * sort | Numeral_int64 of int64 * sort | Numeral_large of string * sort | Numeral_rational of numeral_refined * numeral_refined external mk_numeral : context -> string -> sort -> ast = "camlidl_z3_Z3_mk_numeral" external mk_real : context -> int -> int -> ast = "camlidl_z3_Z3_mk_real" external mk_int : context -> int -> sort -> ast = "camlidl_z3_Z3_mk_int" external mk_int64 : context -> int64 -> sort -> ast = "camlidl_z3_Z3_mk_int64" external mk_pattern : context -> ast array -> pattern = "camlidl_z3_Z3_mk_pattern" external mk_bound : context -> int -> sort -> ast = "camlidl_z3_Z3_mk_bound" external mk_forall : context -> int -> pattern array -> sort array -> symbol array -> ast -> ast = "camlidl_z3_Z3_mk_forall_bytecode" "camlidl_z3_Z3_mk_forall" external mk_exists : context -> int -> pattern array -> sort array -> symbol array -> ast -> ast = "camlidl_z3_Z3_mk_exists_bytecode" "camlidl_z3_Z3_mk_exists" external mk_quantifier : context -> bool -> int -> pattern array -> sort array -> symbol array -> ast -> ast = "camlidl_z3_Z3_mk_quantifier_bytecode" "camlidl_z3_Z3_mk_quantifier" external mk_quantifier_ex : context -> bool -> int -> symbol -> symbol -> pattern array -> ast array -> sort array -> symbol array -> ast -> ast = "camlidl_z3_Z3_mk_quantifier_ex_bytecode" "camlidl_z3_Z3_mk_quantifier_ex" external mk_forall_const : context -> int -> app array -> pattern array -> ast -> ast = "camlidl_z3_Z3_mk_forall_const" external mk_exists_const : context -> int -> app array -> pattern array -> ast -> ast = "camlidl_z3_Z3_mk_exists_const" external mk_quantifier_const : context -> bool -> int -> app array -> pattern array -> ast -> ast = "camlidl_z3_Z3_mk_quantifier_const_bytecode" "camlidl_z3_Z3_mk_quantifier_const" external mk_quantifier_const_ex : context -> bool -> int -> symbol -> symbol -> app array -> pattern array -> ast array -> ast -> ast = "camlidl_z3_Z3_mk_quantifier_const_ex_bytecode" "camlidl_z3_Z3_mk_quantifier_const_ex" external get_symbol_kind : context -> symbol -> symbol_kind = "camlidl_z3_Z3_get_symbol_kind" external get_symbol_int : context -> symbol -> int = "camlidl_z3_Z3_get_symbol_int" external get_symbol_string : context -> symbol -> string = "camlidl_z3_Z3_get_symbol_string" external get_sort_name : context -> sort -> symbol = "camlidl_z3_Z3_get_sort_name" external get_sort_id : context -> sort -> int = "camlidl_z3_Z3_get_sort_id" external sort_to_ast : context -> sort -> ast = "camlidl_z3_Z3_sort_to_ast" external is_eq_sort : context -> sort -> sort -> bool = "camlidl_z3_Z3_is_eq_sort" external get_sort_kind : context -> sort -> sort_kind = "camlidl_z3_Z3_get_sort_kind" external get_bv_sort_size : context -> sort -> int = "camlidl_z3_Z3_get_bv_sort_size" external get_finite_domain_sort_size : context -> sort -> int64 option = "camlidl_z3_Z3_get_finite_domain_sort_size" external get_array_sort_domain : context -> sort -> sort = "camlidl_z3_Z3_get_array_sort_domain" external get_array_sort_range : context -> sort -> sort = "camlidl_z3_Z3_get_array_sort_range" external get_tuple_sort_mk_decl : context -> sort -> func_decl = "camlidl_z3_Z3_get_tuple_sort_mk_decl" external get_tuple_sort_num_fields : context -> sort -> int = "camlidl_z3_Z3_get_tuple_sort_num_fields" external get_tuple_sort_field_decl : context -> sort -> int -> func_decl = "camlidl_z3_Z3_get_tuple_sort_field_decl" external get_datatype_sort_num_constructors : context -> sort -> int = "camlidl_z3_Z3_get_datatype_sort_num_constructors" external get_datatype_sort_constructor : context -> sort -> int -> func_decl = "camlidl_z3_Z3_get_datatype_sort_constructor" external get_datatype_sort_recognizer : context -> sort -> int -> func_decl = "camlidl_z3_Z3_get_datatype_sort_recognizer" external get_datatype_sort_constructor_accessor : context -> sort -> int -> int -> func_decl = "camlidl_z3_Z3_get_datatype_sort_constructor_accessor" external get_relation_arity : context -> sort -> int = "camlidl_z3_Z3_get_relation_arity" external get_relation_column : context -> sort -> int -> sort = "camlidl_z3_Z3_get_relation_column" external func_decl_to_ast : context -> func_decl -> ast = "camlidl_z3_Z3_func_decl_to_ast" external is_eq_func_decl : context -> func_decl -> func_decl -> bool = "camlidl_z3_Z3_is_eq_func_decl" external get_func_decl_id : context -> func_decl -> int = "camlidl_z3_Z3_get_func_decl_id" external get_decl_name : context -> func_decl -> symbol = "camlidl_z3_Z3_get_decl_name" external get_decl_kind : context -> func_decl -> decl_kind = "camlidl_z3_Z3_get_decl_kind" external get_domain_size : context -> func_decl -> int = "camlidl_z3_Z3_get_domain_size" external get_arity : context -> func_decl -> int = "camlidl_z3_Z3_get_arity" external get_domain : context -> func_decl -> int -> sort = "camlidl_z3_Z3_get_domain" external get_range : context -> func_decl -> sort = "camlidl_z3_Z3_get_range" external get_decl_num_parameters : context -> func_decl -> int = "camlidl_z3_Z3_get_decl_num_parameters" external get_decl_parameter_kind : context -> func_decl -> int -> parameter_kind = "camlidl_z3_Z3_get_decl_parameter_kind" external get_decl_int_parameter : context -> func_decl -> int -> int = "camlidl_z3_Z3_get_decl_int_parameter" external get_decl_double_parameter : context -> func_decl -> int -> float = "camlidl_z3_Z3_get_decl_double_parameter" external get_decl_symbol_parameter : context -> func_decl -> int -> symbol = "camlidl_z3_Z3_get_decl_symbol_parameter" external get_decl_sort_parameter : context -> func_decl -> int -> sort = "camlidl_z3_Z3_get_decl_sort_parameter" external get_decl_ast_parameter : context -> func_decl -> int -> ast = "camlidl_z3_Z3_get_decl_ast_parameter" external get_decl_func_decl_parameter : context -> func_decl -> int -> func_decl = "camlidl_z3_Z3_get_decl_func_decl_parameter" external get_decl_rational_parameter : context -> func_decl -> int -> string = "camlidl_z3_Z3_get_decl_rational_parameter" external app_to_ast : context -> app -> ast = "camlidl_z3_Z3_app_to_ast" external get_app_decl : context -> app -> func_decl = "camlidl_z3_Z3_get_app_decl" external get_app_num_args : context -> app -> int = "camlidl_z3_Z3_get_app_num_args" external get_app_arg : context -> app -> int -> ast = "camlidl_z3_Z3_get_app_arg" (** Summary: \[ [ binder_type ] \] is a universal or existential quantifier. - {b See also}: {!term_refined} *) type binder_type = Forall | Exists (** Summary: \[ [ term_refined ] \] is the refinement of a {!ast} . - {b See also}: {!term_refine} *) type term_refined = | Term_numeral of numeral_refined | Term_app of decl_kind * func_decl * ast array | Term_quantifier of binder_type * int * ast array array * (symbol * sort) array * ast | Term_var of int * sort external is_eq_ast : context -> ast -> ast -> bool = "camlidl_z3_Z3_is_eq_ast" external get_ast_id : context -> ast -> int = "camlidl_z3_Z3_get_ast_id" external get_ast_hash : context -> ast -> int = "camlidl_z3_Z3_get_ast_hash" external get_sort : context -> ast -> sort = "camlidl_z3_Z3_get_sort" external is_well_sorted : context -> ast -> bool = "camlidl_z3_Z3_is_well_sorted" external get_bool_value : context -> ast -> lbool = "camlidl_z3_Z3_get_bool_value" external get_ast_kind : context -> ast -> ast_kind = "camlidl_z3_Z3_get_ast_kind" external is_app : context -> ast -> bool = "camlidl_z3_Z3_is_app" external is_numeral_ast : context -> ast -> bool = "camlidl_z3_Z3_is_numeral_ast" external is_algebraic_number : context -> ast -> bool = "camlidl_z3_Z3_is_algebraic_number" external to_app : context -> ast -> app = "camlidl_z3_Z3_to_app" external to_func_decl : context -> ast -> func_decl = "camlidl_z3_Z3_to_func_decl" external get_numeral_string : context -> ast -> string = "camlidl_z3_Z3_get_numeral_string" external get_numeral_decimal_string : context -> ast -> int -> string = "camlidl_z3_Z3_get_numeral_decimal_string" external get_numerator : context -> ast -> ast = "camlidl_z3_Z3_get_numerator" external get_denominator : context -> ast -> ast = "camlidl_z3_Z3_get_denominator" external get_numeral_small : context -> ast -> bool * int64 * int64 = "camlidl_z3_Z3_get_numeral_small" external get_numeral_int : context -> ast -> bool * int = "camlidl_z3_Z3_get_numeral_int" external get_numeral_int64 : context -> ast -> bool * int64 = "camlidl_z3_Z3_get_numeral_int64" external get_numeral_rational_int64 : context -> ast -> bool * int64 * int64 = "camlidl_z3_Z3_get_numeral_rational_int64" external get_algebraic_number_lower : context -> ast -> int -> ast = "camlidl_z3_Z3_get_algebraic_number_lower" external get_algebraic_number_upper : context -> ast -> int -> ast = "camlidl_z3_Z3_get_algebraic_number_upper" external pattern_to_ast : context -> pattern -> ast = "camlidl_z3_Z3_pattern_to_ast" external get_pattern_num_terms : context -> pattern -> int = "camlidl_z3_Z3_get_pattern_num_terms" external get_pattern : context -> pattern -> int -> ast = "camlidl_z3_Z3_get_pattern" external get_index_value : context -> ast -> int = "camlidl_z3_Z3_get_index_value" external is_quantifier_forall : context -> ast -> bool = "camlidl_z3_Z3_is_quantifier_forall" external get_quantifier_weight : context -> ast -> int = "camlidl_z3_Z3_get_quantifier_weight" external get_quantifier_num_patterns : context -> ast -> int = "camlidl_z3_Z3_get_quantifier_num_patterns" external get_quantifier_pattern_ast : context -> ast -> int -> pattern = "camlidl_z3_Z3_get_quantifier_pattern_ast" external get_quantifier_num_no_patterns : context -> ast -> int = "camlidl_z3_Z3_get_quantifier_num_no_patterns" external get_quantifier_no_pattern_ast : context -> ast -> int -> ast = "camlidl_z3_Z3_get_quantifier_no_pattern_ast" external get_quantifier_bound_name : context -> ast -> int -> symbol = "camlidl_z3_Z3_get_quantifier_bound_name" external get_quantifier_bound_sort : context -> ast -> int -> sort = "camlidl_z3_Z3_get_quantifier_bound_sort" external get_quantifier_body : context -> ast -> ast = "camlidl_z3_Z3_get_quantifier_body" external get_quantifier_num_bound : context -> ast -> int = "camlidl_z3_Z3_get_quantifier_num_bound" external simplify : context -> ast -> ast = "camlidl_z3_Z3_simplify" external simplify_ex : context -> ast -> params -> ast = "camlidl_z3_Z3_simplify_ex" external simplify_get_help : context -> string = "camlidl_z3_Z3_simplify_get_help" external simplify_get_param_descrs : context -> param_descrs = "camlidl_z3_Z3_simplify_get_param_descrs" external update_term : context -> ast -> ast array -> ast = "camlidl_z3_Z3_update_term" external substitute : context -> ast -> ast array -> ast array -> ast = "camlidl_z3_Z3_substitute" external substitute_vars : context -> ast -> ast array -> ast = "camlidl_z3_Z3_substitute_vars" external translate : context -> ast -> context -> ast = "camlidl_z3_Z3_translate" (** A model assigns uninterpreted sorts to finite universes of distinct values, constants to values, and arrays and functions to finite maps from argument values to result values plus a default value for all other arguments. *) type model_refined = { sorts : (sort, ast_vector) Hashtbl.t; consts : (func_decl, ast) Hashtbl.t; arrays : (func_decl, (ast, ast) Hashtbl.t * ast) Hashtbl.t; funcs : (func_decl, (ast array, ast) Hashtbl.t * ast) Hashtbl.t; } external model_eval : context -> model -> ast -> bool -> ast option = "camlidl_z3_Z3_model_eval" external model_get_const_interp : context -> model -> func_decl -> ast option = "camlidl_z3_Z3_model_get_const_interp" external model_get_func_interp : context -> model -> func_decl -> func_interp option = "camlidl_z3_Z3_model_get_func_interp" external model_get_num_consts : context -> model -> int = "camlidl_z3_Z3_model_get_num_consts" external model_get_const_decl : context -> model -> int -> func_decl = "camlidl_z3_Z3_model_get_const_decl" external model_get_num_funcs : context -> model -> int = "camlidl_z3_Z3_model_get_num_funcs" external model_get_func_decl : context -> model -> int -> func_decl = "camlidl_z3_Z3_model_get_func_decl" external model_get_num_sorts : context -> model -> int = "camlidl_z3_Z3_model_get_num_sorts" external model_get_sort : context -> model -> int -> sort = "camlidl_z3_Z3_model_get_sort" external model_get_sort_universe : context -> model -> sort -> ast_vector = "camlidl_z3_Z3_model_get_sort_universe" external is_as_array : context -> ast -> bool = "camlidl_z3_Z3_is_as_array" external get_as_array_func_decl : context -> ast -> func_decl = "camlidl_z3_Z3_get_as_array_func_decl" external func_interp_get_num_entries : context -> func_interp -> int = "camlidl_z3_Z3_func_interp_get_num_entries" external func_interp_get_entry : context -> func_interp -> int -> func_entry = "camlidl_z3_Z3_func_interp_get_entry" external func_interp_get_else : context -> func_interp -> ast = "camlidl_z3_Z3_func_interp_get_else" external func_interp_get_arity : context -> func_interp -> int = "camlidl_z3_Z3_func_interp_get_arity" external func_entry_get_value : context -> func_entry -> ast = "camlidl_z3_Z3_func_entry_get_value" external func_entry_get_num_args : context -> func_entry -> int = "camlidl_z3_Z3_func_entry_get_num_args" external func_entry_get_arg : context -> func_entry -> int -> ast = "camlidl_z3_Z3_func_entry_get_arg" external open_log : string -> bool = "camlidl_z3_Z3_open_log" external append_log : string -> unit = "camlidl_z3_Z3_append_log" external close_log : unit -> unit = "camlidl_z3_Z3_close_log" external toggle_warning_messages : bool -> unit = "camlidl_z3_Z3_toggle_warning_messages" external set_ast_print_mode : context -> ast_print_mode -> unit = "camlidl_z3_Z3_set_ast_print_mode" external ast_to_string : context -> ast -> string = "camlidl_z3_Z3_ast_to_string" external pattern_to_string : context -> pattern -> string = "camlidl_z3_Z3_pattern_to_string" external sort_to_string : context -> sort -> string = "camlidl_z3_Z3_sort_to_string" external func_decl_to_string : context -> func_decl -> string = "camlidl_z3_Z3_func_decl_to_string" external model_to_string : context -> model -> string = "camlidl_z3_Z3_model_to_string" external benchmark_to_smtlib_string : context -> string -> string -> string -> string -> ast array -> ast -> string = "camlidl_z3_Z3_benchmark_to_smtlib_string_bytecode" "camlidl_z3_Z3_benchmark_to_smtlib_string" external parse_smtlib2_string : context -> string -> symbol array -> sort array -> symbol array -> func_decl array -> ast = "camlidl_z3_Z3_parse_smtlib2_string_bytecode" "camlidl_z3_Z3_parse_smtlib2_string" external parse_smtlib2_file : context -> string -> symbol array -> sort array -> symbol array -> func_decl array -> ast = "camlidl_z3_Z3_parse_smtlib2_file_bytecode" "camlidl_z3_Z3_parse_smtlib2_file" external parse_smtlib_string : context -> string -> symbol array -> sort array -> symbol array -> func_decl array -> unit = "camlidl_z3_Z3_parse_smtlib_string_bytecode" "camlidl_z3_Z3_parse_smtlib_string" external parse_smtlib_file : context -> string -> symbol array -> sort array -> symbol array -> func_decl array -> unit = "camlidl_z3_Z3_parse_smtlib_file_bytecode" "camlidl_z3_Z3_parse_smtlib_file" external get_smtlib_num_formulas : context -> int = "camlidl_z3_Z3_get_smtlib_num_formulas" external get_smtlib_formula : context -> int -> ast = "camlidl_z3_Z3_get_smtlib_formula" external get_smtlib_num_assumptions : context -> int = "camlidl_z3_Z3_get_smtlib_num_assumptions" external get_smtlib_assumption : context -> int -> ast = "camlidl_z3_Z3_get_smtlib_assumption" external get_smtlib_num_decls : context -> int = "camlidl_z3_Z3_get_smtlib_num_decls" external get_smtlib_decl : context -> int -> func_decl = "camlidl_z3_Z3_get_smtlib_decl" external get_smtlib_num_sorts : context -> int = "camlidl_z3_Z3_get_smtlib_num_sorts" external get_smtlib_sort : context -> int -> sort = "camlidl_z3_Z3_get_smtlib_sort" external get_smtlib_error : context -> string = "camlidl_z3_Z3_get_smtlib_error" external parse_z3_string : context -> string -> ast = "camlidl_z3_Z3_parse_z3_string" external parse_z3_file : context -> string -> ast = "camlidl_z3_Z3_parse_z3_file" external set_error : context -> error_code -> unit = "camlidl_z3_Z3_set_error" external get_error_msg_ex : context -> error_code -> string = "camlidl_z3_Z3_get_error_msg_ex" external get_version : unit -> int * int * int * int = "camlidl_z3_Z3_get_version" external mk_fixedpoint : context -> fixedpoint = "camlidl_z3_Z3_mk_fixedpoint" external fixedpoint_add_rule : context -> fixedpoint -> ast -> symbol -> unit = "camlidl_z3_Z3_fixedpoint_add_rule" external fixedpoint_add_fact : context -> fixedpoint -> func_decl -> int array -> unit = "camlidl_z3_Z3_fixedpoint_add_fact" external fixedpoint_assert : context -> fixedpoint -> ast -> unit = "camlidl_z3_Z3_fixedpoint_assert" external fixedpoint_query : context -> fixedpoint -> ast -> lbool = "camlidl_z3_Z3_fixedpoint_query" external fixedpoint_query_relations : context -> fixedpoint -> func_decl array -> lbool = "camlidl_z3_Z3_fixedpoint_query_relations" external fixedpoint_get_answer : context -> fixedpoint -> ast = "camlidl_z3_Z3_fixedpoint_get_answer" external fixedpoint_get_reason_unknown : context -> fixedpoint -> string = "camlidl_z3_Z3_fixedpoint_get_reason_unknown" external fixedpoint_update_rule : context -> fixedpoint -> ast -> symbol -> unit = "camlidl_z3_Z3_fixedpoint_update_rule" external fixedpoint_get_num_levels : context -> fixedpoint -> func_decl -> int = "camlidl_z3_Z3_fixedpoint_get_num_levels" external fixedpoint_get_cover_delta : context -> fixedpoint -> int -> func_decl -> ast = "camlidl_z3_Z3_fixedpoint_get_cover_delta" external fixedpoint_add_cover : context -> fixedpoint -> int -> func_decl -> ast -> unit = "camlidl_z3_Z3_fixedpoint_add_cover" external fixedpoint_get_statistics : context -> fixedpoint -> stats = "camlidl_z3_Z3_fixedpoint_get_statistics" external fixedpoint_register_relation : context -> fixedpoint -> func_decl -> unit = "camlidl_z3_Z3_fixedpoint_register_relation" external fixedpoint_set_predicate_representation : context -> fixedpoint -> func_decl -> symbol array -> unit = "camlidl_z3_Z3_fixedpoint_set_predicate_representation" external fixedpoint_simplify_rules : context -> fixedpoint -> ast array -> func_decl array -> ast_vector = "camlidl_z3_Z3_fixedpoint_simplify_rules" external fixedpoint_set_params : context -> fixedpoint -> params -> unit = "camlidl_z3_Z3_fixedpoint_set_params" external fixedpoint_get_help : context -> fixedpoint -> string = "camlidl_z3_Z3_fixedpoint_get_help" external fixedpoint_get_param_descrs : context -> fixedpoint -> param_descrs = "camlidl_z3_Z3_fixedpoint_get_param_descrs" external fixedpoint_to_string : context -> fixedpoint -> ast array -> string = "camlidl_z3_Z3_fixedpoint_to_string" external fixedpoint_push : context -> fixedpoint -> unit = "camlidl_z3_Z3_fixedpoint_push" external fixedpoint_pop : context -> fixedpoint -> unit = "camlidl_z3_Z3_fixedpoint_pop" external mk_ast_vector : context -> ast_vector = "camlidl_z3_Z3_mk_ast_vector" external ast_vector_size : context -> ast_vector -> int = "camlidl_z3_Z3_ast_vector_size" external ast_vector_get : context -> ast_vector -> int -> ast = "camlidl_z3_Z3_ast_vector_get" external ast_vector_set : context -> ast_vector -> int -> ast -> unit = "camlidl_z3_Z3_ast_vector_set" external ast_vector_resize : context -> ast_vector -> int -> unit = "camlidl_z3_Z3_ast_vector_resize" external ast_vector_push : context -> ast_vector -> ast -> unit = "camlidl_z3_Z3_ast_vector_push" external ast_vector_translate : context -> ast_vector -> context -> ast_vector = "camlidl_z3_Z3_ast_vector_translate" external ast_vector_to_string : context -> ast_vector -> string = "camlidl_z3_Z3_ast_vector_to_string" external mk_ast_map : context -> ast_map = "camlidl_z3_Z3_mk_ast_map" external ast_map_contains : context -> ast_map -> ast -> bool = "camlidl_z3_Z3_ast_map_contains" external ast_map_find : context -> ast_map -> ast -> ast = "camlidl_z3_Z3_ast_map_find" external ast_map_insert : context -> ast_map -> ast -> ast -> unit = "camlidl_z3_Z3_ast_map_insert" external ast_map_erase : context -> ast_map -> ast -> unit = "camlidl_z3_Z3_ast_map_erase" external ast_map_reset : context -> ast_map -> unit = "camlidl_z3_Z3_ast_map_reset" external ast_map_size : context -> ast_map -> int = "camlidl_z3_Z3_ast_map_size" external ast_map_keys : context -> ast_map -> ast_vector = "camlidl_z3_Z3_ast_map_keys" external ast_map_to_string : context -> ast_map -> string = "camlidl_z3_Z3_ast_map_to_string" external mk_goal : context -> bool -> bool -> bool -> goal = "camlidl_z3_Z3_mk_goal" external goal_precision : context -> goal -> goal_prec = "camlidl_z3_Z3_goal_precision" external goal_assert : context -> goal -> ast -> unit = "camlidl_z3_Z3_goal_assert" external goal_inconsistent : context -> goal -> bool = "camlidl_z3_Z3_goal_inconsistent" external goal_depth : context -> goal -> int = "camlidl_z3_Z3_goal_depth" external goal_reset : context -> goal -> unit = "camlidl_z3_Z3_goal_reset" external goal_size : context -> goal -> int = "camlidl_z3_Z3_goal_size" external goal_formula : context -> goal -> int -> ast = "camlidl_z3_Z3_goal_formula" external goal_num_exprs : context -> goal -> int = "camlidl_z3_Z3_goal_num_exprs" external goal_is_decided_sat : context -> goal -> bool = "camlidl_z3_Z3_goal_is_decided_sat" external goal_is_decided_unsat : context -> goal -> bool = "camlidl_z3_Z3_goal_is_decided_unsat" external goal_translate : context -> goal -> context -> goal = "camlidl_z3_Z3_goal_translate" external goal_to_string : context -> goal -> string = "camlidl_z3_Z3_goal_to_string" external mk_tactic : context -> string -> tactic = "camlidl_z3_Z3_mk_tactic" external mk_probe : context -> string -> probe = "camlidl_z3_Z3_mk_probe" external tactic_and_then : context -> tactic -> tactic -> tactic = "camlidl_z3_Z3_tactic_and_then" external tactic_or_else : context -> tactic -> tactic -> tactic = "camlidl_z3_Z3_tactic_or_else" external tactic_par_or : context -> tactic array -> tactic = "camlidl_z3_Z3_tactic_par_or" external tactic_par_and_then : context -> tactic -> tactic -> tactic = "camlidl_z3_Z3_tactic_par_and_then" external tactic_try_for : context -> tactic -> int -> tactic = "camlidl_z3_Z3_tactic_try_for" external tactic_when : context -> probe -> tactic -> tactic = "camlidl_z3_Z3_tactic_when" external tactic_cond : context -> probe -> tactic -> tactic -> tactic = "camlidl_z3_Z3_tactic_cond" external tactic_repeat : context -> tactic -> int -> tactic = "camlidl_z3_Z3_tactic_repeat" external tactic_skip : context -> tactic = "camlidl_z3_Z3_tactic_skip" external tactic_fail : context -> tactic = "camlidl_z3_Z3_tactic_fail" external tactic_fail_if : context -> probe -> tactic = "camlidl_z3_Z3_tactic_fail_if" external tactic_fail_if_not_decided : context -> tactic = "camlidl_z3_Z3_tactic_fail_if_not_decided" external tactic_using_params : context -> tactic -> params -> tactic = "camlidl_z3_Z3_tactic_using_params" external probe_const : context -> float -> probe = "camlidl_z3_Z3_probe_const" external probe_lt : context -> probe -> probe -> probe = "camlidl_z3_Z3_probe_lt" external probe_gt : context -> probe -> probe -> probe = "camlidl_z3_Z3_probe_gt" external probe_le : context -> probe -> probe -> probe = "camlidl_z3_Z3_probe_le" external probe_ge : context -> probe -> probe -> probe = "camlidl_z3_Z3_probe_ge" external probe_eq : context -> probe -> probe -> probe = "camlidl_z3_Z3_probe_eq" external probe_and : context -> probe -> probe -> probe = "camlidl_z3_Z3_probe_and" external probe_or : context -> probe -> probe -> probe = "camlidl_z3_Z3_probe_or" external probe_not : context -> probe -> probe = "camlidl_z3_Z3_probe_not" external get_num_tactics : context -> int = "camlidl_z3_Z3_get_num_tactics" external get_tactic_name : context -> int -> string = "camlidl_z3_Z3_get_tactic_name" external get_num_probes : context -> int = "camlidl_z3_Z3_get_num_probes" external get_probe_name : context -> int -> string = "camlidl_z3_Z3_get_probe_name" external tactic_get_help : context -> tactic -> string = "camlidl_z3_Z3_tactic_get_help" external tactic_get_param_descrs : context -> tactic -> param_descrs = "camlidl_z3_Z3_tactic_get_param_descrs" external tactic_get_descr : context -> string -> string = "camlidl_z3_Z3_tactic_get_descr" external probe_get_descr : context -> string -> string = "camlidl_z3_Z3_probe_get_descr" external probe_apply : context -> probe -> goal -> float = "camlidl_z3_Z3_probe_apply" external tactic_apply : context -> tactic -> goal -> apply_result = "camlidl_z3_Z3_tactic_apply" external tactic_apply_ex : context -> tactic -> goal -> params -> apply_result = "camlidl_z3_Z3_tactic_apply_ex" external apply_result_to_string : context -> apply_result -> string = "camlidl_z3_Z3_apply_result_to_string" external apply_result_get_num_subgoals : context -> apply_result -> int = "camlidl_z3_Z3_apply_result_get_num_subgoals" external apply_result_get_subgoal : context -> apply_result -> int -> goal = "camlidl_z3_Z3_apply_result_get_subgoal" external apply_result_convert_model : context -> apply_result -> int -> model -> model = "camlidl_z3_Z3_apply_result_convert_model" external mk_solver : context -> solver = "camlidl_z3_Z3_mk_solver" external mk_simple_solver : context -> solver = "camlidl_z3_Z3_mk_simple_solver" external mk_solver_for_logic : context -> symbol -> solver = "camlidl_z3_Z3_mk_solver_for_logic" external mk_solver_from_tactic : context -> tactic -> solver = "camlidl_z3_Z3_mk_solver_from_tactic" external solver_get_help : context -> solver -> string = "camlidl_z3_Z3_solver_get_help" external solver_get_param_descrs : context -> solver -> param_descrs = "camlidl_z3_Z3_solver_get_param_descrs" external solver_set_params : context -> solver -> params -> unit = "camlidl_z3_Z3_solver_set_params" external solver_push : context -> solver -> unit = "camlidl_z3_Z3_solver_push" external solver_pop : context -> solver -> int -> unit = "camlidl_z3_Z3_solver_pop" external solver_reset : context -> solver -> unit = "camlidl_z3_Z3_solver_reset" external solver_get_num_scopes : context -> solver -> int = "camlidl_z3_Z3_solver_get_num_scopes" external solver_assert : context -> solver -> ast -> unit = "camlidl_z3_Z3_solver_assert" external solver_get_assertions : context -> solver -> ast_vector = "camlidl_z3_Z3_solver_get_assertions" external solver_check : context -> solver -> lbool = "camlidl_z3_Z3_solver_check" external solver_check_assumptions : context -> solver -> ast array -> lbool = "camlidl_z3_Z3_solver_check_assumptions" external solver_get_model : context -> solver -> model = "camlidl_z3_Z3_solver_get_model" external solver_get_proof : context -> solver -> ast = "camlidl_z3_Z3_solver_get_proof" external solver_get_unsat_core : context -> solver -> ast_vector = "camlidl_z3_Z3_solver_get_unsat_core" external solver_get_reason_unknown : context -> solver -> string = "camlidl_z3_Z3_solver_get_reason_unknown" external solver_get_statistics : context -> solver -> stats = "camlidl_z3_Z3_solver_get_statistics" external solver_to_string : context -> solver -> string = "camlidl_z3_Z3_solver_to_string" type stat_datum = Stat_int of int | Stat_float of float type stats_refined = (string, stat_datum) Hashtbl.t external stats_to_string : context -> stats -> string = "camlidl_z3_Z3_stats_to_string" external stats_size : context -> stats -> int = "camlidl_z3_Z3_stats_size" external stats_get_key : context -> stats -> int -> string = "camlidl_z3_Z3_stats_get_key" external stats_is_uint : context -> stats -> int -> bool = "camlidl_z3_Z3_stats_is_uint" external stats_is_double : context -> stats -> int -> bool = "camlidl_z3_Z3_stats_is_double" external stats_get_uint_value : context -> stats -> int -> int = "camlidl_z3_Z3_stats_get_uint_value" external stats_get_double_value : context -> stats -> int -> float = "camlidl_z3_Z3_stats_get_double_value" (* Internal auxiliary functions: *) (* (* Transform a pair of arrays into an array of pairs *) let array_combine a b = if Array.length a <> Array.length b then raise (Invalid_argument "array_combine"); Array.init (Array.length a) (fun i -> (a.(i), b.(i))) (* [a |> b] is the pipeline operator for [b(a)] *) let ( |> ) x f = f x *) (* Find the index of an element in an array, raises Not_found is missing *) let find equal x a = let len = Array.length a in let rec find_ i = if i >= len then raise Not_found else if equal x a.(i) then i else find_ (i+1) in find_ 0 (* Symbols *) let symbol_refine c s = match get_symbol_kind c s with | INT_SYMBOL -> Symbol_int (get_symbol_int c s) | STRING_SYMBOL -> Symbol_string (get_symbol_string c s) let mk_symbol c = function | Symbol_int(i) -> mk_int_symbol c i | Symbol_string(s) -> mk_string_symbol c s (* Sorts *) let get_datatype_sort c s = Array.init (get_datatype_sort_num_constructors c s) (fun i -> let constructor = get_datatype_sort_constructor c s i in let recognizer = get_datatype_sort_recognizer c s i in let accessors = Array.init (get_domain_size c constructor) (fun j -> get_datatype_sort_constructor_accessor c s i j ) in {constructor; recognizer; accessors} ) let sort_refine c s = match get_sort_kind c s with | UNINTERPRETED_SORT -> Sort_uninterpreted (get_sort_name c s) | BOOL_SORT -> Sort_bool | INT_SORT -> Sort_int | BV_SORT -> Sort_bv (get_bv_sort_size c s) | FINITE_DOMAIN_SORT -> (match get_finite_domain_sort_size c s with | Some(sz) -> Sort_finite_domain (get_sort_name c s, sz) | None -> failwith "Z3.sort_refine: failed to get size of finite-domain sort" ) | REAL_SORT -> Sort_real | ARRAY_SORT -> Sort_array (get_array_sort_domain c s, get_array_sort_range c s) | DATATYPE_SORT -> Sort_datatype (get_datatype_sort c s) | RELATION_SORT -> Sort_relation (Array.init (get_relation_arity c s) (fun i -> get_relation_column c s i)) | UNKNOWN_SORT -> Sort_unknown let mk_sort c = function | Sort_uninterpreted(s) -> mk_uninterpreted_sort c s | Sort_bool -> mk_bool_sort c | Sort_int -> mk_int_sort c | Sort_bv(size) -> mk_bv_sort c size | Sort_finite_domain(name,size) -> mk_finite_domain_sort c name size | Sort_real -> mk_real_sort c | Sort_array(domain,range) -> mk_array_sort c domain range | Sort_datatype(constructors) -> get_range c constructors.(0).constructor | Sort_relation(_) -> invalid_arg "Z3.mk_sort: cannot construct relation sorts" | Sort_unknown(_) -> invalid_arg "Z3.mk_sort: cannot construct unknown sorts" (* Replacement datatypes creation API *) let mk_datatypes ctx generator = let usort0 = mk_uninterpreted_sort ctx (mk_int_symbol ctx 0) in let rec find_num_sorts i = if i = max_int then invalid_arg "mk_datatypes: too many sorts" else match generator (Array.make i usort0) with | None -> find_num_sorts (i+1) | Some(a) when Array.length a = i -> i | Some _ -> invalid_arg "mk_datatypes: number of sorts and datatype descriptors must be equal" in let num_sorts = find_num_sorts 0 in let sorts0 = Array.init num_sorts (fun i -> mk_uninterpreted_sort ctx (mk_int_symbol ctx i)) in let ctorss_descriptors = match generator sorts0 with | Some(ctorss_descriptors) -> ctorss_descriptors | None -> invalid_arg "mk_datatypes: generator failed" in let names = Array.map fst ctorss_descriptors in let ctorss = Array.map (fun (_, ctors_descriptor) -> Array.map (fun {constructor_desc; recognizer_desc; accessor_descs} -> let field_names = Array.map fst accessor_descs in let sort_refs = Array.make (Array.length accessor_descs) 0 in let field_sorts = Array.mapi (fun i (_, sort) -> try let j = find (fun s t -> is_eq_sort ctx s t) sort sorts0 in sort_refs.(i) <- j ; None with Not_found -> Some(sort) ) accessor_descs in mk_constructor ctx constructor_desc recognizer_desc field_names field_sorts sort_refs ) ctors_descriptor ) ctorss_descriptors in let constructor_lists = Array.map (mk_constructor_list ctx) ctorss in let sorts,_ = mk_datatypes ctx names constructor_lists in let datatypes = Array.mapi (fun i sort -> (sort, Array.mapi (fun j ctor -> let num_fields = Array.length (snd ctorss_descriptors.(i)).(j).accessor_descs in let constructor, recognizer, accessors = query_constructor ctx ctor num_fields in {constructor; recognizer; accessors} ) ctorss.(i)) ) sorts in Array.iter (fun ctor_list -> del_constructor_list ctx ctor_list ) constructor_lists ; Array.iter (fun ctors -> Array.iter (fun ctor -> del_constructor ctx ctor ) ctors ) ctorss ; datatypes (* Numerals *) let rec numeral_refine c t = assert( get_ast_kind c t = NUMERAL_AST ); let sort = get_sort c t in let is_int, i = get_numeral_int c t in if is_int then Numeral_int (i, sort) else let is_int64, i = get_numeral_int64 c t in if is_int64 then Numeral_int64 (i, sort) else if get_sort_kind c sort <> REAL_SORT then Numeral_large (get_numeral_string c t, sort) else let n = numeral_refine c (get_numerator c t) in let d = numeral_refine c (get_denominator c t) in Numeral_rational (n, d) let to_real c x = if get_sort_kind c (get_sort c x) = REAL_SORT then x else mk_int2real c x let rec embed_numeral c = function | Numeral_int (i, s) -> mk_int c i s | Numeral_int64 (i, s) -> mk_int64 c i s | Numeral_large (l, s) -> mk_numeral c l s | Numeral_rational (Numeral_int(n,_), Numeral_int(d,_)) -> mk_real c n d | Numeral_rational (n, d) -> mk_div c (to_real c (embed_numeral c n)) (to_real c (embed_numeral c d)) (* Or should the following be used instead? let n_str = get_numeral_string c (embed_numeral c n) in let d_str = get_numeral_string c (embed_numeral c d) in mk_numeral c (n_str ^ " / " ^ d_str) (mk_real_sort c) *) (* Terms *) let get_app_args c a = Array.init (get_app_num_args c a) (get_app_arg c a);; let get_domains c d = Array.init (get_domain_size c d) (get_domain c d);; let get_pattern_terms c p = Array.init (get_pattern_num_terms c p) (get_pattern c p) let term_refine c t = match get_ast_kind c t with | NUMERAL_AST -> Term_numeral (numeral_refine c t) | APP_AST -> let t' = to_app c t in let f = get_app_decl c t' in let num_args = get_app_num_args c t' in let args = Array.init num_args (get_app_arg c t') in let k = get_decl_kind c f in Term_app (k, f, args) | QUANTIFIER_AST -> let bt = if is_quantifier_forall c t then Forall else Exists in let w = get_quantifier_weight c t in let np = get_quantifier_num_patterns c t in let pats = Array.init np (get_quantifier_pattern_ast c t) in let pats = Array.map (get_pattern_terms c) pats in let nb = get_quantifier_num_bound c t in let bound = Array.init nb (fun i -> (get_quantifier_bound_name c t i, get_quantifier_bound_sort c t i) ) in let body = get_quantifier_body c t in Term_quantifier (bt, w, pats, bound, body) | VAR_AST -> Term_var (get_index_value c t, get_sort c t) | _ -> assert false (* let mk_term c = function *) (* | Term_numeral (numeral, sort) -> mk_numeral c numeral sort *) (* | Term_app (kind, decl, args) -> *) (* | Term_quantifier (strength, weight, pats, bound, body) -> *) (* | Term_var (index, sort) -> *) (* Refined model API *) let model_refine c m = let num_sorts = model_get_num_sorts c m in let sorts = Hashtbl.create num_sorts in for i = 0 to num_sorts - 1 do let sort = model_get_sort c m i in let universe = model_get_sort_universe c m sort in Hashtbl.add sorts sort universe done; let num_consts = model_get_num_consts c m in let consts = Hashtbl.create num_consts in let arrays = Hashtbl.create 0 in for i = 0 to num_consts - 1 do let const_decl = model_get_const_decl c m i in match model_get_const_interp c m const_decl with | Some(const_interp) -> if is_as_array c const_interp then let array_decl = get_as_array_func_decl c const_interp in match model_get_func_interp c m array_decl with | Some(array_interp) -> let num_entries = func_interp_get_num_entries c array_interp in let tbl = Hashtbl.create num_entries in for i = 0 to num_entries - 1 do let entry = func_interp_get_entry c array_interp i in assert( func_entry_get_num_args c entry = 1 ); let arg = func_entry_get_arg c entry 0 in let value = func_entry_get_value c entry in Hashtbl.add tbl arg value done; let default = func_interp_get_else c array_interp in Hashtbl.add arrays const_decl (tbl, default) | None -> () else Hashtbl.add consts const_decl const_interp | None -> () done; let num_funcs = model_get_num_funcs c m in let funcs = Hashtbl.create num_funcs in for i = 0 to num_funcs - 1 do let func_decl = model_get_func_decl c m i in if not (Hashtbl.mem arrays func_decl) then match model_get_func_interp c m func_decl with | Some(func_interp) -> let num_entries = func_interp_get_num_entries c func_interp in let tbl = Hashtbl.create num_entries in for i = 0 to num_entries - 1 do let entry = func_interp_get_entry c func_interp i in let num_args = func_entry_get_num_args c entry in let args = Array.init num_args (fun i -> func_entry_get_arg c entry i) in let value = func_entry_get_value c entry in Hashtbl.add tbl args value done; let default = func_interp_get_else c func_interp in Hashtbl.add funcs func_decl (tbl, default) | None -> () done; {sorts; consts; arrays; funcs} (* Extended parser API *) let get_smtlib_formulas c = Array.init (get_smtlib_num_formulas c) (get_smtlib_formula c) let get_smtlib_assumptions c = Array.init (get_smtlib_num_assumptions c) (get_smtlib_assumption c) let get_smtlib_decls c = Array.init (get_smtlib_num_decls c) (get_smtlib_decl c) let get_smtlib_parse_results c = (get_smtlib_formulas c, get_smtlib_assumptions c, get_smtlib_decls c) let parse_smtlib_string_x c a1 a2 a3 a4 a5 = parse_smtlib_string c a1 a2 a3 a4 a5 ; get_smtlib_parse_results c let parse_smtlib_file_x c a1 a2 a3 a4 a5 = parse_smtlib_file c a1 a2 a3 a4 a5 ; get_smtlib_parse_results c let parse_smtlib_string_formula c a1 a2 a3 a4 a5 = parse_smtlib_string c a1 a2 a3 a4 a5 ; match get_smtlib_formulas c with [|f|] -> f | _ -> failwith "Z3: parse_smtlib_string_formula" let parse_smtlib_file_formula c a1 a2 a3 a4 a5 = parse_smtlib_file c a1 a2 a3 a4 a5 ; match get_smtlib_formulas c with [|f|] -> f | _ -> failwith "Z3: parse_smtlib_file_formula" (* Error handling *) let get_error_msg c e = match e with | PARSER_ERROR -> (get_error_msg_ex c e) ^ ": " ^ (get_smtlib_error c) | _ -> get_error_msg_ex c e (* Refined stats API *) let stats_refine c s = let num_stats = stats_size c s in let tbl = Hashtbl.create num_stats in for i = 0 to num_stats - 1 do let key = stats_get_key c s i in let datum = if stats_is_uint c s i then Stat_int(stats_get_uint_value c s i) else Stat_float(stats_get_double_value c s i) in Hashtbl.add tbl key datum done; tbl let _ = Printexc.register_printer (function | Error(c,e) -> Some ("Z3 "^(get_error_msg c e)) | _ -> None ) module V3 = struct (* File generated from z3.idl *) type symbol and literals and theory and config and context and sort and func_decl and ast and app and pattern and model and constructor and constructor_list and lbool = | L_FALSE | L_UNDEF | L_TRUE and symbol_kind = | INT_SYMBOL | STRING_SYMBOL and parameter_kind = | PARAMETER_INT | PARAMETER_DOUBLE | PARAMETER_RATIONAL | PARAMETER_SYMBOL | PARAMETER_SORT | PARAMETER_AST | PARAMETER_FUNC_DECL and sort_kind = | UNINTERPRETED_SORT | BOOL_SORT | INT_SORT | REAL_SORT | BV_SORT | ARRAY_SORT | DATATYPE_SORT | RELATION_SORT | FINITE_DOMAIN_SORT | UNKNOWN_SORT and ast_kind = | NUMERAL_AST | APP_AST | VAR_AST | QUANTIFIER_AST | SORT_AST | FUNC_DECL_AST | UNKNOWN_AST and decl_kind = | OP_TRUE | OP_FALSE | OP_EQ | OP_DISTINCT | OP_ITE | OP_AND | OP_OR | OP_IFF | OP_XOR | OP_NOT | OP_IMPLIES | OP_OEQ | OP_ANUM | OP_AGNUM | OP_LE | OP_GE | OP_LT | OP_GT | OP_ADD | OP_SUB | OP_UMINUS | OP_MUL | OP_DIV | OP_IDIV | OP_REM | OP_MOD | OP_TO_REAL | OP_TO_INT | OP_IS_INT | OP_POWER | OP_STORE | OP_SELECT | OP_CONST_ARRAY | OP_ARRAY_MAP | OP_ARRAY_DEFAULT | OP_SET_UNION | OP_SET_INTERSECT | OP_SET_DIFFERENCE | OP_SET_COMPLEMENT | OP_SET_SUBSET | OP_AS_ARRAY | OP_BNUM | OP_BIT1 | OP_BIT0 | OP_BNEG | OP_BADD | OP_BSUB | OP_BMUL | OP_BSDIV | OP_BUDIV | OP_BSREM | OP_BUREM | OP_BSMOD | OP_BSDIV0 | OP_BUDIV0 | OP_BSREM0 | OP_BUREM0 | OP_BSMOD0 | OP_ULEQ | OP_SLEQ | OP_UGEQ | OP_SGEQ | OP_ULT | OP_SLT | OP_UGT | OP_SGT | OP_BAND | OP_BOR | OP_BNOT | OP_BXOR | OP_BNAND | OP_BNOR | OP_BXNOR | OP_CONCAT | OP_SIGN_EXT | OP_ZERO_EXT | OP_EXTRACT | OP_REPEAT | OP_BREDOR | OP_BREDAND | OP_BCOMP | OP_BSHL | OP_BLSHR | OP_BASHR | OP_ROTATE_LEFT | OP_ROTATE_RIGHT | OP_EXT_ROTATE_LEFT | OP_EXT_ROTATE_RIGHT | OP_INT2BV | OP_BV2INT | OP_CARRY | OP_XOR3 | OP_PR_UNDEF | OP_PR_TRUE | OP_PR_ASSERTED | OP_PR_GOAL | OP_PR_MODUS_PONENS | OP_PR_REFLEXIVITY | OP_PR_SYMMETRY | OP_PR_TRANSITIVITY | OP_PR_TRANSITIVITY_STAR | OP_PR_MONOTONICITY | OP_PR_QUANT_INTRO | OP_PR_DISTRIBUTIVITY | OP_PR_AND_ELIM | OP_PR_NOT_OR_ELIM | OP_PR_REWRITE | OP_PR_REWRITE_STAR | OP_PR_PULL_QUANT | OP_PR_PULL_QUANT_STAR | OP_PR_PUSH_QUANT | OP_PR_ELIM_UNUSED_VARS | OP_PR_DER | OP_PR_QUANT_INST | OP_PR_HYPOTHESIS | OP_PR_LEMMA | OP_PR_UNIT_RESOLUTION | OP_PR_IFF_TRUE | OP_PR_IFF_FALSE | OP_PR_COMMUTATIVITY | OP_PR_DEF_AXIOM | OP_PR_DEF_INTRO | OP_PR_APPLY_DEF | OP_PR_IFF_OEQ | OP_PR_NNF_POS | OP_PR_NNF_NEG | OP_PR_NNF_STAR | OP_PR_CNF_STAR | OP_PR_SKOLEMIZE | OP_PR_MODUS_PONENS_OEQ | OP_PR_TH_LEMMA | OP_RA_STORE | OP_RA_EMPTY | OP_RA_IS_EMPTY | OP_RA_JOIN | OP_RA_UNION | OP_RA_WIDEN | OP_RA_PROJECT | OP_RA_FILTER | OP_RA_NEGATION_FILTER | OP_RA_RENAME | OP_RA_COMPLEMENT | OP_RA_SELECT | OP_RA_CLONE | OP_FD_LT | OP_LABEL | OP_LABEL_LIT | OP_DT_CONSTRUCTOR | OP_DT_RECOGNISER | OP_DT_ACCESSOR | OP_UNINTERPRETED and param_kind = | PK_UINT | PK_BOOL | PK_DOUBLE | PK_SYMBOL | PK_STRING | PK_OTHER | PK_INVALID and search_failure = | NO_FAILURE | UNKNOWN | TIMEOUT | MEMOUT_WATERMARK | CANCELED | NUM_CONFLICTS | THEORY | QUANTIFIERS and ast_print_mode = | PRINT_SMTLIB_FULL | PRINT_LOW_LEVEL | PRINT_SMTLIB_COMPLIANT | PRINT_SMTLIB2_COMPLIANT external mk_config : unit -> config = "camlidl_z3V3_Z3_mk_config" external del_config : config -> unit = "camlidl_z3V3_Z3_del_config" external set_param_value : config -> string -> string -> unit = "camlidl_z3V3_Z3_set_param_value" external mk_context : config -> context = "camlidl_z3V3_Z3_mk_context" external del_context : context -> unit = "camlidl_z3V3_Z3_del_context" external update_param_value : context -> string -> string -> unit = "camlidl_z3V3_Z3_update_param_value" external get_param_value : context -> string -> string option = "camlidl_z3V3_Z3_get_param_value" external mk_int_symbol : context -> int -> symbol = "camlidl_z3V3_Z3_mk_int_symbol" external mk_string_symbol : context -> string -> symbol = "camlidl_z3V3_Z3_mk_string_symbol" external mk_uninterpreted_sort : context -> symbol -> sort = "camlidl_z3V3_Z3_mk_uninterpreted_sort" external mk_bool_sort : context -> sort = "camlidl_z3V3_Z3_mk_bool_sort" external mk_int_sort : context -> sort = "camlidl_z3V3_Z3_mk_int_sort" external mk_real_sort : context -> sort = "camlidl_z3V3_Z3_mk_real_sort" external mk_bv_sort : context -> int -> sort = "camlidl_z3V3_Z3_mk_bv_sort" external mk_finite_domain_sort : context -> symbol -> int64 -> sort = "camlidl_z3V3_Z3_mk_finite_domain_sort" external mk_array_sort : context -> sort -> sort -> sort = "camlidl_z3V3_Z3_mk_array_sort" external mk_tuple_sort : context -> symbol -> symbol array -> sort array -> sort * func_decl * func_decl array = "camlidl_z3V3_Z3_mk_tuple_sort" external mk_enumeration_sort : context -> symbol -> symbol array -> sort * func_decl array * func_decl array = "camlidl_z3V3_Z3_mk_enumeration_sort" external mk_list_sort : context -> symbol -> sort -> sort * func_decl * func_decl * func_decl * func_decl * func_decl * func_decl = "camlidl_z3V3_Z3_mk_list_sort" external mk_constructor : context -> symbol -> symbol -> symbol array -> sort array -> int array -> constructor = "camlidl_z3_Z3_mk_constructor_bytecode" "camlidl_z3V3_Z3_mk_constructor" external del_constructor : context -> constructor -> unit = "camlidl_z3V3_Z3_del_constructor" external mk_datatype : context -> symbol -> constructor array -> sort * constructor array = "camlidl_z3V3_Z3_mk_datatype" external mk_constructor_list : context -> constructor array -> constructor_list = "camlidl_z3V3_Z3_mk_constructor_list" external del_constructor_list : context -> constructor_list -> unit = "camlidl_z3V3_Z3_del_constructor_list" external mk_datatypes : context -> symbol array -> constructor_list array -> sort array * constructor_list array = "camlidl_z3V3_Z3_mk_datatypes" external query_constructor : context -> constructor -> int -> func_decl * func_decl * func_decl array = "camlidl_z3V3_Z3_query_constructor" external mk_func_decl : context -> symbol -> sort array -> sort -> func_decl = "camlidl_z3V3_Z3_mk_func_decl" external mk_app : context -> func_decl -> ast array -> ast = "camlidl_z3V3_Z3_mk_app" external mk_const : context -> symbol -> sort -> ast = "camlidl_z3V3_Z3_mk_const" external mk_fresh_func_decl : context -> string -> sort array -> sort -> func_decl = "camlidl_z3V3_Z3_mk_fresh_func_decl" external mk_fresh_const : context -> string -> sort -> ast = "camlidl_z3V3_Z3_mk_fresh_const" external mk_true : context -> ast = "camlidl_z3V3_Z3_mk_true" external mk_false : context -> ast = "camlidl_z3V3_Z3_mk_false" external mk_eq : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_eq" external mk_distinct : context -> ast array -> ast = "camlidl_z3V3_Z3_mk_distinct" external mk_not : context -> ast -> ast = "camlidl_z3V3_Z3_mk_not" external mk_ite : context -> ast -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_ite" external mk_iff : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_iff" external mk_implies : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_implies" external mk_xor : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_xor" external mk_and : context -> ast array -> ast = "camlidl_z3V3_Z3_mk_and" external mk_or : context -> ast array -> ast = "camlidl_z3V3_Z3_mk_or" external mk_add : context -> ast array -> ast = "camlidl_z3V3_Z3_mk_add" external mk_mul : context -> ast array -> ast = "camlidl_z3V3_Z3_mk_mul" external mk_sub : context -> ast array -> ast = "camlidl_z3V3_Z3_mk_sub" external mk_unary_minus : context -> ast -> ast = "camlidl_z3V3_Z3_mk_unary_minus" external mk_div : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_div" external mk_mod : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_mod" external mk_rem : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_rem" external mk_power : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_power" external mk_lt : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_lt" external mk_le : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_le" external mk_gt : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_gt" external mk_ge : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_ge" external mk_int2real : context -> ast -> ast = "camlidl_z3V3_Z3_mk_int2real" external mk_real2int : context -> ast -> ast = "camlidl_z3V3_Z3_mk_real2int" external mk_is_int : context -> ast -> ast = "camlidl_z3V3_Z3_mk_is_int" external mk_bvnot : context -> ast -> ast = "camlidl_z3V3_Z3_mk_bvnot" external mk_bvredand : context -> ast -> ast = "camlidl_z3V3_Z3_mk_bvredand" external mk_bvredor : context -> ast -> ast = "camlidl_z3V3_Z3_mk_bvredor" external mk_bvand : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvand" external mk_bvor : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvor" external mk_bvxor : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvxor" external mk_bvnand : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvnand" external mk_bvnor : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvnor" external mk_bvxnor : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvxnor" external mk_bvneg : context -> ast -> ast = "camlidl_z3V3_Z3_mk_bvneg" external mk_bvadd : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvadd" external mk_bvsub : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvsub" external mk_bvmul : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvmul" external mk_bvudiv : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvudiv" external mk_bvsdiv : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvsdiv" external mk_bvurem : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvurem" external mk_bvsrem : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvsrem" external mk_bvsmod : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvsmod" external mk_bvult : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvult" external mk_bvslt : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvslt" external mk_bvule : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvule" external mk_bvsle : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvsle" external mk_bvuge : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvuge" external mk_bvsge : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvsge" external mk_bvugt : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvugt" external mk_bvsgt : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvsgt" external mk_concat : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_concat" external mk_extract : context -> int -> int -> ast -> ast = "camlidl_z3V3_Z3_mk_extract" external mk_sign_ext : context -> int -> ast -> ast = "camlidl_z3V3_Z3_mk_sign_ext" external mk_zero_ext : context -> int -> ast -> ast = "camlidl_z3V3_Z3_mk_zero_ext" external mk_repeat : context -> int -> ast -> ast = "camlidl_z3V3_Z3_mk_repeat" external mk_bvshl : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvshl" external mk_bvlshr : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvlshr" external mk_bvashr : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvashr" external mk_rotate_left : context -> int -> ast -> ast = "camlidl_z3V3_Z3_mk_rotate_left" external mk_rotate_right : context -> int -> ast -> ast = "camlidl_z3V3_Z3_mk_rotate_right" external mk_ext_rotate_left : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_ext_rotate_left" external mk_ext_rotate_right : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_ext_rotate_right" external mk_int2bv : context -> int -> ast -> ast = "camlidl_z3V3_Z3_mk_int2bv" external mk_bv2int : context -> ast -> bool -> ast = "camlidl_z3V3_Z3_mk_bv2int" external mk_bvadd_no_overflow : context -> ast -> ast -> bool -> ast = "camlidl_z3V3_Z3_mk_bvadd_no_overflow" external mk_bvadd_no_underflow : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvadd_no_underflow" external mk_bvsub_no_overflow : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvsub_no_overflow" external mk_bvsub_no_underflow : context -> ast -> ast -> bool -> ast = "camlidl_z3V3_Z3_mk_bvsub_no_underflow" external mk_bvsdiv_no_overflow : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvsdiv_no_overflow" external mk_bvneg_no_overflow : context -> ast -> ast = "camlidl_z3V3_Z3_mk_bvneg_no_overflow" external mk_bvmul_no_overflow : context -> ast -> ast -> bool -> ast = "camlidl_z3V3_Z3_mk_bvmul_no_overflow" external mk_bvmul_no_underflow : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_bvmul_no_underflow" external mk_select : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_select" external mk_store : context -> ast -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_store" external mk_const_array : context -> sort -> ast -> ast = "camlidl_z3V3_Z3_mk_const_array" external mk_map : context -> func_decl -> int -> ast -> ast = "camlidl_z3V3_Z3_mk_map" external mk_array_default : context -> ast -> ast = "camlidl_z3V3_Z3_mk_array_default" external mk_set_sort : context -> sort -> sort = "camlidl_z3V3_Z3_mk_set_sort" external mk_empty_set : context -> sort -> ast = "camlidl_z3V3_Z3_mk_empty_set" external mk_full_set : context -> sort -> ast = "camlidl_z3V3_Z3_mk_full_set" external mk_set_add : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_set_add" external mk_set_del : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_set_del" external mk_set_union : context -> ast array -> ast = "camlidl_z3V3_Z3_mk_set_union" external mk_set_intersect : context -> ast array -> ast = "camlidl_z3V3_Z3_mk_set_intersect" external mk_set_difference : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_set_difference" external mk_set_complement : context -> ast -> ast = "camlidl_z3V3_Z3_mk_set_complement" external mk_set_member : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_set_member" external mk_set_subset : context -> ast -> ast -> ast = "camlidl_z3V3_Z3_mk_set_subset" external mk_numeral : context -> string -> sort -> ast = "camlidl_z3V3_Z3_mk_numeral" external mk_real : context -> int -> int -> ast = "camlidl_z3V3_Z3_mk_real" external mk_int : context -> int -> sort -> ast = "camlidl_z3V3_Z3_mk_int" external mk_int64 : context -> int64 -> sort -> ast = "camlidl_z3V3_Z3_mk_int64" external mk_pattern : context -> ast array -> pattern = "camlidl_z3V3_Z3_mk_pattern" external mk_bound : context -> int -> sort -> ast = "camlidl_z3V3_Z3_mk_bound" external mk_forall : context -> int -> pattern array -> sort array -> symbol array -> ast -> ast = "camlidl_z3_Z3_mk_forall_bytecode" "camlidl_z3V3_Z3_mk_forall" external mk_exists : context -> int -> pattern array -> sort array -> symbol array -> ast -> ast = "camlidl_z3_Z3_mk_exists_bytecode" "camlidl_z3V3_Z3_mk_exists" external mk_quantifier : context -> bool -> int -> pattern array -> sort array -> symbol array -> ast -> ast = "camlidl_z3_Z3_mk_quantifier_bytecode" "camlidl_z3V3_Z3_mk_quantifier" external mk_quantifier_ex : context -> bool -> int -> symbol -> symbol -> pattern array -> ast array -> sort array -> symbol array -> ast -> ast = "camlidl_z3_Z3_mk_quantifier_ex_bytecode" "camlidl_z3V3_Z3_mk_quantifier_ex" external mk_forall_const : context -> int -> app array -> pattern array -> ast -> ast = "camlidl_z3V3_Z3_mk_forall_const" external mk_exists_const : context -> int -> app array -> pattern array -> ast -> ast = "camlidl_z3V3_Z3_mk_exists_const" external mk_quantifier_const : context -> bool -> int -> app array -> pattern array -> ast -> ast = "camlidl_z3_Z3_mk_quantifier_const_bytecode" "camlidl_z3V3_Z3_mk_quantifier_const" external mk_quantifier_const_ex : context -> bool -> int -> symbol -> symbol -> app array -> pattern array -> ast array -> ast -> ast = "camlidl_z3_Z3_mk_quantifier_const_ex_bytecode" "camlidl_z3V3_Z3_mk_quantifier_const_ex" external get_symbol_kind : context -> symbol -> symbol_kind = "camlidl_z3V3_Z3_get_symbol_kind" external get_symbol_int : context -> symbol -> int = "camlidl_z3V3_Z3_get_symbol_int" external get_symbol_string : context -> symbol -> string = "camlidl_z3V3_Z3_get_symbol_string" external get_sort_name : context -> sort -> symbol = "camlidl_z3V3_Z3_get_sort_name" external get_sort_id : context -> sort -> int = "camlidl_z3V3_Z3_get_sort_id" external sort_to_ast : context -> sort -> ast = "camlidl_z3V3_Z3_sort_to_ast" external is_eq_sort : context -> sort -> sort -> bool = "camlidl_z3V3_Z3_is_eq_sort" external get_sort_kind : context -> sort -> sort_kind = "camlidl_z3V3_Z3_get_sort_kind" external get_bv_sort_size : context -> sort -> int = "camlidl_z3V3_Z3_get_bv_sort_size" external get_finite_domain_sort_size : context -> sort -> int64 option = "camlidl_z3V3_Z3_get_finite_domain_sort_size" external get_array_sort_domain : context -> sort -> sort = "camlidl_z3V3_Z3_get_array_sort_domain" external get_array_sort_range : context -> sort -> sort = "camlidl_z3V3_Z3_get_array_sort_range" external get_tuple_sort_mk_decl : context -> sort -> func_decl = "camlidl_z3V3_Z3_get_tuple_sort_mk_decl" external get_tuple_sort_num_fields : context -> sort -> int = "camlidl_z3V3_Z3_get_tuple_sort_num_fields" external get_tuple_sort_field_decl : context -> sort -> int -> func_decl = "camlidl_z3V3_Z3_get_tuple_sort_field_decl" external get_datatype_sort_num_constructors : context -> sort -> int = "camlidl_z3V3_Z3_get_datatype_sort_num_constructors" external get_datatype_sort_constructor : context -> sort -> int -> func_decl = "camlidl_z3V3_Z3_get_datatype_sort_constructor" external get_datatype_sort_recognizer : context -> sort -> int -> func_decl = "camlidl_z3V3_Z3_get_datatype_sort_recognizer" external get_datatype_sort_constructor_accessor : context -> sort -> int -> int -> func_decl = "camlidl_z3V3_Z3_get_datatype_sort_constructor_accessor" external get_relation_arity : context -> sort -> int = "camlidl_z3V3_Z3_get_relation_arity" external get_relation_column : context -> sort -> int -> sort = "camlidl_z3V3_Z3_get_relation_column" external func_decl_to_ast : context -> func_decl -> ast = "camlidl_z3V3_Z3_func_decl_to_ast" external is_eq_func_decl : context -> func_decl -> func_decl -> bool = "camlidl_z3V3_Z3_is_eq_func_decl" external get_func_decl_id : context -> func_decl -> int = "camlidl_z3V3_Z3_get_func_decl_id" external get_decl_name : context -> func_decl -> symbol = "camlidl_z3V3_Z3_get_decl_name" external get_decl_kind : context -> func_decl -> decl_kind = "camlidl_z3V3_Z3_get_decl_kind" external get_domain_size : context -> func_decl -> int = "camlidl_z3V3_Z3_get_domain_size" external get_arity : context -> func_decl -> int = "camlidl_z3V3_Z3_get_arity" external get_domain : context -> func_decl -> int -> sort = "camlidl_z3V3_Z3_get_domain" external get_range : context -> func_decl -> sort = "camlidl_z3V3_Z3_get_range" external get_decl_num_parameters : context -> func_decl -> int = "camlidl_z3V3_Z3_get_decl_num_parameters" external get_decl_parameter_kind : context -> func_decl -> int -> parameter_kind = "camlidl_z3V3_Z3_get_decl_parameter_kind" external get_decl_int_parameter : context -> func_decl -> int -> int = "camlidl_z3V3_Z3_get_decl_int_parameter" external get_decl_double_parameter : context -> func_decl -> int -> float = "camlidl_z3V3_Z3_get_decl_double_parameter" external get_decl_symbol_parameter : context -> func_decl -> int -> symbol = "camlidl_z3V3_Z3_get_decl_symbol_parameter" external get_decl_sort_parameter : context -> func_decl -> int -> sort = "camlidl_z3V3_Z3_get_decl_sort_parameter" external get_decl_ast_parameter : context -> func_decl -> int -> ast = "camlidl_z3V3_Z3_get_decl_ast_parameter" external get_decl_func_decl_parameter : context -> func_decl -> int -> func_decl = "camlidl_z3V3_Z3_get_decl_func_decl_parameter" external get_decl_rational_parameter : context -> func_decl -> int -> string = "camlidl_z3V3_Z3_get_decl_rational_parameter" external app_to_ast : context -> app -> ast = "camlidl_z3V3_Z3_app_to_ast" external get_app_decl : context -> app -> func_decl = "camlidl_z3V3_Z3_get_app_decl" external get_app_num_args : context -> app -> int = "camlidl_z3V3_Z3_get_app_num_args" external get_app_arg : context -> app -> int -> ast = "camlidl_z3V3_Z3_get_app_arg" external is_eq_ast : context -> ast -> ast -> bool = "camlidl_z3V3_Z3_is_eq_ast" external get_ast_id : context -> ast -> int = "camlidl_z3V3_Z3_get_ast_id" external get_ast_hash : context -> ast -> int = "camlidl_z3V3_Z3_get_ast_hash" external get_sort : context -> ast -> sort = "camlidl_z3V3_Z3_get_sort" external is_well_sorted : context -> ast -> bool = "camlidl_z3V3_Z3_is_well_sorted" external get_bool_value : context -> ast -> lbool = "camlidl_z3V3_Z3_get_bool_value" external get_ast_kind : context -> ast -> ast_kind = "camlidl_z3V3_Z3_get_ast_kind" external is_app : context -> ast -> bool = "camlidl_z3V3_Z3_is_app" external is_numeral_ast : context -> ast -> bool = "camlidl_z3V3_Z3_is_numeral_ast" external is_algebraic_number : context -> ast -> bool = "camlidl_z3V3_Z3_is_algebraic_number" external to_app : context -> ast -> app = "camlidl_z3V3_Z3_to_app" external to_func_decl : context -> ast -> func_decl = "camlidl_z3V3_Z3_to_func_decl" external get_numeral_string : context -> ast -> string = "camlidl_z3V3_Z3_get_numeral_string" external get_numeral_decimal_string : context -> ast -> int -> string = "camlidl_z3V3_Z3_get_numeral_decimal_string" external get_numerator : context -> ast -> ast = "camlidl_z3V3_Z3_get_numerator" external get_denominator : context -> ast -> ast = "camlidl_z3V3_Z3_get_denominator" external get_numeral_small : context -> ast -> bool * int64 * int64 = "camlidl_z3V3_Z3_get_numeral_small" external get_numeral_int : context -> ast -> bool * int = "camlidl_z3V3_Z3_get_numeral_int" external get_numeral_int64 : context -> ast -> bool * int64 = "camlidl_z3V3_Z3_get_numeral_int64" external get_numeral_rational_int64 : context -> ast -> bool * int64 * int64 = "camlidl_z3V3_Z3_get_numeral_rational_int64" external get_algebraic_number_lower : context -> ast -> int -> ast = "camlidl_z3V3_Z3_get_algebraic_number_lower" external get_algebraic_number_upper : context -> ast -> int -> ast = "camlidl_z3V3_Z3_get_algebraic_number_upper" external pattern_to_ast : context -> pattern -> ast = "camlidl_z3V3_Z3_pattern_to_ast" external get_pattern_num_terms : context -> pattern -> int = "camlidl_z3V3_Z3_get_pattern_num_terms" external get_pattern : context -> pattern -> int -> ast = "camlidl_z3V3_Z3_get_pattern" external get_index_value : context -> ast -> int = "camlidl_z3V3_Z3_get_index_value" external is_quantifier_forall : context -> ast -> bool = "camlidl_z3V3_Z3_is_quantifier_forall" external get_quantifier_weight : context -> ast -> int = "camlidl_z3V3_Z3_get_quantifier_weight" external get_quantifier_num_patterns : context -> ast -> int = "camlidl_z3V3_Z3_get_quantifier_num_patterns" external get_quantifier_pattern_ast : context -> ast -> int -> pattern = "camlidl_z3V3_Z3_get_quantifier_pattern_ast" external get_quantifier_num_no_patterns : context -> ast -> int = "camlidl_z3V3_Z3_get_quantifier_num_no_patterns" external get_quantifier_no_pattern_ast : context -> ast -> int -> ast = "camlidl_z3V3_Z3_get_quantifier_no_pattern_ast" external get_quantifier_bound_name : context -> ast -> int -> symbol = "camlidl_z3V3_Z3_get_quantifier_bound_name" external get_quantifier_bound_sort : context -> ast -> int -> sort = "camlidl_z3V3_Z3_get_quantifier_bound_sort" external get_quantifier_body : context -> ast -> ast = "camlidl_z3V3_Z3_get_quantifier_body" external get_quantifier_num_bound : context -> ast -> int = "camlidl_z3V3_Z3_get_quantifier_num_bound" external simplify : context -> ast -> ast = "camlidl_z3V3_Z3_simplify" external update_term : context -> ast -> ast array -> ast = "camlidl_z3V3_Z3_update_term" external substitute : context -> ast -> ast array -> ast array -> ast = "camlidl_z3V3_Z3_substitute" external substitute_vars : context -> ast -> ast array -> ast = "camlidl_z3V3_Z3_substitute_vars" external open_log : string -> bool = "camlidl_z3V3_Z3_open_log" external append_log : string -> unit = "camlidl_z3V3_Z3_append_log" external close_log : unit -> unit = "camlidl_z3V3_Z3_close_log" external toggle_warning_messages : bool -> unit = "camlidl_z3V3_Z3_toggle_warning_messages" external set_ast_print_mode : context -> ast_print_mode -> unit = "camlidl_z3V3_Z3_set_ast_print_mode" external ast_to_string : context -> ast -> string = "camlidl_z3V3_Z3_ast_to_string" external pattern_to_string : context -> pattern -> string = "camlidl_z3V3_Z3_pattern_to_string" external sort_to_string : context -> sort -> string = "camlidl_z3V3_Z3_sort_to_string" external func_decl_to_string : context -> func_decl -> string = "camlidl_z3V3_Z3_func_decl_to_string" external model_to_string : context -> model -> string = "camlidl_z3V3_Z3_model_to_string" external benchmark_to_smtlib_string : context -> string -> string -> string -> string -> ast array -> ast -> string = "camlidl_z3_Z3_benchmark_to_smtlib_string_bytecode" "camlidl_z3V3_Z3_benchmark_to_smtlib_string" external parse_smtlib2_string : context -> string -> symbol array -> sort array -> symbol array -> func_decl array -> ast = "camlidl_z3_Z3_parse_smtlib2_string_bytecode" "camlidl_z3V3_Z3_parse_smtlib2_string" external parse_smtlib2_file : context -> string -> symbol array -> sort array -> symbol array -> func_decl array -> ast = "camlidl_z3_Z3_parse_smtlib2_file_bytecode" "camlidl_z3V3_Z3_parse_smtlib2_file" external parse_smtlib_string : context -> string -> symbol array -> sort array -> symbol array -> func_decl array -> unit = "camlidl_z3_Z3_parse_smtlib_string_bytecode" "camlidl_z3V3_Z3_parse_smtlib_string" external parse_smtlib_file : context -> string -> symbol array -> sort array -> symbol array -> func_decl array -> unit = "camlidl_z3_Z3_parse_smtlib_file_bytecode" "camlidl_z3V3_Z3_parse_smtlib_file" external get_smtlib_num_formulas : context -> int = "camlidl_z3V3_Z3_get_smtlib_num_formulas" external get_smtlib_formula : context -> int -> ast = "camlidl_z3V3_Z3_get_smtlib_formula" external get_smtlib_num_assumptions : context -> int = "camlidl_z3V3_Z3_get_smtlib_num_assumptions" external get_smtlib_assumption : context -> int -> ast = "camlidl_z3V3_Z3_get_smtlib_assumption" external get_smtlib_num_decls : context -> int = "camlidl_z3V3_Z3_get_smtlib_num_decls" external get_smtlib_decl : context -> int -> func_decl = "camlidl_z3V3_Z3_get_smtlib_decl" external get_smtlib_num_sorts : context -> int = "camlidl_z3V3_Z3_get_smtlib_num_sorts" external get_smtlib_sort : context -> int -> sort = "camlidl_z3V3_Z3_get_smtlib_sort" external get_smtlib_error : context -> string = "camlidl_z3V3_Z3_get_smtlib_error" external parse_z3_string : context -> string -> ast = "camlidl_z3_Z3_parse_z3V3_string" external parse_z3_file : context -> string -> ast = "camlidl_z3_Z3_parse_z3V3_file" external get_version : unit -> int * int * int * int = "camlidl_z3V3_Z3_get_version" external reset_memory : unit -> unit = "camlidl_z3V3_Z3_reset_memory" external theory_mk_sort : context -> theory -> symbol -> sort = "camlidl_z3V3_Z3_theory_mk_sort" external theory_mk_value : context -> theory -> symbol -> sort -> ast = "camlidl_z3V3_Z3_theory_mk_value" external theory_mk_constant : context -> theory -> symbol -> sort -> ast = "camlidl_z3V3_Z3_theory_mk_constant" external theory_mk_func_decl : context -> theory -> symbol -> sort array -> sort -> func_decl = "camlidl_z3V3_Z3_theory_mk_func_decl" external theory_get_context : theory -> context = "camlidl_z3V3_Z3_theory_get_context" external theory_assert_axiom : theory -> ast -> unit = "camlidl_z3V3_Z3_theory_assert_axiom" external theory_assume_eq : theory -> ast -> ast -> unit = "camlidl_z3V3_Z3_theory_assume_eq" external theory_enable_axiom_simplification : theory -> bool -> unit = "camlidl_z3V3_Z3_theory_enable_axiom_simplification" external theory_get_eqc_root : theory -> ast -> ast = "camlidl_z3V3_Z3_theory_get_eqc_root" external theory_get_eqc_next : theory -> ast -> ast = "camlidl_z3V3_Z3_theory_get_eqc_next" external theory_get_num_parents : theory -> ast -> int = "camlidl_z3V3_Z3_theory_get_num_parents" external theory_get_parent : theory -> ast -> int -> ast = "camlidl_z3V3_Z3_theory_get_parent" external theory_is_value : theory -> ast -> bool = "camlidl_z3V3_Z3_theory_is_value" external theory_is_decl : theory -> func_decl -> bool = "camlidl_z3V3_Z3_theory_is_decl" external theory_get_num_elems : theory -> int = "camlidl_z3V3_Z3_theory_get_num_elems" external theory_get_elem : theory -> int -> ast = "camlidl_z3V3_Z3_theory_get_elem" external theory_get_num_apps : theory -> int = "camlidl_z3V3_Z3_theory_get_num_apps" external theory_get_app : theory -> int -> ast = "camlidl_z3V3_Z3_theory_get_app" external mk_injective_function : context -> symbol -> sort array -> sort -> func_decl = "camlidl_z3V3_Z3_mk_injective_function" external set_logic : context -> string -> bool = "camlidl_z3V3_Z3_set_logic" external push : context -> unit = "camlidl_z3V3_Z3_push" external pop : context -> int -> unit = "camlidl_z3V3_Z3_pop" external get_num_scopes : context -> int = "camlidl_z3V3_Z3_get_num_scopes" external persist_ast : context -> ast -> int -> unit = "camlidl_z3V3_Z3_persist_ast" external assert_cnstr : context -> ast -> unit = "camlidl_z3V3_Z3_assert_cnstr" external check_and_get_model : context -> lbool * model = "camlidl_z3V3_Z3_check_and_get_model" external check : context -> lbool = "camlidl_z3V3_Z3_check" external check_assumptions : context -> ast array -> int -> ast array -> lbool * model * ast * int * ast array = "camlidl_z3V3_Z3_check_assumptions" external get_implied_equalities : context -> ast array -> lbool * int array = "camlidl_z3V3_Z3_get_implied_equalities" external del_model : context -> model -> unit = "camlidl_z3V3_Z3_del_model" external soft_check_cancel : context -> unit = "camlidl_z3V3_Z3_soft_check_cancel" external get_search_failure : context -> search_failure = "camlidl_z3V3_Z3_get_search_failure" external mk_label : context -> symbol -> bool -> ast -> ast = "camlidl_z3V3_Z3_mk_label" external get_relevant_labels : context -> literals = "camlidl_z3V3_Z3_get_relevant_labels" external get_relevant_literals : context -> literals = "camlidl_z3V3_Z3_get_relevant_literals" external get_guessed_literals : context -> literals = "camlidl_z3V3_Z3_get_guessed_literals" external del_literals : context -> literals -> unit = "camlidl_z3V3_Z3_del_literals" external get_num_literals : context -> literals -> int = "camlidl_z3V3_Z3_get_num_literals" external get_label_symbol : context -> literals -> int -> symbol = "camlidl_z3V3_Z3_get_label_symbol" external get_literal : context -> literals -> int -> ast = "camlidl_z3V3_Z3_get_literal" external disable_literal : context -> literals -> int -> unit = "camlidl_z3V3_Z3_disable_literal" external block_literals : context -> literals -> unit = "camlidl_z3V3_Z3_block_literals" external get_model_num_constants : context -> model -> int = "camlidl_z3V3_Z3_get_model_num_constants" external get_model_constant : context -> model -> int -> func_decl = "camlidl_z3V3_Z3_get_model_constant" external get_model_num_funcs : context -> model -> int = "camlidl_z3V3_Z3_get_model_num_funcs" external get_model_func_decl : context -> model -> int -> func_decl = "camlidl_z3V3_Z3_get_model_func_decl" external eval_func_decl : context -> model -> func_decl -> bool * ast = "camlidl_z3V3_Z3_eval_func_decl" external is_array_value : context -> model -> ast -> bool * int = "camlidl_z3V3_Z3_is_array_value" external get_array_value : context -> model -> ast -> ast array -> ast array -> ast array * ast array * ast = "camlidl_z3V3_Z3_get_array_value" external get_model_func_else : context -> model -> int -> ast = "camlidl_z3V3_Z3_get_model_func_else" external get_model_func_num_entries : context -> model -> int -> int = "camlidl_z3V3_Z3_get_model_func_num_entries" external get_model_func_entry_num_args : context -> model -> int -> int -> int = "camlidl_z3V3_Z3_get_model_func_entry_num_args" external get_model_func_entry_arg : context -> model -> int -> int -> int -> ast = "camlidl_z3V3_Z3_get_model_func_entry_arg" external get_model_func_entry_value : context -> model -> int -> int -> ast = "camlidl_z3V3_Z3_get_model_func_entry_value" external eval : context -> model -> ast -> bool * ast = "camlidl_z3V3_Z3_eval" external eval_decl : context -> model -> func_decl -> ast array -> bool * ast = "camlidl_z3V3_Z3_eval_decl" external context_to_string : context -> string = "camlidl_z3V3_Z3_context_to_string" external statistics_to_string : context -> string = "camlidl_z3V3_Z3_statistics_to_string" external get_context_assignment : context -> ast = "camlidl_z3V3_Z3_get_context_assignment" (* Internal auxillary functions: *) (* Transform a pair of arrays into an array of pairs *) let array_combine a b = if Array.length a <> Array.length b then raise (Invalid_argument "array_combine"); Array.init (Array.length a) (fun i->(a.(i),b.(i)));; (* [a |> b] is the pipeline operator for [b(a)] *) let ( |> ) x f = f x;; (* Extensions, except for refinement: *) let mk_context_x configs = let config = mk_config() in let f(param_id,param_value) = set_param_value config param_id param_value in Array.iter f configs; let context = mk_context config in del_config config; context;; let get_app_args c a = Array.init (get_app_num_args c a) (get_app_arg c a);; let get_domains c d = Array.init (get_domain_size c d) (get_domain c d);; let get_array_sort c t = (get_array_sort_domain c t, get_array_sort_range c t);; let get_tuple_sort c ty = (get_tuple_sort_mk_decl c ty, Array.init (get_tuple_sort_num_fields c ty) (get_tuple_sort_field_decl c ty));; type datatype_constructor_refined = { constructor : func_decl; recognizer : func_decl; accessors : func_decl array } let get_datatype_sort c ty = Array.init (get_datatype_sort_num_constructors c ty) (fun idx_c -> let constr = get_datatype_sort_constructor c ty idx_c in let recog = get_datatype_sort_recognizer c ty idx_c in let num_acc = get_domain_size c constr in { constructor = constr; recognizer = recog; accessors = Array.init num_acc (get_datatype_sort_constructor_accessor c ty idx_c); }) let get_model_constants c m = Array.init (get_model_num_constants c m) (get_model_constant c m);; let get_model_func_entry c m i j = (Array.init (get_model_func_entry_num_args c m i j) (get_model_func_entry_arg c m i j), get_model_func_entry_value c m i j);; let get_model_func_entries c m i = Array.init (get_model_func_num_entries c m i) (get_model_func_entry c m i);; let get_model_funcs c m = Array.init (get_model_num_funcs c m) (fun i->(get_model_func_decl c m i |> get_decl_name c, get_model_func_entries c m i, get_model_func_else c m i));; let get_smtlib_formulas c = Array.init (get_smtlib_num_formulas c) (get_smtlib_formula c);; let get_smtlib_assumptions c = Array.init (get_smtlib_num_assumptions c) (get_smtlib_assumption c);; let get_smtlib_decls c = Array.init (get_smtlib_num_decls c) (get_smtlib_decl c);; let get_smtlib_parse_results c = (get_smtlib_formulas c, get_smtlib_assumptions c, get_smtlib_decls c);; let parse_smtlib_string_formula c a1 a2 a3 a4 a5 = (parse_smtlib_string c a1 a2 a3 a4 a5; match get_smtlib_formulas c with [|f|] -> f | _ -> failwith "Z3: parse_smtlib_string_formula");; let parse_smtlib_file_formula c a1 a2 a3 a4 a5 = (parse_smtlib_file c a1 a2 a3 a4 a5; match get_smtlib_formulas c with [|f|] -> f | _ -> failwith "Z3: parse_smtlib_file_formula");; let parse_smtlib_string_x c a1 a2 a3 a4 a5 = (parse_smtlib_string c a1 a2 a3 a4 a5; get_smtlib_parse_results c);; let parse_smtlib_file_x c a1 a2 a3 a4 a5 = (parse_smtlib_file c a1 a2 a3 a4 a5; get_smtlib_parse_results c);; (* Refinement: *) type symbol_refined = | Symbol_int of int | Symbol_string of string | Symbol_unknown;; let symbol_refine c s = match get_symbol_kind c s with | INT_SYMBOL -> Symbol_int (get_symbol_int c s) | STRING_SYMBOL -> Symbol_string (get_symbol_string c s);; type sort_refined = | Sort_uninterpreted of symbol | Sort_bool | Sort_int | Sort_real | Sort_bv of int | Sort_array of (sort * sort) | Sort_datatype of datatype_constructor_refined array | Sort_relation | Sort_finite_domain | Sort_unknown of symbol;; let sort_refine c ty = match get_sort_kind c ty with | UNINTERPRETED_SORT -> Sort_uninterpreted (get_sort_name c ty) | BOOL_SORT -> Sort_bool | INT_SORT -> Sort_int | REAL_SORT -> Sort_real | BV_SORT -> Sort_bv (get_bv_sort_size c ty) | ARRAY_SORT -> Sort_array (get_array_sort_domain c ty, get_array_sort_range c ty) | DATATYPE_SORT -> Sort_datatype (get_datatype_sort c ty) | RELATION_SORT -> Sort_relation | FINITE_DOMAIN_SORT -> Sort_finite_domain | UNKNOWN_SORT -> Sort_unknown (get_sort_name c ty);; let get_pattern_terms c p = Array.init (get_pattern_num_terms c p) (get_pattern c p) type binder_type = | Forall | Exists type numeral_refined = | Numeral_small of int64 * int64 | Numeral_large of string type term_refined = | Term_app of decl_kind * func_decl * ast array | Term_quantifier of binder_type * int * ast array array * (symbol *sort) array * ast | Term_numeral of numeral_refined * sort | Term_var of int * sort let term_refine c t = match get_ast_kind c t with | NUMERAL_AST -> let (is_small, n, d) = get_numeral_small c t in if is_small then Term_numeral(Numeral_small(n,d), get_sort c t) else Term_numeral(Numeral_large(get_numeral_string c t), get_sort c t) | APP_AST -> let t' = to_app c t in let f = get_app_decl c t' in let num_args = get_app_num_args c t' in let args = Array.init num_args (get_app_arg c t') in let k = get_decl_kind c f in Term_app (k, f, args) | QUANTIFIER_AST -> let bt = if is_quantifier_forall c t then Forall else Exists in let w = get_quantifier_weight c t in let np = get_quantifier_num_patterns c t in let pats = Array.init np (get_quantifier_pattern_ast c t) in let pats = Array.map (get_pattern_terms c) pats in let nb = get_quantifier_num_bound c t in let bound = Array.init nb (fun i -> (get_quantifier_bound_name c t i, get_quantifier_bound_sort c t i)) in let body = get_quantifier_body c t in Term_quantifier(bt, w, pats, bound, body) | VAR_AST -> Term_var(get_index_value c t, get_sort c t) | _ -> assert false type theory_callbacks = { mutable delete_theory : unit -> unit; mutable reduce_eq : ast -> ast -> ast option; mutable reduce_app : func_decl -> ast array -> ast option; mutable reduce_distinct : ast array -> ast option; mutable final_check : unit -> bool; mutable new_app : ast -> unit; mutable new_elem : ast -> unit; mutable init_search: unit -> unit; mutable push: unit -> unit; mutable pop: unit -> unit; mutable restart : unit -> unit; mutable reset: unit -> unit; mutable new_eq : ast -> ast -> unit; mutable new_diseq : ast -> ast -> unit; mutable new_assignment: ast -> bool -> unit; mutable new_relevant : ast -> unit; } let mk_theory_callbacks() = { delete_theory = (fun () -> ()); reduce_eq = (fun _ _ -> None); reduce_app = (fun _ _ -> None); reduce_distinct = (fun _ -> None); final_check = (fun _ -> true); new_app = (fun _ -> ()); new_elem = (fun _ -> ()); init_search= (fun () -> ()); push= (fun () -> ()); pop= (fun () -> ()); restart = (fun () -> ()); reset= (fun () -> ()); new_eq = (fun _ _ -> ()); new_diseq = (fun _ _ -> ()); new_assignment = (fun _ _ -> ()); new_relevant = (fun _ -> ()); } external get_theory_callbacks : theory -> theory_callbacks = "get_theory_callbacks" external mk_theory_register : context -> string -> theory_callbacks -> theory = "mk_theory_register" external set_delete_callback_register : theory -> unit = "set_delete_callback_register" external set_reduce_app_callback_register : theory -> unit = "set_reduce_app_callback_register" external set_reduce_eq_callback_register : theory -> unit = "set_reduce_eq_callback_register" external set_reduce_distinct_callback_register : theory -> unit = "set_reduce_distinct_callback_register" external set_new_app_callback_register : theory -> unit = "set_new_app_callback_register" external set_new_elem_callback_register : theory -> unit = "set_new_elem_callback_register" external set_init_search_callback_register : theory -> unit = "set_init_search_callback_register" external set_push_callback_register : theory -> unit = "set_push_callback_register" external set_pop_callback_register : theory -> unit = "set_pop_callback_register" external set_restart_callback_register : theory -> unit = "set_restart_callback_register" external set_reset_callback_register : theory -> unit = "set_reset_callback_register" external set_final_check_callback_register : theory -> unit = "set_final_check_callback_register" external set_new_eq_callback_register : theory -> unit = "set_new_eq_callback_register" external set_new_diseq_callback_register : theory -> unit = "set_new_diseq_callback_register" external set_new_assignment_callback_register : theory -> unit = "set_new_assignment_callback_register" external set_new_relevant_callback_register : theory -> unit = "set_new_relevant_callback_register" let is_some opt = match opt with | Some v -> true | None -> false let get_some opt = match opt with | Some v -> v | None -> failwith "None unexpected" let apply_delete (th:theory_callbacks) = th.delete_theory () let set_delete_callback th cb = let cbs = get_theory_callbacks th in cbs.delete_theory <- cb; set_delete_callback_register th let mk_theory context name = Callback.register "is_some" is_some; Callback.register "get_some" get_some; Callback.register "apply_delete" apply_delete; let cbs = mk_theory_callbacks() in mk_theory_register context name cbs let apply_reduce_app (th:theory_callbacks) f args = th.reduce_app f args let set_reduce_app_callback th cb = Callback.register "apply_reduce_app" apply_reduce_app; let cbs = get_theory_callbacks th in cbs.reduce_app <- cb; set_reduce_app_callback_register th let apply_reduce_eq (th:theory_callbacks) a b = th.reduce_eq a b let set_reduce_eq_callback th cb = Callback.register "apply_reduce_eq" apply_reduce_eq; let cbs = get_theory_callbacks th in cbs.reduce_eq <- cb; set_reduce_eq_callback_register th let apply_reduce_distinct (th:theory_callbacks) args = th.reduce_distinct args let set_reduce_distinct_callback th cb = Callback.register "apply_reduce_distinct" apply_reduce_distinct; let cbs = get_theory_callbacks th in cbs.reduce_distinct <- cb; set_reduce_distinct_callback_register th let apply_new_app (th:theory_callbacks) a = th.new_app a let set_new_app_callback th cb = Callback.register "apply_new_app" apply_new_app; let cbs = get_theory_callbacks th in cbs.new_app <- cb; set_new_app_callback_register th let apply_new_elem (th:theory_callbacks) a = th.new_elem a let set_new_elem_callback th cb = Callback.register "apply_new_elem" apply_new_elem; let cbs = get_theory_callbacks th in cbs.new_elem <- cb; set_new_elem_callback_register th let apply_init_search (th:theory_callbacks) = th.init_search() let set_init_search_callback th cb = Callback.register "apply_init_search" apply_init_search; let cbs = get_theory_callbacks th in cbs.init_search <- cb; set_init_search_callback_register th let apply_push (th:theory_callbacks) = th.push() let set_push_callback th cb = Callback.register "apply_push" apply_push; let cbs = get_theory_callbacks th in cbs.push <- cb; set_push_callback_register th let apply_pop (th:theory_callbacks) = th.pop() let set_pop_callback th cb = Callback.register "apply_pop" apply_pop; let cbs = get_theory_callbacks th in cbs.pop <- cb; set_pop_callback_register th let apply_restart (th:theory_callbacks) = th.restart() let set_restart_callback th cb = Callback.register "apply_restart" apply_restart; let cbs = get_theory_callbacks th in cbs.restart <- cb; set_restart_callback_register th let apply_reset (th:theory_callbacks) = th.reset() let set_reset_callback th cb = Callback.register "apply_reset" apply_reset; let cbs = get_theory_callbacks th in cbs.reset <- cb; set_reset_callback_register th let apply_final_check (th:theory_callbacks) = th.final_check() let set_final_check_callback th cb = Callback.register "apply_final_check" apply_final_check; let cbs = get_theory_callbacks th in cbs.final_check <- cb; set_final_check_callback_register th let apply_new_eq (th:theory_callbacks) a b = th.new_eq a b let set_new_eq_callback th cb = Callback.register "apply_new_eq" apply_new_eq; let cbs = get_theory_callbacks th in cbs.new_eq <- cb; set_new_eq_callback_register th let apply_new_diseq (th:theory_callbacks) a b = th.new_diseq a b let set_new_diseq_callback th cb = Callback.register "apply_new_diseq" apply_new_diseq; let cbs = get_theory_callbacks th in cbs.new_diseq <- cb; set_new_diseq_callback_register th let apply_new_assignment (th:theory_callbacks) a b = th.new_assignment a b let set_new_assignment_callback th cb = Callback.register "apply_new_assignment" apply_new_assignment; let cbs = get_theory_callbacks th in cbs.new_assignment <- cb; set_new_assignment_callback_register th let apply_new_relevant (th:theory_callbacks) a = th.new_relevant a let set_new_relevant_callback th cb = Callback.register "apply_new_relevant" apply_new_relevant; let cbs = get_theory_callbacks th in cbs.new_relevant <- cb; set_new_relevant_callback_register th end