Ticket #11309: trac_11309-fix-comparison-of-comparisons.patch

File trac_11309-fix-comparison-of-comparisons.patch, 3.6 KB (added by kini, 8 years ago)
  • sage/libs/ginac/decl.pxi

    # HG changeset patch
    # Date 1308205524 25200
    # User Keshav Kini <keshav.kini@gmail.com>
    # Parent a916e91ecd31c17b084b3bfb74bedc5f3bde5602
    trac #11309: resolve nested symbolic comparisons (e.g. "(x < y) < z") properly
    
    diff --git a/sage/libs/ginac/decl.pxi b/sage/libs/ginac/decl.pxi
    a b  
    6060        GEx collect(GEx s, bint dist) except +
    6161        GEx diff(GSymbol s, int d)    except +
    6262        GEx series(GEx s, int order, unsigned options) except +
     63        bint is_equal(GEx s)          except +
    6364        bint is_zero()                except +
    6465        bint is_polynomial(GEx vars)  except +
    6566        bint match(GEx pattern, GExList s) except +
  • sage/symbolic/expression.pyx

    diff --git a/sage/symbolic/expression.pyx b/sage/symbolic/expression.pyx
    a b  
    11221122    def __richcmp__(left, right, int op):
    11231123        """
    11241124        Create a formal symbolic inequality or equality.
    1125        
    1126         EXAMPLES::
    1127        
     1125
     1126        EXAMPLES::
     1127
    11281128            sage: var('x, y')
    11291129            (x, y)
    11301130            sage: x + 2/3 < y^2
     
    11371137            x^3 - y^10 >= x^10 + y
    11381138            sage: x^2 > x
    11391139            x^2 > x
     1140
     1141        Testing trac #11309 which changes the behavior of comparison of
     1142        comparisons::
     1143
     1144            sage: (-x + y < 0) in [x - y < 0]
     1145            False
     1146            sage: Set([-x + y < 0, x - y < 0])
     1147            {-x + y < 0, x - y < 0}
     1148            sage: (x < y) == (x > y)
     1149            False
     1150            sage: (x < 0) < (x < 1)
     1151            False
     1152            sage: (x < y) != (y > x)
     1153            True
     1154            sage: (x < x) == (x < x)
     1155            True
     1156            sage: (y > y) != (y > y)
     1157            False
     1158            sage: (x < y) != x
     1159            True
     1160            sage: x == (x == x)
     1161            False
    11401162        """
    11411163        return (<Element>left)._richcmp(right, op)
    11421164
     
    11461168        l = left
    11471169        r = right
    11481170
    1149         if is_a_relational(l._gobj) or is_a_relational(r._gobj):
    1150             c = cmp(hash(l), hash(r))
    1151             if op == Py_NE:
    1152                 return c != 0
    1153             elif op == Py_EQ:
    1154                 return c == 0
     1171        # resolve relation immediately if lhs or rhs is already a relation
     1172        if is_a_relational(l._gobj):
     1173            if is_a_relational(r._gobj):
     1174                if l.operator() == r.operator():
     1175                    e2 = ( l._gobj.lhs().is_equal(r._gobj.lhs()) and
     1176                          l._gobj.rhs().is_equal(r._gobj.rhs()) )
     1177                else:
     1178                    e2 = False          # l and r are different relations
     1179            else:
     1180                e2 = False              # l is relational but r isn't.
     1181
     1182            if op == Py_EQ:
     1183                return e2
     1184            elif op == Py_NE:
     1185                return not e2
    11551186            else:
    11561187                return False
    1157 
     1188        elif is_a_relational(r._gobj):  # l isn't relational but r is.
     1189            if op == Py_EQ:
     1190                return False
     1191            elif op == Py_NE:
     1192                return True
     1193            else:
     1194                return False
     1195
     1196        # neither was relational, so we can create a symbolic relation
    11581197        cdef GEx e
    11591198        if op == Py_LT:
    11601199            e = g_lt(l._gobj, r._gobj)
     
    11671206        elif op == Py_NE:
    11681207            e = g_ne(l._gobj, r._gobj)
    11691208        elif op == Py_GE:
    1170             e = g_ge(l._gobj, r._gobj)       
     1209            e = g_ge(l._gobj, r._gobj)
    11711210        else:
    11721211            raise TypeError
    11731212        return new_Expression_from_GEx(l._parent, e)