
    Ng                        d dl 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mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ 	 d dlm Z m!Z! d dl"m#Z# d dl$m%Z% n# e&$ r Y nw xY w G d d	e          Z' G d
 de          Z( G d d          Z) G d de)e          Z*d Z+ G d de)e          Z, G d de,e          Z- G d de,e          Z. G d de-e          Z/ G d de,e          Z0 G d de)e          Z1 G d de)e          Z2 G d d e)e          Z3 G d! d"e)e          Z4 G d# d$e4e          Z5 G d% d&e5e          Z6 G d' d(e4e          Z7 G d) d*e5          Z8 G d+ d,e)e
          Z9d- Z: G d. d/e;e)e          Z< G d0 d1e=          Z>g fd2Z? G d3 d4          Z@d5 ZAd6 ZBeCd7k    r eA             dS dS )8    N)reduce)chain)APPAbstractVariableExpressionAllExpressionAndExpressionApplicationExpressionBinaryExpressionBooleanExpressionConstantExpressionEqualityExpressionEventVariableExpressionExistsExpression
ExpressionFunctionVariableExpressionImpExpressionIndividualVariableExpressionLambdaExpressionLogicParserNegatedExpressionOrExpressionTokensVariableis_eventvar
is_funcvar	is_indvarunique_variable)CanvasTk)Font)in_idlec                   b    e Zd ZdZdZdZdZdZdZeeeegZ	e
j        e	z   Ze
j        egz   e	z   ZdS )	DrtTokensDRS+PRO[]:N)__name__
__module____qualname__r$   DRS_CONCPRONOUNOPEN_BRACKETCLOSE_BRACKETCOLONPUNCTr   SYMBOLSTOKENS     H/var/www/html/ai-engine/env/lib/python3.11/site-packages/nltk/sem/drt.pyr#   r#   5   sY        
CHGLME|]E:Enu$G]cU"U*FFFr6   r#   c                   l    e Z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 Zd Zd Zd Zd ZdS )	DrtParserz$A lambda calculus expression parser.c                    t          j        |            t          d t          j        D             d t          j        D             z   t          dfgz   d t          j        t          j	        z   D             z   t          j
        dfgz   t          j        dfgz   d t          j        D             z   d t          j        D             z   d	gz             | _        d S )
Nc                     g | ]}|d fS    r5   .0xs     r7   
<listcomp>z&DrtParser.__init__.<locals>.<listcomp>K   s    333aV333r6   c                     g | ]}|d fS )   r5   r>   s     r7   rA   z&DrtParser.__init__.<locals>.<listcomp>L       222!1v222r6      c                     g | ]}|d fS )   r5   r>   s     r7   rA   z&DrtParser.__init__.<locals>.<listcomp>N   s    CCC!1vCCCr6         c                     g | ]}|d fS )   r5   r>   s     r7   rA   z&DrtParser.__init__.<locals>.<listcomp>Q   s    111!1v111r6   c                     g | ]}|d fS )   r5   r>   s     r7   rA   z&DrtParser.__init__.<locals>.<listcomp>R   rD   r6   )N	   )r   __init__dictr#   LAMBDA_LISTNOT_LISTr   EQ_LISTr   NEQ_LISTr1   r-   OR_LISTIMP_LISToperator_precedenceselfs    r7   rO   zDrtParser.__init__G   s    T"""#'33Y233322y12223Qxj DCy06?BCCCD #$	%
 "A&'( 21y01112 32y12223 k
$
 
$
   r6   c                     t           j        S )z#This method exists to be overridden)r#   r3   rX   s    r7   get_all_symbolszDrtParser.get_all_symbolsV   s      r6   c                     |t           j        vS N)r#   r4   )rY   toks     r7   
isvariablezDrtParser.isvariableZ   s    )***r6   c                    |t           j        v r|                     ||          S |t           j        v r|                     ||          S |t           j        k    rd|                     d          r9|                     d          t           j        k    r| 	                    ||          S | 
                    ||          S |                                t           j        k    r5|                     t           j                   | 	                    ||          S |                     |          rd|                     d          r9|                     d          t           j        k    r|                     ||          S |                     ||          S dS )zgThis method is intended to be overridden for logics that
        use different operators or expressionsr   N)r#   rR   handle_negationrQ   handle_lambdaOPENinRangetokenr/   
handle_DRShandle_openupperr$   assertNextTokenr_   r1   handle_prophandle_variable)rY   r^   contexts      r7   handlezDrtParser.handle]   s]    )$$$''W555I)))%%c7333IN""||A 64::a==I4J#J#JsG444''W555YY[[IM))  000??3000__S!! 	:||A :4::a==IO#C#C''W555++C999		: 	:r6   c                      t          |          S r]   DrtNegatedExpression)rY   
expressions     r7   make_NegatedExpressionz DrtParser.make_NegatedExpressionv   s    #J///r6   c                 L   |                                  }|                     d          r7|                     d          t          j        k    r|                                  |                     |          }|                     t          j                   t          ||d           S Nr   )	handle_refsrd   re   r#   COMMAhandle_condsri   CLOSEr$   )rY   r^   rl   refscondss        r7   rf   zDrtParser.handle_DRSy   s    !!LLOO	 $

1 @ @JJLLL!!'**Y_---4%%%r6   c                 (   |                      t          j                   g }|                     d          r|                     d          t          j        k    r|r7|                     d          t          j        k    r|                                  |                    |                     d                     |                     d          r#|                     d          t          j        k    |                      t          j                   |S )Nr   
quantified)	ri   r#   r/   rd   re   r0   rv   appendget_next_token_variable)rY   ry   s     r7   ru   zDrtParser.handle_refs   s    Y3444ll1oo 	D$**Q--93J"J"J 

188

KK44\BBCCC	 ll1oo 	D$**Q--93J"J"J
 	Y4555r6   c                 (   |                      t          j                   g }|                     d          r|                     d          t          j        k    r|r7|                     d          t          j        k    r|                                  |                    |                     |                     |                     d          r#|                     d          t          j        k    |                      t          j                   |S rt   )	ri   r#   r/   rd   re   r0   rv   r}   process_next_expression)rY   rl   rz   s      r7   rw   zDrtParser.handle_conds   s    Y3444ll1oo 	@$**Q--93J"J"J A)/99

LL55g>>???	 ll1oo 	@$**Q--93J"J"J
 	Y4555r6   c                     |                      |          }|                     d           |                     t          j                  }t          ||          S )Nr)   )make_VariableExpressionri   r   r#   r1   DrtProposition)rY   r^   rl   variabledrss        r7   rj   zDrtParser.handle_prop   sN    //44S!!!**9?;;h,,,r6   c                 "    t          ||          S )zlThis method serves as a hook for other logic parsers that
        have different equality expression classesDrtEqualityExpressionrY   firstseconds      r7   make_EqualityExpressionz!DrtParser.make_EqualityExpression   s     %UF333r6   c                 |    |t           j        k    rd S |t           j        v rt          S |t           j        v rd }|S dS )zbThis method serves as a hook for other logic parsers that
        have different boolean operatorsc                 $    t          | |d           S r]   DrtConcatenationr   r   s     r7   <lambda>z9DrtParser.get_BooleanExpression_factory.<locals>.<lambda>   s    )9%)N)N r6   c                     t          | t                    rt          | j        | j        |          S t          | t                    rt	          | j        | j        |          S t          d          Nz'Antecedent of implication must be a DRS)
