
    MZd$                        d dl mZ d dlmZ d dlmZmZmZmZm	Z	m
Z
 d dlmZ d dlmZ d dlmZmZmZmZ d dlmZ d Zd	 Zd
 Z G d d      Z e       Z e
d      Zej9                  e      d        Zej9                  e      d        Zej=                  e      d        Zej9                  e      d        Zej=                  e      d        Zej=                  e      d        Zej=                  e      d        Zej=                  e      d        Zej=                  e      d        Zej9                  e      d        Zej>                  d ej@                  d ejB                  d ejD                  d ejF                  d ejH                  d ejJ                  d ejL                  d ejN                  d  ejP                  d! i
Z)ej9                  ee	e      d"        Zy#)$    )defaultdict)Q)AddMulPowNumberNumberSymbolSymbol)ImaginaryUnit)Abs)
EquivalentAndOrImplies)MatMulc           	      l    t        |j                  D cg c]  }|j                  | |       c} S c c}w )a  
    Apply all arguments of the expression to the fact structure.

    Parameters
    ==========

    symbol : Symbol
        A placeholder symbol.

    fact : Boolean
        Resulting ``Boolean`` expression.

    expr : Expr

    Examples
    ========

    >>> from sympy import Q
    >>> from sympy.assumptions.sathandlers import allargs
    >>> from sympy.abc import x, y
    >>> allargs(x, Q.negative(x) | Q.positive(x), x*y)
    (Q.negative(x) | Q.positive(x)) & (Q.negative(y) | Q.positive(y))

    )r   argssubssymbolfactexprargs       ?/usr/lib/python3/dist-packages/sympy/assumptions/sathandlers.pyallargsr      s,    2 499=C63'=>>=   1c           	      l    t        |j                  D cg c]  }|j                  | |       c} S c c}w )a  
    Apply any argument of the expression to the fact structure.

    Parameters
    ==========

    symbol : Symbol
        A placeholder symbol.

    fact : Boolean
        Resulting ``Boolean`` expression.

    expr : Expr

    Examples
    ========

    >>> from sympy import Q
    >>> from sympy.assumptions.sathandlers import anyarg
    >>> from sympy.abc import x, y
    >>> anyarg(x, Q.negative(x) & Q.positive(x), x*y)
    (Q.negative(x) & Q.positive(x)) | (Q.negative(y) & Q.positive(y))

    )r   r   r   r   s       r   anyargr   +   s,    2 $))<3		&#&<==<r   c                    |j                   D cg c]  }|j                  | |       }}t        t        t	        |            D cg c],  }t        ||   g|d| ||dz   d z   D cg c]  }|  c} . c}} }|S c c}w c c}w c c}}w )a  
    Apply exactly one argument of the expression to the fact structure.

    Parameters
    ==========

    symbol : Symbol
        A placeholder symbol.

    fact : Boolean
        Resulting ``Boolean`` expression.

    expr : Expr

    Examples
    ========

    >>> from sympy import Q
    >>> from sympy.assumptions.sathandlers import exactlyonearg
    >>> from sympy.abc import x, y
    >>> exactlyonearg(x, Q.positive(x), x*y)
    (Q.positive(x) & ~Q.positive(y)) | (Q.positive(y) & ~Q.positive(x))

    N   )r   r   r   rangelenr   )r   r   r   r   	pred_argsilitress           r   exactlyoneargr'   G   s    2 4899=C63'=I=
#(Y#8: 9Q< 9Ra=!A#$4 #CC4 #  : ;CJ ># :s   A>B
%
B/B
B
c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)ClassFactRegistrya  
    Register handlers against classes.

    Explanation
    ===========

    ``register`` method registers the handler function for a class. Here,
    handler function should return a single fact. ``multiregister`` method
    registers the handler function for multiple classes. Here, handler function
    should return a container of multiple facts.

    ``registry(expr)`` returns a set of facts for *expr*.

    Examples
    ========

    Here, we register the facts for ``Abs``.

    >>> from sympy import Abs, Equivalent, Q
    >>> from sympy.assumptions.sathandlers import ClassFactRegistry
    >>> reg = ClassFactRegistry()
    >>> @reg.register(Abs)
    ... def f1(expr):
    ...     return Q.nonnegative(expr)
    >>> @reg.register(Abs)
    ... def f2(expr):
    ...     arg = expr.args[0]
    ...     return Equivalent(~Q.zero(arg), ~Q.zero(expr))

    Calling the registry with expression returns the defined facts for the
    expression.

    >>> from sympy.abc import x
    >>> reg(Abs(x))
    {Q.nonnegative(Abs(x)), Equivalent(~Q.zero(x), ~Q.zero(Abs(x)))}

    Multiple facts can be registered at once by ``multiregister`` method.

    >>> reg2 = ClassFactRegistry()
    >>> @reg2.multiregister(Abs)
    ... def _(expr):
    ...     arg = expr.args[0]
    ...     return [Q.even(arg) >> Q.even(expr), Q.odd(arg) >> Q.odd(expr)]
    >>> reg2(Abs(x))
    {Implies(Q.even(x), Q.even(Abs(x))), Implies(Q.odd(x), Q.odd(Abs(x)))}

    c                 T    t        t              | _        t        t              | _        y N)r   	frozensetsinglefacts
