mirror of
https://github.com/Z3Prover/z3
synced 2025-04-08 10:25:18 +00:00
fix #4871
This commit is contained in:
parent
c49d39af81
commit
9b9d906702
|
@ -321,23 +321,27 @@ class solve_eqs_tactic : public tactic {
|
|||
|
||||
bool solve_mod(expr * lhs, expr * rhs, expr * eq, app_ref & var, expr_ref & def, proof_ref & pr) {
|
||||
rational r1, r2;
|
||||
expr* arg1, *arg2, *arg3, *arg4;
|
||||
if (m_produce_proofs) {
|
||||
expr* arg1;
|
||||
if (m_produce_proofs)
|
||||
return false;
|
||||
|
||||
auto fresh = [&]() { return m().mk_fresh_const("mod", m_a_util.mk_int()); };
|
||||
auto mk_int = [&](rational const& r) { return m_a_util.mk_int(r); };
|
||||
auto add = [&](expr* a, expr* b) { return m_a_util.mk_add(a, b); };
|
||||
auto mul = [&](expr* a, expr* b) { return m_a_util.mk_mul(a, b); };
|
||||
|
||||
VERIFY(m_a_util.is_mod(lhs, lhs, arg1));
|
||||
if (!m_a_util.is_numeral(arg1, r1) || !r1.is_pos()) {
|
||||
return false;
|
||||
}
|
||||
VERIFY(m_a_util.is_mod(lhs, arg1, arg2));
|
||||
if (!m_a_util.is_numeral(arg2, r1) || !r1.is_pos()) {
|
||||
return false;
|
||||
}
|
||||
if (m_a_util.is_mod(rhs, arg3, arg4) && m_a_util.is_numeral(arg4, r2) && r1 == r2) {
|
||||
rhs = arg3;
|
||||
}
|
||||
else if (!m_a_util.is_numeral(rhs, r2) || !r2.is_zero()) {
|
||||
return false;
|
||||
}
|
||||
if (solve_eq(arg1, rhs, eq, var, def, pr)) {
|
||||
def = m_a_util.mk_add(def, m_a_util.mk_mul(m().mk_fresh_const("mod", m_a_util.mk_int()), m_a_util.mk_int(r1)));
|
||||
return true;
|
||||
//
|
||||
// solve lhs mod r1 = r2
|
||||
// as lhs = r1*mod!1 + r2
|
||||
//
|
||||
if (m_a_util.is_numeral(rhs, r2) && r2 < r1) {
|
||||
expr_ref def0(m());
|
||||
def0 = add(mk_int(r2), mul(fresh(), mk_int(r1)));
|
||||
return solve_eq(lhs, def0, eq, var, def, pr);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue