3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-24 01:25:31 +00:00

Fix for partially interpreted floating-point functions. Relates to #2596, #2631.

This commit is contained in:
Christoph M. Wintersteiger 2019-10-25 15:59:19 +01:00
parent 1d4f8c0168
commit 2308d8af09
No known key found for this signature in database
GPG key ID: BCF6360F86294467
7 changed files with 118 additions and 86 deletions

View file

@ -53,6 +53,7 @@ struct evaluator_cfg : public default_rewriter_cfg {
seq_rewriter m_seq_rw;
array_util m_ar;
arith_util m_au;
fpa_util m_fpau;
unsigned long long m_max_memory;
unsigned m_max_steps;
bool m_model_completion;
@ -78,6 +79,7 @@ struct evaluator_cfg : public default_rewriter_cfg {
m_seq_rw(m),
m_ar(m),
m_au(m),
m_fpau(m),
m_pinned(m) {
bool flat = true;
m_b_rw.set_flat(flat);
@ -132,9 +134,9 @@ struct evaluator_cfg : public default_rewriter_cfg {
return false;
}
bool reduce_quantifier(quantifier * old_q,
expr * new_body,
expr * const * new_patterns,
bool reduce_quantifier(quantifier * old_q,
expr * new_body,
expr * const * new_patterns,
expr * const * new_no_patterns,
expr_ref & result,
proof_ref & result_pr) {
@ -148,7 +150,7 @@ struct evaluator_cfg : public default_rewriter_cfg {
family_id fid = f->get_family_id();
bool is_uninterp = fid != null_family_id && m.get_plugin(fid)->is_considered_uninterpreted(f);
br_status st = BR_FAILED;
TRACE("model_evaluator", tout << f->get_name() << " " << is_uninterp << "\n";);
TRACE("model_evaluator", tout << f->get_name() << " " << is_uninterp << "\n";);
if (num == 0 && (fid == null_family_id || is_uninterp)) { // || m_ar.is_as_array(f)
expr * val = m_model.get_const_interp(f);
if (val != nullptr) {
@ -195,8 +197,8 @@ struct evaluator_cfg : public default_rewriter_cfg {
result = m.mk_false();
st = BR_DONE;
}
TRACE("model_evaluator",
tout << st << " " << mk_pp(s, m) << " " << s_fid << " " << m_ar_rw.get_fid() << " "
TRACE("model_evaluator",
tout << st << " " << mk_pp(s, m) << " " << s_fid << " " << m_ar_rw.get_fid() << " "
<< mk_pp(args[0], m) << " " << mk_pp(args[1], m) << " " << result << "\n";);
if (st != BR_FAILED)
return st;
@ -324,7 +326,14 @@ struct evaluator_cfg : public default_rewriter_cfg {
result = nullptr;
result_pr = nullptr;
if (f->get_family_id() == m_fpau.get_family_id() &&
!m_fpau.is_considered_uninterpreted(f, num, args)) {
// cwinter: should this be unreachable?
return BR_FAILED;
}
func_interp * fi = m_model.get_func_interp(f);
if (fi) {
if (fi->is_partial())
fi->set_else(m.get_some_value(f->get_range()));
@ -338,6 +347,10 @@ struct evaluator_cfg : public default_rewriter_cfg {
result = m_au.mk_numeral(rational(0), f->get_range());
return BR_DONE;
}
else if (m_fpau.is_considered_uninterpreted(f, num, args)) {
result = m.get_some_value(f->get_range());
return BR_DONE;
}
return BR_FAILED;
}
@ -524,7 +537,7 @@ struct evaluator_cfg : public default_rewriter_cfg {
func_decl* f = m_ar.get_as_array_func_decl(to_app(a));
func_interp* g = m_model.get_func_interp(f);
if (!g) return false;
if (!g) return false;
else_case = g->get_else();
if (!else_case) {
TRACE("model_evaluator", tout << "no else case " << mk_pp(a, m) << "\n";);