
    EdI                         d Z ddlmZmZmZ ddl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mZmZ ddlmZ ddlmZ dd	lmZmZmZ  G d
 d          Z e            Zd ZdefdZd Z d Z!d Z"ddl#m$Z$m%Z% dS )z4Module for querying SymPy objects about assumptions.    )global_assumptions	PredicateAppliedPredicate)CNF
EncodedCNFLiteral)sympify)BooleanKind)EqNeGtLtGeLe)satisfiable)memoize_property)sympy_deprecation_warningSymPyDeprecationWarningignore_warningsc                      e Zd ZdZed             Zed             Zed             Zed             Zed             Z	ed             Z
ed             Zed	             Zed
             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Z ed             Z!ed             Z"ed              Z#ed!             Z$ed"             Z%ed#             Z&ed$             Z'ed%             Z(ed&             Z)ed'             Z*ed(             Z+ed)             Z,ed*             Z-ed+             Z.ed,             Z/ed-             Z0ed.             Z1ed/             Z2ed0             Z3ed1             Z4ed2             Z5ed3             Z6ed4             Z7ed5             Z8ed6             Z9ed7             Z:ed8             Z;d9S ):AssumptionKeyszy
    This class contains all the supported keys by ``ask``.
    It should be accessed via the instance ``sympy.Q``.

    c                 "    ddl m}  |            S )N   )HermitianPredicate)handlers.setsr   )selfr   s     5lib/python3.11/site-packages/sympy/assumptions/ask.py	hermitianzAssumptionKeys.hermitian    #    555555!!###    c                 "    ddl m}  |            S )Nr   )AntihermitianPredicate)r   r"   )r   r"   s     r   antihermitianzAssumptionKeys.antihermitian%   s#    999999%%'''r    c                 "    ddl m}  |            S )Nr   )RealPredicate)r   r%   )r   r%   s     r   realzAssumptionKeys.real*   s     000000}r    c                 "    ddl m}  |            S )Nr   )ExtendedRealPredicate)r   r(   )r   r(   s     r   extended_realzAssumptionKeys.extended_real/   s#    888888$$&&&r    c                 "    ddl m}  |            S )Nr   )ImaginaryPredicate)r   r+   )r   r+   s     r   	imaginaryzAssumptionKeys.imaginary4   r   r    c                 "    ddl m}  |            S )Nr   )ComplexPredicate)r   r.   )r   r.   s     r   complexzAssumptionKeys.complex9   #    333333!!!r    c                 "    ddl m}  |            S )Nr   )AlgebraicPredicate)r   r2   )r   r2   s     r   	algebraiczAssumptionKeys.algebraic>   r   r    c                 "    ddl m}  |            S )Nr   )TranscendentalPredicate)predicates.setsr5   )r   r5   s     r   transcendentalzAssumptionKeys.transcendentalC   s#    <<<<<<&&(((r    c                 "    ddl m}  |            S )Nr   )IntegerPredicate)r   r9   )r   r9   s     r   integerzAssumptionKeys.integerH   r0   r    c                 "    ddl m}  |            S )Nr   )RationalPredicate)r   r<   )r   r<   s     r   rationalzAssumptionKeys.rationalM   s#    444444  """r    c                 "    ddl m}  |            S )Nr   )IrrationalPredicate)r   r?   )r   r?   s     r   
irrationalzAssumptionKeys.irrationalR   s#    666666""$$$r    c                 "    ddl m}  |            S )Nr   )FinitePredicate)handlers.calculusrB   )r   rB   s     r   finitezAssumptionKeys.finiteW   "    666666   r    c                 "    ddl m}  |            S )Nr   )InfinitePredicate)rC   rG   )r   rG   s     r   infinitezAssumptionKeys.infinite\   #    888888  """r    c                 "    ddl m}  |            S )Nr   )PositiveInfinitePredicate)rC   rK   )r   rK   s     r   positive_infinitez AssumptionKeys.positive_infinitea   #    @@@@@@((***r    c                 "    ddl m}  |            S )Nr   )NegativeInfinitePredicate)rC   rO   )r   rO   s     r   negative_infinitez AssumptionKeys.negative_infinitef   rM   r    c                 "    ddl m}  |            S )Nr   )PositivePredicate)handlers.orderrR   )r   rR   s     r   positivezAssumptionKeys.positivek   #    555555  """r    c                 "    ddl m}  |            S )Nr   )NegativePredicate)rS   rW   )r   rW   s     r   negativezAssumptionKeys.negativep   rU   r    c                 "    ddl m}  |            S )Nr   )ZeroPredicate)rS   rZ   )r   rZ   s     r   zerozAssumptionKeys.zerou   s     111111}r    c                 "    ddl m}  |            S )Nr   )ExtendedPositivePredicate)rS   r]   )r   r]   s     r   extended_positivez AssumptionKeys.extended_positivez   #    ======((***r    c                 "    ddl m}  |            S )Nr   )ExtendedNegativePredicate)rS   ra   )r   ra   s     r   extended_negativez AssumptionKeys.extended_negative   r_   r    c                 "    ddl m}  |            S )Nr   )NonZeroPredicate)rS   rd   )r   rd   s     r   nonzerozAssumptionKeys.nonzero   s#    444444!!!r    c                 "    ddl m}  |            S )Nr   )NonPositivePredicate)rS   rg   )r   rg   s     r   nonpositivezAssumptionKeys.nonpositive   #    888888##%%%r    c                 "    ddl m}  |            S )Nr   )NonNegativePredicate)rS   rk   )r   rk   s     r   nonnegativezAssumptionKeys.nonnegative   ri   r    c                 "    ddl m}  |            S )Nr   )ExtendedNonZeroPredicate)rS   rn   )r   rn   s     r   extended_nonzerozAssumptionKeys.extended_nonzero   s#    <<<<<<'')))r    c                 "    ddl m}  |            S )Nr   )ExtendedNonPositivePredicate)rS   rq   )r   rq   s     r   extended_nonpositivez#AssumptionKeys.extended_nonpositive   #    @@@@@@++---r    c                 "    ddl m}  |            S )Nr   )ExtendedNonNegativePredicate)rS   ru   )r   ru   s     r   extended_nonnegativez#AssumptionKeys.extended_nonnegative   rs   r    c                 "    ddl m}  |            S )Nr   )EvenPredicate)handlers.ntheoryrx   )r   rx   s     r   evenzAssumptionKeys.even   s     333333}r    c                 "    ddl m}  |            S )Nr   )OddPredicate)ry   r|   )r   r|   s     r   oddzAssumptionKeys.odd   s     222222|~~r    c                 "    ddl m}  |            S )Nr   )PrimePredicate)ry   r   )r   r   s     r   primezAssumptionKeys.prime   s"    444444~r    c                 "    ddl m}  |            S )Nr   )CompositePredicate)ry   r   )r   r   s     r   	compositezAssumptionKeys.composite   s#    888888!!###r    c                 "    ddl m}  |            S )Nr   )CommutativePredicate)handlers.commonr   )r   r   s     r   commutativezAssumptionKeys.commutative   s#    999999##%%%r    c                 "    ddl m}  |            S )Nr   )IsTruePredicate)r   r   )r   r   s     r   is_truezAssumptionKeys.is_true   s"    444444   r    c                 "    ddl m}  |            S )Nr   )SymmetricPredicate)handlers.matricesr   )r   r   s     r   	symmetriczAssumptionKeys.symmetric   s#    999999!!###r    c                 "    ddl m}  |            S )Nr   )InvertiblePredicate)r   r   )r   r   s     r   
invertiblezAssumptionKeys.invertible   #    ::::::""$$$r    c                 "    ddl m}  |            S )Nr   )OrthogonalPredicate)r   r   )r   r   s     r   
orthogonalzAssumptionKeys.orthogonal   r   r    c                 "    ddl m}  |            S )Nr   )UnitaryPredicate)r   r   )r   r   s     r   unitaryzAssumptionKeys.unitary   s#    777777!!!r    c                 "    ddl m}  |            S )Nr   )PositiveDefinitePredicate)r   r   )r   r   s     r   positive_definitez AssumptionKeys.positive_definite   rM   r    c                 "    ddl m}  |            S )Nr   )UpperTriangularPredicate)r   r   )r   r   s     r   upper_triangularzAssumptionKeys.upper_triangular   #    ??????'')))r    c                 "    ddl m}  |            S )Nr   )LowerTriangularPredicate)r   r   )r   r   s     r   lower_triangularzAssumptionKeys.lower_triangular   r   r    c                 "    ddl m}  |            S )Nr   )DiagonalPredicate)r   r   )r   r   s     r   diagonalzAssumptionKeys.diagonal   rI   r    c                 "    ddl m}  |            S )Nr   )FullRankPredicate)r   r   )r   r   s     r   fullrankzAssumptionKeys.fullrank   rI   r    c                 "    ddl m}  |            S )Nr   )SquarePredicate)r   r   )r   r   s     r   squarezAssumptionKeys.square   rE   r    c                 "    ddl m}  |            S )Nr   )IntegerElementsPredicate)r   r   )r   r   s     r   integer_elementszAssumptionKeys.integer_elements   r   r    c                 "    ddl m}  |            S )Nr   )RealElementsPredicate)r   r   )r   r   s     r   real_elementszAssumptionKeys.real_elements   s#    <<<<<<$$&&&r    c                 "    ddl m}  |            S )Nr   )ComplexElementsPredicate)r   r   )r   r   s     r   complex_elementszAssumptionKeys.complex_elements   r   r    c                 "    ddl m}  |            S )Nr   )SingularPredicate)predicates.matricesr   )r   r   s     r   singularzAssumptionKeys.singular  s#    ::::::  """r    c                 "    ddl m}  |            S )Nr   )NormalPredicate)r   r   )r   r   s     r   normalzAssumptionKeys.normal  s"    888888   r    c                 "    ddl m}  |            S )Nr   )TriangularPredicate)r   r   )r   r   s     r   
triangularzAssumptionKeys.triangular  s#    <<<<<<""$$$r    c                 "    ddl m}  |            S )Nr   )UnitTriangularPredicate)r   r   )r   r   s     r   unit_triangularzAssumptionKeys.unit_triangular  s#    @@@@@@&&(((r    c                 "    ddl m}  |            S )Nr   )EqualityPredicate)relation.equalityr   )r   r   s     r   eqzAssumptionKeys.eq  rI   r    c                 "    ddl m}  |            S )Nr   )UnequalityPredicate)r   r   )r   r   s     r   nezAssumptionKeys.ne  r   r    c                 "    ddl m}  |            S )Nr   )StrictGreaterThanPredicate)r   r   )r   r   s     r   gtzAssumptionKeys.gt  s#    AAAAAA))+++r    c                 "    ddl m}  |            S )Nr   )GreaterThanPredicate)r   r   )r   r   s     r   gezAssumptionKeys.ge$  s#    ;;;;;;##%%%r    c                 "    ddl m}  |            S )Nr   )StrictLessThanPredicate)r   r   )r   r   s     r   ltzAssumptionKeys.lt)  s#    >>>>>>&&(((r    c                 "    ddl m}  |            S )Nr   )LessThanPredicate)r   r   )r   r   s     r   lezAssumptionKeys.le.  rI   r    N)<__name__
__module____qualname____doc__r   r   r#   r&   r)   r,   r/   r3   r7   r:   r=   r@   rD   rH   rL   rP   rT   rX   r[   r^   rb   re   rh   rl   ro   rr   rv   rz   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r    r   r   r      s"         $ $ $ ( ( (    ' ' ' $ $ $ " " " $ $ $ ) ) ) " " " # # # % % % ! ! ! # # # + + + + + + # # # # # #    + + + + + + " " " & & & & & & * * * . . . . . .             $ $ $ & & & ! ! ! $ $ $ % % % % % % " " " + + + * * * * * * # # # # # # ! ! ! * * * ' ' ' * * * # # # ! ! ! % % % ) ) ) # # # % % % , , , & & & ) ) ) # # # # #r    r   c                    t                      }| j        D ]}g }|D ]|}t          |j        t                    r`t          |j        j                  dk    rC|j        j        |v r3|                    t          |j        j
        |j                             z n%}|r"|                    t          |                     t          |          S )a  
    Extract all relevant assumptions from *assump* with respect to given *exprs*.

    Parameters
    ==========

    assump : sympy.assumptions.cnf.CNF

    exprs : tuple of expressions

    Returns
    =======

    sympy.assumptions.cnf.CNF

    Examples
    ========

    >>> from sympy import Q
    >>> from sympy.assumptions.cnf import CNF
    >>> from sympy.assumptions.ask import _extract_all_facts
    >>> from sympy.abc import x, y
    >>> assump = CNF.from_prop(Q.positive(x) & Q.integer(y))
    >>> exprs = (x,)
    >>> cnf = _extract_all_facts(assump, exprs)
    >>> cnf.clauses
    {frozenset({Literal(Q.positive, False)})}

    r   )setclauses
