예제 #1
0
파일: parser.cpp 프로젝트: ghalib/scheme
// Would be nice to make this a virtual member function, but it's
// awkward with the recursion for list printing.
std::ostream& print(std::ostream& os, const ElemPtr& e, bool first=true)
{
  SymbolPtr sym = to_symbol(e);
  NumberPtr num = to_number(e);
  if (sym)
    {
      os << sym->value();
    }
  else if (num)
    {
      os << num->value();
    }
  else
    {
      PairPtr p = to_cons(e);
      if (p)
	{
	  if (first)
	    os << "(";
	  if (is_nil(p))
	    os << ")";
	  else
	    {
	      if (!(to_symbol(p->car())))
		os << "(";
	      print(os, p->car(), false);
	      if (!(is_nil(to_cons(p->cdr()))))
		os << " ";
	      print(os, p->cdr(), false);
	    }
	}
    }
  return os;
}
예제 #2
0
파일: api_quant.cpp 프로젝트: Jornason/z3
    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_ast parse_smtlib2_stream(bool exec, Z3_context c, std::istream& is,
                             unsigned num_sorts,
                             Z3_symbol const sort_names[],
                             Z3_sort const sorts[],
                             unsigned num_decls,
                             Z3_symbol const decl_names[],
                             Z3_func_decl const decls[]) {
     Z3_TRY;
     cmd_context ctx(&mk_c(c)->fparams(), false, &(mk_c(c)->m()));
     ctx.set_ignore_check(true);
     if (exec) {
         ctx.set_solver(alloc(z3_context_solver, *mk_c(c)));
     }
     for (unsigned i = 0; i < num_decls; ++i) {
        ctx.insert(to_symbol(decl_names[i]), to_func_decl(decls[i]));
     }
     for (unsigned i = 0; i < num_sorts; ++i) {
         psort* ps = ctx.pm().mk_psort_cnst(to_sort(sorts[i]));
         ctx.insert(ctx.pm().mk_psort_user_decl(0, to_symbol(sort_names[i]), ps));
     }
     if (!parse_smt2_commands(ctx, is)) {
         SET_ERROR_CODE(Z3_PARSER_ERROR);
         return of_ast(mk_c(c)->m().mk_true());
     }
     ptr_vector<expr>::const_iterator it  = ctx.begin_assertions();
     ptr_vector<expr>::const_iterator end = ctx.end_assertions();
     unsigned size = static_cast<unsigned>(end - it);
     return of_ast(mk_c(c)->mk_and(size, it));
     Z3_CATCH_RETURN(0);
 }
예제 #4
0
파일: api_params.cpp 프로젝트: CHolmes3/z3
 /**
    \brief Add a symbol parameter \c k with value \c v to the parameter set \c p.
 */
 void Z3_API Z3_params_set_symbol(Z3_context c, Z3_params p, Z3_symbol k, Z3_symbol v) {
     Z3_TRY;
     LOG_Z3_params_set_symbol(c, p, k, v);
     RESET_ERROR_CODE();
     to_params(p)->m_params.set_sym(norm_param_name(to_symbol(k)).c_str(), to_symbol(v));
     Z3_CATCH;
 }
