a
    RG5dI                     @   s   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 dZe Zdd ZdefddZdd Z dd Z!d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                   @   s  e Zd ZdZedd Zedd Zedd Zedd	 Zed
d Z	edd Z
edd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zed d! Zed"d# Zed$d% Zed&d' Zed(d) Zed*d+ Zed,d- Zed.d/ Zed0d1 Zed2d3 Zed4d5 Zed6d7 Zed8d9 Z ed:d; Z!ed<d= Z"ed>d? Z#ed@dA Z$edBdC Z%edDdE Z&edFdG Z'edHdI Z(edJdK Z)edLdM Z*edNdO Z+edPdQ Z,edRdS Z-edTdU Z.edVdW Z/edXdY Z0edZd[ Z1ed\d] Z2ed^d_ Z3ed`da Z4edbdc Z5eddde Z6edfdg Z7edhdi Z8edjdk Z9edldm Z:edndo Z;dpS )qAssumptionKeyszy
    This class contains all the supported keys by ``ask``.
    It should be accessed via the instance ``sympy.Q``.

    c                 C   s   ddl m} | S )N   )HermitianPredicate)handlers.setsr   )selfr    r   Q/var/www/html/django/DPS/env/lib/python3.9/site-packages/sympy/assumptions/ask.py	hermitian    s    zAssumptionKeys.hermitianc                 C   s   ddl m} | S )Nr   )AntihermitianPredicate)r   r   )r   r   r   r   r   antihermitian%   s    zAssumptionKeys.antihermitianc                 C   s   ddl m} | S )Nr   )RealPredicate)r   r   )r   r   r   r   r   real*   s    zAssumptionKeys.realc                 C   s   ddl m} | S )Nr   )ExtendedRealPredicate)r   r!   )r   r!   r   r   r   extended_real/   s    zAssumptionKeys.extended_realc                 C   s   ddl m} | S )Nr   )ImaginaryPredicate)r   r#   )r   r#   r   r   r   	imaginary4   s    zAssumptionKeys.imaginaryc                 C   s   ddl m} | S )Nr   )ComplexPredicate)r   r%   )r   r%   r   r   r   complex9   s    zAssumptionKeys.complexc                 C   s   ddl m} | S )Nr   )AlgebraicPredicate)r   r'   )r   r'   r   r   r   	algebraic>   s    zAssumptionKeys.algebraicc                 C   s   ddl m} | S )Nr   )TranscendentalPredicate)Zpredicates.setsr)   )r   r)   r   r   r   transcendentalC   s    zAssumptionKeys.transcendentalc                 C   s   ddl m} | S )Nr   )IntegerPredicate)r   r+   )r   r+   r   r   r   integerH   s    zAssumptionKeys.integerc                 C   s   ddl m} | S )Nr   )RationalPredicate)r   r-   )r   r-   r   r   r   rationalM   s    zAssumptionKeys.rationalc                 C   s   ddl m} | S )Nr   )IrrationalPredicate)r   r/   )r   r/   r   r   r   
irrationalR   s    zAssumptionKeys.irrationalc                 C   s   ddl m} | S )Nr   )FinitePredicate)handlers.calculusr1   )r   r1   r   r   r   finiteW   s    zAssumptionKeys.finitec                 C   s   ddl m} | S )Nr   )InfinitePredicate)r2   r4   )r   r4   r   r   r   infinite\   s    zAssumptionKeys.infinitec                 C   s   ddl m} | S )Nr   )PositiveInfinitePredicate)r2   r6   )r   r6   r   r   r   positive_infinitea   s    z AssumptionKeys.positive_infinitec                 C   s   ddl m} | S )Nr   )NegativeInfinitePredicate)r2   r8   )r   r8   r   r   r   negative_infinitef   s    z AssumptionKeys.negative_infinitec                 C   s   ddl m} | S )Nr   )PositivePredicate)handlers.orderr:   )r   r:   r   r   r   positivek   s    zAssumptionKeys.positivec                 C   s   ddl m} | S )Nr   )NegativePredicate)r;   r=   )r   r=   r   r   r   negativep   s    zAssumptionKeys.negativec                 C   s   ddl m} | S )Nr   )ZeroPredicate)r;   r?   )r   r?   r   r   r   zerou   s    zAssumptionKeys.zeroc                 C   s   ddl m} | S )Nr   )ExtendedPositivePredicate)r;   rA   )r   rA   r   r   r   extended_positivez   s    z AssumptionKeys.extended_positivec                 C   s   ddl m} | S )Nr   )ExtendedNegativePredicate)r;   rC   )r   rC   r   r   r   extended_negative   s    z AssumptionKeys.extended_negativec                 C   s   ddl m} | S )Nr   )NonZeroPredicate)r;   rE   )r   rE   r   r   r   nonzero   s    zAssumptionKeys.nonzeroc                 C   s   ddl m} | S )Nr   )NonPositivePredicate)r;   rG   )r   rG   r   r   r   nonpositive   s    zAssumptionKeys.nonpositivec                 C   s   ddl m} | S )Nr   )NonNegativePredicate)r;   rI   )r   rI   r   r   r   nonnegative   s    zAssumptionKeys.nonnegativec                 C   s   ddl m} | S )Nr   )ExtendedNonZeroPredicate)r;   rK   )r   rK   r   r   r   extended_nonzero   s    zAssumptionKeys.extended_nonzeroc                 C   s   ddl m} | S )Nr   )ExtendedNonPositivePredicate)r;   rM   )r   rM   r   r   r   extended_nonpositive   s    z#AssumptionKeys.extended_nonpositivec                 C   s   ddl m} | S )Nr   )ExtendedNonNegativePredicate)r;   rO   )r   rO   r   r   r   extended_nonnegative   s    z#AssumptionKeys.extended_nonnegativec                 C   s   ddl m} | S )Nr   )EvenPredicate)handlers.ntheoryrQ   )r   rQ   r   r   r   even   s    zAssumptionKeys.evenc                 C   s   ddl m} | S )Nr   )OddPredicate)rR   rT   )r   rT   r   r   r   odd   s    zAssumptionKeys.oddc                 C   s   ddl m} | S )Nr   )PrimePredicate)rR   rV   )r   rV   r   r   r   prime   s    zAssumptionKeys.primec                 C   s   ddl m} | S )Nr   )CompositePredicate)rR   rX   )r   rX   r   r   r   	composite   s    zAssumptionKeys.compositec                 C   s   ddl m} | S )Nr   )CommutativePredicate)handlers.commonrZ   )r   rZ   r   r   r   commutative   s    zAssumptionKeys.commutativec                 C   s   ddl m} | S )Nr   )IsTruePredicate)r[   r]   )r   r]   r   r   r   is_true   s    zAssumptionKeys.is_truec                 C   s   ddl m} | S )Nr   )SymmetricPredicate)handlers.matricesr_   )r   r_   r   r   r   	symmetric   s    zAssumptionKeys.symmetricc                 C   s   ddl m} | S )Nr   )InvertiblePredicate)r`   rb   )r   rb   r   r   r   
invertible   s    zAssumptionKeys.invertiblec                 C   s   ddl m} | S )Nr   )OrthogonalPredicate)r`   rd   )r   rd   r   r   r   
orthogonal   s    zAssumptionKeys.orthogonalc                 C   s   ddl m} | S )Nr   )UnitaryPredicate)r`   rf   )r   rf   r   r   r   unitary   s    zAssumptionKeys.unitaryc                 C   s   ddl m} | S )Nr   )PositiveDefinitePredicate)r`   rh   )r   rh   r   r   r   positive_definite   s    z AssumptionKeys.positive_definitec                 C   s   ddl m} | S )Nr   )UpperTriangularPredicate)r`   rj   )r   rj   r   r   r   upper_triangular   s    zAssumptionKeys.upper_triangularc                 C   s   ddl m} | S )Nr   )LowerTriangularPredicate)r`   rl   )r   rl   r   r   r   lower_triangular   s    zAssumptionKeys.lower_triangularc                 C   s   ddl m} | S )Nr   )DiagonalPredicate)r`   rn   )r   rn   r   r   r   diagonal   s    zAssumptionKeys.diagonalc                 C   s   ddl m} | S )Nr   )FullRankPredicate)r`   rp   )r   rp   r   r   r   fullrank   s    zAssumptionKeys.fullrankc                 C   s   ddl m} | S )Nr   )SquarePredicate)r`   rr   )r   rr   r   r   r   square   s    zAssumptionKeys.squarec                 C   s   ddl m} | S )Nr   )IntegerElementsPredicate)r`   rt   )r   rt   r   r   r   integer_elements   s    zAssumptionKeys.integer_elementsc                 C   s   ddl m} | S )Nr   )RealElementsPredicate)r`   rv   )r   rv   r   r   r   real_elements   s    zAssumptionKeys.real_elementsc                 C   s   ddl m} | S )Nr   )ComplexElementsPredicate)r`   rx   )r   rx   r   r   r   complex_elements   s    zAssumptionKeys.complex_elementsc                 C   s   ddl m} | S )Nr   )SingularPredicate)predicates.matricesrz   )r   rz   r   r   r   singular  s    zAssumptionKeys.singularc                 C   s   ddl m} | S )Nr   )NormalPredicate)r{   r}   )r   r}   r   r   r   normal  s    zAssumptionKeys.normalc                 C   s   ddl m} | S )Nr   )TriangularPredicate)r{   r   )r   r   r   r   r   
triangular  s    zAssumptionKeys.triangularc                 C   s   ddl m} | S )Nr   )UnitTriangularPredicate)r{   r   )r   r   r   r   r   unit_triangular  s    zAssumptionKeys.unit_triangularc                 C   s   ddl m} | S )Nr   )EqualityPredicate)relation.equalityr   )r   r   r   r   r   eq  s    zAssumptionKeys.eqc                 C   s   ddl m} | S )Nr   )UnequalityPredicate)r   r   )r   r   r   r   r   ne  s    zAssumptionKeys.nec                 C   s   ddl m} | S )Nr   )StrictGreaterThanPredicate)r   r   )r   r   r   r   r   gt  s    zAssumptionKeys.gtc                 C   s   ddl m} | S )Nr   )GreaterThanPredicate)r   r   )r   r   r   r   r   ge$  s    zAssumptionKeys.gec                 C   s   ddl m} | S )Nr   )StrictLessThanPredicate)r   r   )r   r   r   r   r   lt)  s    zAssumptionKeys.ltc                 C   s   ddl m} | S )Nr   )LessThanPredicate)r   r   )r   r   r   r   r   le.  s    zAssumptionKeys.leN)<__name__
__module____qualname____doc__r   r   r   r    r"   r$   r&   r(   r*   r,   r.   r0   r3   r5   r7   r9   r<   r>   r@   rB   rD   rF   rH   rJ   rL   rN   rP   rS   rU   rW   rY   r\   r^   ra   rc   re   rg   ri   rk   rm   ro   rq   rs   ru   rw   ry   r|   r~   r   r   r   r   r   r   r   r   r   r   r   r   r      s   






















































r   c                 C   s~   t  }| jD ]h}g }|D ]H}t|jtrt|jjdkr|jj|v r\|t	|jj
|j q qq|r|t| q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   )Zassumpexprsfactsclauseargsliteralr   r   r   _extract_all_facts6  s    
r   Tc                 C   sr  ddl m} t| } t|}t| ts0| jtur8tdt|tsL|jturTt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 }}n.| j|v r|t|  | j }}nt	j| f }}t|}|| t||}t  }	t! }
|
"t|	 |
#| |j$r(t%|
du r(t&d| t'||}|dur@|S || (|}|dur`t)|S || ||d}|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)*Z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   Z	from_propextendr   get_all_known_factsr   Zfrom_cnfZadd_from_cnfr   r   
ValueError_ask_single_fact	_eval_askbool)Zpropositionr   r   r   Zbinrelpredskeyr   Z
assump_cnflocal_factsZknown_facts_cnfZenc_cnfresr   r   r   askf  s<    Z(








r   c           	      C   s   |j rt }t|j dkrj|j \}t|dkrj|\}|| d}|durP|d nt }|jrj|j|v rjdS |j D ]\}t|dkrp|\}|js||jdnd}|du rqp|\}}| |v r dS | |v rp dS qpd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   Zknown_facts_dictclfZ
prop_factsZprop_reqr   Zprop_rejr   r   r   r     s,    3
r   c                 C   sZ   t dddd t| tr | jj} tt| d}|dur@|| ntt| t| |gd 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   handlerZQkeyr   r   r   register_handlerF  s    	
r   c                 C   s\   t dddd t| tr | jj} tt  tt| | W d   n1 sN0    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   r   r   r   r   `  s    

r   )r   r   N)&r   Zsympy.assumptions.assumer   r   r   Zsympy.assumptions.cnfr   r   r   
sympy.corer   Z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   Zsympy.assumptions.ask_generatedr   r   r   r   r   r   <module>   s&    
  !0 S