§
    íóÉjìq  ã                   óø  — d Z ddlZddlZddlmZ ddlmZ ddlmZm	Z	 ddl
mZ ddlmZmZmZmZmZmZmZmZmZmZmZ  G d„ d	e¦  «        Z G d
„ de	¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z	 d(d„Z	 d(d„Z d)d„Z!d„ Z"d„ Z#d„ Z$d„ Z% G d„ d¦  «        Z&d(d„Z'd„ Z( G d„ de¦  «        Z) G d„ d e¦  «        Z* G d!„ d"¦  «        Z+d#„ Z,d$„ Z-d%„ Z.d&„ Z/e0d'k    r e/¦   «          dS dS )*z;
Module for a resolution-based First Order theorem prover.
é    N)Údefaultdict)Úreduce)ÚBaseProverCommandÚProver)Ú	skolemize)ÚAndExpressionÚApplicationExpressionÚEqualityExpressionÚ
ExpressionÚIndividualVariableExpressionÚNegatedExpressionÚOrExpressionÚVariableÚVariableExpressionÚ	is_indvarÚunique_variablec                   ó   — e Zd ZdS )ÚProverParseErrorN)Ú__name__Ú
__module__Ú__qualname__© ó    ú|/home/lighthouse/badge-speaker-benchmark/.benchmark-venv-community/lib/python3.11/site-packages/nltk/inference/resolution.pyr   r   #   s   € € € € € Ø€Dr   r   c                   ó(   — e Zd ZdZdZdZdd„Zd„ ZdS )	ÚResolutionProverÚANSWERTé<   NFc                 óê  — |sg }d}	 g }|r#|                      t          | ¦  «        ¦  «         |D ]$}|                      t          |¦  «        ¦  «         Œ%|                      |¦  «        \  }}|r't          t                               |¦  «        ¦  «         nY# t          $ rL}| j        r't          |¦  «         	                    d¦  «        rd}g }n|rt          |¦  «         n|‚Y d}~nd}~ww xY w||fS )zÜ
        :param goal: Input expression to prove
        :type goal: sem.Expression
        :param assumptions: Input expressions to use as assumptions in the proof
        :type assumptions: list(sem.Expression)
        Nz maximum recursion depth exceededF)
ÚextendÚclausifyÚ_attempt_proofÚprintÚResolutionProverCommandÚ_decorate_clausesÚRuntimeErrorÚ_assume_falseÚstrÚ
startswith)ÚselfÚgoalÚassumptionsÚverboseÚresultÚclausesÚaÚes           r   Ú_provezResolutionProver._prove3   s.  € ð ð 	ØˆKàˆð	ØˆGØð 0Ø—’�x¨¨™œÑ/Ô/Ð/Ø ð ,ð ,�Ø—’�x¨™{œ{Ñ+Ô+Ð+Ð+Ø"×1Ò1°'Ñ:Ô:‰OˆF�GØð JÝÕ-×?Ò?ÀÑHÔHÑIÔIÐIøøÝð 
	ð 
	ð 
	ØÔ!ð 	¥c¨!¡f¤f×&7Ò&7Ø2ñ'ô 'ð 	ð �Ø��àð Ý˜!‘H”H�H�Hà�Gøøøøøøøøøð
	øøøð ˜Ð Ð s   ˆBB Â
C.Â"AC)Ã)C.c                 óN  — t          t          ¦  «        }| j        rt          j        ¦   «         | j        z   nd }d}|t          |¦  «        k     �rT||                              ¦   «         �s ||         r||         d         dz   }n|dz   }|t          |¦  «        k     rî||k    rÐ|rÎ||                              ¦   «         s´|�t          j        ¦   «         |k    rdg fS ||                              |¦  «         	 ||                              ||         |¬¦  «        }n# t          $ r dg fcY S w xY w|rA|D ];}|dz   |dz   f|_
        |                     |¦  «         t          |¦  «        sd|fc S Œ<d}n|dz  }|t          |¦  «        k     °î|dz  }|t          |¦  «        k     �°Td|fS )Nr   éÿÿÿÿé   F)ÚdeadlineT)r   ÚlistÚTIMEOUTÚtimeÚ	monotonicÚlenÚis_tautologyÚappendÚunifyÚ_UnifyTimeoutÚ_parents)r*   r/   Útriedr6   ÚiÚjÚ
newclausesÚ	newclauses           r   r"   zResolutionProver._attempt_proofT   sÿ  € å�DÑ!Ô!ˆð 7;´lÐL•4”>Ñ#Ô# d¤lÑ2Ð2ÈˆàˆØ•#�g‘,”,ÒÑØ˜1”:×*Ò*Ñ,Ô,ñ #ð ˜”8ð Ø˜aœ œ qÑ(�A�Aà˜A™�Aà�#˜g™,œ,Ò&Ð&ð ˜A’v�v !�v¨G°A¬J×,CÒ,CÑ,EÔ,E�vØ#Ð/µD´NÑ4DÔ4DÀxÒ4OÐ4Oð %*¨2 ;Ð.Ø˜aœŸš¨Ñ*Ô*Ð*ð/Ø)0°¬×)9Ò)9¸'À!¼*ÈxÐ)9Ñ)XÔ)X˜J˜JøÝ,ð /ð /ð /ð %*¨2 ;Ð.Ð.Ð.ð/øøøð &ð "Ø-7ð ;ð ; 	Ø67¸!±e¸QÀ¹U°^ 	Ô 2Ø '§¢¨yÑ 9Ô 9Ð 9Ý'*¨9¡~¤~ð !;Ø,0°'¨?Ð$:Ð$:Ð$:ð!;à "˜AØ!Ø˜‘F�Að7 �#˜g™,œ,Ò&Ð&ð8 �‰FˆAðK •#�g‘,”,ÒÑðL �wÐÐs   Ã7#D ÄD,Ä+D,)NNF)r   r   r   Ú
ANSWER_KEYr'   r8   r2   r"   r   r   r   r   r   '   sI   € € € € € Ø€JØ€Mð €Gð!ð !ð !ð !ðB2 ð 2 ð 2 ð 2 ð 2 r   r   c                   ó<   — e Zd Zdd„Zdd„Zdd„Zed„ ¦   «         ZdS )	r$   Nc                 ó’   — |�t          |t          ¦  «        sJ ‚nt          ¦   «         }t          j        | |||¦  «         d| _        dS )zé
        :param goal: Input expression to prove
        :type goal: sem.Expression
        :param assumptions: Input expressions to use as assumptions in
            the proof.
        :type assumptions: list(sem.Expression)
        N)Ú
isinstancer   r   Ú__init__Ú_clauses)r*   r+   r,   Úprovers       r   rJ   z ResolutionProverCommand.__init__Š   sQ   € ð ÐÝ˜fÕ&6Ñ7Ô7Ð7Ð7Ð7Ð7å%Ñ'Ô'ˆFåÔ" 4¨°°{ÑCÔCÐCØˆŒˆˆr   Fc                 óú   — | j         €n| j                             |                      ¦   «         |                      ¦   «         |¦  «        \  | _         }|| _        t                               |¦  «        | _        | j         S )zh
        Perform the actual proof.  Store the result to prevent unnecessary
        re-proving.
        )	Ú_resultÚ_proverr2   r+   r,   rK   r$   r%   Ú_proof)r*   r-   r/   s      r   ÚprovezResolutionProverCommand.proveš   sk   € ð
 Œ<ÐØ$(¤L×$7Ò$7Ø—	’	‘”˜T×-Ò-Ñ/Ô/°ñ%ô %Ñ!ˆDŒL˜'ð $ˆDŒMÝ1×CÒCÀGÑLÔLˆDŒKØŒ|Ðr   c                 óª  — |                       |¦  «         t          ¦   «         }t          t          t          j        ¦  «        ¦  «        }| j        D ]�}t          |¦  «        dk    rlt          |d         t          ¦  «        rQ|d         j
        |k    r@t          |d         j        t          ¦  «        s |                     |d         j        ¦  «         Œ‚|S )Nr5   r   )rQ   Úsetr   r   r   rF   rK   r;   rI   r	   ÚfunctionÚargumentr   Úadd)r*   r-   ÚanswersÚ	answer_exÚclauses        r   Úfind_answersz$ResolutionProverCommand.find_answers§   s¼   € Ø�
Š
�7ÑÔÐå‘%”%ˆÝ&¥xÕ0@Ô0KÑ'LÔ'LÑMÔMˆ	Ø”mð 	0ð 	0ˆFå�F‘”˜qÒ Ð Ý˜v aœyÕ*?Ñ@Ô@ð !à˜1”IÔ&¨)Ò3Ð3Ý" 6¨!¤9Ô#5Õ7SÑTÔTð 4ð —’˜F 1œIÔ.Ñ/Ô/Ð/øØˆr   c                 ó^  — d}| s|S t          d„ | D ¦   «         ¦  «        }t          t          t          | ¦  «        ¦  «        ¦  «        }t          t          | ¦  «        ¦  «        D ]Ç}d}d}| |                              ¦   «         rd}| |         j        rt          | |         j        ¦  «        }d|t          t          | |         ¦  «        ¦  «        z
  dz   z  |z   }d|t          t          |dz   ¦  «        ¦  «        z
  z  t          |dz   ¦  «        z   }|d|› d| |         › d|› d|› d	�	z  }ŒÈ|S )
z,
        Decorate the proof output.
        Ú c              3   óN   K  — | ] }t          t          |¦  «        ¦  «        V — Œ!d S ©N)r;   r(   )Ú.0rY   s     r   ú	<genexpr>z<ResolutionProverCommand._decorate_clauses.<locals>.<genexpr>Á   s0   è è € ÐDÐD°&�S¥ V¡¤Ñ-Ô-ÐDÐDÐDÐDÐDÐDr   ÚAÚ	Tautologyú r5   ú[z] ú
)Úmaxr;   r(   Úranger<   r@   )r/   ÚoutÚmax_clause_lenÚmax_seq_lenrB   ÚparentsÚtautÚseqs           r   r%   z)ResolutionProverCommand._decorate_clauses¶   sH  € ð
 ˆð ð 	ØˆJÝÐDÐD¸GÐDÑDÔDÑDÔDˆÝ�#�c '™lœlÑ+Ô+Ñ,Ô,ˆÝ•s˜7‘|”|Ñ$Ô$ð 		>ð 		>ˆAØˆGØˆDØ�qŒz×&Ò&Ñ(Ô(ð #Ø"�Ø�qŒzÔ"ð 3Ý˜g aœjÔ1Ñ2Ô2�Ø˜^­cµ#°g¸a´j±/´/Ñ.BÔ.BÑBÀQÑFÑGÈ'ÑQˆGØ˜¥s­3¨q°1©u©:¬:¡¤Ñ6Ñ7½#¸aÀ!¹e¹*¼*ÑDˆCØÐ=�sÐ=Ð=˜g aœjÐ=Ð=¨7Ð=Ð=°TÐ=Ð=Ð=Ñ=ˆCˆCØˆ