isinstancer$   ry   rz   r   r   r   	Exceptionr   s     r7   make_imp_expressionzDDrtParser.get_BooleanExpression_factory.<locals>.make_imp_expression   sd    eS)) @uz5;???e%566 O+EKvNNN IJJJr6   N)r#   r-   rU   DrtOrExpressionrV   )rY   r^   r   s      r7   get_BooleanExpression_factoryz'DrtParser.get_BooleanExpression_factory   s\     )$$$NNNI%%%""I&&&K K K '&4r6   c                      |||          S r]   r5   )rY   factoryr   r   s       r7   make_BooleanExpressionz DrtParser.make_BooleanExpression   s    wuf%%%r6   c                 "    t          ||          S r]   DrtApplicationExpression)rY   functionarguments      r7   make_ApplicationExpressionz$DrtParser.make_ApplicationExpression   s    '(;;;r6   c                 :    t          t          |                    S r]   )DrtVariableExpressionr   )rY   names     r7   r   z!DrtParser.make_VariableExpression   s    $Xd^^444r6   c                 "    t          ||          S r]   )DrtLambdaExpression)rY   	variablesterms      r7   make_LambdaExpressionzDrtParser.make_LambdaExpression   s    "9d333r6   N)r*   r+   r,   __doc__rO   r[   r_   rm   rr   rf   ru   rw   rj   r   r   r   r   r   r   r5   r6   r7   r9   r9   D   s        ..
 
 
! ! !+ + +: : :20 0 0	& 	& 	&	 	 		 	 	- - -4 4 4
  (& & &< < <5 5 54 4 4 4 4r6   r9   c                       e Zd ZdZ e            Zed             Zd Zd Z	d Z
d Zd Zdd	Zed
             ZddZd ZddZd Zd Zd Zd Zd Zd Zd Zd ZdS )DrtExpressionz_
    This is the base abstract DRT Expression from which every DRT
    Expression extends.
    c                 6    | j                             |          S r]   )_drt_parserparse)clsss     r7   
fromstringzDrtExpression.fromstring   s    $$Q'''r6   c                 "    t          | |          S r]   r   rY   others     r7   applytozDrtExpression.applyto   s    'e444r6   c                      t          |           S r]   ro   rX   s    r7   __neg__zDrtExpression.__neg__   s    #D)))r6   c                     t           S r]   )NotImplementedr   s     r7   __and__zDrtExpression.__and__   s    r6   c                 P    t          |t                    sJ t          | |          S r]   )r   r   r   r   s     r7   __or__zDrtExpression.__or__   s(    %/////tU+++r6   c                    t          |t                    sJ t          | t                    rt          | j        | j        |          S t          | t
                    rt          | j        | j        |          S t          d          r   )	r   r   r$   ry   rz   r   r   r   r   r   s     r7   __gt__zDrtExpression.__gt__   sy    %/////dC   	5ty$*e444d,-- 	D#DJUCCCABBBr6   Nc                     t          |t                    sJ |                                                                 }|                                                                }|                    ||          S )a<  
        Check for logical equivalence.
        Pass the expression (self <-> other) to the theorem prover.
        If the prover says it is valid, then the self and other are equal.

        :param other: an ``DrtExpression`` to check equality against
        :param prover: a ``nltk.inference.api.Prover``
        )r   r   simplifyfolequiv)rY   r   proverf1f2s        r7   r   zDrtExpression.equiv   sb     %/////]]__  ""^^!!##xxF###r6   c                 :    t          d| j        j        z            )Nz#'%s' object has no attribute 'type')AttributeError	__class__r*   rX   s    r7   typezDrtExpression.type   s!    1DN4KK
 
 	
r6   c                     t                      r]   NotImplementedError)rY   	signatures     r7   	typecheckzDrtExpression.typecheck   s    !###r6   c                 $    t          | |d           S r]   r   r   s     r7   __add__zDrtExpression.__add__   s    eT222r6   Fc                     t                      )z
        Return the set of discourse referents in this DRS.
        :param recursive: bool Also find discourse referents in subterms?
        :return: list of ``Variable`` objects
        r   rY   	recursives     r7   get_refszDrtExpression.get_refs  s     "###r6   c                     t          | t                    oRt          | j        t                    o8| j        j        j        t          j        k    ot          | j        t                    S )zIs self of the form "PRO(x)"?)
r   r   r   DrtAbstractVariableExpressionr   r   r#   r.   r   DrtIndividualVariableExpressionrX   s    r7   is_pronoun_functionz!DrtExpression.is_pronoun_function
  s^     t566 K4=*GHHK&+y/@@K 4=*IJJ		
r6   c                 "    t          ||          S r]   r   r   s      r7   r   z%DrtExpression.make_EqualityExpression  s    $UF333r6   c                      t          |          S r]   )r   )rY   r   s     r7   r   z%DrtExpression.make_VariableExpression  s    $X...r6   c                      t          |           S r]   )resolve_anaphorarX   s    r7   r   zDrtExpression.resolve_anaphora  s    %%%r6   c                 :    |                      d | j                  S )Nc                 *    |                                  S r]   )eliminate_equality)es    r7   r   z2DrtExpression.eliminate_equality.<locals>.<lambda>  s    q/C/C/E/E r6   )visit_structuredr   rX   s    r7   r   z DrtExpression.eliminate_equality  s    $$%E%Et~VVVr6   c                 P    d                     |                                           S )zG
        Draw the DRS
        :return: the pretty print string
        
)join_prettyrX   s    r7   pretty_formatzDrtExpression.pretty_format  s    
 yy(((r6   c                 H    t          |                                            d S r]   )printr   rX   s    r7   pretty_printzDrtExpression.pretty_print&  s"    d  ""#####r6   c                 H    t          |                                            d S r]   )	DrsDrawerdrawrX   s    r7   r   zDrtExpression.draw)  s     $r6   r]   F)r*   r+   r,   r   r9   r   classmethodr   r   r   r   r   r   r   propertyr   r   r   r   r   r   r   r   r   r   r   r   r5   r6   r7   r   r      ss        
 )++K( ( [(5 5 5* * *  , , ,C C C$ $ $ $ 
 
 X

$ $ $ $3 3 3$ $ $ $
 
 
4 4 4/ / /& & &W W W) ) )$ $ $    r6   r   c                   t    e Zd ZdZddZddZd ZddZd	 Zd
 Z	d Z
d Zd Zd Zd Zd Zej        Zd ZdS )r$   z%A Discourse Representation Structure.Nc                 0    || _         || _        || _        dS )z
        :param refs: list of ``DrtIndividualVariableExpression`` for the
            discourse referents
        :param conds: list of ``Expression`` for the conditions
        N)ry   rz   
consequent)rY   ry   rz   r   s       r7   rO   zDRS.__init__0  s     	
$r6   FTc                   	 | j         v rs| S | j                                       }| j        r| j                            d          }nd}t	          | j         d|         j        gz   | j         |dz   d         z   fd| j        D             |          S rt          | j                                                   z  D ]	t          	          }t          |          | j                             	          }| j        r| j                            	d          }nd}t	          | j         d|         |gz   | j         |dz   d         z   	fd| j        D             |          } | j        r| j                                      }nd}t	          | j         fd| j        D             |          S )_Replace all instances of variable v with expression E in self,
        where v is free in self.TNr=   c                 @    g | ]}|                     d           S Treplace)r?   condalpha_convertrq   r   s     r7   rA   zDRS.replace.<locals>.<listcomp>K  s;         Xz4OO  r6   c                 @    g | ]}|                     d           S r   r   )r?   r   r   newvarexrefs     r7   rA   zDRS.replace.<locals>.<listcomp>a  s;        $ !LLhmLL  r6   c                 @    g | ]}|                               S r5   r   )r?   r   r   rq   replace_boundr   s     r7   rA   zDRS.replace.<locals>.<listcomp>q  s;        LL:}mTT  r6   )ry   indexr   r   r$   r   rz   setfreer   r   )
rY   r   rq   r  r   ir   newvarr   r   s
    ````   @@r7   r   zDRS.replace:  si    ty    IOOH--? &!%!8!8 *dM" "JJ "&JIbqbMZ%8$99DIa!egg<NN     $(J        ty>>JOO,=,==  C,S11F4V<<H	,,A *%)_%<%<4& &

 &*
	"1"049QUWW3EE     (,
   # DD  "!_44j- 

 "
	       $
     r6   c                    t          t          j        d | j        D             t	                                }| j        r,|                    | j                                                   |t	          | j                  z
  S )z:see: Expression.free()c                 6    g | ]}|                                 S r5   )r  r?   cs     r7   rA   zDRS.free.<locals>.<listcomp>z  s     *H*H*H16688*H*H*Hr6   )	r   operatoror_rz   r  r   updater  ry   )rY   
conds_frees     r7   r  zDRS.freex  si    HL*H*HTZ*H*H*H#%%PP
? 	6do2244555C	NN**r6   c                     |rn| j         t          t          j        d | j        D                                 z   }| j        r-|                    | j                            d                     |S | j         S )#:see: AbstractExpression.get_refs()c              3   @   K   | ]}|                     d           V  dS TN)r   r	  s     r7   	<genexpr>zDRS.get_refs.<locals>.<genexpr>  s.      #I#IAJJt$4$4#I#I#I#I#I#Ir6   T)ry   listr   from_iterablerz   r   extendr   )rY   r   
conds_refss      r7   r   zDRS.get_refs  s     	T##I#Idj#I#I#III& & J  B!!$/":":4"@"@AAA9r6   c                     t          t          || j                            }| j        r#|                     || j                              ||          S z:see: Expression.visit())r  maprz   r   r}   )rY   r   
combinatorpartss       r7   visitz	DRS.visit  sS    S4:..//? 	4LL$/22333z%   r6   c           	          | j         r || j                   nd} || j        t          t          || j                            |          S )#:see: Expression.visit_structured()N)r   ry   r  r  rz   )rY   r   r  r   s       r7   r   zDRS.visit_structured  sI    26/KXXdo...t
z$)T#h
*C*C%D%DjQQQr6   c                    | }d}|t          |j                  k     r|j        |         }t          |t                    rt          |j        t
                    rt          |j        t
                    rt          t          t          |j
                  |j        j        hz
            |j        d |         |j        |dz   d          z   |j                  }|j        j        |j        j        k    r)|                    |j        j        |j        dd          }d}|dz  }|dz  }|t          |j                  k     g }|j        D ]i}|                                }|                                }t          |t                    r|j
        s|j        s|j        r|                    |           j|j        r|j                                        nd }t          |j
        ||          S )Nr   r=   F)lenrz   r   r   r   r   r   r$   r  r  ry   r   r   r   r   r   r}   )rY   r   r  r   rz   new_condnew_cond_simpr   s           r7   r   zDRS.eliminate_equality  s   #ci..  9Q<D4!344tz+EFF t{,FGG
 SX$+*>)??@@IbqbMCIa!egg$66N 
 ;'4:+>>>++dk&:DJuUUCAQFA! #ci..  $ I 		' 		'D..00H$--//M}c22' %' !&' !+	' X&&&<?NTS^66888PT
38UJ///r6   c                 D   | j         rd }| j        r$t          t          d | j        D                       }|r(t	          || j                                                   }n| j                                         }| j        d d d         D ]}t          ||          }|S | j        st          d          t          t          d | j        D                       }t          t          |                     | j                  d d d                   D ]}t          ||          }|S )Nc                 6    g | ]}|                                 S r5   r   r	  s     r7   rA   zDRS.fol.<locals>.<listcomp>  s     .K.K.K1quuww.K.K.Kr6   z-Cannot convert DRS with no conditions to FOL.c                 6    g | ]}|                                 S r5   r&  r	  s     r7   rA   zDRS.fol.<locals>.<listcomp>  s     *G*G*Gq15577*G*G*Gr6   )r   rz   r   r   r   r   ry   r   r   r  r   _order_ref_stringsr   )rY   accumr   s      r7   r   zDRS.fol  s-   ? 	Ez M}.K.K
.K.K.KLL .%eT_-@-@-B-BCC++--y2 2 2%c511L : Q OPPP=*G*GDJ*G*G*GHHE8T%<%<TY%G%G"%MNN 5 5(e44Lr6   c           	      8   d                     |                     | j                            }d d | j        D             D             }t	          t          |          gt          t          t
          |                    z             ddz  z   dz   d|                              z   dz   d	d
z  z   dz   gfd|D             z   ddz  z   dz   gz   }| j	        r=t                              |t          j        | j	                                                  S |S )N c                     g | ]	}|D ]}|
S r5   r5   )r?   	cond_liner   s      r7   rA   zDRS._pretty.<locals>.<listcomp>  sA     
 
 
 "
 

 	 
 
 
 
r6   c                 T    g | ]%}t          d  |                                          &S )c                 *    |                                  S r]   )strip)r   s    r7   r   z(DRS._pretty.<locals>.<listcomp>.<lambda>  s     r6   )filterr   r?   r   s     r7   rA   zDRS._pretty.<locals>.<listcomp>  s;       @D**DLLNN;;  r6   z __z_ |  |z|--z-|c                 F    g | ]}d |                               z   dz   S )r5  r6  )ljust)r?   linelengths     r7   rA   zDRS._pretty.<locals>.<listcomp>  s/    GGGDtdjj(((4/GGGr6   z|_z_|)r   r)  ry   rz   maxr!  r  r  r9  r   DrtBinaryExpression_assemble_prettyr#   IMPr   )rY   	refs_line
cond_linesr   r;  s       @r7   r   zDRS._pretty  sP   HHT44TY??@@	
 
 HL
  
 
 

 c)nn%Sj-A-A(B(BBCC sV|#d*yv...5sV|#d*
 HGGGJGGGH cFl"T)*+ 	 ? 	&77Y]DO$;$;$=$=   
r6   c                    d |D             }g }g }g }g }|D ]}t          |          r|                    |           't          |          r|                    |           Lt          |          r|                    |           q|                    |           t	          |          t	          |d           z   t	          |d           z   t	          |d           z   S )Nc                     g | ]}d |z  S )%sr5   )r?   r   s     r7   rA   z*DRS._order_ref_strings.<locals>.<listcomp>  s    ...#4#:...r6   c                 r    t          | dd          dgt          | dd                    dk                       S )NrC   r'  r   intr!  vs    r7   r   z(DRS._order_ref_strings.<locals>.<lambda>  s1    sAabbE2;s1QRR5zzQ3O/P/P r6   )keyc           	          | d         t          | dd          dgt          | dd                    dk                       fS Nr   r=   r'  rF  rH  s    r7   r   z(DRS._order_ref_strings.<locals>.<lambda>  s;    qtS!ABB%S122ZZST_9U5V5V.W r6   c           	          | d         t          | dd          dgt          | dd                    dk                       fS rL  rF  rH  s    r7   r   z(DRS._order_ref_strings.<locals>.<lambda>   s;    adC122C!""JJRSO8T4U4U-V r6   )r   r}   r   r   sorted)rY   ry   stringsind_vars	func_vars
event_vars
other_varsr   s           r7   r)  zDRS._order_ref_strings  s   .....	

 	% 	%A|| %""""A %  ####Q %!!!$$$$!!!$$$$:Z%P%PQQQRY$W$WXXXY X#V#VWWWX	
r6   c                    t          |t                    rt          | j                  t          |j                  k    r|}t	          | j        |j                  D ]1\  }}|                     |          }|                    ||d          }2| j        |j        k    rUt          | j                  t          |j                  k    r+t	          | j        |j                  D ]\  }}||k    s dS dS dS z}Defines equality modulo alphabetic variance.
        If we are comparing \x.M  and \y.N, then check equality of M and N[x/y].TF)	r   r$   r!  ry   zipr   r   r   rz   )rY   r   converted_otherr1r2varexc1c2s           r7   __eq__z
DRS.__eq__  s    eS!! 	 49~~UZ00"'!$)_-ABB O OFB 88<<E&5&=&=b%&N&NOO?o&@@@SJF F.//F0 F0 #&dj/2G"H"H ) )B "b#(55 !)4ur6   c                     | |k     S r]   r5   r   s     r7   __ne__z
DRS.__ne__      5=  r6   c                 N   d                     d                    |                     | j                            d                    d | j        D                                 }| j        r:t          j        |z   dz   t          j        z   dz   d| j        z  z   t          j	        z   S |S )Nz([{}],[{}]),, c              3       K   | ]	}d |z  V  
dS rD  Nr5   r3  s     r7   r  zDRS.__str__.<locals>.<genexpr>  s&      99ddTk999999r6   r,  rD  )
formatr   r)  ry   rz   r   r#   rc   r?  rx   rY   r   s     r7   __str__zDRS.__str__  s    ""HHT,,TY7788II99dj99999
 
 ? 		 -  	
 () /" 
r6   r]   FTr   )r*   r+   r,   r   rO   r   r  r   r  r   r   r   r   r)  r]  r_  r   __hash__rh  r5   r6   r7   r$   r$   -  s        //% % % %< < < <|+ + +
 
 
 
! ! !R R R
"0 "0 "0H  0  4
 
 
,  $! ! ! "H    r6   r$   c                     t          | j                  rt          |           S t          | j                  rt	          |           S t          | j                  rt          |           S t          |           S )z
    This is a factory method that instantiates and returns a subtype of
    ``DrtAbstractVariableExpression`` appropriate for the given variable.
    )r   r   r   r   DrtFunctionVariableExpressionr   DrtEventVariableExpressionDrtConstantExpressionr   s    r7   r   r   ,  sr    
  /.x888	HM	"	" /,X666	X]	#	# /)(333$X...r6   c                   (    e Zd Zd ZddZd Zd ZdS )r   c                     | S r]   r5   rX   s    r7   r   z!DrtAbstractVariableExpression.fol<      r6   Fc                     g S r  r5   r   s     r7   r   z&DrtAbstractVariableExpression.get_refs?  s    	r6   c                 <    d| z  }dt          |          z  }||||gS NrD  r,  r!  rY   r   blanks      r7   r   z%DrtAbstractVariableExpression._prettyC  s)    4Kc!ffua''r6   c                     | S r]   r5   rX   s    r7   r   z0DrtAbstractVariableExpression.eliminate_equalityH  rr  r6   Nr   )r*   r+   r,   r   r   r   r   r5   r6   r7   r   r   ;  sU             ( ( (
    r6   r   c                       e Zd ZdS )r   Nr*   r+   r,   r5   r6   r7   r   r   L           	Dr6   r   c                       e Zd ZdS )rl  Nr|  r5   r6   r7   rl  rl  R  r}  r6   rl  c                       e Zd ZdS )rm  Nr|  r5   r6   r7   rm  rm  X  r}  r6   rm  c                       e Zd ZdS )rn  Nr|  r5   r6   r7   rn  rn  ^          Dr6   rn  c                   b    e Zd Zd ZddZd ZddZd Zd Ze	j
        Z
d	 Zd
 Zd Zd Zd ZdS )r   c                 "    || _         || _        d S r]   r   r   )rY   r   r   s      r7   rO   zDrtProposition.__init__c  s     r6   FTc           	         | j         |k    rOt          |t                    s
J d            t          |j         | j                            ||||                    S t          | j         | j                            ||||                    S )Nz4Can only replace a proposition label with a variable)r   r   r   r   r   r   )rY   r   rq   r  r   s        r7   r   zDrtProposition.replaceg  s    =H$$9  F FEF F F "#  :}mTT  
 "  :}mTT  r6   c                 Z    t          | j        | j                                                  S r]   )r   r   r   r   rX   s    r7   r   z!DrtProposition.eliminate_equalityv  s"    dmTX-H-H-J-JKKKr6   c                 >    |r| j                             d          ng S NT)r   r   r   s     r7   r   zDrtProposition.get_refsy  s"    *3;tx  &&&;r6   c                 b    | j         |j         k    o| j        |j        k    o| j        |j        k    S r]   )r   r   r   r   s     r7   r]  zDrtProposition.__eq__|  s5    Neo- &/&EI%	
r6   c                     | |k     S r]   r5   r   s     r7   r_  zDrtProposition.__ne__  r`  r6   c                 4    | j                                         S r]   )r   r   rX   s    r7   r   zDrtProposition.fol  s    x||~~r6   c                       j                                         }dt          d j        z            z  fd|d d         D              fd|dd         D             z   fd|dd          D             z   S )Nr,  rD  c                      g | ]
}d z   |z   S r,  r5   r?   r:  ry  s     r7   rA   z*DrtProposition._pretty.<locals>.<listcomp>  s"    666DUS[4666r6   r=   c                 0    g | ]}d j         z  dz   |z   S )rD  r)   ro  )r?   r:  rY   s     r7   rA   z*DrtProposition._pretty.<locals>.<listcomp>  s*    HHHTtdm#c)D0HHHr6   rC   c                      g | ]
}d z   |z   S r  r5   r  s     r7   rA   z*DrtProposition._pretty.<locals>.<listcomp>  s"    888dus{T!888r6   )r   r   r!  r   )rY   drs_sry  s   ` @r7   r   zDrtProposition._pretty  s      ""c$.///6666E"1"I666HHHHU1Q3ZHHHI8888eABBi8889	
r6   c                 6     | || j                   g          S r  )r   rY   r   r  s      r7   r  zDrtProposition.visit  s!    z88DH--.///r6   c                 @     || j          || j                            S )r  r  r  s      r7   r   zDrtProposition.visit_structured  s"    z$-$(););<<<r6   c                 (    d| j          d| j         dS )Nzprop(rc  )r  rX   s    r7   rh  zDrtProposition.__str__  s    3t}333333r6   Nri  r   )r*   r+   r,   rO   r   r   r   r]  r_  r   rj  r   r   r  r   rh  r5   r6   r7   r   r   b  s             L L L< < < <
 
 
! ! ! "H  
 
 
0 0 0= = =4 4 4 4 4r6   r   c                   "    e Zd Zd ZddZd ZdS )rp   c                 N    t          | j                                                  S r]   )r   r   r   rX   s    r7   r   zDrtNegatedExpression.fol  s     111r6   Fc                 6    | j                             |          S rt  )r   r   r   s     r7   r   zDrtNegatedExpression.get_refs  s    y!!),,,r6   c                     | j                                         }d |d d         D             d |dd         D             z   d |dd         D             z   d |dd          D             z   S )Nc                     g | ]}d |z   S z    r5   r?   r:  s     r7   rA   z0DrtNegatedExpression._pretty.<locals>.<listcomp>  s    666tVd]666r6   rC   c                     g | ]}d |z   S )z__  r5   r  s     r7   rA   z0DrtNegatedExpression._pretty.<locals>.<listcomp>      999v}999r6   rE   c                     g | ]}d |z   S )z  | r5   r  s     r7   rA   z0DrtNegatedExpression._pretty.<locals>.<listcomp>  r  r6   rG   c                     g | ]}d |z   S r  r5   r  s     r7   rA   z0DrtNegatedExpression._pretty.<locals>.<listcomp>  s    888v}888r6   )r   r   )rY   
term_liness     r7   r   zDrtNegatedExpression._pretty  s    Y&&((
66z"1"~66699AaC999:99AaC999: 98ABB8889	
r6   Nr   r*   r+   r,   r   r   r   r5   r6   r7   rp   rp     sF        2 2 2- - - -
 
 
 
 
r6   rp   c                   (    e Zd Zd Zd Zd ZddZdS )r   c           	          |                      || j                            | j        t	          |          d                    S )zRename all occurrences of the variable introduced by this variable
        binder in the expression to ``newvar``.
        :param newvar: ``Variable``, for the new variable
        T)r   r   r   r   r   )rY   r  s     r7   r   z!DrtLambdaExpression.alpha_convert  s?    
 ~~Idm-B6-J-JDQQ
 
 	
r6   c                 Z    t          | j        | j                                                  S r]   )r   r   r   r   rX   s    r7   r   zDrtLambdaExpression.fol  s    ty}}???r6   c                     | j         g}| j        }|j        | j        k    r1|                    |j                    |j        }|j        | j        k    1d                    d |D                       t
          j        z   |                                }dt                    z  fd|d d         D             fd|dd         D             z   fd|dd         D             z   fd	|dd          D             z   S )
Nr,  c              3       K   | ]	}d |z  V  
dS re  r5   )r?   rI  s     r7   r  z.DrtLambdaExpression._pretty.<locals>.<genexpr>  s&      ::1dQh::::::r6   c                      g | ]
}d z   |z   S r  r5   r  s     r7   rA   z/DrtLambdaExpression._pretty.<locals>.<listcomp>  s"    >>>tVe^d">>>r6   r=   c                      g | ]
}d z   |z   S )z \  r5   r  s     r7   rA   z/DrtLambdaExpression._pretty.<locals>.<listcomp>  s"    BBB$w%BBBr6   rC   c                      g | ]
}d z   |z   S )z /\ r5   )r?   r:  
var_strings     r7   rA   z/DrtLambdaExpression._pretty.<locals>.<listcomp>  s#    GGGtw#d*GGGr6   rE   c                      g | ]
}d z   |z   S r  r5   r  s     r7   rA   z/DrtLambdaExpression._pretty.<locals>.<listcomp>  s"    @@@v~$@@@r6   )	r   r   r   r}   r   r#   DOTr   r!  )rY   r   r   r  ry  r  s       @@r7   r   zDrtLambdaExpression._pretty  s-   ]O	yn..T]+++9D n.. XX::	:::::Y]J
\\^^
c*oo%>>>>z"1"~>>>BBBB*QqS/BBBCGGGGz!A#GGGH A@@@ABB@@@A	
r6   Fc                 \    |r#| j         g| j                            d          z   n| j         gS r  T)r   r   r   r   s     r7   r   zDrtLambdaExpression.get_refs  s4     ;DXT]Odi006666$-	
r6   Nr   )r*   r+   r,   r   r   r   r   r5   r6   r7   r   r     sX        
 
 
@ @ @
 
 
 
 
 
 
 
 
r6   r   c                   8    e Zd ZddZd Zed             Zd ZdS )r=  Fc                 t    |r5| j                             d          | j                            d          z   ng S r  )r   r   r   r   s     r7   r   zDrtBinaryExpression.get_refs  s>     GPWDJ%%(<(<T(B(BBBUW	
r6   c                     t                               |                     | j                  |                                 |                     | j                            S r]   )r=  r>  _pretty_subexr   getOpr   rX   s    r7   r   zDrtBinaryExpression._pretty  sK    "33tz**JJLLt{++
 
 	
r6   c                    t          t          |           t          |                    }t          | |          } t          ||          }dt                    z  t          t	          | |                    }fd|d d         D             fd|dd         D             z   fd|dd          D             z   S )Nr,  c                 >    g | ]\  }}d |z   d z   z   d z   |z   d z   S r  r5   r?   
first_linesecond_linery  s      r7   rA   z8DrtBinaryExpression._assemble_pretty.<locals>.<listcomp>  sK       +J j 3&.4{BSH  r6   rC   c                 >    g | ]\  }}d |z   dz   z   dz   |z   dz   S )(r,  r  r5   )r?   r  r  ops      r7   rA   z8DrtBinaryExpression._assemble_pretty.<locals>.<listcomp>  sK       +J j 3&+c1K?#E  r6   rE   c                 >    g | ]\  }}d |z   d z   z   d z   |z   d z   S r  r5   r  s      r7   rA   z8DrtBinaryExpression._assemble_pretty.<locals>.<listcomp>  sK       +J j 3&.4{BSH  r6   )r<  r!  _pad_verticallyr  rV  )first_linesr  second_lines	max_linesfirst_second_linesry  s    `   @r7   r>  z$DrtBinaryExpression._assemble_pretty  s   K((#l*;*;<<	%k9==&|Y??c"gg!#k<"@"@AA   /A"1"/E     /A!A#/F  	   /A!""/E  	
r6   c                 *    |                                 S r]   r   rY   subexs     r7   r  z!DrtBinaryExpression._pretty_subex  s    }}r6   Nr   )r*   r+   r,   r   r   staticmethodr>  r  r5   r6   r7   r=  r=    sa        
 
 
 

 
 
 
 
 \
*    r6   r=  c                       e Zd ZdS )DrtBooleanExpressionNr|  r5   r6   r7   r  r    r  r6   r  c                       e Zd Zd Zd ZdS )r   c                 ~    t          | j                                        | j                                                  S r]   )r   r   r   r   rX   s    r7   r   zDrtOrExpression.fol  s*    DJNN,,dkoo.?.?@@@r6   c                     t          |t                    rd |                                D             S t                              | |          S )Nc                 "    g | ]}|d d         S r=   r'  r5   r  s     r7   rA   z1DrtOrExpression._pretty_subex.<locals>.<listcomp>	       ;;;4D2J;;;r6   )r   r   r   r  r  r  s     r7   r  zDrtOrExpression._pretty_subex  sF    e_-- 	<;;5==??;;;;#11$>>>r6   N)r*   r+   r,   r   r  r5   r6   r7   r   r     s5        A A A? ? ? ? ?r6   r   c                       e Zd Zd ZdS )r   c                 ~    t          | j                                        | j                                                  S r]   )r   r   r   r   rX   s    r7   r   zDrtEqualityExpression.fol  s*    !$*.."2"2DKOO4E4EFFFr6   N)r*   r+   r,   r   r5   r6   r7   r   r     s(        G G G G Gr6   r   c                   z    e Zd ZdZddZddZd Zd Zdd	Zd
 Z	d Z
d Zej        Zd Zd Zd Zd Zd Zd ZdS )r   zDRS of the form '(DRS + DRS)'Nc                 L    t                               | ||           || _        d S r]   )r  rO   r   )rY   r   r   r   s       r7   rO   zDrtConcatenation.__init__  s%    %%dE6:::$r6   FTc                    | j         }| j        }| j        }||                                 v rM|rJ|                    ||||          }|                    ||||          }|r|                    ||||          }n|rt          |                     d                    |                                z  D ]h}t          t          |                    }	|                    ||	d|          }|                    ||	d|          }|r|                    ||	d|          }i|                    ||||          }|                    ||||          }|r|                    ||||          }| 	                    |||          S )r   T)
r   r   r   r   r   r  r  r   r   r   )
rY   r   rq   r  r   r   r   r   r   rI  s
             r7   r   zDrtConcatenation.replace  s    
_
 t}}&& 
j-   j-   !+!3!3 *m]" "J  Ut}}T2233joo6G6GG U UC-oc.B.BCCA!MM#q$FFE#^^CD-HHF! U%/%7%7Qm%T%T
MM(J}UUE^^Hj-WWF '//j- 
 ~~eVZ888r6   c                     |                                  }t          |t                    rJ |                                S r]   )r   r   r   r   rg  s     r7   r   z#DrtConcatenation.eliminate_equality@  s8    mmooc#344444%%'''r6   c                 x   | j                                         }| j                                        }| j        r| j                                        nd }t	          |t
                    rt	          |t
                    rt          |                    d                    t          |                    d                    z  D ]5}t          t          |                    }|
                    ||d          }6t          |j        |j        z   |j        |j        z   |          S |                     |||          S r  )r   r   r   r   r   r$   r  r   r   r   r   ry   rz   r   )rY   r   r   r   r   r  s         r7   r   zDrtConcatenation.simplifyF  s   
