U
    L?hK                     @   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   G/var/www/html/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 rt }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rqp|\}}| |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