§
    PŠtj}  ã                   óœ   — d Z ddlmZ  G d„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        Zdd
„Zd„ Zd„ Zd„ Z	d„ Z
d„ Zd„ Zd„ Zd„ Zd	S )aG   Generic Unification algorithm for expression trees with lists of children

This implementation is a direct translation of

Artificial Intelligence: A Modern Approach by Stuart Russel and Peter Norvig
Second edition, section 9.2, page 276

It is modified in the following ways:

1.  We allow associative and commutative Compound expressions. This results in
    combinatorial blowup.
2.  We explore the tree lazily.
3.  We provide generic interfaces to symbolic algebra libraries in Python.

A more traditional version can be found here
http://aima.cs.berkeley.edu/python/logic.html
é    )Úkbinsc                   ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ÚCompoundzr A little class to represent an interior node in the tree

    This is analogous to SymPy.Basic for non-Atoms
    c                 ó"   — || _         || _        d S ©N)ÚopÚargs)Úselfr   r	   s      úN/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/unify/core.pyÚ__init__zCompound.__init__   s   € ØˆŒØˆŒ	ˆ	ˆ	ó    c                 ó~   — t          | ¦  «        t          |¦  «        u o| j        |j        k    o| j        |j        k    S r   )Útyper   r	   ©r
   Úothers     r   Ú__eq__zCompound.__eq__   s<   € Ý�T‘
