§
    OŠtj©  ã                   ó¶   — d Z ddlmZ ddlmZ ddlmZmZmZ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mZ dd	gZ G d
„ de¦  «        Z G d„ d	e¦  «        ZdS )z
General binary relations.
é    )ÚOptional)ÚS)ÚAppliedPredicateÚaskÚ	PredicateÚQ)ÚBooleanKind)ÚEqÚNeÚGtÚLtÚGeÚLe)Ú	conjunctsÚNotÚBinaryRelationÚAppliedBinaryRelationc                   óˆ   — e Zd ZU dZdZee         ed<   dZee         ed<   d„ Z	e
d„ ¦   «         Ze
d„ ¦   «         Zd„ Zdd
„ZdS )r   a^  
    Base class for all binary relational predicates.

    Explanation
    ===========

    Binary relation takes two arguments and returns ``AppliedBinaryRelation``
    instance. To evaluate it to boolean value, use :obj:`~.ask()` or
    :obj:`~.refine()` function.

    You can add support for new types by registering the handler to dispatcher.
    See :obj:`~.Predicate()` for more information about predicate dispatching.

    Examples
    ========

    Applying and evaluating to boolean value:

    >>> from sympy import Q, ask, sin, cos
    >>> from sympy.abc import x
    >>> Q.eq(sin(x)**2+cos(x)**2, 1)
    Q.eq(sin(x)**2 + cos(x)**2, 1)
    >>> ask(_)
    True

    You can define a new binary relation by subclassing and dispatching.
    Here, we define a relation $R$ such that $x R y$ returns true if
    $x = y + 1$.

    >>> from sympy import ask, Number, Q
    >>> from sympy.assumptions import BinaryRelation
    >>> class MyRel(BinaryRelation):
    ...     name = "R"
    ...     is_reflexive = False
    >>> Q.R = MyRel()
    >>> @Q.R.register(Number, Number)
    ... def _(n1, n2, assumptions):
    ...     return ask(Q.zero(n1 - n2 - 1), assumptions)
    >>> Q.R(2, 1)
    Q.R(2, 1)

    Now, we can use ``ask()`` to evaluate it to boolean value.

    >>> ask(Q.R(2, 1))
    True
    >>> ask(Q.R(1, 2))
    False

    ``Q.R`` returns ``False`` with minimum cost if two arguments have same
    structure because it is antireflexive relation [1] by
    ``is_reflexive = False``.

    >>> ask(Q.R(x, x))
    False

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Reflexive_relation
    NÚis_reflexiveÚis_symmetricc                 ó€   — t          |¦  «        dk    st          dt          |¦  «        z  ¦  «        ‚t          | g|¢R Ž S )Né   z0Binary relation takes two arguments, but got %s.)ÚlenÚ
