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

Bugfix for FP theory; handling of UFs and interpreted functions from other theories.

This commit is contained in:
Christoph M. Wintersteiger 2015-08-27 18:17:26 +01:00
parent 8c11299be6
commit 081ba9093a
5 changed files with 89 additions and 51 deletions

View file

@ -215,16 +215,16 @@ void fpa2bv_converter::mk_uninterpreted_function(func_decl * f, unsigned num, ex
expr_ref_buffer new_args(m);
for (unsigned i = 0; i < num ; i ++)
if (is_float(args[i]))
{
expr * sgn, * sig, * exp;
split_fp(args[i], sgn, exp, sig);
new_args.push_back(sgn);
new_args.push_back(sig);
new_args.push_back(exp);
}
else
new_args.push_back(args[i]);
if (is_float(args[i]))
{
expr * sgn, * sig, * exp;
split_fp(args[i], sgn, exp, sig);
new_args.push_back(sgn);
new_args.push_back(sig);
new_args.push_back(exp);
}
else
new_args.push_back(args[i]);
func_decl * fd;
func_decl_triple fd3;
@ -270,6 +270,7 @@ void fpa2bv_converter::mk_uninterpreted_function(func_decl * f, unsigned num, ex
func_decl * f_sig = m.mk_func_decl(symbol(name_buffer.c_str()), new_domain.size(), new_domain.c_ptr(), m_bv_util.mk_sort(m_util.get_sbits(f->get_range())-1));
name_buffer.reset(); name_buffer << f->get_name() << ".exp";
func_decl * f_exp = m.mk_func_decl(symbol(name_buffer.c_str()), new_domain.size(), new_domain.c_ptr(), m_bv_util.mk_sort(m_util.get_ebits(f->get_range())));
expr_ref a_sgn(m), a_sig(m), a_exp(m);
a_sgn = m.mk_app(f_sgn, new_args.size(), new_args.c_ptr());
a_sig = m.mk_app(f_sig, new_args.size(), new_args.c_ptr());

View file

@ -86,7 +86,7 @@ public:
void mk_numeral(func_decl * f, unsigned num, expr * const * args, expr_ref & result);
virtual void mk_const(func_decl * f, expr_ref & result);
virtual void mk_rm_const(func_decl * f, expr_ref & result);
void mk_uninterpreted_function(func_decl * f, unsigned num, expr * const * args, expr_ref & result);
virtual void mk_uninterpreted_function(func_decl * f, unsigned num, expr * const * args, expr_ref & result);
void mk_var(unsigned base_inx, sort * srt, expr_ref & result);
void mk_pinf(func_decl * f, expr_ref & result);

View file

@ -176,7 +176,7 @@ struct fpa2bv_rewriter_cfg : public default_rewriter_cfg {
}
}
if (f->get_family_id() == null_family_id)
if (f->get_family_id() != m_conv.fu().get_family_id())
{
bool is_float_uf = m_conv.is_float(f->get_range());
unsigned i = 0;