multifacts)selfs    r   __init__zClassFactRegistry.__init__   s    &y1%i0    c                       fd}|S )Nc                 8    j                   xx   | hz  cc<   | S r+   )r-   )funcclsr/   s    r   _z%ClassFactRegistry.register.<locals>._   s     S!dV+!Kr1    )r/   r5   r6   s   `` r   registerzClassFactRegistry.register   s    	 r1   c                       fd}|S )Nc                 F    D ]  }j                   |xx   | hz  cc<    | S r+   )r.   )r4   r5   classesr/   s     r   r6   z*ClassFactRegistry.multiregister.<locals>._   s-     /$.$/Kr1   r7   )r/   r;   r6   s   `` r   multiregisterzClassFactRegistry.multiregister   s    	 r1   c                    | j                   |   }| j                   D ]!  }t        ||      s|| j                   |   z  }# | j                  |   }| j                  D ]!  }t        ||      s|| j                  |   z  }# ||fS r+   )r-   
issubclassr.   )r/   keyret1kret2s        r   __getitem__zClassFactRegistry.__getitem__   s    $!! 	,A#q!((++	, s# 	+A#q!**	+ Tzr1   c                     t               }| t        |         \  }}|D ]  }|j                   ||              |D ]  }|j                   ||              |S r+   )settypeaddupdate)r/   r   ret	handlers1	handlers2hs         r   __call__zClassFactRegistry.__call__   s_    e#DJ/	9 	AGGAdG	 	 AJJqw	 
r1   N)	__name__
__module____qualname____doc__r0   r8   r<   rC   rM   r7   r1   r   r)   r)   h   s!    .^1	r1   r)   xc                    | j                   d   }t        j                  |       t        t        j                  |       t        j                  |              t        j
                  |      t        j
                  |       z	  t        j                  |      t        j                  |       z	  t        j                  |      t        j                  |       z	  gS )Nr   )r   r   nonnegativer   zeroevenoddinteger)r   r   s     r   r6   r6      s    
))A,CMM$s|affTl]3FF3K166$<'EE#J!%%+%IIcNaiio-	 r1   c                    t        t        t        j                  t              |       t        j                  |       z	  t        t        t        j                  t              |       t        j                  |       z	  t        t        t        j
                  t              |       t        j
                  |       z	  t        t        t        j                  t              |       t        j                  |       z	  t        t        t        j                  t              |       t        j                  |       z	  t        t        t        j                  t               |       t        j                  |        z	  gS r+   )	r   rR   r   positivenegativerealrationalrX   r'   r   s    r   r6   r6      s    Aqzz!}d+qzz$/??Aqzz!}d+qzz$/??Aqvvay$'166$<7Aqzz!}d+qzz$/??Aqyy|T*aiio=!aiil]D1aiio5EE r1   c           	          t        t        t        j                  t              |       }t	        t        t        j
                  t              |       }t        |t        |t        j
                  |                   S r+   r   rR   r   r\   r'   
irrationalr   r   allargs_realonearg_irrationals      r   r6   r6      M    1affQi.L%aa$?<):ALL<N!OPPr1   c                 n   t        t        j                  |       t        t        t        j                  t              |             t        t        t        j                  t              |       t        j                  |       z	  t        t        t        j                  t              |       t        j                  |       z	  t        t        t        j                  t              |       t        j                  |       z	  t        t        t        j                  t              |       t        j                  |       z	  t        t        t        j                  t               |       t        j                  |        z	  t        t        t        j                  t              |       t        j                  |       z	  gS r+   )r   r   rU   r   rR   r   rZ   r\   r]   rX   r'   commutativer^   s    r   r6   r6      s    qvvd|VAqvvay$%?@Aqzz!}d+qzz$/??Aqvvay$'166$<7Aqzz!}d+qzz$/??Aqyy|T*aiio=!ajjm^T2qyy6FFAq}}Q'.!--2EE r1   c                     t        t        t        j                  t              |       }t	        |t        j                  |              S r+   )r   rR   r   primer   )r   allargs_primes     r   r6   r6      s1     Aqwwqz40M=1774=.11r1   c           	      (   t        t        t        j                  t              t        j                  t              z  |       }t        t        t        j                  t              |       }t        |t        |t        j                  |                   S r+   )r   rR   r   	imaginaryr\   r'   r   )r   allargs_imag_or_realonearg_imaginarys      r   r6   r6      s^     #1akk!nqvvay&@$G$QA='1A1;;tCT)UVVr1   c           	          t        t        t        j                  t              |       }t	        t        t        j
                  t              |       }t        |t        |t        j
                  |                   S r+   r`   rb   s      r   r6   r6     re   r1   c           	          t        t        t        j                  t              |       }t	        t        t        j
                  t              |       }t        |t        |t        j
                  |                   S r+   )r   rR   r   rX   r   rV   r   r   )r   allargs_integeranyarg_evens      r   r6   r6     sL    
 a1t4OAFF1It,K?J{AFF4L$IJJr1   c                     t        t        t        j                  t              |       }t        t        t        j                  t              |       }t        |t        t        j                  |       |            S r+   )r   rR   r   square
invertibler   r   )r   allargs_squareallargs_invertibles      r   r6   r6     sM    QT2N ALLOT:>:all4.@BT#UVVr1   c           
         | j                   | j                  }}t        j                  |      t        j                  |      z  t        j
                  |      z  t        j
                  |       z	  t        j
                  |      t        j                  |      z  t        j
                  |      z  t        j
                  |       z	  t        j                  |      t        j                  |      z  t        j
                  |      z  t        j                  |       z	  t        t        j                  |       t        j                  |      t        j                  |      z        gS r+   )baseexpr   r\   rV   rT   rW   nonpositiver   rU   rZ   )r   ry   rz   s      r   r6   r6   !  s    		488#D	
s	#ammC&8	8Q]]4=PP	
t	quuSz	)AMM#,>	>1==QUCVV	
t	quuSz	)AMM#,>	>1==QUCVV166$<

3!?@	 r1   c                     | j                   S r+   )is_positiveos    r   <lambda>r   /  
    !-- r1   c                     | j                   S r+   )is_zeror~   s    r   r   r   0  
    aii r1   c                     | j                   S r+   )is_negativer~   s    r   r   r   1  r   r1   c                     | j                   S r+   )is_rationalr~   s    r   r   r   2  r   r1   c                     | j                   S r+   )is_irrationalr~   s    r   r   r   3  s
    AOO r1   c                     | j                   S r+   )is_evenr~   s    r   r   r   4  r   r1   c                     | j                   S r+   )is_oddr~   s    r   r   r   5  s
    QXX r1   c                     | j                   S r+   )is_imaginaryr~   s    r   r   r   6  
    1>> r1   c                     | j                   S r+   )is_primer~   s    r   r   r   7  s
    qzz r1   c                     | j                   S r+   )is_compositer~   s    r   r   r   8  r   r1   c                     g }t         j                         D ]3  \  }} ||       } ||       }||j                  t        ||             5 |S r+   )_old_assump_gettersitemsappendr   )r   rI   pgetterpredprops         r   r6   r6   ;  sU    
C(..0 /	6wd|JJz$-.	/
 Jr1   N)*collectionsr   sympy.assumptions.askr   
sympy.corer   r   r   r   r	   r
   sympy.core.numbersr   $sympy.functions.elementary.complexesr   sympy.logic.boolalgr   r   r   r   sympy.matrices.expressionsr   r   r   r'   r)   class_fact_registryrR   r<   r6   r8   rZ   rU   r[   r]   ra   rV   rW   rl   ri   	compositer   r7   r1   r   <module>r      s%   # # D D , 4 > > -?8>8BW Wr ()  3K ""3' ( ""3' ( c"Q #Q ""3' ( c"2 #2 c"W #W c"Q #Q
 c"K #K f%W &W ""3' ( JJ'FFJJ'JJ'LL+FFEEKK)GG!KK)  ""6<G Hr1   