mirror of
https://github.com/Z3Prover/z3
synced 2025-04-16 05:48:44 +00:00
swap
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
262acc0556
commit
0f7ff2a3d0
|
@ -605,11 +605,11 @@ br_status bool_rewriter::try_ite_value(app * ite, app * val, expr_ref & result)
|
||||||
SASSERT(m().is_value(val));
|
SASSERT(m().is_value(val));
|
||||||
|
|
||||||
if (m().are_distinct(val, e)) {
|
if (m().are_distinct(val, e)) {
|
||||||
result = m().mk_and(m().mk_eq(t, val), cond);
|
result = m().mk_and(mk_eq(t, val), cond);
|
||||||
return BR_REWRITE2;
|
return BR_REWRITE2;
|
||||||
}
|
}
|
||||||
if (m().are_distinct(val, t)) {
|
if (m().are_distinct(val, t)) {
|
||||||
result = m().mk_and(m().mk_eq(e, val), m().mk_not(cond));
|
result = m().mk_and(mk_eq(e, val), m().mk_not(cond));
|
||||||
return BR_REWRITE2;
|
return BR_REWRITE2;
|
||||||
}
|
}
|
||||||
if (m().are_equal(val, t)) {
|
if (m().are_equal(val, t)) {
|
||||||
|
@ -618,24 +618,24 @@ br_status bool_rewriter::try_ite_value(app * ite, app * val, expr_ref & result)
|
||||||
return BR_DONE;
|
return BR_DONE;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
result = m().mk_or(m().mk_eq(e, val), cond);
|
result = m().mk_or(mk_eq(e, val), cond);
|
||||||
}
|
}
|
||||||
return BR_REWRITE2;
|
return BR_REWRITE2;
|
||||||
}
|
}
|
||||||
if (m().are_equal(val, e)) {
|
if (m().are_equal(val, e)) {
|
||||||
result = m().mk_or(m().mk_eq(t, val), m().mk_not(cond));
|
result = m().mk_or(mk_eq(t, val), m().mk_not(cond));
|
||||||
return BR_REWRITE2;
|
return BR_REWRITE2;
|
||||||
}
|
}
|
||||||
|
|
||||||
expr* cond2 = nullptr, *t2 = nullptr, *e2 = nullptr;
|
expr* cond2 = nullptr, *t2 = nullptr, *e2 = nullptr;
|
||||||
if (m().is_ite(t, cond2, t2, e2) && m().is_value(t2) && m().is_value(e2)) {
|
if (m().is_ite(t, cond2, t2, e2) && m().is_value(t2) && m().is_value(e2)) {
|
||||||
VERIFY(BR_FAILED != try_ite_value(to_app(t), val, result));
|
VERIFY(BR_FAILED != try_ite_value(to_app(t), val, result));
|
||||||
result = m().mk_ite(cond, result, m().mk_eq(e, val));
|
result = m().mk_ite(cond, result, mk_eq(e, val));
|
||||||
return BR_REWRITE2;
|
return BR_REWRITE2;
|
||||||
}
|
}
|
||||||
if (m().is_ite(e, cond2, t2, e2) && m().is_value(t2) && m().is_value(e2)) {
|
if (m().is_ite(e, cond2, t2, e2) && m().is_value(t2) && m().is_value(e2)) {
|
||||||
VERIFY(BR_FAILED != try_ite_value(to_app(e), val, result));
|
VERIFY(BR_FAILED != try_ite_value(to_app(e), val, result));
|
||||||
result = m().mk_ite(cond, m().mk_eq(t, val), result);
|
result = m().mk_ite(cond, mk_eq(t, val), result);
|
||||||
return BR_REWRITE2;
|
return BR_REWRITE2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -700,7 +700,7 @@ br_status bool_rewriter::mk_eq_core(expr * lhs, expr * rhs, expr_ref & result) {
|
||||||
return BR_DONE;
|
return BR_DONE;
|
||||||
}
|
}
|
||||||
if (unfolded) {
|
if (unfolded) {
|
||||||
result = m().mk_eq(lhs, rhs);
|
result = mk_eq(lhs, rhs);
|
||||||
return BR_DONE;
|
return BR_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -728,7 +728,7 @@ br_status bool_rewriter::mk_distinct_core(unsigned num_args, expr * const * args
|
||||||
|
|
||||||
if (num_args == 2) {
|
if (num_args == 2) {
|
||||||
expr_ref tmp(m());
|
expr_ref tmp(m());
|
||||||
result = m().mk_not(m().mk_eq(args[0], args[1]));
|
result = m().mk_not(mk_eq(args[0], args[1]));
|
||||||
return BR_REWRITE2; // mk_eq may be dispatched to other rewriters.
|
return BR_REWRITE2; // mk_eq may be dispatched to other rewriters.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -759,7 +759,7 @@ br_status bool_rewriter::mk_distinct_core(unsigned num_args, expr * const * args
|
||||||
ptr_buffer<expr> new_diseqs;
|
ptr_buffer<expr> new_diseqs;
|
||||||
for (unsigned i = 0; i < num_args; i++) {
|
for (unsigned i = 0; i < num_args; i++) {
|
||||||
for (unsigned j = i + 1; j < num_args; j++)
|
for (unsigned j = i + 1; j < num_args; j++)
|
||||||
new_diseqs.push_back(m().mk_not(m().mk_eq(args[i], args[j])));
|
new_diseqs.push_back(m().mk_not(mk_eq(args[i], args[j])));
|
||||||
}
|
}
|
||||||
result = m().mk_and(new_diseqs.size(), new_diseqs.c_ptr());
|
result = m().mk_and(new_diseqs.size(), new_diseqs.c_ptr());
|
||||||
return BR_REWRITE3;
|
return BR_REWRITE3;
|
||||||
|
|
|
@ -127,9 +127,14 @@ public:
|
||||||
br_status mk_ite_core(expr * c, expr * t, expr * e, expr_ref & result);
|
br_status mk_ite_core(expr * c, expr * t, expr * e, expr_ref & result);
|
||||||
br_status mk_not_core(expr * t, expr_ref & result);
|
br_status mk_not_core(expr * t, expr_ref & result);
|
||||||
|
|
||||||
|
app* mk_eq(expr* lhs, expr* rhs) {
|
||||||
|
if (lhs->get_id() > rhs->get_id()) std::swap(lhs, rhs);
|
||||||
|
return m().mk_eq(lhs, rhs);
|
||||||
|
}
|
||||||
|
|
||||||
void mk_eq(expr * lhs, expr * rhs, expr_ref & result) {
|
void mk_eq(expr * lhs, expr * rhs, expr_ref & result) {
|
||||||
if (mk_eq_core(lhs, rhs, result) == BR_FAILED)
|
if (mk_eq_core(lhs, rhs, result) == BR_FAILED)
|
||||||
result = m().mk_eq(lhs, rhs);
|
result = mk_eq(lhs, rhs);
|
||||||
}
|
}
|
||||||
void mk_iff(expr * lhs, expr * rhs, expr_ref & result) { mk_eq(lhs, rhs, result); }
|
void mk_iff(expr * lhs, expr * rhs, expr_ref & result) { mk_eq(lhs, rhs, result); }
|
||||||
void mk_xor(expr * lhs, expr * rhs, expr_ref & result);
|
void mk_xor(expr * lhs, expr * rhs, expr_ref & result);
|
||||||
|
|
Loading…
Reference in a new issue