ó
    ˆ*£h©  ã                   ó¨   • S r SSKJr  SSKJr  SSKJrJrJrJ	r	  SSK
Jr  SSKJrJrJrJrJrJr  SSKJrJr  SS	/r " S
 S\5      r " S S	\5      rg)z
General binary relations.
é    )ÚOptional)ÚS)ÚAppliedPredicateÚaskÚ	PredicateÚQ)ÚBooleanKind)ÚEqÚNeÚGtÚLtÚGeÚLe)Ú	conjunctsÚNotÚBinaryRelationÚAppliedBinaryRelationc                   óx   • \ rS rSr% SrSr\\   \S'   Sr	\\   \S'   S r
\S 5       r\S 5       rS	 rSS
 jrSrg)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                 óf   • [        U5      S:X  d  [        S[        U5      -  5      e[        U /UQ76 $ )Né   z0Binary relation takes two arguments, but got %s.)ÚlenÚ
ValueErrorr   )ÚselfÚargss     Ú^/home/mande/repo/quber/.venv/lib/python3.13/site-packages/sympy/assumptions/relation/binrel.pyÚ__call__ÚBinaryRelation.__call__P   s5   € Ü�4‹y˜A‹~ÜÐOÔRUÐVZÓR[Ñ[Ó\Ð\Ü$ TÐ1¨DÒ1Ð1ó    c                 ó*   • U R                   (       a  U $ g ©N)r   ©r   s    r   ÚreversedÚBinaryRelation.reversedU   s   € à××ØˆKØr!   c                 ó   • g r#   © r$   s    r   ÚnegatedÚBinaryRelation.negated[   s   € àr!   c                 ó¨   • U[         R                  L d  U[         R                  L a  g U R                  nUc   g U(       a  X:X  a  gU(       d  X:X  a  gg )NTF)r   ÚNaNr   )r   ÚlhsÚrhsÚ	reflexives       r   Ú_compare_reflexiveÚ!BinaryRelation._compare_reflexive_   sN   € ð ”!—%‘%Š<˜3¤!§%¡%š<Øà×%Ñ%ˆ	ØÑØð
 ö	 ˜C›JØÞ £
ØØr!   c                 óF  • U R                   " U6 nUb  U$ Uu  pEU R                  XEUS9nUb  U$ U R                  (       ab  [        U5      [        U5      4nU R                  R                  " U6 U R                  R                  " [        U5      6 La  U R                  XTUS9nU$ )N)Úassumptions)r0   Úhandlerr   ÚtypeÚdispatchr%   )r   r   r3   Úretr-   r.   Útypess          r   ÚevalÚBinaryRelation.evalq   s    € à×%Ò% tÐ,ˆØ‰?ØˆJð ‰ˆØ�l‰l˜3°ˆlÐ=ˆØ‰?ØˆJð ××Ü˜#“Y¤ S£	Ð*ˆEØ�|‰|×$Ò$ eÐ,°D·L±L×4IÒ4IÌ8ÐTYË?Ð4[Ò[Ø—l‘l 3¸�lÐE�àˆ
r!   r(   )T)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r   ÚboolÚ__annotations__r   r   Úpropertyr%   r)   r0   r9   Ú__static_attributes__r(   r!   r   r   r      s]   ‡ ñ;ðz $(€L�(˜4‘.Ó'Ø#'€L�(˜4‘.Ó'ò2ð
 ñó ðð
 ñó ðò÷$r!   c                   ót   • \ rS rSrSr\S 5       r\S 5       r\S 5       r\S 5       r	\S 5       r
S rS	 rS
rg)r   é‡   zX
The class of expressions resulting from applying ``BinaryRelation``
to the arguments.

c                 ó    • U R                   S   $ )z#The left-hand side of the relation.r   ©Ú	argumentsr$   s    r   r-   ÚAppliedBinaryRelation.lhsŽ   ó   € ð �~‰~˜aÑ Ð r!   c                 ó    • U R                   S   $ )z$The right-hand side of the relation.é   rG   r$   s    r   r.   ÚAppliedBinaryRelation.rhs“   rJ   r!   c                 ór   • U R                   R                  nUc  U $ U" U R                  U R                  5      $ )z5
Try to return the relationship with sides reversed.
)Úfunctionr%   r.   r-   ©r   Úrevfuncs     r   r%   ÚAppliedBinaryRelation.reversed˜   s2   € ð
 —-‘-×(Ñ(ˆØ‰?ØˆKÙ�t—x‘x §¡Ó*Ð*r!   c                 ó¼   • U R                   R                  nUc  U $ [        S U R                   5       5      (       d  U" U R                  * U R
                  * 5      $ U $ )z5
Try to return the relationship with signs reversed.
c              3   óD   #   • U  H  oR                   [        L v •  M     g 7fr#   )Úkindr	   )Ú.0Úsides     r   Ú	<genexpr>Ú5AppliedBinaryRelation.reversedsign.<locals>.<genexpr>ª   s   é € ÐGº°—9‘9¤Õ+ºùs   ‚ )rO   r%   ÚanyrH   r-   r.   rP   s     r   ÚreversedsignÚ"AppliedBinaryRelation.reversedsign¢   sP   € ð
 —-‘-×(Ñ(ˆØ‰?ØˆKÜÑG¸¿ºÓG×GÑGÙ˜DŸH™H˜9 t§x¡x iÓ0Ð0Øˆr!   c                 óf   • U R                   R                  nUc
  [        U SS9$ U" U R                  6 $ )NF©Úevaluate)rO   r)   r   rH   )r   Úneg_rels     r   r)   ÚAppliedBinaryRelation.negated®   s2   € à—-‘-×'Ñ'ˆØ‰?Ü�t eÑ,Ð,Ù˜Ÿ™Ð'Ð'r!   c                 óŒ  ^• [        5       m[        [        R                  [        [        R
                  [        [        R                  [        [        R                  [        [        R                  [        [        R                  0n[        U5       HP  nUR                  U;   a,  TR!                  U[#        U5         " UR$                  6 5        M?  TR!                  U5        MR     ['        U4S jX R(                  4 5       5      (       a  gU R*                  U R(                  R*                  [-        U SS9[-        U R(                  SS94n['        U4S jU 5       5      (       a  gU R.                  R1                  U R2                  U5      nUb  U$ [5        S U R2                   5       5      nU R.                  R1                  Xa5      $ )Nc              3   ó,   >#   • U  H	  oT;   v •  M     g 7fr#   r(   ©rV   ÚrelÚconj_assumpss     €r   rX   Ú2AppliedBinaryRelation._eval_ask.<locals>.<genexpr>À   s   øé € ÐDÒ.C s�lÖ"Ò.Cùó   ƒTFr^   c              3   ó,   >#   • U  H	  oT;   v •  M     g 7fr#   r(   rd   s     €r   rX   rg   Ä   s   øé € Ð7ªh s�lÖ"ªhùrh   c              3   ó@   #   • U  H  oR                  5       v •  M     g 7fr#   )Úsimplify)rV   Úas     r   rX   rg   Í   s   é € Ð:ª> a—Z‘Z—\�\ª>ùs   ‚)Úsetr
   r   Úeqr   Úner   Úgtr   Últr   Úger   Úler   ÚfuncÚaddr5   r   rZ   r%   r)   r   rO   r9   rH   Útuple)r   r3   Úbinrelpredsrl   Úneg_relsr7   r   rf   s          @r   Ú	_eval_askÚAppliedBinaryRelation._eval_askµ   s<  ø€ Ü“uˆÜœ1Ÿ4™4¤¤Q§T¡T¬2¬q¯t©t´R¼¿¹¼rÄ1Ç4Á4ÌÌQÏTÉTÐRˆÜ˜;Ö'ˆAØ�v‰v˜Ó$Ø× Ñ  ¬T°!«WÒ!5°q·v±vÐ!>Ö?à× Ñ  Ö#ñ	 (ô ÔD¨t·]±]Ñ.CÓD×DÑDØØ—L‘L $§-¡-×"7Ñ"7¼¸TÈEÑ9RÜ�—‘¨Ñ.ð0ˆäÔ7©hÓ7×7Ñ7Øð �m‰m× Ñ  §¡°Ó=ˆØ‰?ØˆJô Ñ:¨4¯>ª>Ó:Ó:ˆØ�}‰}×!Ñ! $Ó4Ð4r!   c                 ó>   • [        U 5      nUc  [        SU -  5      eU$ )Nz"Cannot determine truth value of %s)r   Ú	TypeError)r   r7   s     r   Ú__bool__ÚAppliedBinaryRelation.__bool__Ð   s&   € Ü�$‹iˆØ‰;ÜÐ@À4ÑGÓHÐHØˆ
r!   r(   N)r;   r<   r=   r>   r?   rB   r-   r.   r%   r[   r)   ry   r}   rC   r(   r!   r   r   r   ‡   su   † ñð ñ!ó ð!ð ñ!ó ð!ð ñ+ó ð+ð ñ	ó ð	ð ñ(ó ð(ò5õ6r!   N)r?   Ú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>r†      sM   ðñõ å "ß AÓ AÝ 'ß 8× 8ß .àÐ4Ð
5€ôu�Yô uôpMÐ,õ Mr!   