3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-23 09:05:31 +00:00

Merge branch 'unstable' of https://git01.codeplex.com/z3 into fpa-api

Conflicts:
	src/ast/float_decl_plugin.h

Signed-off-by: Christoph M. Wintersteiger <cwinter@microsoft.com>
This commit is contained in:
Christoph M. Wintersteiger 2014-07-31 17:37:43 +01:00
commit c508b66cf7
37 changed files with 502 additions and 263 deletions

View file

@ -22,6 +22,7 @@ Revision History:
void theory_arith_params::updt_params(params_ref const & _p) {
smt_params_helper p(_p);
m_arith_random_initial_value = p.arith_random_initial_value();
m_arith_random_seed = p.random_seed();
m_arith_mode = static_cast<arith_solver_id>(p.arith_solver());
m_nl_arith = p.arith_nl();
m_nl_arith_gb = p.arith_nl_gb();

View file

@ -3945,7 +3945,7 @@ namespace smt {
m_fingerprints.display(tout);
);
failure fl = get_last_search_failure();
if (fl == TIMEOUT || fl == MEMOUT || fl == CANCELED || fl == NUM_CONFLICTS) {
if (fl == TIMEOUT || fl == MEMOUT || fl == CANCELED || fl == NUM_CONFLICTS || fl == THEORY) {
// don't generate model.
return;
}

View file

@ -1198,6 +1198,7 @@ namespace smt {
void theory_bv::relevant_eh(app * n) {
ast_manager & m = get_manager();
context & ctx = get_context();
TRACE("bv", tout << "relevant: " << mk_pp(n, m) << "\n";);
if (m.is_bool(n)) {
bool_var v = ctx.get_bool_var(n);
atom * a = get_bv2a(v);

View file

@ -51,26 +51,27 @@ namespace smt {
void theory_fpa::mk_bv_eq(expr * x, expr * y) {
SASSERT(get_sort(x)->get_family_id() == m_converter.bu().get_family_id());
SASSERT(get_sort(y)->get_family_id() == m_converter.bu().get_family_id());
ast_manager & m = get_manager();
context & ctx = get_context();
theory_id bv_tid = ctx.get_theory(m.get_sort(x)->get_family_id())->get_id();
literal l = mk_eq(x, y, false);
ctx.mk_th_axiom(get_id(), 1, &l);
literal l = mk_eq(x, y, false);
ctx.mk_th_axiom(bv_tid, 1, &l);
ctx.mark_as_relevant(l);
}
expr_ref theory_fpa::mk_eq_bv_const(expr_ref const & e) {
app_ref theory_fpa::mk_eq_bv_const(expr_ref const & e) {
ast_manager & m = get_manager();
context & ctx = get_context();
expr_ref bv_const(m);
bv_const = m.mk_fresh_const(0, m.get_sort(e));
app_ref bv_const(m);
bv_const = m.mk_fresh_const(0, m.get_sort(e));
mk_bv_eq(bv_const, e);
return bv_const;
}
bool theory_fpa::internalize_atom(app * atom, bool gate_ctx) {
TRACE("t_fpa", tout << "internalizing atom: " << mk_ismt2_pp(atom, get_manager()) << "\n";);
SASSERT(atom->get_family_id() == get_family_id());
SASSERT(atom->get_family_id() == get_family_id());
ast_manager & m = get_manager();
context & ctx = get_context();
@ -78,6 +79,9 @@ namespace smt {
bv_util & bu = m_converter.bu();
expr_ref bv_atom(m);
if (ctx.b_internalized(atom))
return true;
unsigned num_args = atom->get_num_args();
for (unsigned i = 0; i < num_args; i++)
ctx.internalize(atom->get_arg(i), false);
@ -104,7 +108,7 @@ namespace smt {
TRACE("t_fpa", tout << "internalizing term: " << mk_ismt2_pp(term, get_manager()) << "\n";);
SASSERT(term->get_family_id() == get_family_id());
SASSERT(!get_context().e_internalized(term));
ast_manager & m = get_manager();
context & ctx = get_context();
simplifier & simp = ctx.get_simplifier();
@ -135,9 +139,9 @@ namespace smt {
simp(a->get_arg(1), sig, pr_sig);
simp(a->get_arg(2), exp, pr_exp);
expr_ref bv_v_sgn = mk_eq_bv_const(sgn);
expr_ref bv_v_sig = mk_eq_bv_const(sig);
expr_ref bv_v_exp = mk_eq_bv_const(exp);
app_ref bv_v_sgn = mk_eq_bv_const(sgn);
app_ref bv_v_sig = mk_eq_bv_const(sig);
app_ref bv_v_exp = mk_eq_bv_const(exp);
m_converter.mk_triple(bv_v_sgn, bv_v_sig, bv_v_exp, bv_term);
}
@ -157,7 +161,7 @@ namespace smt {
SASSERT(!m_trans_map.contains(term));
m_trans_map.insert(term, bv_term, 0);
enode * e = ctx.mk_enode(term, false, false, true);
enode * e = (ctx.e_internalized(term)) ? ctx.get_enode(term) : ctx.mk_enode(term, false, false, true);
theory_var v = mk_var(e);
ctx.attach_th_var(e, this, v);
TRACE("t_fpa", tout << "new theory var: " << mk_ismt2_pp(term, get_manager()) << " := " << v << "\n";);
@ -224,7 +228,7 @@ namespace smt {
else if (m_converter.fu().is_rm(m.get_sort(get_enode(x)->get_owner()))) {
mk_bv_eq(ex, ey);
}
else
else
UNREACHABLE();
}
@ -253,7 +257,7 @@ namespace smt {
m.mk_not(m.mk_eq(exp_x, exp_y)));
}
else if (m_converter.fu().is_rm(m.get_sort(get_enode(x)->get_owner()))) {
deq = m.mk_not(m.mk_eq(ex, ey));
deq = m.mk_not(m.mk_eq(ex, ey));
}
else
UNREACHABLE();
@ -281,7 +285,7 @@ namespace smt {
mpf_manager & mpfm = fu.fm();
unsynch_mpz_manager & mpzm = mpfm.mpz_manager();
unsynch_mpq_manager & mpqm = mpfm.mpq_manager();
theory_var v = n->get_th_var(get_id());
SASSERT(v != null_theory_var);
expr * fpa_e = get_enode(v)->get_owner();
@ -437,9 +441,19 @@ namespace smt {
ctx.mark_as_relevant(bv_exp);
}
else if (n->get_decl()->get_decl_kind() == OP_TO_IEEE_BV) {
literal l = mk_eq(n, ex, false);
ctx.mark_as_relevant(l);
//literal l = mk_eq(n, ex, false);
//ctx.mark_as_relevant(l);
//ctx.mk_th_axiom(get_id(), 1, &l);
app * ex_a = to_app(ex);
if (n->get_id() > ex_a->get_id())
std::swap(n, ex_a);
expr_ref eq(m);
eq = m.mk_eq(n, ex_a);
ctx.internalize(eq, false);
literal l = ctx.get_literal(eq);
ctx.mk_th_axiom(get_id(), 1, &l);
ctx.mark_as_relevant(l);
}
else
NOT_IMPLEMENTED_YET();
@ -453,4 +467,7 @@ namespace smt {
m_bool_var2atom.reset();
theory::reset_eh();
}
void theory_fpa::init_model(model_generator & m) {
}
};

View file

@ -51,9 +51,10 @@ namespace smt {
protected:
fpa2bv_converter m_converter;
fpa2bv_rewriter m_rw;
expr_map m_trans_map;
expr_map m_trans_map;
th_trail_stack m_trail_stack;
bool_var2atom m_bool_var2atom;
enode_vector m_temporaries;
virtual final_check_status final_check_eh() { return FC_DONE; }
virtual bool internalize_atom(app * atom, bool gate_ctx);
@ -71,6 +72,7 @@ namespace smt {
void assign_eh(bool_var v, bool is_true);
virtual void relevant_eh(app * n);
virtual void init_model(model_generator & m);
public:
theory_fpa(ast_manager& m);
@ -86,7 +88,7 @@ namespace smt {
}
void mk_bv_eq(expr * x, expr * y);
expr_ref mk_eq_bv_const(expr_ref const & e);
app_ref mk_eq_bv_const(expr_ref const & e);
};
};