3
0
Fork 0
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:
Lev Nachmanson 2025-10-29 06:25:03 -07:00
parent 2b99949ac4
commit ba83ec929a
29 changed files with 665 additions and 371 deletions

View file

@ -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>;