ValueErrorr   )ÚselfÚargss     ú_/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/assumptions/relation/binrel.pyÚ__call__zBinaryRelation.__call__P   sE   € Ý�4‰yŒy˜AŠ~ˆ~ÝÐOÕRUÐVZÑR[ÔR[Ñ[Ñ\Ô\Ð\Ý$ TÐ1¨DÐ1Ð1Ð1Ð1ó    c                 ó   — | j         r| S d S ©N)r   ©r   s    r   ÚreversedzBinaryRelation.reversedU   s   € àÔð 	ØˆKØˆtr   c                 ó   — d S r!   © r"   s    r   ÚnegatedzBinaryRelation.negated[   s   € àˆtr   c                 ó~   — |t           j        u s|t           j        u rd S | j        }|€n|r||k    rdS |s||k    rdS d S )NTF)r   ÚNaNr   )r   ÚlhsÚrhsÚ	reflexives       r   Ú_compare_reflexivez!BinaryRelation._compare_reflexive_   s^   € ð •!”%ˆ<ˆ<˜3¥!¤%˜<˜<Ø�4àÔ%ˆ	ØÐØØð 	˜C 3šJ˜JØ�4Øð 	  s¢
 
Ø�5Øˆtr   Tc                 ó4  —  | j         |Ž }|�|S |\  }}|                      |||¬¦  «        }|�|S | j        rat          |¦  «        t          |¦  «        f} | j        j        |Ž  | j        j        t          |¦  «        Ž ur|                      |||¬¦  «        }|S )N)Úassumptions)r,   Úhandlerr   ÚtypeÚdispatchr#   )r   r   r.   Úretr)   r*   Útypess          r   ÚevalzBinaryRelation.evalq   s²   € à%ˆdÔ% tÐ,ˆØˆ?ØˆJð ‰ˆˆSØ�lŠl˜3 °ˆlÑ=Ô=ˆØˆ?ØˆJð Ôð 	FÝ˜#‘Y”Y¥ S¡	¤	Ð*ˆEØ$ˆtŒ|Ô$ eÐ,Ð4I°D´LÔ4IÍ8ÐTYÉ?Ì?Ð4[Ð[Ð[Ø—l’l 3¨¸�lÑEÔE�àˆ
r   )T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ÚboolÚ__annotations__r   r   Úpropertyr#   r&   r,   r4   r%   r   r   r   r      s³   € € € € € € ð;ð ;ðz $(€L�(˜4”.Ð'Ð'Ñ'Ø#'€L�(˜4”.Ð'Ð'Ñ'ð2ð 2ð 2ð
 ðð ñ „Xðð
 ðð ñ „Xððð ð ð$ð ð ð ð ð r   c                   óŒ   — e Zd ZdZed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Z	d„ Z
d„ Zd	S )
r   zd
    The class of expressions resulting from applying ``BinaryRelation``
    to the arguments.

    c                 ó   — | j         d         S )z#The left-hand side of the relation.r   ©Ú	argumentsr"   s    r   r)   zAppliedBinaryRelation.lhsŽ   ó   € ð Œ~˜aÔ Ð r   c                 ó   — | j         d         S )z$The right-hand side of the relation.é   r>   r"   s    r   r*   zAppliedBinaryRelation.rhs“   r@   r   c                 óN   — | j         j        }|€| S  || j        | j        ¦  «        S )zE
        Try to return the relationship with sides reversed.
        )Úfunctionr#   r*   r)   ©r   Úrevfuncs     r   r#   zAppliedBinaryRelation.reversed˜   s.   € ð
 ”-Ô(ˆØˆ?ØˆKØˆw�t”x ¤Ñ*Ô*Ð*r   c                 ó’   — | j         j        }|€| S t          d„ | j        D ¦   «         ¦  «        s || j         | j         ¦  «        S | S )zE
        Try to return the relationship with signs reversed.
        Nc              3   ó2   K  — | ]}|j         t          u V — Œd S r!   )Úkindr	   )Ú.0Úsides     r   ú	<genexpr>z5AppliedBinaryRelation.reversedsign.<locals>.<genexpr>ª   s)   è è € ÐGÐG°�4”9¥Ð+ÐGÐGÐGÐGÐGÐGr   )rD   r#   Úanyr?   r)   r*   rE   s     r   Úreversedsignz"AppliedBinaryRelation.reversedsign¢   sX   € ð
 ”-Ô(ˆØˆ?ØˆKÝÐGÐG¸¼ÐGÑGÔGÑGÔGð 	1Ø�7˜DœH˜9 t¤x iÑ0Ô0Ð0Øˆr   c                 óT   — | j         j        }|€t          | d¬¦  «        S  || j        Ž S )NF©Úevaluate)rD   r&   r   r?   )r   Úneg_rels     r   r&   zAppliedBinaryRelation.negated®   s3   € à”-Ô'ˆØˆ?Ý�t eÐ,Ñ,Ô,Ð,Øˆw˜œÐ'Ð'r   c                 ó^  ‡— t          ¦   «         Št          t          j        t          t          j        t          t          j        t          t          j	        t          t          j        t          t          j        i}t          |¦  «        D ]Q}|j        |v r1‰                      |t#          |¦  «                 |j        Ž ¦  «         Œ<‰                     |¦  «         ŒRt'          ˆfd„| | j        fD ¦   «         ¦  «        rdS | j        | j        j        t-          | d¬¦  «        t-          | j        d¬¦  «        f}t'          ˆfd„|D ¦   «         ¦  «        rdS | j                             | j        |¦  «        }|�|S t5          d„ | j        D ¦   «         ¦  «        }| j                             ||¦  «        S )Nc              3   ó    •K  — | ]}|‰v V — Œ	d S r!   r%   ©rJ   ÚrelÚconj_assumpss     €r   rL   z2AppliedBinaryRelation._eval_ask.<locals>.<genexpr>À   s(   øè è € ÐDÐD sˆs�lÐ"ÐDÐDÐDÐDÐDÐDr   TFrP   c              3   ó    •K  — | ]}|‰v V — Œ	d S r!   r%   rU   s     €r   rL   z2AppliedBinaryRelation._eval_ask.<locals>.<genexpr>Ä   s(   øè è € Ð7Ð7 sˆs�lÐ"Ð7Ð7Ð7Ð7Ð7Ð7r   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S r!   )Úsimplify)rJ   Úas     r   rL   z2AppliedBinaryRelation._eval_ask.<locals>.<genexpr>Í   s*   è è € Ð:Ð: a�Q—Z’Z‘\”\Ð:Ð:Ð:Ð:Ð:Ð:r   )Úsetr
   r   Úeqr   Úner   Úgtr   Últr   Úger   Úler   ÚfuncÚaddr0   r   rM   r#   r&   r   rD   r4   r?   Útuple)r   r.   Úbinrelpredsr[   Úneg_relsr2   r   rW   s          @r   Ú	_eval_askzAppliedBinaryRelation._eval_askµ   s‹  ø€ Ý‘u”uˆÝ�1œ4¥¥Q¤T­2­q¬tµR½¼½rÅ1Ä4ÍÍQÌTÐRˆÝ˜;Ñ'Ô'ð 	$ð 	$ˆAØŒv˜Ð$Ð$Ø× Ò Ð!5 ­T°!©W¬WÔ!5°q´vÐ!>Ñ?Ô?Ð?Ð?à× Ò  Ñ#Ô#Ð#Ð#õ ÐDÐDÐDÐD¨t°T´]Ð.CÐDÑDÔDÑDÔDð 	Ø�4Ø”L $¤-Ô"7½¸TÈEÐ9RÑ9RÔ9RÝ�”¨Ð.Ñ.Ô.ð0ˆåÐ7Ð7Ð7Ð7¨hÐ7Ñ7Ô7Ñ7Ô7ð 	Ø�5ð Œm× Ò  ¤°Ñ=Ô=ˆØˆ?ØˆJõ Ð:Ð:¨4¬>Ð:Ñ:Ô:Ñ:Ô:ˆØŒ}×!Ò! $¨Ñ4Ô4Ð4r   c                 óL   — t          | ¦  «        }|€t          d| z  ¦  «        ‚|S )Nz"Cannot determine truth value of %s)r   Ú	TypeError)r   r2   s     r   Ú__bool__zAppliedBinaryRelation.__bool__Ð   s+   € Ý�$‰iŒiˆØˆ;ÝÐ@À4ÑGÑHÔHÐHØˆ
r   N)r5   r6   r7   r8   r;   r)   r*   r#   rN   r&   rh   rk   r%   r   r   r   r   ‡   sÃ   € € € € € ðð ð ð!ð !ñ „Xð!ð ð!ð !ñ „Xð!ð ð+ð +ñ „Xð+ð ð	ð 	ñ „Xð	ð ð(ð (ñ „Xð(ð5ð 5ð 5ð6ð ð ð ð r   N)r8   Útypingr   Úsympy.core.singletonr   Úsympy.assumptionsr   r   r   r   Úsympy.core.kindr	   Úsympy.core.relationalr
   r   r   r   r   r   Úsympy.logic.boolalgr   r   Ú__all__r   r   r%   r   r   ú<module>rs      s0  ððð ð Ð Ð Ð Ð Ð à "Ð "Ð "Ð "Ð "Ð "Ø AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AØ 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .àÐ4Ð
5€ðuð uð uð uð u�Yñ uô uð uðpMð Mð Mð Mð MÐ,ñ Mô Mð Mð Mð Mr   