r   )NNN)F)r   r   r   rJ   rQ   rZ   Ústaticmethodr%   r   r   r   r$   r$   ‰   sk   € € € € € ðð ð ð ð ð ð ð ðð ð ð ð ðð ñ „\ðð ð r   r$   c                   ó`   — e Zd Zd„ Z	 dd„Zd„ Zd„ Zd„ Zd„ Zd	„ Z	d
„ Z
d„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚClausec                 óX   — t                                | |¦  «         d | _        d | _        d S r^   )r7   rJ   Ú_is_tautologyr@   )r*   Údatas     r   rJ   zClause.__init__Ñ   s)   € Ý�Š�d˜DÑ!Ô!Ð!Ø!ˆÔØˆŒˆˆr   NFc           
      ó  — |€t          ¦   «         }|€g g f}|€g g f}t          |t          ¦  «        rt          |¦  «        }t	          | ||||t
          ||¦  «        }g }t          |¦  «        D ]R\  }	}
|	|vrIt          |¦  «        D ]9\  }}|	|k    r.||vr*|
                     |¦  «        r|                     |¦  «         Œ:ŒSg }t          t          |¦  «        ¦  «        D ]!}	|	|vr|                     ||	         ¦  «         Œ"|S )að  
        Attempt to unify this Clause with the other, returning a list of
        resulting, unified, Clauses.

        :param other: ``Clause`` with which to unify
        :param bindings: ``BindingDict`` containing bindings that should be used
            during the unification
        :param used: tuple of two lists of atoms.  The first lists the
            atoms from 'self' that were successfully unified with atoms from
            'other'.  The second lists the atoms from 'other' that were successfully
            unified with atoms from 'self'.
        :param skipped: tuple of two ``Clause`` objects.  The first is a list of all
            the atoms from the 'self' Clause that have not been unified with
            anything on the path.  The second is same thing for the 'other' Clause.
        :param debug: bool indicating whether debug statements should print
        :return: list containing all the resulting ``Clause`` objects that could be
            obtained by unification
        )ÚBindingDictrI   ÚboolÚDebugObjectÚ_iterate_firstÚ_complete_unify_pathÚ	enumerateÚsubsumesr=   rg   r;   )r*   ÚotherÚbindingsÚusedÚskippedÚdebugr6   rD   ÚsubsumedrB   Úc1rC   Úc2r.   s                 r   r>   zClause.unifyÖ   s6  € ð* ÐÝ"‘}”}ˆHØˆ<Ø˜�8ˆDØˆ?Ø˜2�hˆGÝ�e�TÑ"Ô"ð 	'Ý Ñ&Ô&ˆEå#Ø�%˜ 4¨Õ2FÈÈxñ
ô 
ˆ
ð ˆÝ˜zÑ*Ô*ð 	+ð 	+‰EˆAˆrØ˜Ð Ð Ý& zÑ2Ô2ð +ð +‘E�A�rØ˜A’v�v !¨8Ð"3Ð"3¸¿ºÀB¹¼Ð"3Ø Ÿš¨Ñ*Ô*Ð*øøØˆÝ•s˜:‘”Ñ'Ô'ð 	-ð 	-ˆAØ˜Ð Ð Ø—’˜j¨œmÑ,Ô,Ð,øàˆr   c                 ó   — | D ]	}||vr dS Œ
dS )z„
        Return True iff every term in 'self' is a term in 'other'.

        :param other: ``Clause``
        :return: bool
        FTr   )r*   r|   r0   s      r   Ú
isSubsetOfzClause.isSubsetOf  s-   € ð ð 	ð 	ˆAØ˜ˆ~ˆ~Ø�u�uð àˆtr   c                 óZ  — g }|D ]H}t          |t          ¦  «        r|                     |j        ¦  «         Œ2|                     | ¦  «         ŒIt	          |¦  «        }t          ¦   «         }g g f}g g f}t          d¦  «        }t          t          | ||||t          |¦  «        ¦  «        dk    S )zì
        Return True iff 'self' subsumes 'other', this is, if there is a
        substitution such that every term in 'self' can be unified with a term
        in 'other'.

        :param other: ``Clause``
        :return: bool
        Fr   )
rI   r   r=   Útermrp   ru   rw   r;   rx   Ú_subsumes_finalize)	r*   r|   ÚnegatedotherÚatomÚnegatedotherClauser}   r~   r   r€   s	            r   r{   zClause.subsumes  sÓ   € ð ˆØð 	+ð 	+ˆDÝ˜$Õ 1Ñ2Ô2ð +Ø×#Ò# D¤IÑ.Ô.Ð.Ð.à×#Ò# T EÑ*Ô*Ð*Ð*å# LÑ1Ô1Ðå‘=”=ˆØ�BˆxˆØ�r�(ˆÝ˜EÑ"Ô"ˆõ ÝØØ&ØØØÝ&Øñô ñ
ô 
ð òð	
r   c                 óT   — t          t                               | ||¦  «        ¦  «        S r^   )rp   r7   Ú__getslice__)r*   ÚstartÚends      r   r�   zClause.__getslice__9  s"   € Ý•d×'Ò'¨¨e°SÑ9Ô9Ñ:Ô:Ð:r   c                 ó:   ‡— t          ˆfd„| D ¦   «         ¦  «        S )Nc                 ó   •— g | ]}|‰v¯|‘Œ	S r   r   )r_   r0   r|   s     €r   ú
<listcomp>z"Clause.__sub__.<locals>.<listcomp>=  s   ø€ Ð9Ð9Ð9˜Q¨!°5¨.¨.�q¨.¨.¨.r   ©rp   ©r*   r|   s    `r   Ú__sub__zClause.__sub__<  s&   ø€ ÝÐ9Ð9Ð9Ð9 $Ð9Ñ9Ô9Ñ:Ô:Ð:r   c                 óR   — t          t                               | |¦  «        ¦  «        S r^   )rp   r7   Ú__add__r”   s     r   r—   zClause.__add__?  s   € Ý•d—l’l 4¨Ñ/Ô/Ñ0Ô0Ð0r   c                 ó„  — | j         �| j         S t          | ¦  «        D ]š\  }}t          |t          ¦  «        s€t	          | ¦  «        dz
  }||k    rh| |         }t          |t
          ¦  «        r|j        |k    r
d| _          dS n*t          |t
          ¦  «        r||j        k    r
d| _          dS |dz  }||k    °hŒ›d| _         dS )z›
        Self is a tautology if it contains ground terms P and -P.  The ground
        term, P, must be an exact match, ie, not using unification.
        Nr5   TF)rr   rz   rI   r
   r;   r   r‡   )r*   rB   r0   rC   Úbs        r   r<   zClause.is_tautologyB  sè   € ð
 ÔÐ)ØÔ%Ð%Ý˜d‘O”Oð 	ð 	‰DˆAˆqÝ˜aÕ!3Ñ4Ô4ð Ý˜‘I”I ‘M�Ø˜!’e�eØ˜Qœ�AÝ! !Õ%6Ñ7Ô7ð (Øœ6 Qš;˜;Ø15˜DÔ.Ø#' 4 4ð 'õ $ AÕ'8Ñ9Ô9ð (Ø ¤š;˜;Ø15˜DÔ.Ø#' 4 4Ø˜‘F�Að ˜!’e�eøð #ˆÔØˆur   c                 óJ   — t          t          j        d„ | D ¦   «         ¦  «        S )Nc              3   óh   K  — | ]-}|                      ¦   «         |                     ¦   «         z  V — Œ.d S r^   )ÚfreeÚ	constants)r_   rŠ   s     r   r`   zClause.free.<locals>.<genexpr>[  s9   è è € Ð$WÐ$WÈ$ d§i¢i¡k¤k°D·N²NÑ4DÔ4DÑ&DÐ$WÐ$WÐ$WÐ$WÐ$WÐ$Wr   )r   ÚoperatorÚor_©r*   s    r   rœ   zClause.freeZ  s$   € Ý•h”lÐ$WÐ$WÐRVÐ$WÑ$WÔ$WÑXÔXÐXr   c                 ó>   ‡‡— t          ˆˆfd„| D ¦   «         ¦  «        S )z½
        Replace every instance of variable with expression across every atom
        in the clause

        :param variable: ``Variable``
        :param expression: ``Expression``
        c                 ó<   •— g | ]}|                      ‰‰¦  «        ‘ŒS r   )Úreplace)r_   rŠ   Ú
