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:
parent
54257b6629
commit
c739e581e4
68 changed files with 253 additions and 0 deletions
|
|
@ -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())));
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue