Spaces:
Sleeping
Sleeping
from sympy.core import S | |
from sympy.core.sympify import sympify | |
from sympy.core.relational import Eq, Ne | |
from sympy.core.parameters import global_parameters | |
from sympy.logic.boolalg import Boolean | |
from sympy.utilities.misc import func_name | |
from .sets import Set | |
class Contains(Boolean): | |
""" | |
Asserts that x is an element of the set S. | |
Examples | |
======== | |
>>> from sympy import Symbol, Integer, S, Contains | |
>>> Contains(Integer(2), S.Integers) | |
True | |
>>> Contains(Integer(-2), S.Naturals) | |
False | |
>>> i = Symbol('i', integer=True) | |
>>> Contains(i, S.Naturals) | |
Contains(i, Naturals) | |
References | |
========== | |
.. [1] https://en.wikipedia.org/wiki/Element_%28mathematics%29 | |
""" | |
def __new__(cls, x, s, evaluate=None): | |
x = sympify(x) | |
s = sympify(s) | |
if evaluate is None: | |
evaluate = global_parameters.evaluate | |
if not isinstance(s, Set): | |
raise TypeError('expecting Set, not %s' % func_name(s)) | |
if evaluate: | |
# _contains can return symbolic booleans that would be returned by | |
# s.contains(x) but here for Contains(x, s) we only evaluate to | |
# true, false or return the unevaluated Contains. | |
result = s._contains(x) | |
if isinstance(result, Boolean): | |
if result in (S.true, S.false): | |
return result | |
elif result is not None: | |
raise TypeError("_contains() should return Boolean or None") | |
return super().__new__(cls, x, s) | |
def binary_symbols(self): | |
return set().union(*[i.binary_symbols | |
for i in self.args[1].args | |
if i.is_Boolean or i.is_Symbol or | |
isinstance(i, (Eq, Ne))]) | |
def as_set(self): | |
return self.args[1] | |