3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-11-06 06:16:02 +00:00

fix some argument-evaluation non-determinism, and mark the rest

Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
Lev Nachmanson 2025-10-28 18:01:44 -07:00
parent efd5d04af5
commit 51f6dfeb83
62 changed files with 765 additions and 120 deletions

View file

@ -389,6 +389,7 @@ namespace nlarith {
};
expr* mk_abs(expr* e) {
//non-deterministic order no change: too complex
return m().mk_ite(mk_lt(e), mk_uminus(e), e);
}
@ -405,6 +406,7 @@ namespace nlarith {
}
else {
expr* half = A.mk_numeral(rational(1,2), false);
//non-deterministic order no change: too complex
result = A.mk_div(mk_add(s.m_a, mk_mul(num(s.m_b), A.mk_power(mk_abs(s.m_c), half))), s.m_d);
}
return result;
@ -439,10 +441,13 @@ namespace nlarith {
expr* result = to_expr(s);
if (is_strict(cmp)) {
if (p.m_a == z()) {
//non-deterministic order no change: too complex
//non-deterministic order no change: too complex
result = mk_add(result, mk_mul(mk_epsilon(), m().mk_ite(mk_lt(p.m_b),num(1),num(-1))));
}
else {
if (s.m_b > 0) {
//non-deterministic order no change: too complex
result = mk_add(result, mk_mul(num(-1),mk_epsilon()));
}
else {
@ -481,6 +486,7 @@ namespace nlarith {
}
app* sq1(expr * e) {
//non-deterministic order no change: too complex
return mk_add(num(1), sq(e));
}
@ -591,7 +597,13 @@ namespace nlarith {
app_ref t1(m()), a2(m()), d(m());
expr_ref cond(m()), t2(m()), branch(m());
expr_ref_vector es(m()), subst(m());
d = mk_sub(mk_mul(b,b), mk_mul(num(4), a, c));
//non-deterministic order change start
{
auto mk_mul_1 = mk_mul(b,b);
auto mk_mul_2 = mk_mul(num(4), a, c);
d = mk_sub(mk_mul_1, mk_mul_2);
}
//non-deterministic order change end
a2 = mk_mul(a, num(2));
TRACE(nlarith,
@ -1054,9 +1066,23 @@ namespace nlarith {
r = I.mk_lt(ad);
}
else {
aabbc = I.mk_sub(I.mk_mul(a,a), I.mk_mul(b,b,c));
r = I.mk_or(I.mk_and(I.mk_lt(ad), I.mk_gt(aabbc)),
//non-deterministic order change start
{
auto mk_mul_1 = I.mk_mul(a,a);
auto mk_mul_2 = I.mk_mul(b,b,c);
aabbc = I.mk_sub(mk_mul_1, mk_mul_2);
}
//non-deterministic order change end
//non-deterministic order no change: too complex
//non-deterministic order change start
{
auto mk_and_1 = I.mk_and(I.mk_lt(ad), I.mk_gt(aabbc));
r = I.mk_or(mk_and_1,
//non-deterministic order no change: too complex
//non-deterministic order no change: too complex
I.mk_and(I.mk_le(bd), I.mk_or(I.mk_lt(ad), I.mk_lt(aabbc))));
}
//non-deterministic order change end
}
}
@ -1071,8 +1097,20 @@ namespace nlarith {
r = I.mk_eq(a);
}
else {
aabbc = I.mk_sub(I.mk_mul(a, a), I.mk_mul(b, b, c));
r = I.mk_and(I.mk_le(I.mk_mul(a, b)), I.mk_eq(aabbc));
//non-deterministic order change start
{
auto mk_mul_1 = I.mk_mul(a, a);
auto mk_mul_2 = I.mk_mul(b, b, c);
aabbc = I.mk_sub(mk_mul_1, mk_mul_2);
}
//non-deterministic order change end
//non-deterministic order change start
{
auto mk_le_1 = I.mk_le(I.mk_mul(a, b));
auto mk_eq_2 = I.mk_eq(aabbc);
r = I.mk_and(mk_le_1, mk_eq_2);
}
//non-deterministic order change end
}
}
@ -1091,9 +1129,22 @@ namespace nlarith {
r = I.mk_le(ad);
}
else {
aabbc = I.mk_sub(I.mk_mul(a, a), I.mk_mul(b, b, c));
r = I.mk_or(I.mk_and(I.mk_le(ad), I.mk_ge(aabbc)),
//non-deterministic order change start
{
auto mk_mul_1 = I.mk_mul(a, a);
auto mk_mul_2 = I.mk_mul(b, b, c);
aabbc = I.mk_sub(mk_mul_1, mk_mul_2);
}
//non-deterministic order change end
//non-deterministic order no change: too complex
//non-deterministic order change start
{
auto mk_and_1 = I.mk_and(I.mk_le(ad), I.mk_ge(aabbc));
r = I.mk_or(mk_and_1,
//non-deterministic order no change: too complex
I.mk_and(I.mk_le(bd), I.mk_le(aabbc)));
}
//non-deterministic order change end
}
}
};
@ -1203,6 +1254,7 @@ namespace nlarith {
return e;
}
else {
//non-deterministic order no change: too complex
return I.mk_or(e, I.mk_and(I.mk_eq(t), mk_lt(p, i)));
}
}
@ -1233,6 +1285,7 @@ namespace nlarith {
return e;
}
else {
//non-deterministic order no change: too complex
return I.mk_or(e, I.mk_and(I.mk_eq(t), mk_lt(p, i)));
}
}
@ -1311,8 +1364,15 @@ namespace nlarith {
// =
// (d*dr*p[i] + a*ar + b*br*c + (a*br + ar*b)*sqrt(c))/d*dr
//
//non-deterministic order no change: too complex
app_ref tmp1(mk_add(mk_mul(d, dr, p[i]), mk_mul(a, ar), mk_mul(b, br, c)), m());
br = mk_add(mk_mul(a, br), mk_mul(ar, b));
//non-deterministic order change start
{
auto mk_mul_1 = mk_mul(a, br);
auto mk_mul_2 = mk_mul(ar, b);
br = mk_add(mk_mul_1, mk_mul_2);
}
//non-deterministic order change end
dr = mk_mul(d, dr);
ar = tmp1;
}