##%%%%''37?LT_--///
eS!! 		=j&=&= 		=5>>$//003vt7L7L3M3MM ; ;.s/C/CDDVT::uzFK/v|1KZXXX>>%<<<r6   c                     | j                             |          | j                            |          z   }| j        r/|r-|                    | j                            d                     |S r  )r   r   r   r   r  )rY   r   ry   s      r7   r   zDrtConcatenation.get_refsV  sd    z""9--0D0DY0O0OO? 	8y 	8KK0066777r6   c                     t           j        S r]   )r#   r-   rX   s    r7   r  zDrtConcatenation.getOp]  s    !!r6   c                    t          |t                    r|                                 }|                                }t          |          t          |          k    rt|}t	          ||          D ]1\  }}|                     |          }|                    ||d          }2| j        |j        k    o| j        |j        k    o| j	        |j	        k    S dS rU  )
r   r   r   r!  rV  r   r   r   r   r   )rY   r   	self_refs
other_refsrW  rX  rY  rZ  s           r7   r]  zDrtConcatenation.__eq__`  s     e-.. 	I))J9~~Z00"'!)Z88 O OFB 88<<E&5&=&=b%&N&NOOJ/"77 F'==F?+EE
 ur6   c                     | |k     S r]   r5   r   s     r7   r_  zDrtConcatenation.__ne__r  r`  r6   c                     t          | j                                        | j                                                  }| j        r't          || j                                                  }|S r]   )r   r   r   r   r   r   )rY   r   s     r7   r   zDrtConcatenation.folw  sU    $*..**DKOO,=,=>>? 	8a!4!4!6!677Ar6   c                 J   t                               |                     | j                  |                                 |                     | j                            }| j        r=t                               |t          j        | j        	                                          }|S r]   )
