mirror of
https://github.com/Z3Prover/z3
synced 2025-04-10 19:27:06 +00:00
fix #6105
non-linear division axioms appear incomplete. Fixed for legacy arithmetic. Fix pending for new arithmetic solver.
This commit is contained in:
parent
56aa4261b6
commit
30165ed40a
|
@ -574,7 +574,8 @@ namespace smt {
|
|||
lower = m_util.mk_ge(mod, zero);
|
||||
upper = m_util.mk_le(mod, abs_divisor);
|
||||
TRACE("div_axiom_bug",
|
||||
tout << "eqz: " << eqz << " neq: " << eq << "\n";
|
||||
tout << "eqz: " << eqz << "\n";
|
||||
tout << "neq: " << eq << "\n";
|
||||
tout << "lower: " << lower << "\n";
|
||||
tout << "upper: " << upper << "\n";);
|
||||
|
||||
|
@ -583,14 +584,27 @@ namespace smt {
|
|||
mk_axiom(eqz, upper, !m_util.is_numeral(abs_divisor));
|
||||
rational k;
|
||||
|
||||
if (!m_util.is_numeral(divisor)) {
|
||||
// (=> (> y 0) (<= (* y (div x y)) x))
|
||||
// (=> (< y 0) ???)
|
||||
expr_ref div_ge(m), div_non_pos(m);
|
||||
if (m_util.is_zero(dividend) && false) {
|
||||
mk_axiom(eqz, m.mk_eq(div, zero));
|
||||
mk_axiom(eqz, m.mk_eq(mod, zero));
|
||||
}
|
||||
|
||||
// (or (= y 0) (<= (* y (div x y)) x))
|
||||
// (or (<= y 0) (>= (* (+ y 1) (div x y)) x))
|
||||
// (or (>= y 0) (>= (* (+ y -1) (div x y)) x))
|
||||
else if (!m_util.is_numeral(divisor)) {
|
||||
expr_ref div_ge(m), div_le(m), ge(m), le(m);
|
||||
div_ge = m_util.mk_ge(m_util.mk_sub(dividend, m_util.mk_mul(divisor, div)), zero);
|
||||
s(div_ge);
|
||||
div_non_pos = m_util.mk_le(divisor, zero);
|
||||
mk_axiom(div_non_pos, div_ge, false);
|
||||
s(div_ge);
|
||||
mk_axiom(eqz, div_ge, false);
|
||||
ge = m_util.mk_ge(divisor, zero);
|
||||
le = m_util.mk_le(divisor, zero);
|
||||
div_le = m_util.mk_le(m_util.mk_sub(dividend, m_util.mk_mul(m_util.mk_add(divisor, one), div)), zero);
|
||||
s(div_le);
|
||||
mk_axiom(le, div_le, false);
|
||||
div_le = m_util.mk_le(m_util.mk_sub(dividend, m_util.mk_mul(m_util.mk_sub(divisor, one), div)), zero);
|
||||
s(div_le);
|
||||
mk_axiom(ge, div_le, false);
|
||||
}
|
||||
|
||||
if (m_params.m_arith_enum_const_mod && m_util.is_numeral(divisor, k) &&
|
||||
|
|
Loading…
Reference in a new issue