Ejemplo n.º 1
0
/*
 * Test 2: build distinct terms
 */
static void test2(void) {
  uint32_t i;
  eterm_t aux;
  occ_t a[50];
  literal_t l;
  type_t tau;

  printf("***********************\n"
	 "*       TEST 2        *\n"
	 "***********************\n\n");

  init_solver(&egraph, &core);

  tau = yices_new_uninterpreted_type();

  printf("---> building a_0 ... a_49\n");
  for (i=0; i<50; i++) {
    aux = egraph_make_variable(&egraph, tau);
    a[i] = pos_occ(aux);
  }

  for (i=0; i<40; i++) {
    printf("---> creating (distinct a_%"PRIu32" ... a_%"PRIu32")\n", i, i+5);
    l = egraph_make_distinct(&egraph, 5, a+i);
    printf("---> result = ");
    print_literal(stdout, l);
    printf("\n");
  }

  print_solver(&egraph, &core);
  delete_solver(&egraph, &core);
}
Ejemplo n.º 2
0
 Z3_lbool Z3_API Z3_solver_get_consequences(Z3_context c, 
                                     Z3_solver s,
                                     Z3_ast_vector assumptions,
                                     Z3_ast_vector variables,
                                     Z3_ast_vector consequences) {
     Z3_TRY;
     LOG_Z3_solver_get_consequences(c, s, assumptions, variables, consequences);
     ast_manager& m = mk_c(c)->m();
     RESET_ERROR_CODE();
     CHECK_SEARCHING(c);
     init_solver(c, s);
     expr_ref_vector _assumptions(m), _consequences(m), _variables(m);
     ast_ref_vector const& __assumptions = to_ast_vector_ref(assumptions);
     for (ast* e : __assumptions) {
         if (!is_expr(e)) {
             _assumptions.finalize(); _consequences.finalize(); _variables.finalize();
             SET_ERROR_CODE(Z3_INVALID_USAGE, "assumption is not an expression");
             return Z3_L_UNDEF;
         }
         _assumptions.push_back(to_expr(e));
     }
     ast_ref_vector const& __variables = to_ast_vector_ref(variables);
     for (ast* a : __variables) {
         if (!is_expr(a)) {
             _assumptions.finalize(); _consequences.finalize(); _variables.finalize();
             SET_ERROR_CODE(Z3_INVALID_USAGE, "variable is not an expression");
             return Z3_L_UNDEF;
         }
         _variables.push_back(to_expr(a));
     }
     lbool result = l_undef;
     unsigned timeout     = to_solver(s)->m_params.get_uint("timeout", mk_c(c)->get_timeout());
     unsigned rlimit      = to_solver(s)->m_params.get_uint("rlimit", mk_c(c)->get_rlimit());
     bool     use_ctrl_c  = to_solver(s)->m_params.get_bool("ctrl_c", false);
     cancel_eh<reslimit> eh(mk_c(c)->m().limit());
     api::context::set_interruptable si(*(mk_c(c)), eh);
     {
         scoped_ctrl_c ctrlc(eh, false, use_ctrl_c);
         scoped_timer timer(timeout, &eh);
         scoped_rlimit _rlimit(mk_c(c)->m().limit(), rlimit);
         try {
             result = to_solver_ref(s)->get_consequences(_assumptions, _variables, _consequences);
         }
         catch (z3_exception & ex) {
             to_solver_ref(s)->set_reason_unknown(eh);
             _assumptions.finalize(); _consequences.finalize(); _variables.finalize();
             mk_c(c)->handle_exception(ex);
             return Z3_L_UNDEF;
         }
     }
     if (result == l_undef) {
         to_solver_ref(s)->set_reason_unknown(eh);
     }
     for (expr* e : _consequences) {
         to_ast_vector_ref(consequences).push_back(e);
     }
     return static_cast<Z3_lbool>(result); 
     Z3_CATCH_RETURN(Z3_L_UNDEF);        
 }
