mirror of
https://github.com/Z3Prover/z3
synced 2025-04-15 13:28:47 +00:00
Fix bug in realclosure::compare function
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
parent
3e19df0441
commit
3c1f1a3b65
|
@ -200,6 +200,11 @@ public:
|
||||||
|
|
||||||
bool eq(interval const & a, interval const & b) const;
|
bool eq(interval const & a, interval const & b) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Return true if all values in 'a' are less than all values in 'b'.
|
||||||
|
*/
|
||||||
|
bool before(interval const & a, interval const & b) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
\brief Set lower bound to -oo.
|
\brief Set lower bound to -oo.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -687,6 +687,13 @@ bool interval_manager<C>::eq(interval const & a, interval const & b) const {
|
||||||
upper_is_open(a) == upper_is_open(b);
|
upper_is_open(a) == upper_is_open(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename C>
|
||||||
|
bool interval_manager<C>::before(interval const & a, interval const & b) const {
|
||||||
|
if (upper_is_inf(a) || lower_is_inf(b))
|
||||||
|
return false;
|
||||||
|
return m().lt(upper(a), lower(b)) || (upper_is_open(a) && m().eq(upper(a), lower(b)));
|
||||||
|
}
|
||||||
|
|
||||||
template<typename C>
|
template<typename C>
|
||||||
void interval_manager<C>::neg_jst(interval const & a, interval_deps & b_deps) {
|
void interval_manager<C>::neg_jst(interval const & a, interval_deps & b_deps) {
|
||||||
if (lower_is_inf(a)) {
|
if (lower_is_inf(a)) {
|
||||||
|
|
|
@ -2500,10 +2500,10 @@ namespace realclosure {
|
||||||
else if (is_nz_rational(a) && is_nz_rational(b))
|
else if (is_nz_rational(a) && is_nz_rational(b))
|
||||||
return qm().lt(to_mpq(a), to_mpq(b)) ? -1 : 1;
|
return qm().lt(to_mpq(a), to_mpq(b)) ? -1 : 1;
|
||||||
else {
|
else {
|
||||||
// TODO: try to refine interval before switching to sub/expensive approach
|
// TODO: try to refine interval before switching to sub+sign approach
|
||||||
if (bqm().lt(interval(a).upper(), interval(b).lower()))
|
if (bqim().before(interval(a), interval(b)))
|
||||||
return -1;
|
return -1;
|
||||||
else if (bqm().lt(interval(b).upper(), interval(a).lower()))
|
else if (bqim().before(interval(b), interval(a)))
|
||||||
return 1;
|
return 1;
|
||||||
else {
|
else {
|
||||||
value_ref diff(*this);
|
value_ref diff(*this);
|
||||||
|
|
Loading…
Reference in a new issue