
    gK                         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;ed9             Z<d:S );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     Q/var/www/html/ai-engine/env/lib/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   )NonIntegerPredicate)r6   r<   )r   r<   s     r   
nonintegerzAssumptionKeys.nonintegerM   s#    888888""$$$r    c                 "    ddl m}  |            S )Nr   )RationalPredicate)r   r?   )r   r?   s     r   rationalzAssumptionKeys.rationalR   s#    444444  """r    c                 "    ddl m}  |            S )Nr   )IrrationalPredicate)r   rB   )r   rB   s     r   
irrationalzAssumptionKeys.irrationalW   s#    666666""$$$r    c                 "    ddl m}  |            S )Nr   )FinitePredicate)handlers.calculusrE   )r   rE   s     r   finitezAssumptionKeys.finite\   "    666666   r    c                 "    ddl m}  |            S )Nr   )InfinitePredicate)rF   rJ   )r   rJ   s     r   infinitezAssumptionKeys.infinitea   #    88888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5555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1111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44444!!!r    c                 "    ddl m}  |            S )Nr   )NonPositivePredicate)rV   rj   )r   rj   s     r   nonpositivezAssumptionKeys.nonpositive   #    88888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33333}r    c                 "    ddl m}  |            S )Nr   )OddPredicate)r|   r   )r   r   s     r   oddzAssumptionKeys.odd   s     222222|~~r    c                 "    ddl m}  |            S )Nr   )PrimePredicate)r|   r   )r   r   s     r   primezAssumptionKeys.prime   s"    444444~r    c                 "    ddl m}  |            S )Nr   )CompositePredicate)r|   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   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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  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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.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      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& 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   ;  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} 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          j        i}t          | t2                    r| j        | j        }}n5| j        |v r|t;          |                    | j        }}nt          j        | f}}tA          j!        |          }	|	"                    |           tG          |	|          }
tI                      }tK                      }|&                    tA          |                     |'                    |
           |
j(        r#tS          |          du rtU          d|z            tW          ||
          }||S  || ,                    |          }|t[          |          S  || ||
          }||S 	  || ||
          }n# |$ r Y d	S w xY w|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 : 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77777@@@@@@+&&K+&&K+y)) J[-=[-P-PHIII+y)) J[-=[-P-P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<<6DEEE 3
,
,C

 #t*

{
+
+C
Cyy &+w
G
G
GC

j+wOOO   tt Js   I+ +I43I4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    s    f  !/11{"##q((%CB2ww!||-11#t<<
,6,B:a==8 ! 1 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'  Y  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.

    .. 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  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>r3     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a# a# a# a# a# a# a# a#H	 N1 1 1h "&/A T T T TnP P Pf< < <40 0 0.         r    