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:
commit
c508b66cf7
37 changed files with 502 additions and 263 deletions
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue