
    wgK                         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% y)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;ed9        Z<y:);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     Z/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/sympy/assumptions/ask.py	hermitianzAssumptionKeys.hermitian        5!##    c                     ddl m}  |       S )Nr   )AntihermitianPredicate)r   r"   )r   r"   s     r   antihermitianzAssumptionKeys.antihermitian%   s    9%''r    c                     ddl m}  |       S )Nr   )RealPredicate)r   r%   )r   r%   s     r   realzAssumptionKeys.real*   s    0r    c                     ddl m}  |       S )Nr   )ExtendedRealPredicate)r   r(   )r   r(   s     r   extended_realzAssumptionKeys.extended_real/   s    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!!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   )NonIntegerPredicate)r6   r<   )r   r<   s     r   
nonintegerzAssumptionKeys.nonintegerM   s    8"$$r    c                     ddl m}  |       S )Nr   )RationalPredicate)r   r?   )r   r?   s     r   rationalzAssumptionKeys.rationalR   s    4 ""r    c                     ddl m}  |       S )Nr   )IrrationalPredicate)r   rB   )r   rB   s     r   
irrationalzAssumptionKeys.irrationalW   s    6"$$r    c                     ddl m}  |       S )Nr   )FinitePredicate)handlers.calculusrE   )r   rE   s     r   finitezAssumptionKeys.finite\       6  r    c                     ddl m}  |       S )Nr   )InfinitePredicate)rF   rJ   )r   rJ   s     r   infinitezAssumptionKeys.infinitea       8 ""r    c                     ddl m}  |       S )Nr   )PositiveInfinitePredicate)rF   rN   )r   rN   s     r   positive_infinitez AssumptionKeys.positive_infinitef       @(**r    c                     ddl m}  |       S )Nr   )NegativeInfinitePredicate)rF   rR   )r   rR   s     r   negative_infinitez AssumptionKeys.negative_infinitek   rP   r    c                     ddl m}  |       S )Nr   )PositivePredicate)handlers.orderrU   )r   rU   s     r   positivezAssumptionKeys.positivep       5 ""r    c                     ddl m}  |       S )Nr   )NegativePredicate)rV   rZ   )r   rZ   s     r   negativezAssumptionKeys.negativeu   rX   r    c                     ddl m}  |       S )Nr   )ZeroPredicate)rV   r]   )r   r]   s     r   zerozAssumptionKeys.zeroz   s    1r    c                     ddl m}  |       S )Nr   )ExtendedPositivePredicate)rV   r`   )r   r`   s     r   extended_positivez AssumptionKeys.extended_positive       =(**r    c                     ddl m}  |       S )Nr   )ExtendedNegativePredicate)rV   rd   )r   rd   s     r   extended_negativez AssumptionKeys.extended_negative   rb   r    c                     ddl m}  |       S )Nr   )NonZeroPredicate)rV   rg   )r   rg   s     r   nonzerozAssumptionKeys.nonzero   s    4!!r    c                     ddl m}  |       S )Nr   )NonPositivePredicate)rV   rj   )r   rj   s     r   nonpositivezAssumptionKeys.nonpositive       8#%%r    c                     ddl m}  |       S )Nr   )NonNegativePredicate)rV   rn   )r   rn   s     r   nonnegativezAssumptionKeys.nonnegative   rl   r    c                     ddl m}  |       S )Nr   )ExtendedNonZeroPredicate)rV   rq   )r   rq   s     r   extended_nonzerozAssumptionKeys.extended_nonzero   s    <'))r    c                     ddl m}  |       S )Nr   )ExtendedNonPositivePredicate)rV   rt   )r   rt   s     r   extended_nonpositivez#AssumptionKeys.extended_nonpositive       @+--r    c                     ddl m}  |       S )Nr   )ExtendedNonNegativePredicate)rV   rx   )r   rx   s     r   extended_nonnegativez#AssumptionKeys.extended_nonnegative   rv   r    c                     ddl m}  |       S )Nr   )EvenPredicate)handlers.ntheoryr{   )r   r{   s     r   evenzAssumptionKeys.even   s    3r    c                     ddl m}  |       S )Nr   )OddPredicate)r|   r   )r   r   s     r   oddzAssumptionKeys.odd   s    2~r    c                     ddl m}  |       S )Nr   )PrimePredicate)r|   r   )r   r   s     r   primezAssumptionKeys.prime   s    4r    c                     ddl m}  |       S )Nr   )CompositePredicate)r|   r   )r   r   s     r   	compositezAssumptionKeys.composite   s    8!##r    c                     ddl m}  |       S )Nr   )CommutativePredicate)handlers.commonr   )r   r   s     r   commutativezAssumptionKeys.commutative   s    9#%%r    c                     ddl m}  |       S )Nr   )IsTruePredicate)r   r   )r   r   s     r   is_truezAssumptionKeys.is_true   s    4  r    c                     ddl m}  |       S )Nr   )SymmetricPredicate)handlers.matricesr   )r   r   s     r   	symmetriczAssumptionKeys.symmetric   s    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!!r    c                     ddl m}  |       S )Nr   )PositiveDefinitePredicate)r   r   )r   r   s     r   positive_definitez AssumptionKeys.positive_definite   rP   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   rL   r    c                     ddl m}  |       S )Nr   )FullRankPredicate)r   r   )r   r   s     r   fullrankzAssumptionKeys.fullrank   rL   r    c                     ddl m}  |       S )Nr   )SquarePredicate)r   r   )r   r   s     r   squarezAssumptionKeys.square   rH   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  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  rL   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)++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.le3  rL   r    N)=__name__
__module____qualname____doc__r   r   r#   r&   r)   r,   r/   r3   r7   r:   r=   r@   rC   rG   rK   rO   rS   rW   r[   r^   ra   re   rh   rk   ro   rr   ru   ry   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   r      sg    $ $ ( (   ' ' $ $ " " $ $ ) ) " " % % # # % % ! ! # # + + + + # # # #   + + + + " " & & & & * * . . . .         $ $ & & ! ! $ $ % % % % " " + + * * * * # # # # ! ! * * ' ' * * # # ! ! % % ) ) # # % % , , & & ) ) # #r    r   c                    t               }| j                  D ]  }g }|D ]  }t        |j                  t              rvt        |j                  j                        dk(  rT|j                  j                  |v r:|j                  t        |j                  j                  |j                                  |s|j                  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   ;  s    < EE.. + 	+G'++'78SAVAV=W[\=\;;??e+KK(<(<gnn MN  	+ 		)D/*!+" u:r    Tc                    ddl m} ddlm} 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        j0                  i}t        | t2              r| j4                  | j6                  }}n<| j8                  |v r|t;        |          | j<                  }}nt        j>                  | f}}tA        jB                  |      }	|	jE                  |       tG        |	|      }
tI               }tK               }|jM                  tA        |             |jO                  |
       |
jP                  rtS        |      du rtU        d|z        tW        ||
      }||S  || jY                  |      }|t[        |      S  || ||
      }||S 	  || ||
      }|S # |$ r Y y	w xY w)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 : Boolean
        Proposition which will be evaluated to boolean value. If this is
        not ``AppliedPredicate``, it will be wrapped by ``Q.is_true``.

    assumptions : Boolean, 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   )satask)
lra_satask)UnhandledInputz.proposition must be a valid logical expressionz.assumptions must be a valid logical expressionFzinconsistent assumptions %sN)assumptionscontext).sympy.assumptions.sataskr   sympy.assumptions.lra_sataskr   !sympy.logic.algorithms.lra_theoryr   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   r   r   binrelpredskeyr   
assump_cnflocal_factsknown_facts_cnfenc_cnfress                 r   askr  o  s   t 07@+&K+&K+y)[-=-=[-PHII+y)[-=-=[-PHIIqttRr144QTT2qttRNK+/0((+*?*?T			[	([ 12K4D4DTII~T {+Jg %Z6K *+OlGS)*% {73u<6DEE 3
,C

 t*

{
+C
Cy +w
GC

+wO J  s   ;I IIc                    |j                   rt               }t        |j                         dk(  r^|j                   \  }t        |      dk(  rB|\  }|j                  | d      }||d   n	t	               }|j
                  r|j                  |v ry|j                   D ]S  }t        |      dk(  s|\  }|j
                  s|j                  |j                  d      nd}|C|\  }}| |v r y| |v sS y y)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    s    f /1{""#q(%%CB2w!|-11#t<
,6,B:a=88 1 !)) 	!F6{aFGhh-11!%%>TX
%%/"((?H_ 	! r    c                     t        ddd       t        | t              r| j                  j                  } t	        t
        | d      }||j                  |       yt        t
        | t        | |g             y)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'  Y  si     	 "'#: #y!hhmm1c4 D!3	#	:;r    c                     t        ddd       t        | t              r| j                  j                  } t	        t
              5  t        t        |       j                  |       ddd       y# 1 sw Y   yxY w)z
    Removes a handler from the ask system.

    .. 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  sd     	 "'#: #y!hhmm	0	1 03&&w/0 0 0s    A--A6)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>r3     s{    :  : :  ' 8 8 - 69 9a# a#H	 1h "&/A TnPf<40. r    