ó
¡¼™\c           @  sà   d  d l  m Z m Z d  d l Z d  d l m Z d  d l m Z d  d l m	 Z	 d  d l
 m Z d  d l m Z d  d l m Z d	 e f d
 „  ƒ  YZ e ƒ  Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ e d „  ƒ Z d S(   iÿÿÿÿ(   t   print_functiont   divisionN(   t   cacheit(   t   S(   t   _sympify(   t   Boolean(   t	   get_class(   t   contextmanagert   AssumptionsContextc           B  s    e  Z d  Z d „  Z d „  Z RS(   sÕ  Set representing assumptions.

    This is used to represent global assumptions, but you can also use this
    class to create your own local assumptions contexts. It is basically a thin
    wrapper to Python's set, so see its documentation for advanced usage.

    Examples
    ========

    >>> from sympy import AppliedPredicate, Q
    >>> from sympy.assumptions.assume import global_assumptions
    >>> global_assumptions
    AssumptionsContext()
    >>> from sympy.abc import x
    >>> global_assumptions.add(Q.real(x))
    >>> global_assumptions
    AssumptionsContext({Q.real(x)})
    >>> global_assumptions.remove(Q.real(x))
    >>> global_assumptions
    AssumptionsContext()
    >>> global_assumptions.clear()

    c         G  s+   x$ | D] } t  t |  ƒ j | ƒ q Wd S(   s   Add an assumption.N(   t   superR   t   add(   t   selft   assumptionst   a(    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyR
   $   s    c         C  s1   |  s d |  j  j Sd |  j  j | j |  ƒ f S(   Ns   %s()s   %s(%s)(   t	   __class__t   __name__t
   _print_set(   R   t   printer(    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyt	   _sympystr)   s    (   R   t
   __module__t   __doc__R
   R   (    (    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyR      s   	t   AppliedPredicatec           B  sŒ   e  Z d  Z g  Z d „  Z e Z e d „  ƒ Z e d „  ƒ Z	 e d „  ƒ Z
 e d
 d „ ƒ Z d „  Z d „  Z d „  Z e d	 „  ƒ Z RS(   s  The class of expressions resulting from applying a Predicate.

    Examples
    ========

    >>> from sympy import Q, Symbol
    >>> x = Symbol('x')
    >>> Q.integer(x)
    Q.integer(x)
    >>> type(Q.integer(x))
    <class 'sympy.assumptions.assume.AppliedPredicate'>

    c         C  s   t  | ƒ } t j |  | | ƒ S(   N(   R   R   t   __new__(   t   clst	   predicatet   arg(    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyR   A   s    c         C  s   |  j  d S(   sê   
        Return the expression used by this assumption.

        Examples
        ========

        >>> from sympy import Q, Symbol
        >>> x = Symbol('x')
        >>> a = Q.integer(x + 1)
        >>> a.arg
        x + 1

        i   (   t   _args(   R   (    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyR   G   s    c         C  s   |  j  d S(   Ni   (   R   (   R   (    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyt   argsX   s    c         C  s   |  j  d S(   Ni    (   R   (   R   (    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyt   func\   s    c         C  s=   |  j  ƒ  d |  j j |  j j ƒ  f f t j j ƒ  t j f S(   Ni   (   t	   class_keyR   t   nameR   t   sort_keyR   t   One(   R   t   order(    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyR   `   s    'c         C  s&   t  | ƒ t k r" |  j | j k St S(   N(   t   typeR   R   t   False(   R   t   other(    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyt   __eq__e   s    c         C  s   t  t |  ƒ j ƒ  S(   N(   R	   R   t   __hash__(   R   (    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyR&   j   s    c         C  s   |  j  j |  j | ƒ S(   N(   R   t   evalR   (   R   R   (    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyt	   _eval_askm   s    c         C  si   d d l  m } m } |  j j d k rb |  j } | j sX | j sX t | | | f ƒ rb | j	 Sn  t
 ƒ  S(   Niÿÿÿÿ(   t   Eqt   Net   is_truet   is_false(   R+   R,   (   t   sympy.core.relationalR)   R*   R   R   R   t
   is_Booleant	   is_Symbolt
   isinstancet   binary_symbolst   set(   R   R)   R*   t   i(    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyR1   p   s    	'
N(   R   R   R   t	   __slots__R   t   Truet   is_Atomt   propertyR   R   R   R   t   NoneR   R%   R&   R(   R1   (    (    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyR   1   s   				t	   Predicatec           B  sk   e  Z d  Z e Z d	 d „ Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z e d	 d „ ƒ Z e d „ Z RS(
   s«  A predicate is a function that returns a boolean value.

    Predicates merely wrap their argument and remain unevaluated:

        >>> from sympy import Q, ask
        >>> type(Q.prime)
        <class 'sympy.assumptions.assume.Predicate'>
        >>> Q.prime.name
        'prime'
        >>> Q.prime(7)
        Q.prime(7)
        >>> _.func.name
        'prime'

    To obtain the truth value of an expression containing predicates, use
    the function ``ask``:

        >>> ask(Q.prime(7))
        True

    The tautological predicate ``Q.is_true`` can be used to wrap other objects:

        >>> from sympy.abc import x
        >>> Q.is_true(x > 1)
        Q.is_true(x > 1)

    c         C  s+   t  j |  ƒ } | | _ | p! g  | _ | S(   N(   R   R   R   t   handlers(   R   R   R:   t   obj(    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyR   ™   s    	c         C  s
   |  j  f S(   N(   R   (   R   (    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyt   _hashable_contentŸ   s    c         C  s
   |  j  f S(   N(   R   (   R   (    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyt   __getnewargs__¢   s    c         C  s   t  |  | ƒ S(   N(   R   (   R   t   expr(    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyt   __call__¥   s    c         C  s   |  j  j | ƒ d  S(   N(   R:   t   append(   R   t   handler(    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyt   add_handler¨   s    c         C  s   |  j  j | ƒ d  S(   N(   R:   t   remove(   R   RA   (    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyt   remove_handler«   s    c         C  s.   |  j  ƒ  d |  j f f t j j ƒ  t j f S(   Ni   (   R   R   R   R    R   (   R   R!   (    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyR   ®   s    c   
      C  sä   d \ } } t j t | ƒ ƒ } x¼ |  j D]± } t | ƒ } xœ | D]” } t | | j d ƒ }	 |	 d k rq qD n  |	 | | ƒ } | d k r’ qD n  | d k r§ | } n0 | d k r¼ | } n | | k r× t d ƒ ‚ n  PqD Wq+ W| S(   sŒ   
        Evaluate self(expr) under the given assumptions.

        This uses only direct resolution methods, not logical inference.
        s   incompatible resolutorsN(   NN(	   R8   t   inspectt   getmroR"   R:   R   t   getattrR   t
   ValueError(
   R   R>   R   t   rest   _rest   mroRA   R   t   subclasst   eval_(    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyR'   ²   s&    			N(   R   R   R   R5   R6   R8   R   R<   R=   R?   RB   RD   R   R   R'   (    (    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyR9   z   s   					c          g  sA   t  j ƒ  } t  j |  ƒ z	 d VWd t  j ƒ  t  j | ƒ Xd S(   s0   Context manager for assumptions

    Examples
    ========

    >>> from sympy.assumptions import assuming, Q, ask
    >>> from sympy.abc import x, y

    >>> print(ask(Q.integer(x + y)))
    None

    >>> with assuming(Q.integer(x), Q.integer(y)):
    ...     print(ask(Q.integer(x + y)))
    True
    N(   t   global_assumptionst   copyt   updatet   clear(   R   t   old_global_assumptions(    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyt   assumingÒ   s    	
(   t
   __future__R    R   RE   t   sympy.core.cacheR   t   sympy.core.singletonR   t   sympy.core.sympifyR   t   sympy.logic.boolalgR   t   sympy.utilities.sourceR   t
   contextlibR   R2   R   RN   R   R9   RS   (    (    (    s7   lib/python2.7/site-packages/sympy/assumptions/assume.pyt   <module>   s   #	IX