Z3_func_decl Z3_API Z3_mk_injective_function(Z3_context c, Z3_symbol s, unsigned domain_size, Z3_sort const domain[], Z3_sort range) { Z3_TRY; LOG_Z3_mk_injective_function(c, s, domain_size, domain, range); RESET_ERROR_CODE(); ast_manager & m = mk_c(c)->m(); mk_c(c)->reset_last_result(); sort* range_ = to_sort(range); func_decl* d = m.mk_func_decl(to_symbol(s), domain_size, to_sorts(domain), range_); expr_ref_vector args(m); expr_ref fn(m), body(m); vector<symbol> names; for (unsigned i = 0; i < domain_size; ++i) { unsigned idx = domain_size-i-1; args.push_back(m.mk_var(idx, to_sort(domain[i]))); names.push_back(symbol(idx)); } fn = m.mk_app(d, args.size(), args.c_ptr()); for (unsigned i = 0; i < domain_size; ++i) { expr* arg = args[i].get(); sort* dom = m.get_sort(arg); func_decl* inv = m.mk_fresh_func_decl(symbol("inv"), to_symbol(s), 1, &range_, dom); body = m.mk_eq(m.mk_app(inv, fn.get()), arg); body = m.mk_forall(args.size(), to_sorts(domain), names.c_ptr(), body.get()); mk_c(c)->save_multiple_ast_trail(body.get()); mk_c(c)->assert_cnstr(body.get()); } mk_c(c)->save_multiple_ast_trail(d); RETURN_Z3(of_func_decl(d)); Z3_CATCH_RETURN(0); }
Z3_func_decl get_model_func_decl_core(Z3_context c, Z3_model m, unsigned i) { CHECK_NON_NULL(m, nullptr); model * _m = to_model_ref(m); if (i >= _m->get_num_functions()) { SET_ERROR_CODE(Z3_IOB, nullptr); return nullptr; } return of_func_decl(_m->get_function(i)); }
Z3_func_decl Z3_API Z3_get_as_array_func_decl(Z3_context c, Z3_ast a) { Z3_TRY; LOG_Z3_get_as_array_func_decl(c, a); RESET_ERROR_CODE(); if (a && is_expr(to_ast(a)) && is_app_of(to_expr(a), mk_c(c)->get_array_fid(), OP_AS_ARRAY)) { RETURN_Z3(of_func_decl(to_func_decl(to_app(a)->get_decl()->get_parameter(0).get_ast()))); } else { SET_ERROR_CODE(Z3_INVALID_ARG, nullptr); RETURN_Z3(nullptr); } Z3_CATCH_RETURN(nullptr); }
Z3_func_decl Z3_API Z3_model_get_const_decl(Z3_context c, Z3_model m, unsigned i) { Z3_TRY; LOG_Z3_model_get_const_decl(c, m, i); RESET_ERROR_CODE(); CHECK_NON_NULL(m, nullptr); model * _m = to_model_ref(m); if (i < _m->get_num_constants()) { RETURN_Z3(of_func_decl(_m->get_constant(i))); } else { SET_ERROR_CODE(Z3_IOB, nullptr); RETURN_Z3(nullptr); } Z3_CATCH_RETURN(nullptr); }
Z3_func_decl Z3_API Z3_get_smtlib_decl(Z3_context c, unsigned i) { Z3_TRY; LOG_Z3_get_smtlib_decl(c, i); RESET_ERROR_CODE(); mk_c(c)->extract_smtlib_parser_decls(); if (mk_c(c)->m_smtlib_parser) { if (i < mk_c(c)->m_smtlib_parser_decls.size()) { func_decl * d = mk_c(c)->m_smtlib_parser_decls[i]; mk_c(c)->save_ast_trail(d); RETURN_Z3(of_func_decl(d)); } else { SET_ERROR_CODE(Z3_IOB); } } else { SET_ERROR_CODE(Z3_NO_PARSER); } RETURN_Z3(0); Z3_CATCH_RETURN(0); }