r=  r>  r  r   r  r   r   r#   r?  r   rg  s     r7   r   zDrtConcatenation._pretty}  s    !22tz**JJLLt{++
 

 ? 	%66Y]DO$;$;$=$= C 
r6   c                     t          |t                    rd |                                D             S t                              | |          S )Nc                 "    g | ]}|d d         S r  r5   r  s     r7   rA   z2DrtConcatenation._pretty_subex.<locals>.<listcomp>  r  r6   )r   r   r   r  r  r  s     r7   r  zDrtConcatenation._pretty_subex  sG    e-.. 	<;;5==??;;;;#11$>>>r6   c                     | j         r8 | || j                   || j                   || j                   g          S  | || j                   || j                  g          S r  )r   r   r   r  s      r7   r  zDrtConcatenation.visit  s~    ? 	M:$*%%xx'<'<hht>W>WX   :xx
33XXdk5J5JKLLLr6   c                 d   |                      | j                  }|                      | j                  }t          j        |z   dz   |                                 z   dz   |z   t          j        z   }| j        r:t          j        |z   dz   t          j	        z   dz   d| j        z  z   t          j        z   S |S )Nr,  rD  )

_str_subexr   r   r   rc   r  rx   r   r#   r?  )rY   r   r   r   s       r7   rh  zDrtConcatenation.__str__  s    
++--kE!C'$**,,6<vET? 		 -  	
 () /" 
r6   c                 \    d|z  }t          |t                    r|j        
|dd         S |S )NrD  r=   r'  )r   r   r   )rY   r  r   s      r7   r  zDrtConcatenation._str_subex  s8    5Le-.. 	53C3KQrT7Nr6   r]   ri  r   )r*   r+   r,   r   rO   r   r   r   r   r  r]  r_  r  rj  r   r   r  r  rh  r  r5   r6   r7   r   r     s	       ''% % % %%9 %9 %9 %9N( ( (= = =    " " "  $! ! ! $,H  
 
 
? ? ?
M M M       r6   r   c                   "    e Zd Zd ZddZd ZdS )r   c                 ~    t          | j                                        | j                                                  S r]   )r	   r   r   r   rX   s    r7   r   zDrtApplicationExpression.fol  s.    $T]%6%6%8%8$-:K:K:M:MNNNr6   Fc                 t    |r5| j                             d          | j                            d          z   ng S r  )r   r   r   r   s     r7   r   z!DrtApplicationExpression.get_refs  s>     DM""4((4=+A+A$+G+GGG	
r6   c           
         |                                  \  }}|                                }d |D             }t          t          t          |g|z                       t          |          }fd|D             }t          t          |t          t          |                               }d |d d         D             d |dd         D             z   d |dd          D             z   S )Nc                 6    g | ]}|                                 S r5   r  )r?   args     r7   rA   z4DrtApplicationExpression._pretty.<locals>.<listcomp>  s     444ckkmm444r6   c                 0    g | ]}t          |          S r5   )r  )r?   	arg_linesr  s     r7   rA   z4DrtApplicationExpression._pretty.<locals>.<listcomp>  s#    XXX	oi;;XXXr6   c                 P    g | ]#\  }}|d z   d                      |          z   d z   $S r  r   r?   	func_line	args_lines      r7   rA   z4DrtApplicationExpression._pretty.<locals>.<listcomp>  sF       (Iy C#((9"5"55;  r6   rC   c                 P    g | ]#\  }}|d z   d                     |          z   dz   $S )r  rb  r  r  r  s      r7   rA   z4DrtApplicationExpression._pretty.<locals>.<listcomp>  F       (Iy C#((9"5"55;  r6   rE   c                 P    g | ]#\  }}|d z   d                      |          z   d z   $S r  r  r  s      r7   rA   z4DrtApplicationExpression._pretty.<locals>.<listcomp>  r  r6   )uncurryr   r<  r  r!  r  r  rV  )rY   r   argsfunction_lines
args_linesfunc_args_linesr  s         @r7   r   z DrtApplicationExpression._pretty  s!   $!))++44t444
C.!1J!>??@@	(CCXXXXZXXX
s>4Z8H3I3IJJKK ,;BQB,?   ,;AaC,@  	 ,;ABB,?  	
r6   Nr   r  r5   r6   r7   r   r     sI        O O O
 
 
 

 
 
 
 
r6   r   c                 d    dt          | d                   z  g}| ||t          |           z
  z  z   S )Nr,  r   rw  )linesr  pad_lines      r7   r  r    s4    c%(mm#$H8y3u::5666r6   c                   (    e Zd Zd ZddZd Zd ZdS )	PossibleAntecedentsc                      t          |           S )zSet of free variables.)r  rX   s    r7   r  zPossibleAntecedents.free  s    4yyr6   FTc                     t                      }| D ]3}||k    r|                     |           |                     |           4|S )r   )r   r}   )rY   r   rq   r  r   resultitems          r7   r   zPossibleAntecedents.replace  sX     %&& 	" 	"DxJ''''D!!!!r6   c                 :    d| z  }dt          |          z  }|||gS rv  rw  rx  s      r7   r   zPossibleAntecedents._pretty  s'    4Kc!ffua  r6   c                 L    dd                     d | D                       z   dz   S )Nr'   rb  c              3       K   | ]	}d |z  V  
dS re  r5   )r?   its     r7   r  z.PossibleAntecedents.__str__.<locals>.<genexpr>  s&      77BdRi777777r6   r(   r  rX   s    r7   rh  zPossibleAntecedents.__str__  s-    SXX77$777777#==r6   Nri  )r*   r+   r,   r  r   r   rh  r5   r6   r7   r   r     sU          	 	 	 	! ! !
> > > > >r6   r   c                       e Zd ZdS )AnaphoraResolutionExceptionNr|  r5   r6   r7   r
  r
    r  r6   r
  c                 B   t          | t                    r	|                                 rt                      }|D ]c}|                                D ]L}|                     |          }|j        | j        j        k    r || j        k    s|                    |           Mdt          |          dk    r	|d         }n|}| 
                    | j        |          S t          | j        || gz             }t          | j        || gz             }|                     ||          S t          | t                    rg }	| j        D ]}
t          |
|| gz             }t          |t                    rlt          |j        t                    r|j        }|j        |_        ||_        t          |j        t                    r|j        st%          d|j        z            |	                    |           | j        rt          | j        || gz             }nd }|                     | j        |	|          S t          | t*                    r| S t          | t,                    r,|                     t          | j        || gz                       S t          | t0                    rh| j        rt          | j        || gz             }nd }|                     t          | j        || gz             t          | j        || gz             |          S t          | t2                    rD|                     t          | j        || gz             t          | j        || gz                       S t          | t4                    r2|                     | j        t          | j        || gz                       S d S )Nr=   r   z+Variable '%s' does not resolve to anything.)r   r	   r   r   r   r   r   r   r}   r!  r   r   r   r$   rz   r   r   r   r
  r   ry   r   r   r   r   r
   r   r   )rq   trailpossible_antecedentsancestorr   refex