”
�d 5™kœkÐ)ð (¨d¬g¸¼Ò.Að (Ø”	˜UœZÒ'ð	)r   c                 óT   — t          t          | ¦  «        | j        | j        f¦  «        S r   )Úhashr   r   r	   ©r
   s    r   Ú__hash__zCompound.__hash__"   s!   € Ý•T˜$‘Z”Z ¤¨$¬)Ð4Ñ5Ô5Ð5r   c                 óŒ   — t          | j        ¦  «        ›dd                     t          t           | j        ¦  «        ¦  «        ›d�S )Nú[z, ú])Ústrr   ÚjoinÚmapr	   r   s    r   Ú__str__zCompound.__str__%   s7   € Ý˜tœw™<œ<˜<˜<¨¯ªµ3µs¸D¼IÑ3FÔ3FÑ)GÔ)GÐ)GÐ)GÐHÐHr   N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   © r   r   r   r      s_   € € € € € ðð ðð ð ð)ð )ð )ð6ð 6ð 6ðIð Ið Ið Ið Ir   r   c                   ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ÚVariablez A Wild token c                 ó   — || _         d S r   )Úarg)r
   r'   s     r   r   zVariable.__init__*   s   € ØˆŒˆˆr   c                 ó^   — t          | ¦  «        t          |¦  «        u o| j        |j        k    S r   )r   r'   r   s     r   r   zVariable.__eq__-   s'   € Ý�D‰zŒz�T %™[œ[Ð(ÐB¨T¬X¸¼Ò-BÐBr   c                 óH   — t          t          | ¦  «        | j        f¦  «        S r   )r   r   r'   r   s    r   r   zVariable.__hash__0   s   € Ý•T˜$‘Z”Z ¤Ð*Ñ+Ô+Ð+r   c                 ó0   — dt          | j        ¦  «        z  S )NzVariable(%s)©r   r'   r   s    r   r   zVariable.__str__3   s   € Ø¥ D¤H¡¤Ñ-Ð-r   Nr   r#   r   r   r%   r%   (   sY   € € € € € ØÐðð ð ðCð Cð Cð,ð ,ð ,ð.ð .ð .ð .ð .r   r%   c                   ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ÚCondVariablez… A wild token that matches conditionally.

    arg   - a wild token.
    valid - an additional constraining function on a match.
    c                 ó"   — || _         || _        d S r   )r'   Úvalid)r
   r'   r/   s      r   r   zCondVariable.__init__<   s   € ØˆŒØˆŒ
ˆ
ˆ
r   c                 ó~   — t          | ¦  «        t          |¦  «        u o| j        |j        k    o| j        |j        k    S r   )r   r'   r/   r   s     r   r   zCondVariable.__eq__@   s=   € Ý�T‘
”
�d 5™kœkÐ)ð *Ø”˜EœIÒ%ð*à”
˜eœkÒ)ð	+r   c                 óT   — t          t          | ¦  «        | j        | j        f¦  «        S r   )r   r   r'   r/   r   s    r   r   zCondVariable.__hash__E   s!   € Ý•T˜$‘Z”Z ¤¨4¬:Ð6Ñ7Ô7Ð7r   c                 ó0   — dt          | j        ¦  «        z  S )NzCondVariable(%s)r+   r   s    r   r   zCondVariable.__str__H   s   € Ø!¥C¨¬¡M¤MÑ1Ð1r   Nr   r#   r   r   r-   r-   6   sZ   € € € € € ðð ð
ð ð ð+ð +ð +ð
8ð 8ð 8ð2ð 2ð 2ð 2ð 2r   r-   Nc              +   ód  ‡‡K  — |pi }| |k    r|V — dS t          | t          t          f¦  «        rt          | ||fi |¤ŽE d{V —† dS t          |t          t          f¦  «        rt          || |fi |¤ŽE d{V —† dS t          | t          ¦  «        �rt          |t          ¦  «        �ri|                     dd„ ¦  «        }|                     dd„ ¦  «        }t          | j        |j        |fi |¤ŽD �]} || ¦  «        rÇ ||¦  «        r¼t          | j	        ¦  «        t          |j	        ¦  «        k     r| |fn|| f\  ŠŠ || ¦  «        r' ||¦  «        rt          ‰j	        ‰j	        d¦  «        }nt          ‰j	        ‰j	        d¦  «        }|D ]6\  }}	ˆfd„|D ¦   «         }
ˆfd	„|	D ¦   «         }t          |
||fi |¤ŽE d{V —† Œ7ŒÕt          | j	        ¦  «        t          |j	        ¦  «        k    rt          | j	        |j	        |fi |¤ŽE d{V —† �Œ dS t          | ¦  «        r‹t          |¦  «        r~t          | ¦  «        t          |¦  «        k    r`t          | ¦  «        d
k    r|V — dS t          | d
         |d
         |fi |¤ŽD ]-}t          | dd…         |dd…         |fi |¤ŽE d{V —† Œ(dS dS dS dS )a
   Unify two expressions.

    Parameters
    ==========

        x, y - expression trees containing leaves, Compounds and Variables.
        s    - a mapping of variables to subtrees.

    Returns
    =======

        lazy sequence of mappings {Variable: subtree}

    Examples
    ========

    >>> from sympy.unify.core import unify, Compound, Variable
    >>> expr    = Compound("Add", ("x", "y"))
    >>> pattern = Compound("Add", ("x", Variable("a")))
    >>> next(unify(expr, pattern, {}))
    {Variable(a): 'y'}
    NÚis_commutativec                 ó   — dS ©NFr#   ©Úxs    r   ú<lambda>zunify.<locals>.<lambda>k   ó   € ¸U€ r   Úis_associativec                 ó   — dS r6   r#   r7   s    r   r9   zunify.<locals>.<lambda>l   r:   r   ÚcommutativeÚassociativec                 óT   •— g | ]$}t          t          ‰j        |¦  «        ¦  «        ‘Œ%S r#   ©Úunpackr   r   )Ú.0r'   Úas     €r   ú
<listcomp>zunify.<locals>.<listcomp>u   ó-   ø€ ÐHÐHÐH¸#�&¥¨!¬$°Ñ!4Ô!4Ñ5Ô5ÐHÐHÐHr   c                 óT   •— g | ]$}t          t          ‰j        |¦  «        ¦  «        ‘Œ%S r#   r@   )rB   r'   Úbs     €r   rD   zunify.<locals>.<listcomp>v   rE   r   r   é   )Ú
isinstancer%   r-   Ú	unify_varr   ÚgetÚunifyr   Úlenr	   ÚallcombinationsÚis_args)r8   ÚyÚsÚfnsr4   r;   ÚsopÚcombsÚaaargsÚbbargsÚaaÚbbÚsheadrC   rG   s                @@r   rL   rL   K   s‚  øøè è € ð. 	
ˆˆR€AàˆA‚v€vØˆˆˆˆˆÝ	�A�¥,Ð/Ñ	0Ô	0ð =Ý˜Q  1Ð,Ð,¨Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ý	�A�¥,Ð/Ñ	0Ô	0ð =Ý˜Q  1Ð,Ð,¨Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ý	�A•xÑ	 Ô	 ñ =¥Z°µ8Ñ%<Ô%<ñ =ØŸšÐ!1°?°?ÑCÔCˆØŸšÐ!1°?°?ÑCÔCˆÝ˜œ˜qœt QÐ.Ð.¨#Ð.Ð.ð 	=ñ 	=ˆCØˆ~˜aÑ Ô ð = ^ ^°AÑ%6Ô%6ð =Ý!$ Q¤V¡¤­s°1´6©{¬{Ò!:Ð!:˜˜1�v�vÀÀAÀ‘��1Ø!�> !Ñ$Ô$ð K¨¨¸Ñ):Ô):ð KÝ+¨A¬F°A´F¸MÑJÔJ�E�Eå+¨A¬F°A´F¸MÑJÔJ�EØ&+ð 9ð 9‘N�F˜FØHÐHÐHÐHÀÐHÑHÔH�BØHÐHÐHÐHÀÐHÑHÔH�BÝ$ R¨¨SÐ8Ð8°CÐ8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8ð9õ �Q”V‘”¥ A¤F¡¤Ò+Ð+Ý  ¤¨¬°Ð<Ð<¸Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<ùð	=ð 	=õ 
�‰Œð =� ™
œ
ð =¥s¨1¡v¤vµ°Q±´Ò'7Ð'7Ýˆq‰6Œ6�QŠ;ˆ;ØˆGˆGˆGˆGˆGå˜q œt Q q¤T¨1Ð4Ð4°Ð4Ð4ð =ð =�Ý   1 2 2¤¨¨!¨"¨"¬¨uÐ<Ð<¸Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<ð=ð =ð =ð =Ð'7Ð'7ð=ð =r   c              +   óB  K  — | |v rt          ||          ||fi |¤ŽE d {V —† d S t          | |¦  «        rd S t          | t          ¦  «        r*|                      |¦  «        rt          || |¦  «        V — d S t          | t          ¦  «        rt          || |¦  «        V — d S d S r   )rL   Úoccur_checkrI   r-   r/   Úassocr%   )Úvarr8   rQ   rR   s       r   rJ   rJ   ‚   s×   è è € Ø
ˆa€x€xÝ˜˜3œ  AÐ-Ð-¨Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ý	�S˜!Ñ	Ô	ð ØˆÝ	�C�Ñ	&Ô	&ð ¨3¯9ª9°Q©<¬<ð Ý�A�s˜AÑÔÐÐÐÐÐÝ	�C�Ñ	"Ô	"ð Ý�A�s˜AÑÔÐÐÐÐÐðð r   c                 óÄ   ‡ — ‰ |k    rdS t          |t          ¦  «        rt          ‰ |j        ¦  «        S t	          |¦  «        rt          ˆ fd„|D ¦   «         ¦  «        rdS dS )z# var occurs in subtree owned by x? Tc              3   ó8   •K  — | ]}t          ‰|¦  «        V — Œd S r   )r[   )rB   Úxir]   s     €r   ú	<genexpr>zoccur_check.<locals>.<genexpr>“   s-   øè è € Ð0Ð0¨�{˜3 Ñ#Ô#Ð0Ð0Ð0Ð0Ð0Ð0r   F)rI   r   r[   r	   rO   Úany)r]   r8   s   ` r   r[   r[   Œ   so   ø€ à
ˆa‚x€xØˆtÝ	�A•xÑ	 Ô	 ð >Ý˜3 ¤Ñ'Ô'Ð'Ý	�‰Œð >ÝÐ0Ð0Ð0Ð0¨aÐ0Ñ0Ô0Ñ0Ô0Ð=¸¸Øˆ5r   c                 ó8   — |                       ¦   «         } || |<   | S )z- Return copy of d with key associated to val )Úcopy)ÚdÚkeyÚvals      r   r\   r\   –   s   € à	�Š‰Œ€AØ€A€c�FØ€Hr   c                 óH   — t          | ¦  «        t          t          t          fv S )z Is x a traditional iterable? )r   ÚtupleÚlistÚsetr7   s    r   rO   rO   œ   s   € å�‰7Œ7•u�d¥CÐ(Ð(Ð(r   c                 óz   — t          | t          ¦  «        r%t          | j        ¦  «        dk    r| j        d         S | S )NrH   r   )rI   r   rM   r	   r7   s    r   rA   rA       s7   € Ý�!•XÑÔð ¥3 q¤v¡;¤;°!Ò#3Ð#3ØŒv�aŒyÐàˆr   c           	   #   óÌ  K  — |dk    rd}|dk    rd}t          | ¦  «        t          |¦  «        k     r| |fn|| f\  }}t          t          t          t          |¦  «        ¦  «        ¦  «        t          |¦  «        |¬¦  «        D ]_}||k    r,t	          d„ | D ¦   «         ¦  «        t          ||¦  «        fV — Œ4t          | |¦  «        t	          d„ |D ¦   «         ¦  «        fV — Œ`dS )a  
    Restructure A and B to have the same number of elements.

    Parameters
    ==========

    ordered must be either 'commutative' or 'associative'.

    A and B can be rearranged so that the larger of the two lists is
    reorganized into smaller sublists.

    Examples
    ========

    >>> from sympy.unify.core import allcombinations
    >>> for x in allcombinations((1, 2, 3), (5, 6), 'associative'): print(x)
    (((1,), (2, 3)), ((5,), (6,)))
    (((1, 2), (3,)), ((5,), (6,)))

    >>> for x in allcombinations((1, 2, 3), (5, 6), 'commutative'): print(x)
        (((1,), (2, 3)), ((5,), (6,)))
        (((1, 2), (3,)), ((5,), (6,)))
        (((1,), (3, 2)), ((5,), (6,)))
        (((1, 3), (2,)), ((5,), (6,)))
        (((2,), (1, 3)), ((5,), (6,)))
        (((2, 1), (3,)), ((5,), (6,)))
        (((2,), (3, 1)), ((5,), (6,)))
        (((2, 3), (1,)), ((5,), (6,)))
        (((3,), (1, 2)), ((5,), (6,)))
        (((3, 1), (2,)), ((5,), (6,)))
        (((3,), (2, 1)), ((5,), (6,)))
        (((3, 2), (1,)), ((5,), (6,)))
    r=   é   r>   N)Úorderedc              3   ó   K  — | ]}|fV — Œd S r   r#   )rB   rC   s     r   ra   z"allcombinations.<locals>.<genexpr>Ð   s$   è è € Ð(Ð( ˜˜Ð(Ð(Ð(Ð(Ð(Ð(r   c              3   ó   K  — | ]}|fV — Œd S r   r#   )rB   rG   s     r   ra   z"allcombinations.<locals>.<genexpr>Ò   s$   è è € Ð+<Ð+<°Q¨Q¨DÐ+<Ð+<Ð+<Ð+<Ð+<Ð+<r   )rM   r   rj   Úrangeri   Ú	partition)ÚAÚBro   ÚsmÚbgÚparts         r   rN   rN   ¦   s  è è € ðF �-ÒÐØˆØ�-ÒÐØˆÝ˜1‘v”v¥ A¡¤’�ˆa�ˆVˆV¨Q°¨F�F€BˆÝ•d�5¥ R¡¤™>œ>Ñ*Ô*­C°©G¬G¸WÐEÑEÔEð =ð =ˆØ�Š7ˆ7ÝÐ(Ð( aÐ(Ñ(Ô(Ñ(Ô(­)°A°tÑ*<Ô*<Ð<Ð<Ð<Ð<Ð<å˜A˜tÑ$Ô$¥eÐ+<Ð+<¸!Ð+<Ñ+<Ô+<Ñ&<Ô&<Ð<Ð<Ð<Ð<Ð<ð	=ð =r   c                 óL   ‡ —  t          ‰ ¦  «        ˆ fd„|D ¦   «         ¦  «        S )z× Partition a tuple/list into pieces defined by indices.

    Examples
    ========

    >>> from sympy.unify.core import partition
    >>> partition((10, 20, 30, 40), [[0, 1, 2], [3]])
    ((10, 20, 30), (40,))
    c                 ó0   •— g | ]}t          ‰|¦  «        ‘ŒS r#   )Úindex)rB   ÚindÚits     €r   rD   zpartition.<locals>.<listcomp>Þ   s!   ø€ Ð4Ð4Ð4¨•U˜2˜s‘^”^Ð4Ð4Ð4r   ©r   )r}   rx   s   ` r   rs   rs   Ô   s0   ø€ ð �4�‰8Œ8Ð4Ð4Ð4Ð4¨tÐ4Ñ4Ô4Ñ5Ô5Ð5r   c                 óL   ‡ —  t          ‰ ¦  «        ˆ fd„|D ¦   «         ¦  «        S )z½ Fancy indexing into an indexable iterable (tuple, list).

    Examples
    ========

    >>> from sympy.unify.core import index
    >>> index([10, 20, 30], (1, 2, 0))
    [20, 30, 10]
    c                 ó    •— g | ]
}‰|         ‘ŒS r#   r#   )rB   Úir}   s     €r   rD   zindex.<locals>.<listcomp>ê   s   ø€ Ð(Ð(Ð(˜q�R˜”UÐ(Ð(Ð(r   r~   )r}   r|   s   ` r   r{   r{   à   s0   ø€ ð �4�‰8Œ8Ð(Ð(Ð(Ð( CÐ(Ñ(Ô(Ñ)Ô)Ð)r   r   )r"   Úsympy.utilities.iterablesr   r   r%   r-   rL   rJ   r[   r\   rO   rA   rN   rs   r{   r#   r   r   ú<module>rƒ      s;  ððð ð$ ,Ð +Ð +Ð +Ð +Ð +ðIð Ið Ið Ið Iñ Iô Ið Ið&.ð .ð .ð .ð .ñ .ô .ð .ð2ð 2ð 2ð 2ð 2ñ 2ô 2ð 2ð*5=ð 5=ð 5=ð 5=ðnð ð ðð ð ðð ð ð)ð )ð )ðð ð ð,=ð ,=ð ,=ð\
6ð 
6ð 
6ð
*ð 
*ð 
*ð 
*ð 
*r   