expressionÚvariables     €€r   r’   z"Clause.replace.<locals>.<listcomp>e  s'   ø€ ÐKÐKÐK¸d�t—|’| H¨jÑ9Ô9ÐKÐKÐKr   r“   )r*   r¥   r¤   s    ``r   r£   zClause.replace]  s,   øø€ õ ÐKÐKÐKÐKÐKÀdÐKÑKÔKÑLÔLÐLr   c                 ó:   ‡— t          ˆfd„| D ¦   «         ¦  «        S )zÃ
        Replace every binding

        :param bindings: A list of tuples mapping Variable Expressions to the
            Expressions to which they are bound.
        :return: ``Clause``
        c                 ó:   •— g | ]}|                      ‰¦  «        ‘ŒS r   )Úsubstitute_bindings)r_   rŠ   r}   s     €r   r’   z.Clause.substitute_bindings.<locals>.<listcomp>o  s'   ø€ ÐKÐKÐK¸d�t×/Ò/°Ñ9Ô9ÐKÐKÐKr   r“   )r*   r}   s    `r   r¨   zClause.substitute_bindingsg  s(   ø€ õ ÐKÐKÐKÐKÀdÐKÑKÔKÑLÔLÐLr   c                 óL   — dd                      d„ | D ¦   «         ¦  «        z   dz   S )NÚ{ú, c              3   ó    K  — | ]	}d |z  V — Œ