예제 #5
0
    Z3_ast mk_quantifier_ex_core(
        Z3_context c, 
        Z3_bool is_forall, 
        unsigned weight, 
        Z3_symbol quantifier_id,
        Z3_symbol skolem_id,
        unsigned num_patterns, Z3_pattern const patterns[], 
        unsigned num_no_patterns, Z3_ast const no_patterns[], 
        unsigned num_decls, Z3_sort const sorts[], 
        Z3_symbol const decl_names[], 
        Z3_ast body) {
        Z3_TRY;
        RESET_ERROR_CODE();
        if (!mk_c(c)->m().is_bool(to_expr(body))) {
            SET_ERROR_CODE(Z3_SORT_ERROR);
        }
        if (num_patterns > 0 && num_no_patterns > 0) {
            SET_ERROR_CODE(Z3_INVALID_USAGE);
        }
        expr * const* ps = reinterpret_cast<expr * const*>(patterns);
        expr * const* no_ps = reinterpret_cast<expr * const*>(no_patterns);
        pattern_validator v(mk_c(c)->m());
        for (unsigned i = 0; i < num_patterns; i++) {
            if (!v(num_decls, ps[i], 0, 0)) {
                SET_ERROR_CODE(Z3_INVALID_PATTERN);
                return 0;
            }
        }

        sort* const* ts = reinterpret_cast<sort * const*>(sorts);
        svector<symbol> names;
        for (unsigned i = 0; i < num_decls; ++i) {
            names.push_back(to_symbol(decl_names[i]));
        }
        expr_ref result(mk_c(c)->m());
        if (num_decls > 0) {
            result = mk_c(c)->m().mk_quantifier(
                (0 != is_forall), 
                names.size(), ts, names.c_ptr(), to_expr(body),            
                weight, 
                to_symbol(quantifier_id),
                to_symbol(skolem_id),
                num_patterns, ps,
                num_no_patterns, no_ps
                );
        }
        else {
            result = to_expr(body);
        }
        mk_c(c)->save_ast_trail(result.get());
        return of_ast(result.get());
        Z3_CATCH_RETURN(0);
    }
예제 #6
0
 void Z3_API Z3_fixedpoint_update_rule(Z3_context c, Z3_fixedpoint d, Z3_ast a, Z3_symbol name) {
     Z3_TRY;
     LOG_Z3_fixedpoint_update_rule(c, d, a, name);
     RESET_ERROR_CODE();
     CHECK_FORMULA(a,);
     to_fixedpoint_ref(d)->update_rule(to_expr(a), to_symbol(name));
     Z3_CATCH;
 }
예제 #7
0
 Z3_sort Z3_API Z3_mk_finite_domain_sort(Z3_context c, Z3_symbol name, unsigned __int64 size) {
     Z3_TRY;
     LOG_Z3_mk_finite_domain_sort(c, name, size);
     RESET_ERROR_CODE();
     sort* s = mk_c(c)->datalog_util().mk_sort(to_symbol(name), size);
     mk_c(c)->save_ast_trail(s);
     RETURN_Z3(of_sort(s));
     Z3_CATCH_RETURN(0);
 }
예제 #8
0
파일: api_solver.cpp 프로젝트: levnach/z3
 Z3_solver Z3_API Z3_mk_solver_for_logic(Z3_context c, Z3_symbol logic) {
     Z3_TRY;
     LOG_Z3_mk_solver_for_logic(c, logic);
     RESET_ERROR_CODE();
     if (!smt_logics::supported_logic(to_symbol(logic))) {
         std::ostringstream strm;
         strm << "logic '" << to_symbol(logic) << "' is not recognized";
         throw default_exception(strm.str());
         RETURN_Z3(nullptr);
     }
     else {
         Z3_solver_ref * s = alloc(Z3_solver_ref, *mk_c(c), mk_smt_strategic_solver_factory(to_symbol(logic)));
         mk_c(c)->save_object(s);
         Z3_solver r = of_solver(s);
         RETURN_Z3(r);
     }
     Z3_CATCH_RETURN(nullptr);
 }
 void init_smtlib_parser(Z3_context c, 
                         unsigned num_sorts,
                         Z3_symbol const sort_names[],
                         Z3_sort const types[],
                         unsigned num_decls,
                         Z3_symbol const decl_names[],
                         Z3_func_decl const decls[]) {
     mk_c(c)->reset_parser();
     mk_c(c)->m_smtlib_parser = smtlib::parser::create(mk_c(c)->m());
     mk_c(c)->m_smtlib_parser->initialize_smtlib();
     smtlib::symtable * table = mk_c(c)->m_smtlib_parser->get_benchmark()->get_symtable();
     for (unsigned i = 0; i < num_sorts; i++) {
         table->insert(to_symbol(sort_names[i]), to_sort(types[i]));
     }
     for (unsigned i = 0; i < num_decls; i++) {
         table->insert(to_symbol(decl_names[i]), to_func_decl(decls[i]));
     }
 }