Ejemplo n.º 3
0
 unsigned Z3_API Z3_solver_get_num_scopes(Z3_context c, Z3_solver s) {
     Z3_TRY;
     LOG_Z3_solver_get_num_scopes(c, s);
     RESET_ERROR_CODE();
     init_solver(c, s);
     return to_solver_ref(s)->get_scope_level();
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 4
0
 void Z3_API Z3_solver_set_activity(Z3_context c, Z3_solver s, Z3_ast a, double activity) {
     Z3_TRY;
     LOG_Z3_solver_set_activity(c, s, a, activity);
     RESET_ERROR_CODE();
     init_solver(c, s);
     to_solver_ref(s)->set_activity(to_expr(a), activity);
     Z3_CATCH;
 }
Ejemplo n.º 5
0
 Z3_lbool Z3_API Z3_solver_check(Z3_context c, Z3_solver s) {
     Z3_TRY;
     LOG_Z3_solver_check(c, s);
     RESET_ERROR_CODE();
     init_solver(c, s);
     return _solver_check(c, s, 0, nullptr);
     Z3_CATCH_RETURN(Z3_L_UNDEF);
 }
Ejemplo n.º 6
0
 Z3_lbool Z3_API Z3_solver_check_assumptions(Z3_context c, Z3_solver s, unsigned num_assumptions, Z3_ast const assumptions[]) {
     Z3_TRY;
     LOG_Z3_solver_check_assumptions(c, s, num_assumptions, assumptions);
     RESET_ERROR_CODE();
     init_solver(c, s);
     return _solver_check(c, s, num_assumptions, assumptions);
     Z3_CATCH_RETURN(Z3_L_UNDEF);
 }
Ejemplo n.º 7
0
 Z3_string Z3_API Z3_solver_get_reason_unknown(Z3_context c, Z3_solver s) {
     Z3_TRY;
     LOG_Z3_solver_get_reason_unknown(c, s);
     RESET_ERROR_CODE();
     init_solver(c, s);
     return mk_c(c)->mk_external_string(to_solver_ref(s)->reason_unknown());
     Z3_CATCH_RETURN("");
 }
Ejemplo n.º 8
0
 void Z3_API Z3_solver_push(Z3_context c, Z3_solver s) {
     Z3_TRY;
     LOG_Z3_solver_push(c, s);
     RESET_ERROR_CODE();
     init_solver(c, s);
     to_solver_ref(s)->push();
     Z3_CATCH;
 }
Ejemplo n.º 9
0
			rectangle_packer (int _nb_screen, const pair & vscreen_min_size, const pair & vscreen_max_size, const pair_list & screen_sizes, const sequence_pair & layout) : nb_screen (_nb_screen) {
				init_solver ();

				// Virtual screen boundaries
				more_than_const (v_vscreen_size (X), vscreen_min_size.x); less_than_const (v_vscreen_size (X), vscreen_max_size.x);
				more_than_const (v_vscreen_size (Y), vscreen_min_size.y); less_than_const (v_vscreen_size (Y), vscreen_max_size.y);

				// Screens inside virtual screen
				for (int sc = 0; sc < nb_screen; ++sc) {
					positive_or_zero (v_screen_pos (sc, X)); offseted_less_than_var (v_screen_pos (sc, X), screen_sizes[sc].x, v_vscreen_size (X));
					positive_or_zero (v_screen_pos (sc, Y)); offseted_less_than_var (v_screen_pos (sc, Y), screen_sizes[sc].y, v_vscreen_size (Y));
				}

				// Screen ordering constraints
				for (int sa = 0;  sa < nb_screen; ++sa)
					for (int sb = 0; sb < sa; ++sb)
						switch (layout.ordering (sa, sb)) {
							case left: offseted_less_than_var (v_screen_pos (sa, X), screen_sizes[sa].x, v_screen_pos (sb, X)); break;
							case right: offseted_less_than_var (v_screen_pos (sb, X), screen_sizes[sb].x, v_screen_pos (sa, X)); break;
							case above: offseted_less_than_var (v_screen_pos (sa, Y), screen_sizes[sa].y, v_screen_pos (sb, Y)); break;
							case under: offseted_less_than_var (v_screen_pos (sb, Y), screen_sizes[sb].y, v_screen_pos (sa, Y)); break;
							default: throw std::runtime_error ("rectangle_packer: unordered screens despite sequence pair"); 
						}

				/* Objective function. sum of :
				 * - constraint gap length
				 * - distance between centers on second axis
				 */	
				const int constraint_gap_coeff = 1;
				const int center_distance_coeff = 1;
				
				std::vector< int > coeffs (v_nb (), 0); // More practical to gather coeffs
				coeffs[v_objective ()] = -1; // 0 = -o + sum(...)

				for (int sa = 0;  sa < nb_screen; ++sa)
					for (int sb = 0; sb < sa; ++sb)
						switch (layout.ordering (sa, sb)) {
							case left:
								coeffs[v_screen_pos (sa, X)] -= constraint_gap_coeff; coeffs[v_screen_pos (sb, X)] += constraint_gap_coeff; // o += sb.x - sa.x
								coeffs[distance_var (v_screen_pos (sa, Y), screen_sizes[sa].y, v_screen_pos (sb, Y), screen_sizes[sb].y)] += center_distance_coeff; // o += dist (sa.cy, sb.cy)
								break;
							case right:
								coeffs[v_screen_pos (sb, X)] -= constraint_gap_coeff; coeffs[v_screen_pos (sa, X)] += constraint_gap_coeff; // o += sa.x - sb.x
								coeffs[distance_var (v_screen_pos (sb, Y), screen_sizes[sb].y, v_screen_pos (sa, Y), screen_sizes[sa].y)] += center_distance_coeff; // o += dist (sb.cy, sa.cy)
								break;
							case above:
								coeffs[v_screen_pos (sa, Y)] -= constraint_gap_coeff; coeffs[v_screen_pos (sb, Y)] += constraint_gap_coeff; // o += sb.y - sa.y
								coeffs[distance_var (v_screen_pos (sa, X), screen_sizes[sa].x, v_screen_pos (sb, X), screen_sizes[sb].x)] += center_distance_coeff; // o += dist (sa.cx, sb.cx)
								break;
							case under:
								coeffs[v_screen_pos (sb, Y)] -= constraint_gap_coeff; coeffs[v_screen_pos (sa, Y)] += constraint_gap_coeff; // o += sa.y - sb.y
								coeffs[distance_var (v_screen_pos (sb, X), screen_sizes[sb].x, v_screen_pos (sa, X), screen_sizes[sa].x)] += center_distance_coeff; // o += dist (sb.cx, sa.cx)
								break;
							default:
								break; // Error handled before
						}
				equality (coeffs);
			}
Ejemplo n.º 10
0
 void Z3_API Z3_solver_assert(Z3_context c, Z3_solver s, Z3_ast a) {
     Z3_TRY;
     LOG_Z3_solver_assert(c, s, a);
     RESET_ERROR_CODE();
     init_solver(c, s);
     CHECK_FORMULA(a,);
     to_solver_ref(s)->assert_expr(to_expr(a));
     Z3_CATCH;
 }
Ejemplo n.º 11
0
 void Z3_API Z3_solver_assert_and_track(Z3_context c, Z3_solver s, Z3_ast a, Z3_ast p) {
     Z3_TRY;
     LOG_Z3_solver_assert_and_track(c, s, a, p);
     RESET_ERROR_CODE();
     init_solver(c, s);
     CHECK_FORMULA(a,);
     CHECK_FORMULA(p,);
     to_solver_ref(s)->assert_expr(to_expr(a), to_expr(p));
     Z3_CATCH;
 }
Ejemplo n.º 12
0
 Z3_string Z3_API Z3_solver_to_dimacs_string(Z3_context c, Z3_solver s) {
     Z3_TRY;
     LOG_Z3_solver_to_string(c, s);
     RESET_ERROR_CODE();
     init_solver(c, s);
     std::ostringstream buffer;
     to_solver_ref(s)->display_dimacs(buffer);
     return mk_c(c)->mk_external_string(buffer.str());
     Z3_CATCH_RETURN("");
 }
Ejemplo n.º 13
0
 Z3_stats Z3_API Z3_solver_get_statistics(Z3_context c, Z3_solver s) {
     Z3_TRY;
     LOG_Z3_solver_get_statistics(c, s);
     RESET_ERROR_CODE();
     init_solver(c, s);
     Z3_stats_ref * st = alloc(Z3_stats_ref);
     to_solver_ref(s)->collect_statistics(st->m_stats);
     mk_c(c)->save_object(st);
     Z3_stats r = of_stats(st);
     RETURN_Z3(r);
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 14
0
 void Z3_API Z3_solver_pop(Z3_context c, Z3_solver s, unsigned n) {
     Z3_TRY;
     LOG_Z3_solver_pop(c, s, n);
     RESET_ERROR_CODE();
     init_solver(c, s);
     if (n > to_solver_ref(s)->get_scope_level()) {
         SET_ERROR_CODE(Z3_IOB, nullptr);
         return;
     }
     if (n > 0)
         to_solver_ref(s)->pop(n);
     Z3_CATCH;
 }
Ejemplo n.º 15
0
 Z3_solver Z3_API Z3_solver_translate(Z3_context c, Z3_solver s, Z3_context target) {
     Z3_TRY;
     LOG_Z3_solver_translate(c, s, target);
     RESET_ERROR_CODE();
     params_ref const& p = to_solver(s)->m_params; 
     Z3_solver_ref * sr = alloc(Z3_solver_ref, *mk_c(target), nullptr);
     init_solver(c, s);
     sr->m_solver = to_solver(s)->m_solver->translate(mk_c(target)->m(), p);
     mk_c(target)->save_object(sr);
     Z3_solver r = of_solver(sr);
     RETURN_Z3(r);
     Z3_CATCH_RETURN(nullptr);
 }
Ejemplo n.º 16
0
 Z3_ast Z3_API Z3_solver_get_proof(Z3_context c, Z3_solver s) {
     Z3_TRY;
     LOG_Z3_solver_get_proof(c, s);
     RESET_ERROR_CODE();
     init_solver(c, s);
     proof * p = to_solver_ref(s)->get_proof();
     if (!p) {
         SET_ERROR_CODE(Z3_INVALID_USAGE, "there is no current proof");
         RETURN_Z3(nullptr);
     }
     mk_c(c)->save_ast_trail(p);
     RETURN_Z3(of_ast(p));
     Z3_CATCH_RETURN(nullptr);
 }
Ejemplo n.º 17
0
 Z3_stats Z3_API Z3_solver_get_statistics(Z3_context c, Z3_solver s) {
     Z3_TRY;
     LOG_Z3_solver_get_statistics(c, s);
     RESET_ERROR_CODE();
     init_solver(c, s);
     Z3_stats_ref * st = alloc(Z3_stats_ref, *mk_c(c));
     to_solver_ref(s)->collect_statistics(st->m_stats);
     get_memory_statistics(st->m_stats);
     get_rlimit_statistics(mk_c(c)->m().limit(), st->m_stats);
     mk_c(c)->save_object(st);
     Z3_stats r = of_stats(st);
     RETURN_Z3(r);
     Z3_CATCH_RETURN(nullptr);
 }
Ejemplo n.º 18
0
 Z3_ast_vector Z3_API Z3_solver_get_trail(Z3_context c, Z3_solver s) {
     Z3_TRY;
     LOG_Z3_solver_get_trail(c, s);
     RESET_ERROR_CODE();
     init_solver(c, s);
     Z3_ast_vector_ref * v = alloc(Z3_ast_vector_ref, *mk_c(c), mk_c(c)->m());
     mk_c(c)->save_object(v);
     expr_ref_vector trail = to_solver_ref(s)->get_trail();
     for (expr* f : trail) {
         v->m_ast_vector.push_back(f);
     }
     RETURN_Z3(of_ast_vector(v));
     Z3_CATCH_RETURN(nullptr);
 }
Ejemplo n.º 19
0
 Z3_ast_vector Z3_API Z3_solver_get_assertions(Z3_context c, Z3_solver s) {
     Z3_TRY;
     LOG_Z3_solver_get_assertions(c, s);
     RESET_ERROR_CODE();
     init_solver(c, s);
     Z3_ast_vector_ref * v = alloc(Z3_ast_vector_ref, *mk_c(c), mk_c(c)->m());
     mk_c(c)->save_object(v);
     unsigned sz = to_solver_ref(s)->get_num_assertions();
     for (unsigned i = 0; i < sz; i++) {
         v->m_ast_vector.push_back(to_solver_ref(s)->get_assertion(i));
     }
     RETURN_Z3(of_ast_vector(v));
     Z3_CATCH_RETURN(nullptr);
 }
Ejemplo n.º 20
0
 Z3_ast_vector Z3_API Z3_solver_get_unsat_core(Z3_context c, Z3_solver s) {
     Z3_TRY;
     LOG_Z3_solver_get_unsat_core(c, s);
     RESET_ERROR_CODE();
     init_solver(c, s);
     ptr_vector<expr> core;
     to_solver_ref(s)->get_unsat_core(core);
     Z3_ast_vector_ref * v = alloc(Z3_ast_vector_ref, mk_c(c)->m());
     mk_c(c)->save_object(v);
     for (unsigned i = 0; i < core.size(); i++) {
         v->m_ast_vector.push_back(core[i]);
     }
     RETURN_Z3(of_ast_vector(v));
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 21
0
 Z3_lbool Z3_API Z3_get_implied_equalities(Z3_context c, 
                                           Z3_solver s,
                                           unsigned num_terms,
                                           Z3_ast const terms[],
                                           unsigned class_ids[]) {
     Z3_TRY;
     LOG_Z3_get_implied_equalities(c, s, num_terms, terms, class_ids);
     ast_manager& m = mk_c(c)->m();
     RESET_ERROR_CODE();
     CHECK_SEARCHING(c);
     init_solver(c, s);
     lbool result = smt::implied_equalities(m, *to_solver_ref(s), num_terms, to_exprs(terms), class_ids);
     return static_cast<Z3_lbool>(result); 
     Z3_CATCH_RETURN(Z3_L_UNDEF);
 }
Ejemplo n.º 22
0
 void Z3_API Z3_solver_from_file(Z3_context c, Z3_solver s, Z3_string file_name) {
     Z3_TRY;
     LOG_Z3_solver_from_file(c, s, file_name);
     char const* ext = get_extension(file_name);
     std::ifstream is(file_name);
     init_solver(c, s);
     if (!is) {
         SET_ERROR_CODE(Z3_FILE_ACCESS_ERROR, nullptr);
     }
     else if (ext && (std::string("dimacs") == ext || std::string("cnf") == ext)) {
         solver_from_dimacs_stream(c, s, is);
     }
     else {
         solver_from_stream(c, s, is);
     }
     Z3_CATCH;
 }
Ejemplo n.º 23
0
 Z3_string Z3_API Z3_solver_get_help(Z3_context c, Z3_solver s) {
     Z3_TRY;
     LOG_Z3_solver_get_help(c, s);
     RESET_ERROR_CODE();
     std::ostringstream buffer;
     param_descrs descrs;
     bool initialized = to_solver(s)->m_solver.get() != nullptr;
     if (!initialized)
         init_solver(c, s);
     to_solver_ref(s)->collect_param_descrs(descrs);
     context_params::collect_solver_param_descrs(descrs);
     if (!initialized)
         to_solver(s)->m_solver = nullptr;
     descrs.display(buffer);
     return mk_c(c)->mk_external_string(buffer.str());
     Z3_CATCH_RETURN("");
 }
Ejemplo n.º 24
0
 Z3_model Z3_API Z3_solver_get_model(Z3_context c, Z3_solver s) {
     Z3_TRY;
     LOG_Z3_solver_get_model(c, s);
     RESET_ERROR_CODE();
     init_solver(c, s);
     model_ref _m;
     to_solver_ref(s)->get_model(_m);
     if (!_m) {
         SET_ERROR_CODE(Z3_INVALID_USAGE);
         RETURN_Z3(0);
     }
     Z3_model_ref * m_ref = alloc(Z3_model_ref); 
     m_ref->m_model = _m;
     mk_c(c)->save_object(m_ref);
     RETURN_Z3(of_model(m_ref));
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 25
0
 Z3_param_descrs Z3_API Z3_solver_get_param_descrs(Z3_context c, Z3_solver s) {
     Z3_TRY;
     LOG_Z3_solver_get_param_descrs(c, s);
     RESET_ERROR_CODE();
     Z3_param_descrs_ref * d = alloc(Z3_param_descrs_ref, *mk_c(c));
     mk_c(c)->save_object(d);
     bool initialized = to_solver(s)->m_solver.get() != nullptr;
     if (!initialized)
         init_solver(c, s);
     to_solver_ref(s)->collect_param_descrs(d->m_descrs);
     context_params::collect_solver_param_descrs(d->m_descrs);
     if (!initialized)
         to_solver(s)->m_solver = nullptr;
     Z3_param_descrs r = of_param_descrs(d);
     RETURN_Z3(r);
     Z3_CATCH_RETURN(nullptr);
 }
Ejemplo n.º 26
0
 lbool context::optimize() {
     if (m_pareto) {
         return execute_pareto();
     }
     if (m_box_index != UINT_MAX) {
         return execute_box();
     }
     clear_state();
     init_solver(); 
     import_scoped_state(); 
     normalize();
     internalize();
     update_solver();
     solver& s = get_solver();
     for (unsigned i = 0; i < m_hard_constraints.size(); ++i) {
         TRACE("opt", tout << "Hard constraint: " << mk_ismt2_pp(m_hard_constraints[i].get(), m) << std::endl;);
         s.assert_expr(m_hard_constraints[i].get());
     }
Ejemplo n.º 27
0
    void solver_from_stream(Z3_context c, Z3_solver s, std::istream& is) {
        scoped_ptr<cmd_context> ctx = alloc(cmd_context, false, &(mk_c(c)->m()));
        ctx->set_ignore_check(true);
        std::stringstream errstrm;
        ctx->set_regular_stream(errstrm);

        if (!parse_smt2_commands(*ctx.get(), is)) {
            ctx = nullptr;
            SET_ERROR_CODE(Z3_PARSER_ERROR, errstrm.str().c_str());
            return;
        }

        bool initialized = to_solver(s)->m_solver.get() != nullptr;
        if (!initialized)
            init_solver(c, s);
        for (expr * e : ctx->assertions()) {
            to_solver_ref(s)->assert_expr(e);
        }
        to_solver_ref(s)->set_model_converter(ctx->get_model_converter());
    }
Ejemplo n.º 28
0
 Z3_model Z3_API Z3_solver_get_model(Z3_context c, Z3_solver s) {
     Z3_TRY;
     LOG_Z3_solver_get_model(c, s);
     RESET_ERROR_CODE();
     init_solver(c, s);
     model_ref _m;
     to_solver_ref(s)->get_model(_m);
     if (!_m) {
         SET_ERROR_CODE(Z3_INVALID_USAGE, "there is no current model");
         RETURN_Z3(nullptr);
     }
     if (_m) {
         if (mk_c(c)->params().m_model_compress) _m->compress();
     }
     Z3_model_ref * m_ref = alloc(Z3_model_ref, *mk_c(c)); 
     m_ref->m_model = _m;
     mk_c(c)->save_object(m_ref);
     RETURN_Z3(of_model(m_ref));
     Z3_CATCH_RETURN(nullptr);
 }
Ejemplo n.º 29
0
 static void solver_from_dimacs_stream(Z3_context c, Z3_solver s, std::istream& is) {
     init_solver(c, s);
     ast_manager& m = to_solver_ref(s)->get_manager();
     std::stringstream err;
     sat::solver solver(to_solver_ref(s)->get_params(), m.limit());
     if (!parse_dimacs(is, err, solver)) {
         SET_ERROR_CODE(Z3_PARSER_ERROR, err.str().c_str());
         return;
     }
     sat2goal s2g;
     ref<sat2goal::mc> mc;
     atom2bool_var a2b(m);
     for (unsigned v = 0; v < solver.num_vars(); ++v) {
         a2b.insert(m.mk_const(symbol(v), m.mk_bool_sort()), v);
     }
     goal g(m);            
     s2g(solver, a2b, to_solver_ref(s)->get_params(), g, mc);
     for (unsigned i = 0; i < g.size(); ++i) {
         to_solver_ref(s)->assert_expr(g.form(i));
     }
 }
Ejemplo n.º 30
0
 void Z3_API Z3_solver_get_levels(Z3_context c, Z3_solver s, Z3_ast_vector literals, unsigned sz, unsigned levels[]) {
     Z3_TRY;
     LOG_Z3_solver_get_levels(c, s, literals, sz, levels);
     RESET_ERROR_CODE();
     init_solver(c, s);
     if (sz != Z3_ast_vector_size(c, literals)) {
         SET_ERROR_CODE(Z3_IOB, nullptr);
         return;
     }
     ptr_vector<expr> _vars;
     for (unsigned i = 0; i < sz; ++i) {
         expr* e = to_expr(Z3_ast_vector_get(c, literals, i));
         mk_c(c)->m().is_not(e, e);
         _vars.push_back(e);
     }
     unsigned_vector _levels(sz);
     to_solver_ref(s)->get_levels(_vars, _levels);
     for (unsigned i = 0; i < sz; ++i) {
         levels[i] = _levels[i];
     }
     Z3_CATCH;
 }