diff --git a/src/math/interval/interval.h b/src/math/interval/interval.h index fd9f5a2463e..0d036a16e29 100644 --- a/src/math/interval/interval.h +++ b/src/math/interval/interval.h @@ -72,6 +72,7 @@ class im_default_config { void set_upper_is_open(interval & a, bool v) { a.m_upper_open = v; } void set_lower_is_inf(interval & a, bool v) { a.m_lower_inf = v; } void set_upper_is_inf(interval & a, bool v) { a.m_upper_inf = v; } + // Reference to numeral manager numeral_manager & m() const { return m_manager; } @@ -184,6 +185,14 @@ class interval_manager { bool upper_is_open(interval const & a) const { return m_c.upper_is_open(a); } bool lower_is_inf(interval const & a) const { return m_c.lower_is_inf(a); } bool upper_is_inf(interval const & a) const { return m_c.upper_is_inf(a); } + bool is_empty(interval const& a) const { + if (lower_is_inf(a) || upper_is_inf(a)) + return false; + ext_numeral_kind lk = lower_kind(a), uk = upper_kind(a); + if (lower_is_open(a) || upper_is_open(a)) + return !(::lt(m(), lower(a), lk, upper(a), uk)); + return ::lt(m(), upper(a), uk, lower(a), lk); + } bool lower_is_neg(interval const & a) const { return ::is_neg(m(), lower(a), lower_kind(a)); } bool lower_is_pos(interval const & a) const { return ::is_pos(m(), lower(a), lower_kind(a)); } diff --git a/src/math/interval/interval_def.h b/src/math/interval/interval_def.h index bbce66420e7..9918f39a1e5 100644 --- a/src/math/interval/interval_def.h +++ b/src/math/interval/interval_def.h @@ -681,7 +681,7 @@ void interval_manager::set(interval & t, interval const & s) { } set_lower_is_open(t, lower_is_open(s)); set_upper_is_open(t, upper_is_open(s)); - SASSERT(check_invariant(t)); + SASSERT(is_empty(t) || check_invariant(t)); } template @@ -813,7 +813,7 @@ void interval_manager::add(interval const & a, interval const & b, interval & set_upper_is_inf(c, new_u_kind == EN_PLUS_INFINITY); set_lower_is_open(c, lower_is_open(a) || lower_is_open(b)); set_upper_is_open(c, upper_is_open(a) || upper_is_open(b)); - SASSERT(check_invariant(c)); + SASSERT(is_empty(a) || is_empty(b) || check_invariant(c)); } template