B
    [                 @   sP   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
 G dd de
ZdS )	zc
This module contains query handlers responsible for calculus queries:
infinitesimal, finite, etc.
    )print_functiondivision)	conjuncts)Qask)CommonHandlerc            	   @   s   e Zd ZdZedd Zedd Zedd Zedd	 Zed
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dS )AskFiniteHandlera  
    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   s*   | j dk	r| j S t| t|kr&dS dS )ap  
        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

        NT)Z	is_finiter   finiter   )exprassumptions r   Blib/python3.7/site-packages/sympy/assumptions/handlers/calculus.pySymbol   s
    
zAskFiniteHandler.Symbolc             C   s~   d}d}xp| j D ]f}tt||}|r*qtt||}|dkrJ||ksb|dkrf||ksb||krfdS |}|dk	r|}qW |S )a  
        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.

        TNF)argsr   r   r	   positive)r
   r   signresultarg_boundedsr   r   r   Add7   s    BzAskFiniteHandler.Addc             C   sn   d}xd| j D ]Z}tt||}|r(qq|dkrb|dkr<dS tt||dkrTdS |dk	rfd}qd}qW |S )a  
        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

        TNF)r   r   r   r	   nonzero)r
   r   r   r   r   r   r   r   Mul   s    (zAskFiniteHandler.Mulc             C   s   t t| j|}t t| j|}|dkr8|dkr8dS |dkrVt t| j|rVdS |rb|rbdS t| jdkdkrt t| j|rdS t| jdkdkrt t| j|rdS t| jdkdkr|dkrdS dS )z
        Unbounded ** NonZero -> Unbounded
        Bounded ** Bounded -> Bounded
        Abs()<=1 ** Positive -> Bounded
        Abs()>=1 ** Negative -> Bounded
        Otherwise unknown
        NFT   )	r   r   r	   baseexpr   absr   negative)r
   r   Zbase_boundedZexp_boundedr   r   r   Pow   s    	$$zAskFiniteHandler.Powc             C   s   t t| jd |S )Nr   )r   r   r	   r   )r
   r   r   r   r   log   s    zAskFiniteHandler.log	      N)__name__
__module____qualname____doc__staticmethodr   r   r   r   r    r   r   Z
AlwaysTrueZcosZsinNumberZPiZExp1ZGoldenRatioZTribonacciConstantZImaginaryUnitr   ZAlwaysFalseZInfinityZNegativeInfinityr   r   r   r   r      s   V8"r   N)r&   Z
__future__r   r   Zsympy.logic.boolalgr   Zsympy.assumptionsr   r   Zsympy.assumptions.handlersr   r   r   r   r   r   <module>   s
   