mirror of
https://github.com/Z3Prover/z3
synced 2025-11-05 13:56:03 +00:00
passing with open ai codex on some non-deterministic param eval
Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
parent
2b99949ac4
commit
ba83ec929a
29 changed files with 665 additions and 371 deletions
|
|
@ -443,12 +443,14 @@ bool bv2real_rewriter::mk_le(expr* s, expr* t, bool is_pos, bool is_neg, expr_re
|
|||
expr_ref gt_proxy(m().mk_not(le_proxy), m());
|
||||
expr_ref s2_is_nonpos(m_bv.mk_sle(s2, m_bv.mk_numeral(rational(0), s2_size)), m());
|
||||
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
expr_ref under(u().mk_bv_add(u().mk_bv_mul(rational(4), s1), u().mk_bv_mul(rational(5), s2)), m());
|
||||
expr_ref s1_scaled4(u().mk_bv_mul(rational(4), s1), m());
|
||||
expr_ref s2_scaled5(u().mk_bv_mul(rational(5), s2), m());
|
||||
expr_ref under(u().mk_bv_add(s1_scaled4, s2_scaled5), m());
|
||||
expr_ref z1(m_bv.mk_numeral(rational(0), m_bv.get_bv_size(under)), m());
|
||||
expr_ref le_under(m_bv.mk_sle(under, z1), m());
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
expr_ref over(u().mk_bv_add(u().mk_bv_mul(rational(2), s1), u().mk_bv_mul(rational(3), s2)), m());
|
||||
expr_ref s1_scaled2(u().mk_bv_mul(rational(2), s1), m());
|
||||
expr_ref s2_scaled3(u().mk_bv_mul(rational(3), s2), m());
|
||||
expr_ref over(u().mk_bv_add(s1_scaled2, s2_scaled3), m());
|
||||
expr_ref z2(m_bv.mk_numeral(rational(0), m_bv.get_bv_size(over)), m());
|
||||
expr_ref le_over(m_bv.mk_sle(over, z2), m());
|
||||
|
||||
|
|
@ -464,11 +466,12 @@ bool bv2real_rewriter::mk_le(expr* s, expr* t, bool is_pos, bool is_neg, expr_re
|
|||
// predicate may occur in negative polarity.
|
||||
if (is_neg) {
|
||||
// s1 + s2*sqrt(2) > 0 <== s2 > 0 & s1 + s2*(5/4) > 0; 4*s1 + 5*s2 > 0
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
expr* e3 = m().mk_implies(m().mk_and(gt_proxy, m().mk_not(s2_is_nonpos)), m().mk_not(le_under));
|
||||
expr* not_s2_nonpos = m().mk_not(s2_is_nonpos);
|
||||
expr* not_le_under = m().mk_not(le_under);
|
||||
expr* e3 = m().mk_implies(m().mk_and(gt_proxy, not_s2_nonpos), not_le_under);
|
||||
// s1 + s2*sqrt(2) > 0 <== s2 <= 0 & s1 + s2*(3/2) > 0 <=> 2*s1 + 3*s2 > 0
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
expr* e4 = m().mk_implies(m().mk_and(gt_proxy, s2_is_nonpos), m().mk_not(le_over));
|
||||
expr* not_le_over = m().mk_not(le_over);
|
||||
expr* e4 = m().mk_implies(m().mk_and(gt_proxy, s2_is_nonpos), not_le_over);
|
||||
u().add_side_condition(e3);
|
||||
u().add_side_condition(e4);
|
||||
}
|
||||
|
|
@ -547,11 +550,14 @@ br_status bv2real_rewriter::mk_le(expr * s, expr * t, expr_ref & result) {
|
|||
expr* ge = m_bv.mk_sle(t22, t12);
|
||||
expr* le = m_bv.mk_sle(t12, t22);
|
||||
expr* e1 = m().mk_or(gz1, gz2);
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
expr* e2 = m().mk_or(m().mk_not(gz1), m().mk_not(lz2), ge);
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
expr* e3 = m().mk_or(m().mk_not(gz2), m().mk_not(lz1), le);
|
||||
result = m().mk_and(e1, e2, e3);
|
||||
expr* not_gz1 = m().mk_not(gz1);
|
||||
expr* not_lz2 = m().mk_not(lz2);
|
||||
expr* e2 = m().mk_or(not_gz1, not_lz2, ge);
|
||||
expr* not_gz2 = m().mk_not(gz2);
|
||||
expr* not_lz1 = m().mk_not(lz1);
|
||||
expr* e3 = m().mk_or(not_gz2, not_lz1, le);
|
||||
expr* conjuncts[3] = { e1, e2, e3 };
|
||||
result = m().mk_and(3, conjuncts);
|
||||
TRACE(bv2real_rewriter, tout << "\n";);
|
||||
return BR_DONE;
|
||||
}
|
||||
|
|
@ -593,8 +599,10 @@ br_status bv2real_rewriter::mk_eq(expr * s, expr * t, expr_ref & result) {
|
|||
u().align_divisors(s1, s2, t1, t2, d1, d2);
|
||||
u().align_sizes(s1, t1);
|
||||
u().align_sizes(s2, t2);
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
result = m().mk_and(m().mk_eq(s1, t1), m().mk_eq(s2, t2));
|
||||
expr* eq_s1_t1 = m().mk_eq(s1, t1);
|
||||
expr* eq_s2_t2 = m().mk_eq(s2, t2);
|
||||
expr* conjuncts[2] = { eq_s1_t1, eq_s2_t2 };
|
||||
result = m().mk_and(2, conjuncts);
|
||||
return BR_DONE;
|
||||
}
|
||||
return BR_FAILED;
|
||||
|
|
@ -657,10 +665,13 @@ br_status bv2real_rewriter::mk_mul(expr* s, expr* t, expr_ref& result) {
|
|||
if (u().is_bv2real(s, s1, s2, d1, r1) && u().is_bv2real(t, t1, t2, d2, r2) && r1 == r2) {
|
||||
// s1*t1 + r1*(s2*t2) + (s1*t2 + s2*t2)*r1
|
||||
expr_ref u1(m()), u2(m());
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
u1 = u().mk_bv_add(u().mk_bv_mul(s1, t1), u().mk_bv_mul(r1, u().mk_bv_mul(t2, s2)));
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
u2 = u().mk_bv_add(u().mk_bv_mul(s1, t2), u().mk_bv_mul(s2, t1));
|
||||
expr_ref s1_t1(u().mk_bv_mul(s1, t1), m());
|
||||
expr_ref t2_s2(u().mk_bv_mul(t2, s2), m());
|
||||
expr_ref r1_t2_s2(u().mk_bv_mul(r1, t2_s2), m());
|
||||
u1 = u().mk_bv_add(s1_t1, r1_t2_s2);
|
||||
expr_ref s1_t2(u().mk_bv_mul(s1, t2), m());
|
||||
expr_ref s2_t1(u().mk_bv_mul(s2, t1), m());
|
||||
u2 = u().mk_bv_add(s1_t2, s2_t1);
|
||||
rational tmp = d1*d2;
|
||||
if (u().mk_bv2real(u1, u2, tmp, r1, result)) {
|
||||
return BR_DONE;
|
||||
|
|
@ -709,4 +720,3 @@ br_status bv2real_elim_rewriter::mk_app_core(func_decl * f, unsigned num_args, e
|
|||
}
|
||||
|
||||
template class rewriter_tpl<bv2real_elim_rewriter_cfg>;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue