
    Ed$                        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                    e          d             Ze                    e          d             Ze                    e          d             Ze                    e          d             Ze                    e          d             Ze                    e          d             Ze                    e          d             Ze                    e          d             Ze                    e          d             Ze                    e          d             Zej        d ej         d ej!        d ej"        d ej#        d ej$        d ej%        d ej&        d ej'        d  ej(        d! i
Z)e                    ee	e          d"             Zd#S )$    )defaultdict)Q)AddMulPowNumberNumberSymbolSymbol)ImaginaryUnit)Abs)
EquivalentAndOrImplies)MatMulc                 <     t           fd|j        D              S )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))

    c                 <    g | ]}                     |          S  subs.0argfactsymbols     =lib/python3.11/site-packages/sympy/assumptions/sathandlers.py
<listcomp>zallargs.<locals>.<listcomp>(   '    ===C63''===    )r   argsr   r   exprs   `` r   allargsr#      s+    2 =====49===>>r   c                 <     t           fd|j        D              S )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))

    c                 <    g | ]}                     |          S r   r   r   s     r   r   zanyarg.<locals>.<listcomp>D   s'    <<<3		&#&&<<<r   )r   r    r!   s   `` r   anyargr&   +   s+    2 <<<<<$)<<<==r   c                       fd|j         D             t          fdt          t                              D              }|S )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))

    c                 <    g | ]}                     |          S r   r   r   s     r   r   z!exactlyonearg.<locals>.<listcomp>`   r   r   c           
      v    g | ]5}t          |         gd  d|         |dz   d         z   D             R  6S )c                     g | ]}| S r   r   )r   lits     r   r   z,exactlyonearg.<locals>.<listcomp>.<listcomp>a   s&     # # #CC4 # # #r   N   )r   )r   i	pred_argss     r   r   z!exactlyonearg.<locals>.<listcomp>a   sz     : : : 9Q<  # #9RaR=!A#$$4 # # #    : : :r   )r    r   rangelen)r   r   r"   resr.   s   ``  @r   exactlyoneargr2   G   sh    2 >====49===I
 : : : :#(Y#8#8: : : ;CJr   c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )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                 j    t          t                    | _        t          t                    | _        d S N)r   	frozensetsinglefacts
multifacts)selfs    r   __init__zClassFactRegistry.__init__   s%    &y11%i00r   c                       fd}|S )Nc                 4    j         xx         | hz  cc<   | S r6   )r8   )funcclsr:   s    r   _z%ClassFactRegistry.register.<locals>._   s)    S!!!dV+!!!Kr   r   )r:   r?   r@   s   `` r   registerzClassFactRegistry.register   s)    	 	 	 	 	 	 r   c                       fd}|S )Nc                 >    D ]}j         |xx         | hz  cc<   | S r6   )r9   )r>   r?   classesr:   s     r   r@   z*ClassFactRegistry.multiregister.<locals>._   s:     / /$$$.$$$$Kr   r   )r:   rD   r@   s   `` r   multiregisterzClassFactRegistry.multiregister   s)    	 	 	 	 	 	 r   c                     | j         |         }| j         D ]"}t          ||          r|| j         |         z  }#| j        |         }| j        D ]"}t          ||          r|| j        |         z  }#||fS r6   )r8   
issubclassr9   )r:   keyret1kret2s        r   __getitem__zClassFactRegistry.__getitem__   s    $! 	, 	,A#q!! ,(++s# 	+ 	+A#q!! +**Tzr   c                     t                      }| t          |                   \  }}|D ] }|                     ||                     !|D ] }|                     ||                     !|S r6   )settypeaddupdate)r:   r"   ret	handlers1	handlers2hs         r   __call__zClassFactRegistry.__call__   s}    ee#DJJ/	9 	 	AGGAAdGG 	  	 AJJqqww
r   N)	__name__
__module____qualname____doc__r;   rA   rE   rL   rV   r   r   r   r4   r4   h   sj        . .^1 1 1      	 	 	 	 	r   r4   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   r@   r@      s    
)A,CM$s|afTll]33F3KK16$<<'E#JJ!%++%IcNNaioo-	 r   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 r6   )	r#   r[   r   positivenegativerealrationalra   r2   r"   s    r   r@   r@      s    Aqz!}}d++qz$/?/??Aqz!}}d++qz$/?/??Aqvayy$''16$<<7Aqz!}}d++qz$/?/??Aqy||T**aioo=!aill]D11aioo5EE r   c           	         t          t          t          j        t                    |           }t	          t          t          j        t                    |           }t          |t          |t          j        |                               S r6   r#   r[   r   re   r2   
irrationalr   r"   allargs_realonearg_irrationals      r   r@   r@      Z    1afQii..L%aa$??<):AL<N<N!O!OPPPr   c                    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 r6   )r   r   r^   r&   r[   r#   rc   re   rf   ra   r2   commutativerg   s    r   r@   r@      s   qvd||VAqvayy$%?%?@@Aqz!}}d++qz$/?/??Aqvayy$''16$<<7Aqz!}}d++qz$/?/??Aqy||T**aioo=!ajmm^T22qy6FFAq}Q''..!-2E2EE r   c                     t          t          t          j        t                    |           }t	          |t          j        |                      S r6   )r#   r[   r   primer   )r"   allargs_primes     r   r@   r@      s7     Aqwqzz400M=174==.111r   c           	      J   t          t          t          j        t                    t          j        t                    z  |           }t          t          t          j        t                    |           }t          |t          |t          j        |                               S r6   )r#   r[   r   	imaginaryre   r2   r   )r"   allargs_imag_or_realonearg_imaginarys      r   r@   r@      sk     #1ak!nnqvayy&@$GG$QA=='1A1;tCTCT)U)UVVVr   c           	         t          t          t          j        t                    |           }t	          t          t          j        t                    |           }t          |t          |t          j        |                               S r6   ri   rk   s      r   r@   r@     rn   r   c           	         t          t          t          j        t                    |           }t	          t          t          j        t                    |           }t          |t          |t          j        |                               S r6   )r#   r[   r   ra   r&   r_   r   r   )r"   allargs_integeranyarg_evens      r   r@   r@     sX    
 a1t44OAF1IIt,,K?J{AF4LL$I$IJJJr   c                    t          t          t          j        t                    |           }t          t          t          j        t                    |           }t          |t          t          j        |           |                    S r6   )r#   r[   r   square
invertibler   r   )r"   allargs_squareallargs_invertibles      r   r@   r@     sZ    QT22N ALOOT::>:al4.@.@BT#U#UVVVr   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 r6   )baseexpr   re   r_   r]   r`   nonpositiver   r^   rc   )r"   r   r   s      r   r@   r@   !  s    	48#D	
s	#amC&8&8	8Q]4=P=PP	
t		quSzz	)AM#,>,>	>1=QUCVCVV	
t		quSzz	)AM#,>,>	>1=QUCVCVV16$<<
3!?@@	 r   c                     | j         S r6   )is_positiveos    r   <lambda>r   /      !- r   c                     | j         S r6   )is_zeror   s    r   r   r   0      ai r   c                     | j         S r6   )is_negativer   s    r   r   r   1  r   r   c                     | j         S r6   )is_rationalr   s    r   r   r   2  r   r   c                     | j         S r6   )is_irrationalr   s    r   r   r   3  s    AO r   c                     | j         S r6   )is_evenr   s    r   r   r   4  r   r   c                     | j         S r6   )is_oddr   s    r   r   r   5  s    QX r   c                     | j         S r6   )is_imaginaryr   s    r   r   r   6      1> r   c                     | j         S r6   )is_primer   s    r   r   r   7  s    qz r   c                     | j         S r6   )is_compositer   s    r   r   r   8  r   r   c                     g }t                                           D ]@\  }} ||           } ||           }|#|                    t          ||                     A|S r6   )_old_assump_gettersitemsappendr   )r"   rR   pgetterpredprops         r   r@   r@   ;  sj    
C(..00 / /	6qwwvd|| 	/JJz$--...Jr   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&   r2   r4   class_fact_registryr[   rE   r@   rA   rc   r^   rd   rf   rj   r_   r`   ru   rr   	compositer   r   r   r   <module>r      s   # # # # # # # # # # # # D D D D D D D D D D D D D D D D , , , , , , 4 4 4 4 4 4 > > > > > > > > > > > > - - - - - -? ? ?8> > >8  BW W W W W W W Wr ('))  F3KK ""3''  (' ""3''  (' c""Q Q #"Q ""3''  (' c""2 2 #"2 c""W W #"W c""Q Q #"Q
 c""K K #"K f%%W W &%W ""3''  (' J''FJ''J''L++FEK))G!!K))  ""6<GG  HG  r   