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

non-deterministic calls are marked

Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
Lev Nachmanson 2025-10-28 19:13:12 -07:00
parent 54257b6629
commit c739e581e4
68 changed files with 253 additions and 0 deletions

View file

@ -331,12 +331,14 @@ struct purify_arith_proc {
expr * x = args[0];
expr * y = args[1];
// y = 0 \/ y*k = x
// TODO: non-deterministic parameter evaluation
push_cnstr(OR(EQ(y, mk_real_zero()),
EQ(u().mk_mul(y, k), x)));
push_cnstr_pr(result_pr);
rational r;
if (complete()) {
// y != 0 \/ k = div-0(x)
// TODO: non-deterministic parameter evaluation
push_cnstr(OR(NOT(EQ(y, mk_real_zero())),
EQ(k, u().mk_div(x, mk_real_zero()))));
push_cnstr_pr(result_pr);
@ -375,6 +377,7 @@ struct purify_arith_proc {
// y < 0 implies k2 < -y ---> y >= 0 \/ k2 < -y
//
expr * zero = mk_int_zero();
// TODO: non-deterministic parameter evaluation
push_cnstr(OR(EQ(y, zero), EQ(x, u().mk_add(u().mk_mul(k1, y), k2))));
push_cnstr_pr(result_pr, mod_pr);
@ -389,9 +392,11 @@ struct purify_arith_proc {
rational r;
if (complete() && (!u().is_numeral(y, r) || r.is_zero())) {
// TODO: non-deterministic parameter evaluation
push_cnstr(OR(NOT(EQ(y, zero)), EQ(k1, u().mk_idiv(x, zero))));
push_cnstr_pr(result_pr);
// TODO: non-deterministic parameter evaluation
push_cnstr(OR(NOT(EQ(y, zero)), EQ(k2, u().mk_mod(x, zero))));
push_cnstr_pr(mod_pr);
}
@ -463,8 +468,10 @@ struct purify_arith_proc {
}
// (^ x 0) --> k | x != 0 implies k = 1, x = 0 implies k = 0^0
// TODO: non-deterministic parameter evaluation
push_cnstr(OR(EQ(x, zero), EQ(k, one)));
push_cnstr_pr(result_pr);
// TODO: non-deterministic parameter evaluation
push_cnstr(OR(NOT(EQ(x, zero)), EQ(k, p0)));
push_cnstr_pr(result_pr);
}
@ -482,6 +489,7 @@ struct purify_arith_proc {
SASSERT(n.is_even());
// (^ x (/ 1 n)) --> k | x >= 0 implies (x = k^n and k >= 0), x < 0 implies k = neg-root(x, n)
// when n is even
// TODO: non-deterministic parameter evaluation
push_cnstr(OR(NOT(u().mk_ge(x, zero)),
AND(EQ(x, u().mk_power(k, u().mk_numeral(n, false))),
u().mk_ge(k, zero))));
@ -600,8 +608,11 @@ struct purify_arith_proc {
expr * pi2 = u().mk_mul(u().mk_numeral(rational(1,2), false), u().mk_pi());
expr * mpi2 = u().mk_mul(u().mk_numeral(rational(-1,2), false), u().mk_pi());
// -1 <= x <= 1 implies sin(k) = x, -pi/2 <= k <= pi/2
// TODO: non-deterministic parameter evaluation
// TODO: non-deterministic parameter evaluation
push_cnstr(OR(OR(NOT(u().mk_ge(x, mone)),
NOT(u().mk_le(x, one))),
// TODO: non-deterministic parameter evaluation
AND(EQ(x, u().mk_sin(k)),
AND(u().mk_ge(k, mpi2),
u().mk_le(k, pi2)))));
@ -642,8 +653,11 @@ struct purify_arith_proc {
expr * pi = u().mk_pi();
expr * zero = u().mk_numeral(rational(0), false);
// -1 <= x <= 1 implies cos(k) = x, 0 <= k <= pi
// TODO: non-deterministic parameter evaluation
// TODO: non-deterministic parameter evaluation
push_cnstr(OR(OR(NOT(u().mk_ge(x, mone)),
NOT(u().mk_le(x, one))),
// TODO: non-deterministic parameter evaluation
AND(EQ(x, u().mk_cos(k)),
AND(u().mk_ge(k, zero),
u().mk_le(k, pi)))));
@ -678,6 +692,7 @@ struct purify_arith_proc {
// tan(k) = x, -pi/2 < k < pi/2
expr * pi2 = u().mk_mul(u().mk_numeral(rational(1,2), false), u().mk_pi());
expr * mpi2 = u().mk_mul(u().mk_numeral(rational(-1,2), false), u().mk_pi());
// TODO: non-deterministic parameter evaluation
push_cnstr(AND(EQ(x, u().mk_tan(k)),
AND(u().mk_gt(k, mpi2),
u().mk_lt(k, pi2))));
@ -804,7 +819,9 @@ struct purify_arith_proc {
auto const& p1 = divs[i];
for (unsigned j = i + 1; j < divs.size(); ++j) {
auto const& p2 = divs[j];
// TODO: non-deterministic parameter evaluation
m_goal.assert_expr(m().mk_implies(
// TODO: non-deterministic parameter evaluation
m().mk_and(m().mk_eq(p1.x, p2.x), m().mk_eq(p1.y, p2.y)),
m().mk_eq(p1.d, p2.d)));
}
@ -813,7 +830,9 @@ struct purify_arith_proc {
auto const& p1 = mods[i];
for (unsigned j = i + 1; j < mods.size(); ++j) {
auto const& p2 = mods[j];
// TODO: non-deterministic parameter evaluation
m_goal.assert_expr(m().mk_implies(
// TODO: non-deterministic parameter evaluation
m().mk_and(m().mk_eq(p1.x, p2.x), m().mk_eq(p1.y, p2.y)),
m().mk_eq(p1.d, p2.d)));
}
@ -822,7 +841,9 @@ struct purify_arith_proc {
auto const& p1 = idivs[i];
for (unsigned j = i + 1; j < idivs.size(); ++j) {
auto const& p2 = idivs[j];
// TODO: non-deterministic parameter evaluation
m_goal.assert_expr(m().mk_implies(
// TODO: non-deterministic parameter evaluation
m().mk_and(m().mk_eq(p1.x, p2.x), m().mk_eq(p1.y, p2.y)),
m().mk_eq(p1.d, p2.d)));
}
@ -843,6 +864,7 @@ struct purify_arith_proc {
expr_ref v0(m().mk_var(0, u().mk_real()), m());
expr_ref v1(m().mk_var(1, u().mk_real()), m());
for (auto const& p : divs) {
// TODO: non-deterministic parameter evaluation
body = m().mk_ite(m().mk_and(m().mk_eq(v0, p.x), m().mk_eq(v1, p.y)), p.d, body);
}
fmc->add(u().mk_div0(), body);
@ -852,6 +874,7 @@ struct purify_arith_proc {
expr_ref v0(m().mk_var(0, u().mk_int()), m());
expr_ref v1(m().mk_var(1, u().mk_int()), m());
for (auto const& p : mods) {
// TODO: non-deterministic parameter evaluation
body = m().mk_ite(m().mk_and(m().mk_eq(v0, p.x), m().mk_eq(v1, p.y)), p.d, body);
}
@ -864,6 +887,7 @@ struct purify_arith_proc {
expr_ref v0(m().mk_var(0, u().mk_int()), m());
expr_ref v1(m().mk_var(1, u().mk_int()), m());
for (auto const& p : idivs) {
// TODO: non-deterministic parameter evaluation
body = m().mk_ite(m().mk_and(m().mk_eq(v0, p.x), m().mk_eq(v1, p.y)), p.d, body);
}
fmc->add(u().mk_idiv0(), body);
@ -881,6 +905,7 @@ struct purify_arith_proc {
for (auto const& kv : m_sin_cos) {
emc->add(kv.m_key->get_decl(),
m().mk_ite(u().mk_ge(kv.m_value.first, mk_real_zero()), u().mk_acos(kv.m_value.second),
// TODO: non-deterministic parameter evaluation
u().mk_add(u().mk_acos(u().mk_uminus(kv.m_value.second)), u().mk_pi())));
}