resolution
r_function
r_argumentr_condsr   r_condtempr   s                 r7   r   r     s   *344 O
))++ 	@#6#8#8 ! 
; 
;#,,.. 	; 	;C&>>sCCE
 **=*GGG!444,33E:::	; '((A--1!4

1
55j6I:VVV)**=u
|?STTJ)**=u
|?STTJ''
J???	J	$	$ 6
$ 	# 	#D%dEZL,@AAF &"455 fl,?@@ )!<D#)=FL$(FMfm-@AA != 935;\B  
 NN6""""  	)**?*AUVVJJJ##JOWjIII	J :	;	; 
	J 1	2	2 
##Z_ezl.BCC
 
 	
 
J 0	1	1 
  	)**?*AUVVJJJ##Z-u
|/CDDZ.0DEE
 
 	
 
J 0	1	1 	
##Z-u
|/CDDZ.0DEE
 
 	

 
J 0	1	1 
##!1*/5J<CW!X!X
 
 	

 
r6   c                   ~    e Zd ZdZdZdZddZd ZeefdZd	 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S )r   rE   
   rI   TNc                    d}|st                      }|                    d           t          dd          }|ryt          |dd          }||_        || _        |                     || j        | j                  \  }}t          || j        z   d          }|| j        z   }	t          |||	          }nt          |d	d	          }|
                                 ||_        || _        || _        || _        dS )
a  
        :param drs: ``DrtExpression``, The DRS to be drawn
        :param size_canvas: bool, True if the canvas size should be the exact size of the DRS
        :param canvas: ``Canvas`` The canvas on which to draw the DRS.  If none is given, create a new canvas.
        NDRT	helvetica   )familysizer   )widthheightd   i,  )r   titler    r   fontcanvas_visit
OUTERSPACETOPSPACEr<  packr   master)
rY   r   size_canvasr#  r(  r"  rightbottomr  r  s
             r7   rO   zDrsDrawer.__init__L  s      	TTFLL{444D 
?a:::"$"&++c4?DM"R"REDO3S99$/1eFCCCc#>>>KKMMMFKr6   c                 @    | j         j                            d          S )z Get the height of a line of text	linespace)r#  r"  metricsrX   s    r7   _get_text_heightzDrsDrawer._get_text_heightl  s    {''444r6   c                     |                      | j        | j        ||           | j        r)t	                      s| j                                         dS |                     | j        ||          S )zDraw the DRSN)_handler   _draw_commandr(  r!   mainloopr$  )rY   r@   ys      r7   r   zDrsDrawer.drawp  sf    TXt11a888; 	/wyy 	/K  """"";;txA...r6   c                 <    |                      || j        ||          S )a!  
        Return the bottom-rightmost point without actually drawing the item

        :param expression: the item to visit
        :param x: the top of the current drawing area
        :param y: the left side of the current drawing area
        :return: the bottom-rightmost point
        )r1  _visit_command)rY   rq   r@   r4  s       r7   r$  zDrsDrawer._visity  s     ||J(;QBBBr6   c                    t          |t                    r*| j                            ||d| j        j        |           nvt          |t
                    ra|\  }}| j                            ||||           ||                                 z   | j        dz  z   }| j        	                    ||||           | 
                    |||          S )a   
        Draw the given item at the given location

        :param item: the item to draw
        :param x: the top of the current drawing area
        :param y: the left side of the current drawing area
        :return: the bottom-rightmost point
        nw)anchorr"  textrC   )r   strr#  create_textr"  tuplecreate_rectangler/  BUFFERcreate_liner6  )rY   r  r@   r4  r*  r+  horiz_line_ys          r7   r2  zDrsDrawer._draw_command  s     dC   		JK##AqDK<LSW#XXXXe$$ 	J"OUFK((Auf===D))+++t{Q?  K##A|ULIII""4A...r6   c                     t          |t                    r9|| j        j                            |          z   ||                                 z   fS t          |t                    r|S dS )a  
        Return the bottom-rightmost point without actually drawing the item

        :param item: the item to visit
        :param x: the top of the current drawing area
        :param y: the left side of the current drawing area
        :return: the bottom-rightmost point
        N)r   r;  r#  r"  measurer/  r=  )rY   r  r@   r4  s       r7   r6  zDrsDrawer._visit_command  sk     dC   	(00666D<Q<Q<S<S8STTe$$ 	K	 	r6   r   c                    || j         k    r)	 |j        |z   }|j        |z   }||fS # t          $ r Y nw xY wt	          |t
                    r| j        }nt	          |t                    r| j        }nt	          |t                    r| j
        }nt	          |t                    r| j        }nt	          |t                    r| j        }npt	          |t                    r| j        }nSt	          |t"                    r| j        }n6t	          |t$                    r| j        }nt)          |j        j                   |||||          \  }}||z
  |_        ||z
  |_        ||fS )a1  
        :param expression: the expression to handle
        :param command: the function to apply, either _draw_command or _visit_command
        :param x: the top of the current drawing area
        :param y: the left side of the current drawing area
        :return: the bottom-rightmost point
        )r6  _drawing_width_drawing_heightr   r   r   _handle_VariableExpressionr$   _handle_DRSrp   _handle_NegatedExpressionr   _handle_LambdaExpressionr
   _handle_BinaryExpressionr   _handle_ApplicationExpressionr   r   _handle_DrtPropositionr   r   r*   )rY   rq   commandr@   r4  r*  r+  r   s           r7   r1  zDrsDrawer._handle  s    d)))"1A5#3a7v&!    j"?@@ 	;5GG
C(( 	;&GG
$899 	;4GG
$788 	;3GG
$455 		;3GG
$<== 	;8GG
$788 	;5GG
N33 	;1GGJ09:::!'*gq!<< %*AI
!%+aZ
"vs   % 
22c                 "     |d|z  ||          S )NrD  r5   )rY   rq   rN  r@   r4  s        r7   rG  z$DrsDrawer._handle_VariableExpression  s    wtj(!Q///r6   c           
         |                      t          j        ||          d         }|                     |j        |||          \  }} |t          j        ||                     |||z
  |                                                      ||fS rt   )r6  r#   NOTr1  r   _get_centered_topr/  rY   rq   rN  r@   r4  r*  r+  s          r7   rI  z#DrsDrawer._handle_NegatedExpression  s    ##IM1a88; ,,zJJ 	M""1fqj$2G2G2I2IJJ	
 	
 	
 vr6   c                    || j         z   }|| j         z   }|j        r%d                    d |j        D                       }nd} ||||          \  }}|| j         dz  z  }|j        r@|j        D ]7}	|                     |	|||          \  }
}t          ||
          }|| j         z  }8n||                                 | j         z   z  }|| j         z  } |||f||          S )Nr,  c              3       K   | ]	}d |z  V  
dS re  r5   )r?   rs     r7   r  z(DrsDrawer._handle_DRS.<locals>.<genexpr>  s&      >>D1H>>>>>>r6   z     rC   )r?  ry   r   rz   r1  r<  r/  )rY   rq   rN  r@   r4  leftr+  ry   	max_rightr   r*  s              r7   rH  zDrsDrawer._handle_DRS  s   4;T[ ? 	88>>jo>>>>>DDD%gdD&99F$+/!  	<"( & &"&,,tWdF"K"K	511	$+%&
 d++--;;F 	T[ 	w	6*Aq111r6   c                 P    |                                 \  }}t          |t                    s|j        }|j        g}                     |          d         }t          |g fd|D             z             }|z
  }	                     |	|j                  }
 	                    |||
          d         }                     |	 
                                          } |t          j        ||          d         }t          |          D ]u\  }}                     |	|j                  } 	                    ||||          d         }|dz   t          |          k     r  |t          j        dz   ||          d         }v |t          j        ||          d         }||fS )Nr=   c                 J    g | ]}                     |          d           S r<   )r$  )r?   r  rY   r@   r4  s     r7   rA   z;DrsDrawer._handle_ApplicationExpression.<locals>.<listcomp>  s.     K K KsS!Q!7!7!: K K Kr6   r   r,  )r  r   r   r   r   r$  r<  rR  rF  r1  r/  r#   rc   	enumerater!  rv   rx   )rY   rq   rN  r@   r4  r   r  function_bottom
