ó
¡¼™\c           @  sl   d  Z  d d l m Z m Z d d l m Z d d l m Z m Z d d l	 m
 Z
 d e
 f d „  ƒ  YZ d S(	   sc   
This module contains query handlers responsible for calculus queries:
infinitesimal, finite, etc.
iÿÿÿÿ(   t   print_functiont   division(   t	   conjuncts(   t   Qt   ask(   t   CommonHandlert   AskFiniteHandlerc        	   B  s¬   e  Z d  Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e Z	 e e
 j ƒ g d \	 Z Z Z Z Z Z Z Z Z e e
 j ƒ g d \ Z Z RS(   s  
    Handler for key 'finite'.

    Test that an expression is bounded respect to all its variables.

    Examples of usage:

    >>> from sympy import Symbol, Q
    >>> from sympy.assumptions.handlers.calculus import AskFiniteHandler
    >>> from sympy.abc import x
    >>> a = AskFiniteHandler()
    >>> a.Symbol(x, Q.positive(x)) == None
    True
    >>> a.Symbol(x, Q.finite(x))
    True

    c         C  s9   |  j  d k	 r |  j  St j |  ƒ t | ƒ k r5 t Sd S(   sp  
        Handles Symbol.

        Examples
        ========

        >>> from sympy import Symbol, Q
        >>> from sympy.assumptions.handlers.calculus import AskFiniteHandler
        >>> from sympy.abc import x
        >>> a = AskFiniteHandler()
        >>> a.Symbol(x, Q.positive(x)) == None
        True
        >>> a.Symbol(x, Q.finite(x))
        True

        N(   t	   is_finitet   NoneR   t   finiteR   t   True(   t   exprt   assumptions(    (    sB   lib/python2.7/site-packages/sympy/assumptions/handlers/calculus.pyt   Symbol   s
    c         C  s»   d } t  } x¨ |  j D] } t t j | ƒ | ƒ } | r@ q n  t t j | ƒ | ƒ } | d k rp | | k s” | d k r˜ | | k s” | | k r˜ d S| } | t k	 r | } q q W| S(   s  
        Return True if expr is bounded, False if not and None if unknown.

        Truth Table:

        +-------+-----+-----------+-----------+
        |       |     |           |           |
        |       |  B  |     U     |     ?     |
        |       |     |           |           |
        +-------+-----+---+---+---+---+---+---+
        |       |     |   |   |   |   |   |   |
        |       |     |'+'|'-'|'x'|'+'|'-'|'x'|
        |       |     |   |   |   |   |   |   |
        +-------+-----+---+---+---+---+---+---+
        |       |     |           |           |
        |   B   |  B  |     U     |     ?     |
        |       |     |           |           |
        +---+---+-----+---+---+---+---+---+---+
        |   |   |     |   |   |   |   |   |   |
        |   |'+'|     | U | ? | ? | U | ? | ? |
        |   |   |     |   |   |   |   |   |   |
        |   +---+-----+---+---+---+---+---+---+
        |   |   |     |   |   |   |   |   |   |
        | U |'-'|     | ? | U | ? | ? | U | ? |
        |   |   |     |   |   |   |   |   |   |
        |   +---+-----+---+---+---+---+---+---+
        |   |   |     |           |           |
        |   |'x'|     |     ?     |     ?     |
        |   |   |     |           |           |
        +---+---+-----+---+---+---+---+---+---+
        |       |     |           |           |
        |   ?   |     |           |     ?     |
        |       |     |           |           |
        +-------+-----+-----------+---+---+---+

            * 'B' = Bounded

            * 'U' = Unbounded

            * '?' = unknown boundedness

            * '+' = positive sign

            * '-' = negative sign

            * 'x' = sign unknown

|

            * All Bounded -> True

            * 1 Unbounded and the rest Bounded -> False

            * >1 Unbounded, all with same known sign -> False

            * Any Unknown and unknown sign -> None

            * Else -> None

        When the signs are not the same you can have an undefined
        result as in oo - oo, hence 'bounded' is also undefined.

        iÿÿÿÿN(   R
   t   argsR   R   R	   t   positiveR   t   False(   R   R   t   signt   resultt   argt   _boundedt   s(    (    sB   lib/python2.7/site-packages/sympy/assumptions/handlers/calculus.pyt   Add7   s    B$c         C  sž   t  } x‘ |  j D]† } t t j | ƒ | ƒ } | r: q q | d k r | d k rV d St t j | ƒ | ƒ d k rx d S| t k	 r– d } q– q t } q W| S(   sž  
        Return True if expr is bounded, False if not and None if unknown.

        Truth Table:

        +---+---+---+--------+
        |   |   |   |        |
        |   | B | U |   ?    |
        |   |   |   |        |
        +---+---+---+---+----+
        |   |   |   |   |    |
        |   |   |   | s | /s |
        |   |   |   |   |    |
        +---+---+---+---+----+
        |   |   |   |        |
        | B | B | U |   ?    |
        |   |   |   |        |
        +---+---+---+---+----+
        |   |   |   |   |    |
        | U |   | U | U | ?  |
        |   |   |   |   |    |
        +---+---+---+---+----+
        |   |   |   |        |
        | ? |   |   |   ?    |
        |   |   |   |        |
        +---+---+---+---+----+

            * B = Bounded

            * U = Unbounded

            * ? = unknown boundedness

            * s = signed (hence nonzero)

            * /s = not signed

        N(   R
   R   R   R   R	   R   t   nonzeroR   (   R   R   R   R   R   (    (    sB   lib/python2.7/site-packages/sympy/assumptions/handlers/calculus.pyt   Mul   s    (
c         C  s0  t  t j |  j ƒ | ƒ } t  t j |  j ƒ | ƒ } | d k rR | d k rR d S| t k r} t  t j |  j ƒ | ƒ r} t S| r | r t St	 |  j ƒ d k t k rÇ t  t j
 |  j ƒ | ƒ rÇ t St	 |  j ƒ d k t k rt  t j |  j ƒ | ƒ rt St	 |  j ƒ d k t k r,| t k r,t Sd S(   sÃ   
        Unbounded ** NonZero -> Unbounded
        Bounded ** Bounded -> Bounded
        Abs()<=1 ** Positive -> Bounded
        Abs()>=1 ** Negative -> Bounded
        Otherwise unknown
        i   N(   R   R   R	   t   baset   expR   R   R   R
   t   absR   t   negative(   R   R   t   base_boundedt   exp_bounded(    (    sB   lib/python2.7/site-packages/sympy/assumptions/handlers/calculus.pyt   PowÅ   s    	'66'c         C  s   t  t j |  j d ƒ | ƒ S(   Ni    (   R   R   R	   R   (   R   R   (    (    sB   lib/python2.7/site-packages/sympy/assumptions/handlers/calculus.pyt   logÞ   s    i	   i   (   t   __name__t
   __module__t   __doc__t   staticmethodR   R   R   R   R    R   R   t
   AlwaysTruet   cost   sint   Numbert   Pit   Exp1t   GoldenRatiot   TribonacciConstantt   ImaginaryUnitR   t   AlwaysFalset   Infinityt   NegativeInfinity(    (    (    sB   lib/python2.7/site-packages/sympy/assumptions/handlers/calculus.pyR      s   V81N(   R#   t
   __future__R    R   t   sympy.logic.boolalgR   t   sympy.assumptionsR   R   t   sympy.assumptions.handlersR   R   (    (    (    sB   lib/python2.7/site-packages/sympy/assumptions/handlers/calculus.pyt   <module>   s
   