contains.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from sympy.core import S
  2. from sympy.core.sympify import sympify
  3. from sympy.core.relational import Eq, Ne
  4. from sympy.core.parameters import global_parameters
  5. from sympy.logic.boolalg import Boolean
  6. from sympy.utilities.misc import func_name
  7. from .sets import Set
  8. class Contains(Boolean):
  9. """
  10. Asserts that x is an element of the set S.
  11. Examples
  12. ========
  13. >>> from sympy import Symbol, Integer, S, Contains
  14. >>> Contains(Integer(2), S.Integers)
  15. True
  16. >>> Contains(Integer(-2), S.Naturals)
  17. False
  18. >>> i = Symbol('i', integer=True)
  19. >>> Contains(i, S.Naturals)
  20. Contains(i, Naturals)
  21. References
  22. ==========
  23. .. [1] https://en.wikipedia.org/wiki/Element_%28mathematics%29
  24. """
  25. def __new__(cls, x, s, evaluate=None):
  26. x = sympify(x)
  27. s = sympify(s)
  28. if evaluate is None:
  29. evaluate = global_parameters.evaluate
  30. if not isinstance(s, Set):
  31. raise TypeError('expecting Set, not %s' % func_name(s))
  32. if evaluate:
  33. # _contains can return symbolic booleans that would be returned by
  34. # s.contains(x) but here for Contains(x, s) we only evaluate to
  35. # true, false or return the unevaluated Contains.
  36. result = s._contains(x)
  37. if isinstance(result, Boolean):
  38. if result in (S.true, S.false):
  39. return result
  40. elif result is not None:
  41. raise TypeError("_contains() should return Boolean or None")
  42. return super().__new__(cls, x, s)
  43. @property
  44. def binary_symbols(self):
  45. return set().union(*[i.binary_symbols
  46. for i in self.args[1].args
  47. if i.is_Boolean or i.is_Symbol or
  48. isinstance(i, (Eq, Ne))])
  49. def as_set(self):
  50. return self.args[1]