3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-11-05 05:49:13 +00:00

fix param evaluation non-determinism

Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
Lev Nachmanson 2025-10-30 07:12:06 -07:00
parent 4b2a4a902d
commit 3c5cb7c044
5 changed files with 94 additions and 59 deletions

View file

@ -585,8 +585,9 @@ br_status bv2real_rewriter::mk_ite(expr* c, 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
if (u().mk_bv2real(m().mk_ite(c, s1, t1), m().mk_ite(c, s2, t2), d1, r1, result)) {
expr_ref ite_s1(m().mk_ite(c, s1, t1), m());
expr_ref ite_s2(m().mk_ite(c, s2, t2), m());
if (u().mk_bv2real(ite_s1.get(), ite_s2.get(), d1, r1, result)) {
return BR_DONE;
}
}
@ -615,8 +616,9 @@ br_status bv2real_rewriter::mk_uminus(expr * s, expr_ref & result) {
if (u().is_bv2real(s, s1, s2, d1, r1)) {
s1 = u().mk_extend(1, s1);
s2 = u().mk_extend(1, s2);
// TODO: non-deterministic parameter evaluation
if (u().mk_bv2real(m_bv.mk_bv_neg(s1), m_bv.mk_bv_neg(s2), d1, r1, result)) {
expr_ref neg_s1(m_bv.mk_bv_neg(s1), m());
expr_ref neg_s2(m_bv.mk_bv_neg(s2), m());
if (u().mk_bv2real(neg_s1.get(), neg_s2.get(), d1, r1, result)) {
return BR_DONE;
}
}
@ -638,8 +640,9 @@ br_status bv2real_rewriter::mk_add(expr* s, expr* t, expr_ref& result) {
rational d1, d2, r1, r2;
if (u().is_bv2real(s, s1, s2, d1, r1) && u().is_bv2real(t, t1, t2, d2, r2) && r1 == r2) {
u().align_divisors(s1, s2, t1, t2, d1, d2);
// TODO: non-deterministic parameter evaluation
if (u().mk_bv2real(u().mk_bv_add(s1, t1), u().mk_bv_add(t2, s2), d1, r1, result)) {
expr_ref sum1(u().mk_bv_add(s1, t1), m());
expr_ref sum2(u().mk_bv_add(t2, s2), m());
if (u().mk_bv2real(sum1.get(), sum2.get(), d1, r1, result)) {
return BR_DONE;
}
}
@ -699,8 +702,9 @@ br_status bv2real_rewriter::mk_sub(expr* s, expr* t, expr_ref& result) {
rational d1, d2, r1, r2;
if (u().is_bv2real(s, s1, s2, d1, r1) && u().is_bv2real(t, t1, t2, d2, r2) && r1 == r2) {
u().align_divisors(s1, s2, t1, t2, d1, d2);
// TODO: non-deterministic parameter evaluation
if (u().mk_bv2real(u().mk_bv_sub(s1, t1), u().mk_bv_sub(s2, t2), d1, r1, result)) {
expr_ref diff1(u().mk_bv_sub(s1, t1), m());
expr_ref diff2(u().mk_bv_sub(s2, t2), m());
if (u().mk_bv2real(diff1.get(), diff2.get(), d1, r1, result)) {
return BR_DONE;
}
}