From 8242069ba6a9e6615317723f1495ee23b1c24055 Mon Sep 17 00:00:00 2001 From: Jakob Rath Date: Thu, 29 Sep 2022 18:22:31 +0200 Subject: [PATCH] One more case for ule_constraint::is_always_false --- src/math/dd/dd_pdd.h | 2 ++ src/math/polysat/ule_constraint.cpp | 4 +++- src/math/polysat/ule_constraint.h | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/math/dd/dd_pdd.h b/src/math/dd/dd_pdd.h index d003461e7..6c7497461 100644 --- a/src/math/dd/dd_pdd.h +++ b/src/math/dd/dd_pdd.h @@ -253,6 +253,7 @@ namespace dd { inline bool is_val(PDD p) const { return m_nodes[p].is_val(); } inline bool is_internal(PDD p) const { return m_nodes[p].is_internal(); } inline bool is_var(PDD p) const { return !is_val(p) && is_zero(lo(p)) && is_one(hi(p)); } + inline bool is_max(PDD p) const { SASSERT(m_semantics == mod2_e || m_semantics == mod2N_e); return is_val(p) && val(p) == max_value(); } bool is_never_zero(PDD p); inline unsigned level(PDD p) const { return m_nodes[p].m_level; } inline unsigned var(PDD p) const { return m_level2var[level(p)]; } @@ -413,6 +414,7 @@ namespace dd { bool is_zero() const { return m.is_zero(root); } bool is_linear() const { return m.is_linear(root); } bool is_var() const { return m.is_var(root); } + bool is_max() const { return m.is_max(root); } /** Polynomial is of the form a * x + b for numerals a, b. */ bool is_unilinear() const { return !is_val() && lo().is_val() && hi().is_val(); } bool is_unary() const { return !is_val() && lo().is_zero() && hi().is_val(); } diff --git a/src/math/polysat/ule_constraint.cpp b/src/math/polysat/ule_constraint.cpp index 9e3ca4200..2a0326ff0 100644 --- a/src/math/polysat/ule_constraint.cpp +++ b/src/math/polysat/ule_constraint.cpp @@ -70,7 +70,7 @@ namespace { return; } // p <= -1 --> 0 <= 0 - if (rhs.is_val() && rhs.val() == rhs.manager().max_value()) { + if (rhs.is_max()) { lhs = 0, rhs = 0; return; } @@ -202,6 +202,8 @@ namespace polysat { return true; // 0 > ... is always false if (lhs == rhs) return true; // p > p + if (rhs.is_max()) + return true; // p > -1 if (lhs.is_one() && rhs.is_never_zero()) return true; // 1 > p implies p == 0 return lhs.is_val() && rhs.is_val() && lhs.val() <= rhs.val(); diff --git a/src/math/polysat/ule_constraint.h b/src/math/polysat/ule_constraint.h index 01eb57b93..ddbb3cc96 100644 --- a/src/math/polysat/ule_constraint.h +++ b/src/math/polysat/ule_constraint.h @@ -27,6 +27,7 @@ namespace polysat { ule_constraint(constraint_manager& m, pdd const& l, pdd const& r); static void simplify(bool& is_positive, pdd& lhs, pdd& rhs); + static bool is_always_false(bool is_positive, pdd const& lhs, pdd const& rhs); public: ~ule_constraint() override {} @@ -35,7 +36,6 @@ namespace polysat { static std::ostream& display(std::ostream& out, lbool status, pdd const& lhs, pdd const& rhs); std::ostream& display(std::ostream& out, lbool status) const override; std::ostream& display(std::ostream& out) const override; - static bool is_always_false(bool is_positive, pdd const& lhs, pdd const& rhs); bool is_always_false(bool is_positive) const override; bool is_currently_false(solver& s, bool is_positive) const override; bool is_currently_false(solver& s, assignment_t const& sub, bool is_positive) const override;