dS )ú%sNr   )r_   Úitems     r   r`   z!Clause.__str__.<locals>.<genexpr>r  s&   è è € Ð<Ð<¨t˜t d™{Ð<Ð<Ð<Ð<Ð<Ð<r   Ú})Újoinr    s    r   Ú__str__zClause.__str__q  s-   € Ø�T—Y’YÐ<Ð<°tÐ<Ñ<Ô<Ñ<Ô<Ñ<¸sÑBÐBr   c                 ó   — d| z  S ©Nr­   r   r    s    r   Ú__repr__zClause.__repr__t  ó   € Ø�d‰{Ðr   )NNNFN)r   r   r   rJ   r>   r…   r{   r�   r•   r—   r<   rœ   r£   r¨   r±   r´   r   r   r   rp   rp   Ð   sñ   € € € € € ðð ð ð TXð/ð /ð /ð /ðb
ð 
ð 
ð$
ð $
ð $
ðL;ð ;ð ;ð;ð ;ð ;ð1ð 1ð 1ðð ð ð0Yð Yð YðMð Mð MðMð Mð MðCð Cð Cðð ð ð ð r   rp   c                   ó   — e Zd ZdZdS )r?   a°  Raised inside a single ``Clause.unify`` when its ``deadline`` passes.

    Unifying two clauses that share many same-predicate literals explores an
    exponential number of literal pairings inside one ``unify`` call, which the
    saturation loop's between-call ``TIMEOUT`` cannot interrupt. Checking the
    deadline inside the recursion (and aborting via this exception) makes the
    time bound effective (CWE-407/CWE-400).
    N)r   r   r   Ú__doc__r   r   r   r?   r?   x  s   € € € € € ðð ð ð r   r?   c                 ó   — |�t          j        ¦   «         |k    rt          ‚|                     d| › d|› d|› �¦  «         t	          | ¦  «        rt	          |¦  «        s || |||||¦  «        S t          | ||||||dz   |¦  «        }|d         | d         gz   |d         f}	|t          | dd…         ||||	||dz   |¦  «        z  }	 t          | d         |d         ||¦  «        \  }
}}| dd…         |d         z   |d         z   }|dd…         |d         z   |d         z   }|t          |||
|g g f||dz   |¦  «        z  }n# t          $ r Y nw xY w|S )zF
    This method facilitates movement through the terms of 'self'
    Núunify(ú,ú) r5   r   )	r9   r:   r?   Úliner;   Ú_iterate_secondrx   Ú_unify_termsÚBindingException)ÚfirstÚsecondr}   r~   r   Úfinalize_methodr€   r6   r.   Ú
newskippedÚnewbindingsÚnewusedÚunusedÚnewfirstÚ	newseconds                  r   rx   rx   ƒ  sÏ  € ð Ð¥¤Ñ 0Ô 0°8Ò ;Ð ;ÝÐØ	‡J‚JÐ4˜Ð4Ð4 Ð4Ð4¨(Ð4Ð4Ñ5Ô5Ð5åˆu‰:Œ:ð +�S ™[œ[ð +Øˆ˜u f¨h¸¸gÀuÑMÔMÐMõ !Ø�6˜8 T¨7°OÀUÈQÁYÐPXñ
ô 
ˆð
 ˜a”j E¨!¤H :Ñ-¨w°q¬zÐ:ˆ
Ø•.Ø�!�"�"ŒIØØØØØØ�A‰IØñ	
ô 	
ñ 		
ˆð	Ý+7Ø�a”˜& œ) X¨tñ,ô ,Ñ(ˆK˜ &ð
 ˜Q˜R˜R”y 7¨1¤:Ñ-°°q´	Ñ9ˆHØ˜q˜r˜rœ
 W¨Q¤ZÑ/°&¸´)Ñ;ˆIØ•nØØØØØ�R�ØØ˜‘	Øñ	ô 	ñ 	ˆFˆFøõ  ð 	ð 	ð 	àˆDð	øøøð ˆs   ÃA8D> Ä>
EÅ
Ec                 óh  — |�t          j        ¦   «         |k    rt          ‚|                     d| › d|› d|› �¦  «         t	          | ¦  «        rt	          |¦  «        s || |||||¦  «        S |d         |d         |d         gz   f}t          | |dd…         |||||dz   |¦  «        }		 t          | d         |d         ||¦  «        \  }
}}| dd…         |d         z   |d         z   }|dd…         |d         z   |d         z   }|	t          |||
|g g f||dz   |¦  «        z  }	n# t          $ r Y nw xY w|	S )zG
    This method facilitates movement through the terms of 'other'
    Nr¹   rº   r»   r   r5   )r9   r:   r?   r¼   r;   r½   r¾   r¿   )rÀ   rÁ   r}   r~   r   rÂ   r€   r6   rÃ   r.   rÄ   rÅ   rÆ   rÇ   rÈ   s                  r   r½   r½   »  s¡  € ð Ð¥¤Ñ 0Ô 0°8Ò ;Ð ;ÝÐØ	‡J‚JÐ4˜Ð4Ð4 Ð4Ð4¨(Ð4Ð4Ñ5Ô5Ð5åˆu‰:Œ:ð &�S ™[œ[ð &Øˆ˜u f¨h¸¸gÀuÑMÔMÐMð ˜a”j '¨!¤*°°q´	¨{Ñ":Ð;ˆ
Ý ØØ�1�2�2ŒJØØØØØ�A‰IØñ	
ô 	
ˆð	Ý+7Ø�a”˜& œ) X¨tñ,ô ,Ñ(ˆK˜ &ð
 ˜Q˜R˜R”y 7¨1¤:Ñ-°°q´	Ñ9ˆHØ˜q˜r˜rœ
 W¨Q¤ZÑ/°&¸´)Ñ;ˆIØ•oØØØØØ�R�ØØ˜‘	Øñ	ô 	ñ 	ˆFˆFøõ  ð 	ð 	ð 	àˆDð	øøøð ˆs   Â)A8D" Ä"
D/Ä.D/c                 ól  — t          | t          ¦  «        sJ ‚t          |t          ¦  «        sJ ‚|€t          ¦   «         }|€g g f}t          | t          ¦  «        rIt          |t          ¦  «        r4t          | j        ||¦  «        }|d         | gz   |d         |gz   f}g g f}�nt          | t          ¦  «        rHt          |t          ¦  «        r3t          | |j        |¦  «        }|d         | gz   |d         |gz   f}g g f}n±t          | t          ¦  «        r;t          | j        j	        | j
        fg¦  «        }|d         | gz   |d         f}g |gf}nat          |t          ¦  «        r;t          |j        j	        |j
        fg¦  «        }|d         |d         |gz   f}| gg f}nt          | |f¦  «        ‚|||fS )aÑ  
    This method attempts to unify two terms.  Two expressions are unifiable
    if there exists a substitution function S such that S(a) == S(-b).

    :param a: ``Expression``
    :param b: ``Expression``
    :param bindings: ``BindingDict`` a starting set of bindings with which
    the unification must be consistent
    :return: ``BindingDict`` A dictionary of the bindings required to unify
    :raise ``BindingException``: If the terms cannot be unified
    Nr   r5   )rI   r   ru   r   r	   Úmost_general_unificationr‡   r
   rÀ   r¥   rÁ   r¿   )r0   r™   r}   r~   rÄ   rÅ   rÆ   s          r   r¾   r¾   î  sÜ  € õ �a�Ñ$Ô$Ð$Ð$Ð$Ý�a�Ñ$Ô$Ð$Ð$Ð$àÐÝ‘=”=ˆØ€|Ø�Bˆxˆõ �!Õ&Ñ'Ô'ð '­J°qÕ:OÑ,PÔ,Pð 'Ý.¨q¬v°q¸(ÑCÔCˆØ˜”7˜a˜S‘= $ q¤'¨Q¨C¡-Ð0ˆØ�b�ˆ‰Ý	�AÕ,Ñ	-Ô	-ð 'µ*¸QÕ@QÑ2RÔ2Rð 'Ý.¨q°!´&¸(ÑCÔCˆØ˜”7˜a˜S‘= $ q¤'¨Q¨C¡-Ð0ˆØ�b�ˆˆõ 
�AÕ)Ñ	*Ô	*ð 
'Ý! A¤GÔ$4°a´hÐ#?Ð"@ÑAÔAˆØ˜”7˜a˜S‘= $ q¤'Ð*ˆØ�q�c�ˆˆÝ	�AÕ)Ñ	*Ô	*ð 'Ý! A¤GÔ$4°a´hÐ#?Ð"@ÑAÔAˆØ˜”7˜D œG q c™MÐ*ˆØ�#�r�ˆˆõ   1˜vÑ&Ô&Ð&à˜ Ð'Ð'r   c                 óô   — |d         s|d         rRt          |d         |d         z   | z   |z   ¦  «        }|                     d|z  ¦  «         |                     |¦  «        gS |                     d¦  «         g S )Nr   r5   z  -> New Clause: %sz  -> End)rp   r¼   r¨   )rÀ   rÁ   r}   r~   r   r€   rE   s          r   ry   ry     sƒ   € ØˆA„wð �$�q”'ð Ý˜7 1œ:¨°¬
Ñ2°UÑ:¸VÑCÑDÔDˆ	Ø�
Š
Ð(¨9Ñ4Ñ5Ô5Ð5Ø×-Ò-¨hÑ7Ô7Ð8Ð8à�
Š
�:ÑÔÐØˆ	r   c                 óT   — t          |d         ¦  «        st          | ¦  «        sdgS g S )Nr   T)r;   )rÀ   rÁ   r}   r~   r   r€   s         r   rˆ   rˆ   &  s/   € Ýˆw�qŒz‰?Œ?ð ¥3 u¡:¤:ð ð ˆvˆàˆ	r   c                 ó*  — g }t          t          | ¦  «        ¦  «        D ]s}|                     ¦   «         D ]G}t          |j        ¦  «        r1t          t          ¦   «         ¦  «        }|                     ||¦  «        }ŒH|                     |¦  «         Œt|S )zC
    Skolemize, clausify, and standardize the variables apart.
    )	Ú	_clausifyr   rœ   r   Únamer   r   r£   r=   )r¤   Úclause_listrY   rœ   Únewvars        r   r!   r!   2  s•   € ð €KÝ�I jÑ1Ô1Ñ2Ô2ð #ð #ˆØ—K’K‘M”Mð 	6ð 	6ˆDÝ˜œÑ#Ô#ð 6Ý+­OÑ,=Ô,=Ñ>Ô>�ØŸš¨¨fÑ5Ô5�øØ×Ò˜6Ñ"Ô"Ð"Ð"ØÐr   c                 óú  — t          | t          ¦  «        r)t          | j        ¦  «        t          | j        ¦  «        z   S t          | t
          ¦  «        rdt          | j        ¦  «        }t          | j        ¦  «        }t          |¦  «        dk    sJ ‚t          |¦  «        dk    sJ ‚|d         |d         z   gS t          | t          ¦  «        rt          | g¦  «        gS t          | t          ¦  «        rt          | g¦  «        gS t          | t          ¦  «        rVt          | j        t          ¦  «        rt          | g¦  «        gS t          | j        t          ¦  «        rt          | g¦  «        gS t          ¦   «         ‚)z;
    :param expression: a skolemized expression in CNF
    r5   r   )rI   r   rÏ   rÀ   rÁ   r   r;   r
   rp   r	   r   r‡   r   )r¤   rÀ   rÁ   s      r   rÏ   rÏ   @  sd  € õ �*�mÑ,Ô,ð *Ý˜Ô)Ñ*Ô*­Y°zÔ7HÑ-IÔ-IÑIÐIÝ	�J¥Ñ	-Ô	-ð *Ý˜*Ô*Ñ+Ô+ˆÝ˜:Ô,Ñ-Ô-ˆÝ�5‰zŒz˜QŠˆˆˆÝ�6‰{Œ{˜aÒÐÐÐØ�a”˜6 !œ9Ñ$Ð%Ð%Ý	�JÕ 2Ñ	3Ô	3ð *Ý˜
�|Ñ$Ô$Ð%Ð%Ý	�JÕ 5Ñ	6Ô	6ð *Ý˜
�|Ñ$Ô$Ð%Ð%Ý	�JÕ 1Ñ	2Ô	2ð *Ý�j”oÕ'<Ñ=Ô=ð 	*Ý˜J˜<Ñ(Ô(Ð)Ð)Ý˜
œÕ);Ñ<Ô<ð 	*Ý˜J˜<Ñ(Ô(Ð)Ð)Ý
Ñ
Ô
Ðr   c                   ó@   — e Zd Zd
d„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
dS )ru   Nc                 ó6   — i | _         |r|D ]\  }}|| |<   ŒdS dS )z‚
        :param binding_list: list of (``AbstractVariableExpression``, ``AtomicExpression``) to initialize the dictionary
        N©Úd)r*   Úbinding_listÚvr™   s       r   rJ   zBindingDict.__init__Y  sE   € ð ˆŒàð 	Ø$ð ð ‘��1Ø��Q‘�ð	ð 	ðð r   c                 óÂ  — t          |t          ¦  «        sJ ‚t          |t          ¦  «        sJ ‚	 | |         }n# t          $ r d}Y nw xY w|r||k    r|| j        |<   dS t          |t
          ¦  «        r[	 | |j                 }n# t          $ r d}Y nw xY wt          |¦  «        }|r||k    r|| j        |j        <   dS t          d|z  ¦  «        ‚t          d|z  ¦  «        ‚)a€  
        A binding is consistent with the dict if its variable is not already bound, OR if its
        variable is already bound to its argument.

        :param variable: ``Variable`` The variable to bind
        :param binding: ``Expression`` The atomic to which 'variable' should be bound
        :raise BindingException: If the variable cannot be bound in this dictionary
        Nz*Variable %s already bound to another value)	rI   r   r   ÚKeyErrorr×   r   r¥   r   r¿   )r*   r¥   ÚbindingÚexistingÚbinding2s        r   Ú__setitem__zBindingDict.__setitem__c  sA  € õ ˜(¥HÑ-Ô-Ð-Ð-Ð-Ý˜'¥:Ñ.Ô.Ð.Ð.Ð.ð	Ø˜H”~ˆHˆHøÝð 	ð 	ð 	ØˆHˆHˆHð	øøøð ð 	˜7 hÒ.Ð.Ø&ˆDŒF�8ÑÐÐÝ˜Õ!=Ñ>Ô>ð 	ð Ø Ô 0Ô1��øÝð  ð  ð  Ø���ð øøøõ *¨(Ñ3Ô3ˆHàð ˜x¨8Ò3Ð3Ø+3�”�wÔ'Ñ(Ð(Ð(å&ØCÀxÑPñô ð õ #Ø?À8ÑLñô ð s!   °9 ¹AÁAÁ5B ÂBÂBc                 óœ   — t          |t          ¦  «        sJ ‚| j        |         }|r%	 | j        |         }n# t          $ r |cY S w xY w|°#dS dS )zD
        Return the expression to which 'variable' is bound
        N)rI   r   r×   rÛ   )r*   r¥   Úintermediates      r   Ú__getitem__zBindingDict.__getitem__Š  s†   € õ ˜(¥HÑ-Ô-Ð-Ð-Ð-à”v˜hÔ'ˆØð 	$ð$Ø#œv lÔ3��øÝð $ð $ð $Ø#Ð#Ð#Ð#ð$øøøð ð 	$ð 	$ð 	$ð 	$ð 	$s   ¨6 ¶AÁAc                 ó   — || j         v S r^   rÖ   )r*   r®   s     r   Ú__contains__zBindingDict.__contains__—  s   € Ø�t”vˆ~Ðr   c                 óÞ   — 	 t          ¦   «         }| j        D ]}| j        |         ||<   Œ|j        D ]}|j        |         ||<   Œ|S # t          $ r}t          d| ›d|›d�¦  «        |‚d}~ww xY w)a  
        :param other: ``BindingDict`` The dict with which to combine self
        :return: ``BindingDict`` A new dict containing all the elements of both parameters
        :raise BindingException: If the parameter dictionaries are not consistent with each other
        z3Attempting to add two contradicting BindingDicts: 'z' and 'ú'N)ru   r×   r¿   )r*   r|   ÚcombinedrÙ   r1   s        r   r—   zBindingDict.__add__š  s¤   € ð	Ý"‘}”}ˆHØ”Vð (ð (�Ø"œf Qœi�˜‘�Ø”Wð )ð )�Ø#œg aœj�˜‘�ØˆOøÝð 	ð 	ð 	Ý"Ð"à15°°°u°u°uð>ñô ð ðøøøøð	øøøs   ‚AA Á
A,ÁA'Á'A,c                 ó*   — t          | j        ¦  «        S r^   )r;   r×   r    s    r   Ú__len__zBindingDict.__len__­  s   € Ý�4”6‰{Œ{Ðr   c                 óž   ‡ — d                      ˆ fd„t          ‰ j                             ¦   «         ¦  «        D ¦   «         ¦  «        }d|z   dz   S )Nr«   c              3   ó<   •K  — | ]}|› d ‰j         |         › �V — ŒdS )ú: NrÖ   )r_   rÙ   r*   s     €r   r`   z&BindingDict.__str__.<locals>.<genexpr>±  s7   øè è € ÐPÐP°Q Ð0Ð0 T¤V¨A¤YÐ0Ð0ÐPÐPÐPÐPÐPÐPr   rª   r¯   )r°   Úsortedr×   Úkeys)r*   Údata_strs   ` r   r±   zBindingDict.__str__°  sJ   ø€ Ø—9’9ÐPÐPÐPÐP½&ÀÄÇÂÁÄÑ:OÔ:OÐPÑPÔPÑPÔPˆØ�X‰~ Ñ#Ð#r   c                 ó   — d| z  S r³   r   r    s    r   r´   zBindingDict.__repr__´  rµ   r   r^   )r   r   r   rJ   rß   râ   rä   r—   ré   r±   r´   r   r   r   ru   ru   X  s’   € € € € € ðð ð ð ð%ð %ð %ðN$ð $ð $ðð ð ðð ð ð&ð ð ð$ð $ð $ðð ð ð ð r   ru   c                 ó®  — |€t          ¦   «         }| |k    r|S t          | t          ¦  «        rt          | ||¦  «        S t          |t          ¦  «        rt          || |¦  «        S t          | t          ¦  «        rLt          |t          ¦  «        r7t          | j        |j        |¦  «        t          | j        |j        |¦  «        z   S t          | |f¦  «        ‚)ah  
    Find the most general unification of the two given expressions

    :param a: ``Expression``
    :param b: ``Expression``
    :param bindings: ``BindingDict`` a starting set of bindings with which the
                     unification must be consistent
    :return: a list of bindings
    :raise BindingException: if the Expressions cannot be unified
    )	ru   rI   r   Ú_mgu_varr	   rË   rT   rU   r¿   )r0   r™   r}   s      r   rË   rË   ¸  sß   € ð ÐÝ‘=”=ˆàˆA‚v€vØˆÝ	�AÕ3Ñ	4Ô	4ð GÝ˜˜1˜hÑ'Ô'Ð'Ý	�AÕ3Ñ	4Ô	4ð GÝ˜˜1˜hÑ'Ô'Ð'Ý	�AÕ,Ñ	-Ô	-ð Gµ*¸QÕ@UÑ2VÔ2Vð GÝ'ØŒJ˜œ
 Hñ
ô 
å$ Q¤Z°´¸XÑFÔFñGð 	Gõ ˜A˜q˜6Ñ
"Ô
"Ð"r   c                 ó¸   — | j         |                     ¦   «         |                     ¦   «         z  v rt          | |f¦  «        ‚t	          | j         |fg¦  «        |z   S r^   )r¥   rœ   r�   r¿   ru   )Úvarr¤   r}   s      r   rò   rò   Ó  sZ   € Ø
„|�z—’Ñ(Ô(¨:×+?Ò+?Ñ+AÔ+AÑAÐAÐAÝ  ZÐ0Ñ1Ô1Ð1å˜Sœ\¨:Ð6Ð7Ñ8Ô8¸8ÑCÐCr   c                   ó   — e Zd Zd„ ZdS )r¿   c                 ó¦   — t          |t          ¦  «        r t                               | d|z  ¦  «         d S t                               | |¦  «         d S )Nz'%s' cannot be bound to '%s')rI   ÚtupleÚ	ExceptionrJ   )r*   Úargs     r   rJ   zBindingException.__init__Û  sR   € Ý�c�5Ñ!Ô!ð 	*Ý×Ò˜tÐ%CÀcÑ%IÑJÔJÐJÐJÐJå×Ò˜t SÑ)Ô)Ð)Ð)Ð)r   N©r   r   r   rJ   r   r   r   r¿   r¿   Ú  s#   € € € € € ð*ð *ð *ð *ð *r   r¿   c                   ó   — e Zd Zd„ ZdS )ÚUnificationExceptionc                 óJ   — t                                | d|› d|› d�¦  «         d S )Nræ   z' cannot unify with ')rø   rJ   )r*   r0   r™   s      r   rJ   zUnificationException.__init__ã  s2   € Ý×Ò˜4Ð!A QÐ!AÐ!A¸QÐ!AÐ!AÐ!AÑBÔBÐBÐBÐBr   Nrú   r   r   r   rü   rü   â  s(   € € € € € ðCð Cð Cð Cð Cr   rü   c                   ó"   — e Zd Zdd„Zd„ Zd„ ZdS )rw   Tr   c                 ó"   — || _         || _        d S r^   )ÚenabledÚindent)r*   r   r  s      r   rJ   zDebugObject.__init__è  s   € ØˆŒØˆŒˆˆr   c                 ó<   — t          | j        | j        |z   ¦  «        S r^   )rw   r   r  )r*   rB   s     r   r—   zDebugObject.__add__ì  s   € Ý˜4œ<¨¬°q©Ñ9Ô9Ð9r   c                 óL   — | j         rt          d| j        z  |z   ¦  «         d S d S )Nz    )r   r#   r  )r*   r¼   s     r   r¼   zDebugObject.lineï  s6   € ØŒ<ð 	/Ý�&˜4œ;Ñ&¨Ñ-Ñ.Ô.Ð.Ð.Ð.ð	/ð 	/r   N)Tr   )r   r   r   rJ   r—   r¼   r   r   r   rw   rw   ç  sF   € € € € € ðð ð ð ð:ð :ð :ð/ð /ð /ð /ð /r   rw   c                  óJ  — t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d	¦  «         t          d
¦  «         t          j        d¦  «        } t          j        d¦  «        }t          j        d¦  «        }t          | › d|› d|› dt	          ¦   «                              || |g¦  «        › �¦  «         t          j        d¦  «        } t          j        d¦  «        }t          j        d¦  «        }t          | › d|› d|› dt	          ¦   «                              || |g¦  «        › �¦  «         t          j        d¦  «        }t          j        d¦  «        }t          |› d|› dt	          ¦   «                              ||g¦  «        › �¦  «         d S )Núman(x)z(man(x) -> man(x))z(man(x) -> --man(x))z-(man(x) and -man(x))z(man(x) or -man(x))z(man(x) iff man(x))z-(man(x) iff -man(x))zall x.man(x)z--all x.some y.F(x,y) & some x.all y.(-F(x,y))zsome x.all y.sees(x,y)zall x.(man(x) -> mortal(x))zman(Socrates)zmortal(Socrates)r«   z |- rì   zall x.(man(x) -> walks(x))z	man(John)zsome y.walks(y)z5some e1.some e2.(believe(e1,john,e2) & walk(e2,mary))zsome e0.walk(e0,mary))Úresolution_testr   Ú
fromstringr#   r   rQ   )Úp1Úp2ÚcÚps       r   ÚtestResolutionProverr  ô  s*  € Ý�IÑÔÐÝÐ)Ñ*Ô*Ð*ÝÐ+Ñ,Ô,Ð,ÝÐ,Ñ-Ô-Ð-ÝÐ*Ñ+Ô+Ð+ÝÐ)Ñ*Ô*Ð*ÝÐ,Ñ-Ô-Ð-ÝÐ*Ñ+Ô+Ð+ÝÐ)Ñ*Ô*Ð*ÝÐ*Ñ+Ô+Ð+ÝÐ,Ñ-Ô-Ð-Ý�NÑ#Ô#Ð#ÝÐCÑDÔDÐDÝÐ,Ñ-Ô-Ð-å	Ô	Ð=Ñ	>Ô	>€BÝ	Ô	Ð/Ñ	0Ô	0€BÝÔÐ1Ñ2Ô2€AÝ	ˆRÐ
GÐ
G�2Ð
GÐ
G˜1Ð
GÐ
GÕ 0Ñ 2Ô 2× 8Ò 8¸¸RÀ¸HÑ EÔ EÐ
GÐ
GÑHÔHÐHå	Ô	Ð<Ñ	=Ô	=€BÝ	Ô	˜|Ñ	,Ô	,€BÝÔÐ0Ñ1Ô1€AÝ	ˆRÐ
GÐ
G�2Ð
GÐ
G˜1Ð
GÐ
GÕ 0Ñ 2Ô 2× 8Ò 8¸¸RÀ¸HÑ EÔ EÐ
GÐ
GÑHÔHÐHåÔÐVÑWÔW€AÝÔÐ6Ñ7Ô7€AÝ	ˆQÐ
;Ð
;�AÐ
;Ð
;Õ)Ñ+Ô+×1Ò1°!°a°SÑ9Ô9Ð
;Ð
;Ñ<Ô<Ð<Ð<Ð<r   c                 óš   — t          j        | ¦  «        }t          ¦   «                              |¦  «        }t	          d|› d|› �¦  «         d S )Nz|- rì   )r   r  r   rQ   r#   )r1   ÚfÚts      r   r  r    sK   € ÝÔ˜aÑ Ô €AÝÑÔ× Ò  Ñ#Ô#€AÝ	ˆ.�ˆ.ˆ.�Qˆ.ˆ.ÑÔÐÐÐr   c                  ó  — t           j        } t          t           | d¦  «        ¦  «        ¦  «         t          t           | d¦  «        ¦  «        ¦  «         t          t           | d¦  «        ¦  «        ¦  «         t          t           | d¦  «        ¦  «        ¦  «         t          t           | d¦  «        ¦  «        ¦  «         t          t           | d¦  «        ¦  «        ¦  «         t          t           | d¦  «        ¦  «        ¦  «         t          t           | d¦  «        ¦  «        ¦  «         t          t           | d	¦  «        ¦  «        ¦  «         t          t           | d
¦  «        ¦  «        ¦  «         t          t           | d¦  «        ¦  «        ¦  «         t          t           | d¦  «        ¦  «        ¦  «         t          t           | d¦  «        ¦  «        ¦  «         t          t           | d¦  «        ¦  «        ¦  «         t          t           | d¦  «        ¦  «        ¦  «         t          t           | d¦  «        ¦  «        ¦  «         t          t           | d¦  «        ¦  «        ¦  «         d S )NzP(x) | Q(x)z(P(x) & Q(x)) | R(x)zP(x) | (Q(x) & R(x))z(P(x) & Q(x)) | (R(x) & S(x))zP(x) | Q(x) | R(x)zP(x) | (Q(x) & R(x)) | S(x)zexists x.P(x) | Q(x)z-(-P(x) & Q(x))zP(x) <-> Q(x)z-(P(x) <-> Q(x))z-(all x.P(x))z-(some x.P(x))zsome x.P(x)zsome x.all y.P(x,y)zall y.some x.P(x,y)zall z.all y.some x.P(x,y,z)z1all x.(all y.P(x,y) -> -all y.(Q(x,y) -> R(x,y))))r   r  r#   r!   )Úlexprs    r   Útest_clausifyr    s=  € ÝÔ!€Eå	�(�5�5˜Ñ'Ô'Ñ
(Ô
(Ñ)Ô)Ð)Ý	�(�5�5Ð/Ñ0Ô0Ñ
1Ô
1Ñ2Ô2Ð2Ý	�(�5�5Ð/Ñ0Ô0Ñ
1Ô
1Ñ2Ô2Ð2Ý	�(�5�5Ð8Ñ9Ô9Ñ
:Ô
:Ñ;Ô;Ð;å	�(�5�5Ð-Ñ.Ô.Ñ
/Ô
/Ñ0Ô0Ð0Ý	�(�5�5Ð6Ñ7Ô7Ñ
8Ô
8Ñ9Ô9Ð9å	�(�5�5Ð/Ñ0Ô0Ñ
1Ô
1Ñ2Ô2Ð2å	�(�5�5Ð*Ñ+Ô+Ñ
,Ô
,Ñ-Ô-Ð-Ý	�(�5�5˜Ñ)Ô)Ñ
*Ô
*Ñ+Ô+Ð+Ý	�(�5�5Ð+Ñ,Ô,Ñ
-Ô
-Ñ.Ô.Ð.Ý	�(�5�5˜Ñ)Ô)Ñ
*Ô
*Ñ+Ô+Ð+Ý	�(�5�5Ð)Ñ*Ô*Ñ
+Ô
+Ñ,Ô,Ð,å	�(�5�5˜Ñ'Ô'Ñ
(Ô
(Ñ)Ô)Ð)Ý	�(�5�5Ð.Ñ/Ô/Ñ
0Ô
0Ñ1Ô1Ð1Ý	�(�5�5Ð.Ñ/Ô/Ñ
0Ô
0Ñ1Ô1Ð1Ý	�(�5�5Ð6Ñ7Ô7Ñ
8Ô
8Ñ9Ô9Ð9Ý	�(�5�5ÐLÑMÔMÑ
NÔ
NÑOÔOÐOÐOÐOr   c                  óþ   — t          ¦   «          t          ¦   «          t          ¦   «          t          ¦   «          t          j        d¦  «        } t          t          | | g¦  «                             ¦   «         ¦  «         d S )Nr  )r  r#   r  r   r  r$   rQ   )r  s    r   Údemor  3  sf   € Ý�O„O€OÝ	�G„G€GÝÑÔÐÝ	�G„G€GåÔ˜hÑ'Ô'€AÝ	Õ
! ! a SÑ
)Ô
)×
/Ò
/Ñ
1Ô
1Ñ2Ô2Ð2Ð2Ð2r   Ú__main__r^   )NN)1r·   rž   r9   Úcollectionsr   Ú	functoolsr   Únltk.inference.apir   r   Únltk.semr   Únltk.sem.logicr   r	   r
   r   r   r   r   r   r   r   r   rø   r   r   r$   r7   rp   r?   rx   r½   r¾   ry   rˆ   r!   rÏ   ru   rË   rò   r¿   rü   rw   r  r  r  r  r   r   r   r   ú<module>r     s¨  ððð ð €€€Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð à 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð	ð 	ð 	ð 	ð 	�yñ 	ô 	ð 	ð_ ð _ ð _ ð _ ð _ �vñ _ ô _ ð _ ðDDð Dð Dð Dð DÐ/ñ Dô Dð DðNeð eð eð eð eˆTñ eô eð eðPð ð ð ð �Iñ ô ð ð NRð5ð 5ð 5ð 5ðr NRð0ð 0ð 0ð 0ðf+(ð +(ð +(ð +(ð\ð ð ð	ð 	ð 	ðð ð ðð ð ð0]ð ]ð ]ð ]ð ]ñ ]ô ]ð ]ð@#ð #ð #ð #ð6Dð Dð Dð*ð *ð *ð *ð *�yñ *ô *ð *ðCð Cð Cð Cð C˜9ñ Cô Cð Cð

/ð 
/ð 
/ð 
/ð 
/ñ 
/ô 
/ð 
/ð=ð =ð =ð>ð ð ðPð Pð Pð43ð 3ð 3ð ˆzÒÐØ€D�F„F€F€F€Fð Ðr   