mirror of
https://github.com/Z3Prover/z3
synced 2025-11-04 13:29:11 +00:00
fix param evaluation non-determinism
Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
parent
a413783c1c
commit
77962ff3bb
4 changed files with 50 additions and 39 deletions
|
|
@ -2130,12 +2130,16 @@ expr* ast_manager::coerce_to(expr* e, sort* s) {
|
|||
}
|
||||
if (s != se && s->get_family_id() == arith_family_id && is_bool(e)) {
|
||||
arith_util au(*this);
|
||||
if (s->get_decl_kind() == REAL_SORT)
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
return mk_ite(e, au.mk_real(1), au.mk_real(0));
|
||||
else
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
return mk_ite(e, au.mk_int(1), au.mk_int(0));
|
||||
if (s->get_decl_kind() == REAL_SORT) {
|
||||
expr_ref one(au.mk_real(1), *this);
|
||||
expr_ref zero(au.mk_real(0), *this);
|
||||
return mk_ite(e, one.get(), zero.get());
|
||||
}
|
||||
else {
|
||||
expr_ref one(au.mk_int(1), *this);
|
||||
expr_ref zero(au.mk_int(0), *this);
|
||||
return mk_ite(e, one.get(), zero.get());
|
||||
}
|
||||
}
|
||||
else {
|
||||
return e;
|
||||
|
|
|
|||
|
|
@ -592,21 +592,22 @@ class smt2_printer {
|
|||
}
|
||||
|
||||
format * pp_attribute(char const * attr, format * f) {
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
return mk_compose(m(),
|
||||
mk_string(m(), attr),
|
||||
mk_indent(m(), static_cast<unsigned>(strlen(attr)), f));
|
||||
format * attr_fmt = mk_string(m(), attr);
|
||||
format * indented = mk_indent(m(), static_cast<unsigned>(strlen(attr)), f);
|
||||
return mk_compose(m(), attr_fmt, indented);
|
||||
}
|
||||
|
||||
format * pp_simple_attribute(char const * attr, int v) {
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
return mk_compose(m(), mk_string(m(), attr), mk_int(m(), v));
|
||||
format * attr_fmt = mk_string(m(), attr);
|
||||
format * int_fmt = mk_int(m(), v);
|
||||
return mk_compose(m(), attr_fmt, int_fmt);
|
||||
}
|
||||
|
||||
format * pp_simple_attribute(char const * attr, symbol const & s) {
|
||||
std::string str = ensure_quote(s);
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
return mk_compose(m(), mk_string(m(), attr), mk_string(m(), str));
|
||||
format * attr_fmt = mk_string(m(), attr);
|
||||
format * sym_fmt = mk_string(m(), str);
|
||||
return mk_compose(m(), attr_fmt, sym_fmt);
|
||||
}
|
||||
|
||||
format * pp_labels(bool is_pos, buffer<symbol> const & names, format * f) {
|
||||
|
|
@ -765,26 +766,31 @@ class smt2_printer {
|
|||
SASSERT(it < end);
|
||||
format * fname = m_env.pp_fdecl(t->get_decl(), len);
|
||||
if (len > MAX_INDENT) {
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
f = mk_group(m(), mk_compose(m(),
|
||||
mk_indent(m(), 1, mk_compose(m(), mk_string(m(), "("), fname)),
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
mk_indent(m(), SMALL_INDENT, mk_compose(m(),
|
||||
mk_seq<format**, f2f>(m(), it, end, f2f()),
|
||||
mk_string(m(), ")")))));
|
||||
format * open_paren = mk_string(m(), "(");
|
||||
format * head = mk_compose(m(), open_paren, fname);
|
||||
format * indented_head = mk_indent(m(), 1, head);
|
||||
format * arg_seq = mk_seq<format**, f2f>(m(), it, end, f2f());
|
||||
format * close_paren = mk_string(m(), ")");
|
||||
format * body = mk_compose(m(), arg_seq, close_paren);
|
||||
format * indented_body = mk_indent(m(), SMALL_INDENT, body);
|
||||
format * combined = mk_compose(m(), indented_head, indented_body);
|
||||
f = mk_group(m(), combined);
|
||||
}
|
||||
else {
|
||||
format * first = *it;
|
||||
++it;
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
f = mk_group(m(), mk_compose(m(),
|
||||
mk_indent(m(), 1, mk_compose(m(), mk_string(m(), "("), fname)),
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
mk_indent(m(), len + 2, mk_compose(m(),
|
||||
mk_string(m(), " "),
|
||||
first,
|
||||
mk_seq<format**, f2f>(m(), it, end, f2f()),
|
||||
mk_string(m(), ")")))));
|
||||
format * open_paren = mk_string(m(), "(");
|
||||
format * head = mk_compose(m(), open_paren, fname);
|
||||
format * indented_head = mk_indent(m(), 1, head);
|
||||
format * space = mk_string(m(), " ");
|
||||
format * first_part = mk_compose(m(), space, first);
|
||||
format * rest_seq = mk_seq<format**, f2f>(m(), it, end, f2f());
|
||||
format * with_rest = mk_compose(m(), first_part, rest_seq);
|
||||
format * close_paren = mk_string(m(), ")");
|
||||
format * body = mk_compose(m(), with_rest, close_paren);
|
||||
format * indented_body = mk_indent(m(), len + 2, body);
|
||||
format * combined = mk_compose(m(), indented_head, indented_body);
|
||||
f = mk_group(m(), combined);
|
||||
}
|
||||
}
|
||||
info f_info(0, 1, 1);
|
||||
|
|
|
|||
|
|
@ -459,9 +459,10 @@ void bv2fpa_converter::convert_min_max_specials(model_core * mc, model_core * ta
|
|||
auto fid = m_fpa_util.get_family_id();
|
||||
auto k = is_decl_of(f, fid, OP_FPA_MIN) ? OP_FPA_MIN_I : OP_FPA_MAX_I;
|
||||
func_decl_ref min_max_i(m.mk_func_decl(fid, k, 0, nullptr, 2, pn_args), m);
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
expr_ref else_value(m.mk_app(min_max_i, m.mk_var(0, srt), m.mk_var(1, srt)), m);
|
||||
flt_fi->set_else(else_value);
|
||||
expr_ref var0(m.mk_var(0, srt), m);
|
||||
expr_ref var1(m.mk_var(1, srt), m);
|
||||
expr_ref else_app(m.mk_app(min_max_i, var0.get(), var1.get()), m);
|
||||
flt_fi->set_else(else_app);
|
||||
|
||||
target_model->register_decl(f, flt_fi);
|
||||
TRACE(bv2fpa, tout << "fp.min/fp.max special: " << std::endl <<
|
||||
|
|
|
|||
|
|
@ -1207,9 +1207,9 @@ void fpa2bv_converter::mk_rem(sort * s, expr_ref & x, expr_ref & y, expr_ref & r
|
|||
lshift = edr_tmp;
|
||||
rshift = nedr_tmp;
|
||||
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
shifted = m.mk_ite(exp_diff_is_neg, m_bv_util.mk_bv_ashr(a_sig_ext, rshift),
|
||||
m_bv_util.mk_bv_shl(a_sig_ext, lshift));
|
||||
expr_ref ashr_expr(m_bv_util.mk_bv_ashr(a_sig_ext, rshift), m);
|
||||
expr_ref shl_expr(m_bv_util.mk_bv_shl(a_sig_ext, lshift), m);
|
||||
shifted = m.mk_ite(exp_diff_is_neg, ashr_expr.get(), shl_expr.get());
|
||||
huge_rem = m_bv_util.mk_bv_urem(shifted, b_sig_ext);
|
||||
huge_div = m.mk_app(m_bv_util.get_fid(), OP_BUDIV_I, shifted, b_sig_ext);
|
||||
huge_div_is_even = m.mk_eq(m_bv_util.mk_extract(0, 0, huge_div), m_bv_util.mk_numeral(0, 1));
|
||||
|
|
@ -3461,9 +3461,9 @@ void fpa2bv_converter::mk_to_bv(func_decl * f, unsigned num, expr * const * args
|
|||
dbg_decouple("fpa2bv_to_bv_shift", shift);
|
||||
|
||||
expr_ref big_sig_shifted(m), int_part(m), last(m), round(m), stickies(m), sticky(m);
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
big_sig_shifted = m.mk_ite(is_neg_shift, m_bv_util.mk_bv_lshr(big_sig, shift),
|
||||
m_bv_util.mk_bv_shl(big_sig, shift));
|
||||
expr_ref lshr_expr(m_bv_util.mk_bv_lshr(big_sig, shift), m);
|
||||
expr_ref shl_expr(m_bv_util.mk_bv_shl(big_sig, shift), m);
|
||||
big_sig_shifted = m.mk_ite(is_neg_shift, lshr_expr.get(), shl_expr.get());
|
||||
int_part = m_bv_util.mk_extract(big_sig_sz-1, big_sig_sz-(bv_sz+3), big_sig_shifted);
|
||||
SASSERT(m_bv_util.get_bv_size(int_part) == bv_sz+3);
|
||||
last = m_bv_util.mk_extract(big_sig_sz-(bv_sz+3), big_sig_sz-(bv_sz+3), big_sig_shifted);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue