U
    ZÊ¹j°K  ã                   @   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;edpdq„ ƒZ<drS )sÚ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   úT/var/www/html/bwave/python/venv/lib/python3.8/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)Ú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   )ÚNonIntegerPredicate)r*   r.   )r   r.   r   r   r   Ú
nonintegerM   s    zAssumptionKeys.nonintegerc                 C   s   ddl m} |ƒ S )Nr   )ÚRationalPredicate)r   r0   )r   r0   r   r   r   ÚrationalR   s    zAssumptionKeys.rationalc                 C   s   ddl m} |ƒ S )Nr   )ÚIrrationalPredicate)r   r2   )r   r2   r   r   r   Ú
irrationalW   s    zAssumptionKeys.irrationalc                 C   s   ddl m} |ƒ S )Nr   )ÚFinitePredicate)Úhandlers.calculusr4   )r   r4   r   r   r   Úfinite\   s    zAssumptionKeys.finitec                 C   s   ddl m} |ƒ S )Nr   )ÚInfinitePredicate)r5   r7   )r   r7   r   r   r   Úinfinitea   s    zAssumptionKeys.infinitec                 C   s   ddl m} |ƒ S )Nr   )ÚPositiveInfinitePredicate)r5   r9   )r   r9   r   r   r   Úpositive_infinitef   s    z AssumptionKeys.positive_infinitec                 C   s   ddl m} |ƒ S )Nr   )ÚNegativeInfinitePredicate)r5   r;   )r   r;   r   r   r   Únegative_infinitek   s    z AssumptionKeys.negative_infinitec                 C   s   ddl m} |ƒ S )Nr   )ÚPositivePredicate)Úhandlers.orderr=   )r   r=   r   r   r   Úpositivep   s    zAssumptionKeys.positivec                 C   s   ddl m} |ƒ S )Nr   )ÚNegativePredicate)r>   r@   )r   r@   r   r   r   Únegativeu   s    zAssumptionKeys.negativec                 C   s   ddl m} |ƒ S )Nr   )ÚZeroPredicate)r>   rB   )r   rB   r   r   r   Úzeroz   s    zAssumptionKeys.zeroc                 C   s   ddl m} |ƒ S )Nr   )ÚExtendedPositivePredicate)r>   rD   )r   rD   r   r   r   Úextended_positive   s    z AssumptionKeys.extended_positivec                 C   s   ddl m} |ƒ S )Nr   )ÚExtendedNegativePredicate)r>   rF   )r   rF   r   r   r   Úextended_negative„   s    z AssumptionKeys.extended_negativec                 C   s   ddl m} |ƒ S )Nr   )ÚNonZeroPredicate)r>   rH   )r   rH   r   r   r   Únonzero‰   s    zAssumptionKeys.nonzeroc                 C   s   ddl m} |ƒ S )Nr   )ÚNonPositivePredicate)r>   rJ   )r   rJ   r   r   r   ÚnonpositiveŽ   s    zAssumptionKeys.nonpositivec                 C   s   ddl m} |ƒ S )Nr   )ÚNonNegativePredicate)r>   rL   )r   rL   r   r   r   Únonnegative“   s    zAssumptionKeys.nonnegativec                 C   s   ddl m} |ƒ S )Nr   )ÚExtendedNonZeroPredicate)r>   rN   )r   rN   r   r   r   Úextended_nonzero˜   s    zAssumptionKeys.extended_nonzeroc                 C   s   ddl m} |ƒ S )Nr   )ÚExtendedNonPositivePredicate)r>   rP   )r   rP   r   r   r   Úextended_nonpositive�   s    z#AssumptionKeys.extended_nonpositivec                 C   s   ddl m} |ƒ S )Nr   )ÚExtendedNonNegativePredicate)r>   rR   )r   rR   r   r   r   Úextended_nonnegative¢   s    z#AssumptionKeys.extended_nonnegativec                 C   s   ddl m} |ƒ S )Nr   )ÚEvenPredicate)Úhandlers.ntheoryrT   )r   rT   r   r   r   Úeven§   s    zAssumptionKeys.evenc                 C   s   ddl m} |ƒ S )Nr   )ÚOddPredicate)rU   rW   )r   rW   r   r   r   Úodd¬   s    zAssumptionKeys.oddc                 C   s   ddl m} |ƒ S )Nr   )ÚPrimePredicate)rU   rY   )r   rY   r   r   r   Úprime±   s    zAssumptionKeys.primec                 C   s   ddl m} |ƒ S )Nr   )ÚCompositePredicate)rU   r[   )r   r[   r   r   r   Ú	composite¶   s    zAssumptionKeys.compositec                 C   s   ddl m} |ƒ S )Nr   )ÚCommutativePredicate)Úhandlers.commonr]   )r   r]   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.matricesrb   )r   rb   r   r   r   Ú	symmetricÅ   s    zAssumptionKeys.symmetricc                 C   s   ddl m} |ƒ S )Nr   )ÚInvertiblePredicate)rc   re   )r   re   r   r   r   Ú
invertibleÊ   s    zAssumptionKeys.invertiblec                 C   s   ddl m} |ƒ S )Nr   )ÚOrthogonalPredicate)rc   rg   )r   rg   r   r   r   Ú
orthogonalÏ   s    zAssumptionKeys.orthogonalc                 C   s   ddl m} |ƒ S )Nr   )ÚUnitaryPredicate)rc   ri   )r   ri   r   r   r   ÚunitaryÔ   s    zAssumptionKeys.unitaryc                 C   s   ddl m} |ƒ S )Nr   )ÚPositiveDefinitePredicate)rc   rk   )r   rk   r   r   r   Úpositive_definiteÙ   s    z AssumptionKeys.positive_definitec                 C   s   ddl m} |ƒ S )Nr   )ÚUpperTriangularPredicate)rc   rm   )r   rm   r   r   r   Úupper_triangularÞ   s    zAssumptionKeys.upper_triangularc                 C   s   ddl m} |ƒ S )Nr   )ÚLowerTriangularPredicate)rc   ro   )r   ro   r   r   r   Úlower_triangularã   s    zAssumptionKeys.lower_triangularc                 C   s   ddl m} |ƒ S )Nr   )ÚDiagonalPredicate)rc   rq   )r   rq   r   r   r   Údiagonalè   s    zAssumptionKeys.diagonalc                 C   s   ddl m} |ƒ S )Nr   )ÚFullRankPredicate)rc   rs   )r   rs   r   r   r   Úfullrankí   s    zAssumptionKeys.fullrankc                 C   s   ddl m} |ƒ S )Nr   )ÚSquarePredicate)rc   ru   )r   ru   r   r   r   Úsquareò   s    zAssumptionKeys.squarec                 C   s   ddl m} |ƒ S )Nr   )ÚIntegerElementsPredicate)rc   rw   )r   rw   r   r   r   Úinteger_elements÷   s    zAssumptionKeys.integer_elementsc                 C   s   ddl m} |ƒ S )Nr   )ÚRealElementsPredicate)rc   ry   )r   ry   r   r   r   Úreal_elementsü   s    zAssumptionKeys.real_elementsc                 C   s   ddl m} |ƒ S )Nr   )ÚComplexElementsPredicate)rc   r{   )r   r{   r   r   r   Úcomplex_elements  s    zAssumptionKeys.complex_elementsc                 C   s   ddl m} |ƒ S )Nr   )ÚSingularPredicate)Úpredicates.matricesr}   )r   r}   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   Úle3  s    zAssumptionKeys.leN)=Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r    r"   r$   r&   r(   r+   r-   r/   r1   r3   r6   r8   r:   r<   r?   rA   rC   rE   rG   rI   rK   rM   rO   rQ   rS   rV   rX   rZ   r\   r_   ra   rd   rf   rh   rj   rl   rn   rp   rr   rt   rv   rx   rz   r|   r   r�   rƒ   r…   rˆ   rŠ   rŒ   rŽ   r�   r’   r   r   r   r   r      sâ   























































r   c                 C   s„   t ƒ }| jD ]n}g }|D ]N}t|jtƒrbt|jjƒdkrb|jj|kr\| t	|jj
|jƒ¡ qf q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Ú
isinstanceZlitr   ÚlenÚ	argumentsÚargÚappendr   ÚfunctionÚis_NotÚaddÚ	frozensetr   )ZassumpZexprsZfactsÚclauseÚargsÚliteralr   r   r   Ú_extract_all_facts;  s    
r¥   Tc                 C   sÄ  ddl m} ddlm} ddlm} t| ƒ} t|ƒ}t| tƒsH| j	t
k	rPtdƒ‚t|tƒsd|j	t
k	rlt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|krÎ|t| ƒ | j }}ntj| f }}t  !|¡}	|	 "|¡ t#|	|ƒ}
t$ƒ }t%ƒ }| &t |ƒ¡ | '|
¡ |
j(�r@t)|ƒdk�r@t*d| ƒ‚t+||
ƒ}|d	k	�rX|S ||Ž  ,|¡}|d	k	�rxt-|ƒS || ||d
�}|d	k	�r”|S z|| ||d
�}W n |k
�r¾   Y d	S X |S )ay	  
    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).Zsympy.assumptions.sataskr¦   Zsympy.assumptions.lra_sataskr§   Z!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£   ra   r   Z	from_propÚextendr¥   Úget_all_known_factsr   Zfrom_cnfZadd_from_cnfr˜   r   Ú
ValueErrorÚ_ask_single_factZ	_eval_askÚbool)Zpropositionr©   rª   r¦   r§   r¨   ZbinrelpredsÚkeyr£   Z
assump_cnfÚlocal_factsZknown_facts_cnfZenc_cnfÚresr   r   r   Úasko  sL    Z(









r¸   c           	      C   sÒ   |j rÎtƒ }t|j ƒdkrj|j \}t|ƒdkrj|\}| | d¡}|dk	rP|d ntƒ }|jrj|j|krjdS |j D ]\}t|ƒdkrp|\}|jsš| |jd¡nd}|dkr¨qp|\}}| |kr¾ dS | |k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k	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©Zdeprecated_since_versionZactive_deprecations_targetN)Úhandlers)r   r™   r   ÚnameÚgetattrr­   Úadd_handlerÚsetattr)rµ   ÚhandlerZQkeyr   r   r   Úregister_handlerY  s    	ú
rÆ   c              	   C   sH   t dddd� t| tƒr | jj} ttƒ� tt| ƒ |¡ W 5 Q R X 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Å   r   r   r   rÇ   s  s    ú

rÇ   )r±   r¹   N)&r–   Zsympy.assumptions.assumer   r   r   Zsympy.assumptions.cnfr   r   r   Z
sympy.corer   Zsympy.core.kindr	   Zsympy.core.relationalr
   r   r   r   r   r   Zsympy.logic.inferencer   Zsympy.utilities.decoratorr   Zsympy.utilities.exceptionsr   r   r   r   r­   r¥   r¸   r³   rÆ   rÇ   Zsympy.assumptions.ask_generatedr±   r¹   r   r   r   r   Ú<module>   s&    
  &4 S