isinstancelitr   len	argumentsargappendr   functionis_Notadd	frozensetr   )assumpexprsfactsclauseargsliterals         r   _extract_all_factsr   6  s    < EEE. + + 
	+ 
	+G'+'788 SAV=W=W[\=\ ;?e+ KK(<gn M MNNNN E +		)D//***u::r    Tc                    ddl m} t          |           } t          |          }t          | t                    s| j        t          urt          d          t          |t                    s|j        t          urt          d          t          t          j
        t          t          j        t          t          j        t          t          j        t"          t          j        t&          t          j        i}t          | t*                    r| j        | j        }}n5| j        |v r|t3          |                    | j        }}nt          j        | f}}t9          j        |          }|                    |           t?          ||          }tA                      }	tC                      }
|
"                    t9          |	                     |
#                    |           |j$        r#tK          |
          du rtM          d|z            tO          ||          }||S  || (                    |          }|tS          |          S  || ||          }|S )	a	  
    Function to evaluate the proposition with assumptions.

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

    This function evaluates the proposition to ``True`` or ``False`` if
    the truth value can be determined. If not, it returns ``None``.

    It should be discerned from :func:`~.refine()` which, when applied to a
    proposition, simplifies the argument to symbolic ``Boolean`` instead of
    Python built-in ``True``, ``False`` or ``None``.

    **Syntax**

        * ask(proposition)
            Evaluate the *proposition* in global assumption context.

        * ask(proposition, assumptions)
            Evaluate the *proposition* with respect to *assumptions* in
            global assumption context.

    Parameters
    ==========

    proposition : Any boolean expression.
        Proposition which will be evaluated to boolean value. If this is
        not ``AppliedPredicate``, it will be wrapped by ``Q.is_true``.

    assumptions : Any boolean expression, optional.
        Local assumptions to evaluate the *proposition*.

    context : AssumptionsContext, optional.
        Default assumptions to evaluate the *proposition*. By default,
        this is ``sympy.assumptions.global_assumptions`` variable.

    Returns
    =======

    ``True``, ``False``, or ``None``

    Raises
    ======

    TypeError : *proposition* or *assumptions* is not valid logical expression.

    ValueError : assumptions are inconsistent.

    Examples
    ========

    >>> from sympy import ask, Q, pi
    >>> from sympy.abc import x, y
    >>> ask(Q.rational(pi))
    False
    >>> ask(Q.even(x*y), Q.even(x) & Q.integer(y))
    True
    >>> ask(Q.prime(4*x), Q.integer(x))
    False

    If the truth value cannot be determined, ``None`` will be returned.

    >>> print(ask(Q.odd(3*x))) # cannot determine unless we know x
    None

    ``ValueError`` is raised if assumptions are inconsistent.

    >>> ask(Q.integer(x), Q.even(x) & Q.odd(x))
    Traceback (most recent call last):
      ...
    ValueError: inconsistent assumptions Q.even(x) & Q.odd(x)

    Notes
    =====

    Relations in assumptions are not implemented (yet), so the following
    will not give a meaningful result.

    >>> ask(Q.positive(x), x > 0)

    It is however a work in progress.

    See Also
    ========

    sympy.assumptions.refine.refine : Simplification using assumptions.
        Proposition is not reduced to ``None`` if the truth value cannot
        be determined.
    r   )sataskz.proposition must be a valid logical expressionz.assumptions must be a valid logical expressionFzinconsistent assumptions %sN)assumptionscontext)*sympy.assumptions.sataskr   r	   r   r   kindr
   	TypeErrorr   Qr   r   r   r   r   r   r   r   r   r   r   r   r   r   functyper   r   r   	from_propextendr   get_all_known_factsr   from_cnfadd_from_cnfr   r   
