3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-28 08:58:44 +00:00

Fixed model completion for unspecified cases of floating-point functions. Thanks to Florian Schanda for reporting this bug.

This commit is contained in:
Christoph M. Wintersteiger 2018-04-05 15:27:02 +01:00
parent 328ad248b6
commit 3de41e5179

View file

@ -262,11 +262,11 @@ func_interp * bv2fpa_converter::convert_func_interp(model_core * mc, func_decl *
unsigned arity = bv_f->get_arity(); unsigned arity = bv_f->get_arity();
func_interp * bv_fi = mc->get_func_interp(bv_f); func_interp * bv_fi = mc->get_func_interp(bv_f);
result = alloc(func_interp, m, arity);
if (bv_fi) { if (bv_fi) {
fpa_rewriter rw(m); fpa_rewriter rw(m);
expr_ref ai(m); expr_ref ai(m);
result = alloc(func_interp, m, arity);
for (unsigned i = 0; i < bv_fi->num_entries(); i++) { for (unsigned i = 0; i < bv_fi->num_entries(); i++) {
func_entry const * bv_fe = bv_fi->get_entry(i); func_entry const * bv_fe = bv_fi->get_entry(i);
@ -311,6 +311,8 @@ func_interp * bv2fpa_converter::convert_func_interp(model_core * mc, func_decl *
result->set_else(ft_els); result->set_else(ft_els);
} }
} }
else
result->set_else(m.get_some_value(f->get_range()));
return result; return result;
} }
@ -467,7 +469,7 @@ void bv2fpa_converter::convert_uf2bvuf(model_core * mc, model_core * target_mode
// it->m_value contains the model for the unspecified cases of it->m_key. // it->m_value contains the model for the unspecified cases of it->m_key.
func_interp * fmv = convert_func_interp(mc, f, it->m_value); func_interp * fmv = convert_func_interp(mc, f, it->m_value);
if (fmv) { SASSERT(fmv);
#if 0 #if 0
// Upon request, add this 'recursive' definition? // Upon request, add this 'recursive' definition?
unsigned n = fmv->get_arity(); unsigned n = fmv->get_arity();
@ -476,17 +478,11 @@ void bv2fpa_converter::convert_uf2bvuf(model_core * mc, model_core * target_mode
args.push_back(m.mk_var(i, f->get_domain()[i])); args.push_back(m.mk_var(i, f->get_domain()[i]));
fmv->set_else(m.mk_app(it->m_key, n, args.c_ptr())); fmv->set_else(m.mk_app(it->m_key, n, args.c_ptr()));
#else #else
fmv->set_else(0); // Make sure it's not left open.
fmv->set_else(0);
#endif #endif
target_model->register_decl(f, fmv); target_model->register_decl(f, fmv);
} }
} }
else {
func_interp * fmv = convert_func_interp(mc, f, it->m_value);
if (fmv) target_model->register_decl(f, fmv);
}
}
} }
} }