3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-10 19:27:06 +00:00
non-linear division axioms appear incomplete.
Fixed for legacy arithmetic. Fix pending for new arithmetic solver.
This commit is contained in:
Nikolaj Bjorner 2022-06-26 20:37:18 -07:00
parent 56aa4261b6
commit 30165ed40a

View file

@ -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) &&