Example #1
0
    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);
    }
Example #2
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));
 }
Example #3
0
 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);
 }
Example #4
0
 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);
 }