ValueError_ask_single_fact	_eval_askbool)propositionr   r   r   binrelpredskeyr   
assump_cnflocal_factsknown_facts_cnfenc_cnfress               r   askr	  f  s8   t 0/////+&&K+&&K+y)) J[-=[-P JHIII+y)) J[-=[-P JHIIIqtRr14QT2qtRNK+/00 .(+*?T		[	( .[ 1 12K4DTI~T {++Jg %Z66K *++OllGS))***%%%  F{733u< F6DEEE 3
,
,C
 
 #t*

{
+
+C
 Cyy &+w
G
G
GCJr    c                    |j         rt                      }t          |j                   dk    r`|j         \  }t          |          dk    rD|\  }|                    | d          }||d         nt	                      }|j        r|j        |v rdS |j         D ]S}t          |          dk    r>|\  }|j        s|                    |j        d          nd}|@|\  }}| |v r dS | |v r dS TdS )a  
    Compute the truth value of single predicate using assumptions.

    Parameters
    ==========

    key : sympy.assumptions.assume.Predicate
        Proposition predicate.

    local_facts : sympy.assumptions.cnf.CNF
        Local assumption in CNF form.

    Returns
    =======

    ``True``, ``False`` or ``None``

    Examples
    ========

    >>> from sympy import Q
    >>> from sympy.assumptions.cnf import CNF
    >>> from sympy.assumptions.ask import _ask_single_fact

    If prerequisite of proposition is rejected by the assumption,
    return ``False``.

    >>> key, assump = Q.zero, ~Q.zero
    >>> local_facts = CNF.from_prop(assump)
    >>> _ask_single_fact(key, local_facts)
    False
    >>> key, assump = Q.zero, ~Q.even
    >>> local_facts = CNF.from_prop(assump)
    >>> _ask_single_fact(key, local_facts)
    False

    If assumption implies the proposition, return ``True``.

    >>> key, assump = Q.even, Q.zero
    >>> local_facts = CNF.from_prop(assump)
    >>> _ask_single_fact(key, local_facts)
    True

    If proposition rejects the assumption, return ``False``.

    >>> key, assump = Q.even, Q.odd
    >>> local_facts = CNF.from_prop(assump)
    >>> _ask_single_fact(key, local_facts)
    False
    r   Nr   FT)r   get_known_facts_dictr   getr   r   r   )	r  r  known_facts_dictclf
prop_factsprop_reqr   prop_rejs	            r   r   r     s1   f  !/11{"##q( 	!%CB2ww!| !-11#t<<
,6M:a==8 ! 1 ! 5!) 	! 	!F6{{a !FGhX-11!%>>>TX
 %/"((? !44H_ ! 554r    c                    t          ddd           t          | t                    r| j        j        } t	          t
          | d          }||                    |           dS t          t
          | t          | |g                     dS )z
    Register a handler in the ask system. key must be a string and handler a
    class inheriting from AskHandler.

    .. deprecated:: 1.8.
        Use multipledispatch handler instead. See :obj:`~.Predicate`.

    z
        The AskHandler system is deprecated. The register_handler() function
        should be replaced with the multipledispatch handler of Predicate.
        1.8deprecated-askhandlerdeprecated_since_versionactive_deprecations_targetN)handlers)r   r   r   namegetattrr   add_handlersetattr)r  handlerQkeys      r   register_handlerr   F  s     	 "'#:    #y!! hm1c4  D <!!!!!3	#	:::;;;;;r    c                    t          ddd           t          | t                    r| j        j        } t	          t
                    5  t          t          |                               |           ddd           dS # 1 swxY w Y   dS )z
    Removes a handler from the ask system. Same syntax as register_handler

    .. deprecated:: 1.8.
        Use multipledispatch handler instead. See :obj:`~.Predicate`.

    z
        The AskHandler system is deprecated. The remove_handler() function
        should be replaced with the multipledispatch handler of Predicate.
        r  r  r  N)	r   r   r   r  r   r   r  r   remove_handler)r  r  s     r   r"  r"  `  s     	 "'#:    #y!! hm	0	1	1 0 03&&w///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0s   )A>>BB)r   r  N)&r   sympy.assumptions.assumer   r   r   sympy.assumptions.cnfr   r   r   
sympy.corer	   sympy.core.kindr
   sympy.core.relationalr   r   r   r   r   r   sympy.logic.inferencer   sympy.utilities.decoratorr   sympy.utilities.exceptionsr   r   r   r   r   r   r	  r   r   r"  sympy.assumptions.ask_generatedr   r  r   r    r   <module>r,     s   : :          : : : : : : : : : :       ' ' ' ' ' ' 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 - - - - - - 6 6 6 6 6 69 9 9 9 9 9 9 9 9 9\# \# \# \# \# \# \# \#~ N- - -` "&/A J J J JZP P Pf< < <40 0 0.         r    