예제 #10
0
 Z3_ast parse_smtlib2_stream(bool exec, Z3_context c, std::istream& is,
                             unsigned num_sorts,
                             Z3_symbol const sort_names[],
                             Z3_sort const sorts[],
                             unsigned num_decls,
                             Z3_symbol const decl_names[],
                             Z3_func_decl const decls[]) {
     Z3_TRY;
     scoped_ptr<cmd_context> ctx = alloc(cmd_context, false, &(mk_c(c)->m()));
     ctx->set_ignore_check(true);
     for (unsigned i = 0; i < num_decls; ++i) {
         ctx->insert(to_symbol(decl_names[i]), to_func_decl(decls[i]));
     }
     for (unsigned i = 0; i < num_sorts; ++i) {
         sort* srt = to_sort(sorts[i]);
         symbol name(to_symbol(sort_names[i]));
         if (!ctx->find_psort_decl(name)) {
             psort* ps = ctx->pm().mk_psort_cnst(srt);
             ctx->insert(ctx->pm().mk_psort_user_decl(0, name, ps));
         }
     }
     std::stringstream errstrm;
     ctx->set_regular_stream(errstrm);
     try {
         if (!parse_smt2_commands(*ctx.get(), is)) {
             ctx = nullptr;
             mk_c(c)->m_parser_error_buffer = errstrm.str();
             SET_ERROR_CODE(Z3_PARSER_ERROR);
             return of_ast(mk_c(c)->m().mk_true());
         }
     }
     catch (z3_exception& e) {
         errstrm << e.msg();
         mk_c(c)->m_parser_error_buffer = errstrm.str();            
         ctx = nullptr;
         SET_ERROR_CODE(Z3_PARSER_ERROR);
         return of_ast(mk_c(c)->m().mk_true());
     }
     ptr_vector<expr>::const_iterator it  = ctx->begin_assertions();
     ptr_vector<expr>::const_iterator end = ctx->end_assertions();
     unsigned size = static_cast<unsigned>(end - it);
     return of_ast(mk_c(c)->mk_and(size, it));
     Z3_CATCH_RETURN(0);
 }
예제 #11
0
파일: api_solver.cpp 프로젝트: ai-se/z3
 Z3_solver Z3_API Z3_mk_solver_for_logic(Z3_context c, Z3_symbol logic) {
     Z3_TRY;
     LOG_Z3_mk_solver_for_logic(c, logic);
     RESET_ERROR_CODE();
     Z3_solver_ref * s = alloc(Z3_solver_ref, mk_smt_strategic_solver_factory(to_symbol(logic)));
     mk_c(c)->save_object(s);
     Z3_solver r = of_solver(s);
     RETURN_Z3(r);
     Z3_CATCH_RETURN(0);
 }
예제 #12
0
 void Z3_API Z3_fixedpoint_set_predicate_representation(
     Z3_context c,
     Z3_fixedpoint d,
     Z3_func_decl f,
     unsigned num_relations,
     Z3_symbol const relation_kinds[]) {
     Z3_TRY;
     LOG_Z3_fixedpoint_set_predicate_representation(c, d, f, num_relations, relation_kinds);
     svector<symbol> kinds;
     for (unsigned i = 0; i < num_relations; ++i) {
         kinds.push_back(to_symbol(relation_kinds[i]));
     }
     to_fixedpoint_ref(d)->ctx().set_predicate_representation(to_func_decl(f), num_relations, kinds.c_ptr());
     Z3_CATCH;
 }
예제 #13
0
파일: api_params.cpp 프로젝트: CHolmes3/z3
 Z3_param_kind Z3_API Z3_param_descrs_get_kind(Z3_context c, Z3_param_descrs p, Z3_symbol n) {
     Z3_TRY;
     LOG_Z3_param_descrs_get_kind(c, p, n);
     RESET_ERROR_CODE();
     param_kind k = to_param_descrs_ptr(p)->get_kind(to_symbol(n));
     switch (k) {
     case CPK_UINT:    return Z3_PK_UINT;
     case CPK_BOOL:    return Z3_PK_BOOL;
     case CPK_DOUBLE:  return Z3_PK_DOUBLE;
     case CPK_STRING:  return Z3_PK_STRING;
     case CPK_SYMBOL:  return Z3_PK_SYMBOL;
     case CPK_INVALID: return Z3_PK_INVALID;
     default:          return Z3_PK_OTHER;
     }
     Z3_CATCH_RETURN(Z3_PK_INVALID);
 }