max_bottomline_heightfunction_drawing_topr*  centred_string_topr  r  arg_drawing_tops   `  ``           r7   rL  z'DrsDrawer._handle_ApplicationExpression  s   #++--$($ABB 	)!*H'(D ++h155a8 K K K K K Kd K K KK
 

 !1n  $55{H4 
  
 Xw3GHHK "33{D1133
 
 	/ABB1E  oo 	U 	UFAs"44; 3 O LLguoFFqIE1us4yy  	# 5u>PQQRST 	0BCCAFz""r6   c           
      :   t           j        d|j        z  z   t           j        z   }|                     |||          d         }|                     |j        |||          \  }} ||||                     |||z
  |                                                      ||fS )NrD  r   )	r#   LAMBDAr   r  r6  r1  r   rR  r/  )rY   rq   rN  r@   r4  r   r*  r+  s           r7   rJ  z"DrsDrawer._handle_LambdaExpression-  s    $tj.A'AAIMQ	##Iq!44Q7 ,,zJJ 	q$00FQJ@U@U@W@WXX	
 	
 	
 vr6   c           
         |                      |j        dd          d         }|                      |j        dd          d         }t          ||          }|                     |||                                           } |t          j        ||          d         }	|j        j        }| 	                    |j        ||	|                     |||                    \  }	}
 |d|
                                z  |	|          d         }	|j        j        }| 	                    |j        ||	|                     |||                    \  }	} |t          j        |	|          d         }	|	t          |
|          fS )Nr   r=   z %s )r$  r   r   r<  rR  r/  r#   rc   rF  r1  r  rx   )rY   rq   rN  r@   r4  first_heightsecond_heightr^  r`  r*  first_bottomsecond_bottoms               r7   rK  z"DrsDrawer._handle_BinaryExpression<  s~   {{:#3Q::1=J$5q!<<Q?,66 "33{D1133
 
 	+=>>qA "'7 $""1k<@@	!
 !
 !1!1!3!33U<NOOPQR #)9!%""1k=AA	"
 "
 	0BCCAFs<7788r6   c                 z     ||j         ||          d         }|                     |j        |||          \  }}||fS rt   )r   r1  r   rS  s          r7   rM  z DrsDrawer._handle_DrtPropositionb  sF    
+Q2215 ,,zJJvr6   c                     |||z
  dz  z   S )zGet the y-coordinate of the point that a figure should start at if
        its height is 'item_height' and it needs to be centered in an area that
        starts at 'top' and is 'full_height' tall.rC   r5   )rY   topfull_heightitem_heights       r7   rR  zDrsDrawer._get_centered_topk  s     kK/1444r6   r  )r   r   )r*   r+   r,   r?  r&  r%  rO   r/  r   r$  r2  r6  r1  rG  rI  rH  rL  rJ  rK  rM  rR  r5   r6   r7   r   r   G  s!       FHJ   @5 5 5  8 / / / /	C 	C 	C/ / /,  , , , ,\0 0 0   2 2 22)# )# )#V  $9 $9 $9L  5 5 5 5 5r6   r   c                  t   t          d           t          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            | d          }t          |           |                    t          d                    }t          |           t          ||k               t          d           t          t           | d                               t          t           | d                               t          t           | d                               t          d            | d                                            | d                                            | d                                            | d                                            | d                                           d S )Nz2====================TEST PARSE====================([x,y],[sees(x,y)])([x],[man(x), walks(x)])z\x.\y.([],[sees(x,y)])z\x.([],[walks(x)])(john)z$(([x],[walks(x)]) + ([y],[runs(y)]))z#(([],[walks(x)]) -> ([],[runs(x)]))z([x],[PRO(x), sees(John,x)]) ([x],[man(x), -([],[walks(x)])])*([],[(([x],[man(x)]) -> ([],[walks(x)]))])z2====================Test fol()====================z\====================Test alpha conversion and lambda expression equality====================z\x.([],[P(x)])zz?====================Test resolve_anaphora()====================z,([x,y,z],[dog(x), cat(y), walks(z), PRO(z)])z3([],[(([x],[dog(x)]) -> ([y],[walks(y), PRO(y)]))])z(([x,y],[]) + ([],[PRO(x)]))z;====================Test pretty_print()====================([],[])z@([],[([x],[big(x), dog(x)]) -> ([],[bark(x)]) -([x],[walk(x)])])z'([x,y],[x=y]) + ([z],[dog(z), walk(z)])z4([],[([x],[]) | ([y],[]) | ([z],[dog(z), walk(z)])])z0\P.\Q.(([x],[]) + P(x) + Q(x))(\x.([],[dog(x)])))r   r   r   r   r   r   r   r   )dexpre1e2s      r7   demorx  r  s   	
,---$E	%%&
'
'(((	%%+
,
,---	%%)
*
*+++	%%+
,
,---	%%7
8
8999	%%6
7
7888	%%/
0
0111	%%3
4
4555	%%=
>
>???	
,---	%%&
'
'
+
+
-
-...	
VWWW	 	!	!B	"III			(3--	(	(B	"III	"(OOO	
9:::	
55!PQQ
R
RSSS	UVVWW   

55!@AA
B
BCCC	
5666	E*""$$$	EK lnnn	E
455BBDDD	E
ABBOOQQQ	E
=>>KKMMMMMr6   c                      	 ddl m}  n!# t          $ r}t          d          d }~ww xY wg d}|D ]0}t                              |          }|                                 1d S )Nr   )r   z,tkinter is required, but it's not available.)r@   rt  z([x],[])z([x],[man(x)])ro  rp  z\x.([],[man(x), walks(x)])z\x y.([],[sees(x,y)])z)([],[(([],[walks(x)]) + ([],[runs(x)]))])rq  rr  )tkinterr   ImportError
ValueErrorr   r   r   )r   r   expressionsds       r7   	test_drawr    s    I I I IGHHHI  K   $$Q''	 s   	 
'"'__main__)Dr  	functoolsr   	itertoolsr   nltk.sem.logicr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rz  r   r   tkinter.fontr    	nltk.utilr!   r{  r#   r9   r   r$   r   r   r   rl  rm  rn  r   rp   r   r=  r  r   r   r   r   r  r  r   r   r
  r   r   rx  r  r*   r5   r6   r7   <module>r     s                                                                    :	""""""""!!!!!!!!!!!!! 	 	 	D	
+ + + + + + + +4 4 4 4 4 4 4 4Dd d d d d d d dN| | | | |- | | |~/ / /    M3M   "	 	 	 	 	!#?	 	 		 	 	 	 	!#=	 	 		 	 	 	 	#%<	 	 		 	 	 	 	9;M 	 	 	;4 ;4 ;4 ;4 ;4]J ;4 ;4 ;4|
 
 
 
 
=*; 
 
 
$"
 "
 "
 "
 "
-)9 "
 "
 "
J% % % % %-)9 % % %P	 	 	 	 	.0A 	 	 	? ? ? ? ?*L ? ? ?G G G G G/1C G G G
Y Y Y Y Y+ Y Y Yx!
 !
 !
 !
 !
}.C !
 !
 !
H7 7 7
> > > > >$z > > >2	 	 	 	 	) 	 	 	 (* P
 P
 P
 P
fh5 h5 h5 h5 h5 h5 h5 h5V	%N %N %NP  2 zDFFFFF s   A A%$A%