
    g                        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%  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        yy# e&$ r Y w xY w)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                   t    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y)	DrtTokensDRS+PRO[]:N)__name__
__module____qualname__r$   DRS_CONCPRONOUNOPEN_BRACKETCLOSE_BRACKETCOLONPUNCTr   SYMBOLSTOKENS     A/var/www/openai/venv/lib/python3.12/site-packages/nltk/sem/drt.pyr#   r#   5   sQ    
CHGLME|]E:Ennu$G]]cU"U*Fr6   r#   c                   j    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y)	DrtParserz$A lambda calculus expression parser.c                 R   t        j                  |        t        t        j                  D cg c]  }|df c}t        j
                  D cg c]  }|df c}z   t        dfgz   t        j                  t        j                  z   D cg c]  }|df c}z   t        j                  dfgz   t        j                  dfgz   t        j                  D cg c]  }|df c}z   t        j                  D cg c]  }|df c}z   d	gz         | _        y c c}w c c}w c c}w c c}w c c}w )
N                        )N	   )r   __init__dictr#   LAMBDA_LISTNOT_LISTr   EQ_LISTr   NEQ_LISTr1   r-   OR_LISTIMP_LISToperator_precedence)selfxs     r7   rD   zDrtParser.__init__G   s0   T"#'&2232aV23(1121!1v123Qxj  )006??BCB!1vBCD #$	%
 ""A&'(  )0010!1v012  )1121!1v123 k
$
 32C 22s   DD
D
D
2D$
c                 "    t         j                  S )z#This method exists to be overridden)r#   r3   rM   s    r7   get_all_symbolszDrtParser.get_all_symbolsV   s       r6   c                 &    |t         j                  vS N)r#   r4   )rM   toks     r7   
isvariablezDrtParser.isvariableZ   s    )****r6   c                    |t         j                  v r| j                  ||      S |t         j                  v r| j	                  ||      S |t         j
                  k(  rW| j                  d      r4| j                  d      t         j                  k(  r| j                  ||      S | j                  ||      S |j                         t         j                  k(  r1| j                  t         j
                         | j                  ||      S | j                  |      rW| j                  d      r4| j                  d      t         j                  k(  r| j!                  ||      S | j#                  ||      S y)zgThis method is intended to be overridden for logics that
        use different operators or expressionsr   N)r#   rG   handle_negationrF   handle_lambdaOPENinRangetokenr/   
handle_DRShandle_openupperr$   assertNextTokenrU   r1   handle_prophandle_variable)rM   rT   contexts      r7   handlezDrtParser.handle]   s     )$$$''W55I)))%%c733INN"||A4::a=I4J4J#JsG44''W55YY[IMM)  0??300__S!||A4::a=IOO#C''W55++C99	 "r6   c                     t        |      S rS   DrtNegatedExpression)rM   
expressions     r7   make_NegatedExpressionz DrtParser.make_NegatedExpressionv   s    #J//r6   c                 "   | j                         }| j                  d      r2| j                  d      t        j                  k(  r| j                          | j                  |      }| j                  t        j                         t        ||d       S Nr   )	handle_refsrZ   r[   r#   COMMAhandle_condsr_   CLOSEr$   )rM   rT   rb   refscondss        r7   r\   zDrtParser.handle_DRSy   sh    !LLO

1 @JJL!!'*Y__-4%%r6   c                    | j                  t        j                         g }| j                  d      r| j	                  d      t        j
                  k7  r|r2| j	                  d      t        j                  k(  r| j	                          |j                  | j                  d             | j                  d      r#| j	                  d      t        j
                  k7  r| j                  t        j
                         |S )Nr   
quantified)	r_   r#   r/   rZ   r[   r0   rl   appendget_next_token_variable)rM   ro   s     r7   rk   zDrtParser.handle_refs   s    Y334ll1o$**Q-93J3J"J

18

KK44\BC	 ll1o$**Q-93J3J"J
 	Y445r6   c                    | j                  t        j                         g }| j                  d      r| j	                  d      t        j
                  k7  r|r2| j	                  d      t        j                  k(  r| j	                          |j                  | j                  |             | j                  d      r#| j	                  d      t        j
                  k7  r| j                  t        j
                         |S rj   )	r_   r#   r/   rZ   r[   r0   rl   rs   process_next_expression)rM   rb   rp   s      r7   rm   zDrtParser.handle_conds   s    Y334ll1o$**Q-93J3J"JA)//9

LL55g>?	 ll1o$**Q-93J3J"J
 	Y445r6   c                     | j                  |      }| j                  d       | j                  t        j                        }t        ||      S )Nr)   )make_VariableExpressionr_   rv   r#   r1   DrtProposition)rM   rT   rb   variabledrss        r7   r`   zDrtParser.handle_prop   sA    //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rM   firstseconds      r7   make_EqualityExpressionz!DrtParser.make_EqualityExpression   s     %UF33r6   c                     |t         j                  k(  rd S |t         j                  v rt        S |t         j                  v rd }|S y)zbThis method serves as a hook for other logic parsers that
        have different boolean operatorsc                     t        | |d       S rS   DrtConcatenationr   r   s     r7   <lambda>z9DrtParser.get_BooleanExpression_factory.<locals>.<lambda>   s    )9%)Nr6   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$   ro   rp   r   r   r   	Exceptionr   s     r7   make_imp_expressionzDDrtParser.get_BooleanExpression_factory.<locals>.make_imp_expression   sQ    eS)uzz5;;??e%56+EKKvNN IJJr6   N)r#   r-   rJ   DrtOrExpressionrK   )rM   rT   r   s      r7   get_BooleanExpression_factoryz'DrtParser.get_BooleanExpression_factory   sK     )$$$NNI%%%""I&&&K '&r6   c                      |||      S rS   r5   )rM   factoryr   r   s       r7   make_BooleanExpressionz DrtParser.make_BooleanExpression   s    uf%%r6   c                     t        ||      S rS   DrtApplicationExpression)rM   functionarguments      r7   make_ApplicationExpressionz$DrtParser.make_ApplicationExpression   s    '(;;r6   c                 *    t        t        |            S rS   )DrtVariableExpressionr   )rM   names     r7   rx   z!DrtParser.make_VariableExpression   s    $Xd^44r6   c                     t        ||      S rS   )DrtLambdaExpression)rM   	variablesterms      r7   make_LambdaExpressionzDrtParser.make_LambdaExpression   s    "9d33r6   N)r*   r+   r,   __doc__rD   rQ   rU   rc   rh   r\   rk   rm   r`   r   r   r   r   rx   r   r5   r6   r7   r9   r9   D   sP    .
!+:20	&		-4
(&<5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y)DrtExpressionz_
    This is the base abstract DRT Expression from which every DRT
    Expression extends.
    c                 8    | j                   j                  |      S rS   )_drt_parserparse)clsss     r7   
fromstringzDrtExpression.fromstring   s    $$Q''r6   c                     t        | |      S rS   r   rM   others     r7   applytozDrtExpression.applyto   s    'e44r6   c                     t        |       S rS   re   rP   s    r7   __neg__zDrtExpression.__neg__   s    #D))r6   c                     t         S rS   )NotImplementedr   s     r7   __and__zDrtExpression.__and__   s    r6   c                 >    t        |t              sJ t        | |      S rS   )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$   ro   rp   r   r   r   r   r   s     r7   __gt__zDrtExpression.__gt__   sa    %///dC tyy$**e44d,-#DJJUCCABBr6   Nc                     t        |t              sJ | j                         j                         }|j                         j                         }|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)rM   r   proverf1f2s        r7   r   zDrtExpression.equiv   sN     %///]]_  "^^!!#xxF##r6   c                 F    t        d| j                  j                  z        )Nz#'%s' object has no attribute 'type')AttributeError	__class__r*   rP   s    r7   typezDrtExpression.type   s!    1DNN4K4KK
 	
r6   c                     t               rS   NotImplementedError)rM   	signatures     r7   	typecheckzDrtExpression.typecheck   s    !##r6   c                     t        | |d       S rS   r   r   s     r7   __add__zDrtExpression.__add__   s    eT22r6   c                     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   rM   	recursives     r7   get_refszDrtExpression.get_refs  s     "##r6   c                     t        | t              xri t        | j                  t              xrM | j                  j                  j
                  t        j                  k(  xr t        | j                  t              S )zIs self of the form "PRO(x)"?)
r   r   r   DrtAbstractVariableExpressionrz   r   r#   r.   r   DrtIndividualVariableExpressionrP   s    r7   is_pronoun_functionz!DrtExpression.is_pronoun_function
  sd     t56 K4==*GHK&&++y/@/@@K 4==*IJ		
r6   c                     t        ||      S rS   r}   r   s      r7   r   z%DrtExpression.make_EqualityExpression  s    $UF33r6   c                     t        |      S rS   )r   )rM   rz   s     r7   rx   z%DrtExpression.make_VariableExpression  s    $X..r6   c                     t        |       S rS   )resolve_anaphorarP   s    r7   r   zDrtExpression.resolve_anaphora  s    %%r6   c                 <    | j                  d | j                        S )Nc                 "    | j                         S rS   )eliminate_equality)es    r7   r   z2DrtExpression.eliminate_equality.<locals>.<lambda>  s    q/C/C/Er6   )visit_structuredr   rP   s    r7   r   z DrtExpression.eliminate_equality  s    $$%Et~~VVr6   c                 @    dj                  | j                               S )zG
        Draw the DRS
        :return: the pretty print string
        
)join_prettyrP   s    r7   pretty_formatzDrtExpression.pretty_format  s    
 yy((r6   c                 6    t        | j                                y rS   )printr   rP   s    r7   pretty_printzDrtExpression.pretty_print&  s    d  "#r6   c                 6    t        |       j                          y rS   )	DrsDrawerdrawrP   s    r7   r   zDrtExpression.draw)  s    $r6   rS   F)r*   r+   r,   r   r9   r   classmethodr   r   r   r   r   r   r   propertyr   r   r   r   r   r   rx   r   r   r   r   r   r5   r6   r7   r   r      s    
 +K( (5*,C$ 
 

$3$
4/&W)$r6   r   c                   |    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y)r$   z%A Discourse Representation Structure.Nc                 .    || _         || _        || _        y)z
        :param refs: list of ``DrtIndividualVariableExpression`` for the
            discourse referents
        :param conds: list of ``Expression`` for the conditions
        N)ro   rp   
consequent)rM   ro   rp   r   s       r7   rD   zDRS.__init__0  s     	
$r6   c                 F   || j                   v r|s| S | j                   j                  |      }| j                  r| j                  j                  ||d|      }nd}t	        | j                   d| |j
                  gz   | j                   |dz   d z   | j                  D cg c]  }|j                  ||d|       c}|      S |rt        | j                         |j                         z  D ]  }t        |      }	t        |	      }
| j                   j                  |      }| j                  r| j                  j                  ||
d|      }nd}t	        | j                   d| |	gz   | j                   |dz   d z   | j                  D cg c]  }|j                  ||
d|       c}|      }  | j                  r| j                  j                  ||||      }nd}t	        | j                   | j                  D cg c]  }|j                  ||||       c}|      S c c}w c c}w c c}w )_Replace all instances of variable v with expression E in self,
        where v is free in self.TNr;   )ro   indexr   replacer$   rz   rp   setfreer   r   )rM   rz   rg   replace_boundalpha_convertir   condrefnewvarnewvarexs              r7   r   zDRS.replace:  s)    tyy  IIOOH-??!%!8!8 *dM"J "&JIIbqMZ%8%8$99DIIa!eg<NN %)JJ$.D Xz4O$.    tyy>JOO,==C,S1F4V<H		,A%)__%<%<4&
 &*
		"10499QUW3EE )-

(2 !LLhmL(2 #D >( !__44j-
 "
		 !%

 * LL:}mT *  I, s   H
H1H
c                 8   t        t        j                  | j                  D cg c]  }|j	                          c}t                     }| j                  r)|j                  | j                  j	                                |t        | j                        z
  S c c}w )z:see: Expression.free())	r   operatoror_rp   r   r   r   updatero   )rM   c
conds_frees      r7   r   zDRS.freex  sj    HLLTZZ*HZ1668Z*H#%P
??doo2245C		N** +Is   B
c                    |rt| j                   t        t        j                  d | j                  D                    z   }| j
                  r*|j                  | j
                  j                  d             |S | j                   S )#:see: AbstractExpression.get_refs()c              3   >   K   | ]  }|j                  d         ywTN)r   ).0r   s     r7   	<genexpr>zDRS.get_refs.<locals>.<genexpr>  s     #IjAJJt$4js   T)ro   listr   from_iterablerp   r   extendr   )rM   r   
conds_refss      r7   r   zDRS.get_refs  sh    T###Idjj#II& J !!$//":":4"@A99r6   c                     t        t        || j                              }| j                  r!|j	                   || j                                ||      S z:see: Expression.visit())r  maprp   r   rs   )rM   r   
combinatorpartss       r7   visitz	DRS.visit  s>    S4::./??LL$//23%  r6   c           	          | j                   r || j                         nd} || j                  t        t        || j                              |      S )#:see: Expression.visit_structured()N)r   ro   r  r
  rp   )rM   r   r  r   s       r7   r   zDRS.visit_structured  s;    26//Xdoo.t
$))T#h

*C%DjQQr6   c                 4   | }d}|t        |j                        k  rD|j                  |   }t        |t              rt        |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                  k7  r4|j                  |j                  j                  |j                  dd      }d}|dz  }|dz  }|t        |j                        k  rDg }|j                  D ]h  }|j                         }|j                         }t        |t              r%|j                  s|j                  s|j                  sX|j!                  |       j |j                  r|j                  j                         nd }t        |j                  ||      S )Nr   r;   F)lenrp   r   r   r   r   r   r$   r  r   ro   rz   r   r   r   r   rs   )rM   r{   r   r   rp   new_condnew_cond_simpr   s           r7   r   zDRS.eliminate_equality  s   #cii. 99Q<D4!34tzz+EFt{{,FGSXX$++*>*>)??@IIbqMCIIa!eg$66NN
 ;;''4::+>+>>++dkk&:&:DJJuUCAQFA! #cii. $ IID..0H$--/M}c2 %% && ++X&  =@NNS^^668PT
388UJ//r6   c                    | j                   rd }| j                  r6t        t        | j                  D cg c]  }|j	                          c}      }|r%t        || j                   j	                               }n| j                   j	                         }| j                  d d d   D ]  }t        ||      } |S | j                  st        d      t        t        | j                  D cg c]  }|j	                          c}      }t        t        | j                  | j                        d d d         D ]  }t        ||      } |S c c}w c c}w )Nz-Cannot convert DRS with no conditions to FOL.)r   rp   r   r   r   r   ro   r   r   r
  r   _order_ref_stringsr   )rM   accumr   r   s       r7   r   zDRS.fol  s   ??Ezz}

.K
1quuw
.KL%eT__-@-@-BC++-yy2%c51 ' L :: OPP=DJJ*GJq1557J*GHE8T%<%<TYY%G"%MN(e4 OL% /L +Hs   E
&E
c           	         dj                  | j                  | j                              }| j                  D cg c]  }t	        d |j                                c}D cg c]  }|D ]  }|  }}}t        t        |      gt        t        t        |            z         }dd|z  z   dz   d|j                  |      z   dz   dd	|z  z   d
z   g|D cg c]  }d|j                  |      z   dz    c}z   dd|z  z   dz   gz   }| j                  r=t        j                  |t        j                  | j                  j                               S |S c c}w c c}}w c c}w )N c                 "    | j                         S rS   )strip)r   s    r7   r   zDRS._pretty.<locals>.<lambda>  s
    r6   z __z_ z| z |z|--z-|z|_z_|)r   r  ro   rp   filterr   maxr  r  r
  ljustr   DrtBinaryExpression_assemble_prettyr#   IMP)rM   	refs_liner   	cond_line
cond_lineslengthliner{   s           r7   r   zDRS._pretty  sz   HHT44TYY?@	
 IM

HR*DLLN;

	 "	  "	  	 
 c)n%Sj-A(BBC sV|#d*yv..5sV|#d*
 =GGJDtdjj((4/JGH cFl"T)*+ 	 ??&77Y]]DOO$;$;$=  
'
 Hs   "E!EEc                    |D cg c]  }d|z  	 }}g }g }g }g }|D ]j  }t        |      r|j                  |        t        |      r|j                  |       =t        |      r|j                  |       Z|j                  |       l t	        |      t	        |d       z   t	        |d       z   t	        |d       z   S c c}w )N%sc                 F    t        | dd  dgt        | dd        dk(           S )Nr<   r  r   intr  vs    r7   r   z(DRS._order_ref_strings.<locals>.<lambda>  s&    sAabE2;s1QR5zQ3O/Pr6   )keyc           	      P    | d   t        | dd  dgt        | dd        dk(           fS Nr   r;   r  r,  r.  s    r7   r   z(DRS._order_ref_strings.<locals>.<lambda>  s0    qtS!AB%S12ZST_9U5V.Wr6   c           	      P    | d   t        | dd  dgt        | dd        dk(           fS r2  r,  r.  s    r7   r   z(DRS._order_ref_strings.<locals>.<lambda>   s0    adC12C!"JRSO8T4U-Vr6   )r   rs   r   r   sorted)	rM   ro   r   stringsind_vars	func_vars
event_vars
other_varsr   s	            r7   r  zDRS._order_ref_strings  s    )-.#4#:.	

A|"A  #Q!!!$!!!$  :Z%PQRY$WXY X#VWX	
 /s   Cc                    t        |t              rt        | j                        t        |j                        k(  r|}t	        | j                  |j                        D ])  \  }}| j                  |      }|j                  ||d      }+ | j                  |j                  k(  r[t        | j                        t        |j                        k(  r0t	        | j                  |j                        D ]  \  }}||k(  r y yy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  ro   ziprx   r   r   rp   )rM   r   converted_otherr1r2varexc1c2s           r7   __eq__z
DRS.__eq__  s     eS!499~UZZ0"'!$))_-A-ABFB 88<E&5&=&=b%&NO C ??o&@&@@SJJF../F0 #&djj/2G2G"HB "b#( #I  r6   c                     | |k(   S rS   r5   r   s     r7   __ne__z
DRS.__ne__      5=  r6   c                 h   dj                  dj                  | j                  | j                              dj                  d | j                  D                    }| j
                  rKt        j                  |z   dz   t        j                  z   dz   d| j
                  z  z   t        j                  z   S |S )Nz([{}],[{}]),, c              3   &   K   | ]	  }d |z    ywr*  Nr5   )r  r   s     r7   r  zDRS.__str__.<locals>.<genexpr>  s     9jddTkj   r  r*  )
formatr   r  ro   rp   r   r#   rY   r#  rn   rM   r{   s     r7   __str__zDRS.__str__  s    ""HHT,,TYY78II9djj99
 ?? --  	
 () //" 
r6   rS   FTr   )r*   r+   r,   r   rD   r   r   r   r  r   r   r   r   r  rC  rE  r   __hash__rO  r5   r6   r7   r$   r$   -  sV    /%<|+
!R
"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)rz   s    r7   r   r   ,  sT    
 .x88	HMM	",X66	X]]	#)(33$X..r6   c                   &    e Zd Zd ZddZd Zd Zy)r   c                     | S rS   r5   rP   s    r7   r   z!DrtAbstractVariableExpression.fol<      r6   c                     g S r   r5   r   s     r7   r   z&DrtAbstractVariableExpression.get_refs?  s    	r6   c                 4    d| z  }dt        |      z  }||||gS Nr*  r  r  rM   r   blanks      r7   r   z%DrtAbstractVariableExpression._prettyC  s'    4Kc!fua''r6   c                     | S rS   r5   rP   s    r7   r   z0DrtAbstractVariableExpression.eliminate_equalityH  rX  r6   Nr   )r*   r+   r,   r   r   r   r   r5   r6   r7   r   r   ;  s    (
r6   r   c                       e Zd Zy)r   Nr*   r+   r,   r5   r6   r7   r   r   L       	r6   r   c                       e Zd Zy)rS  Nrb  r5   r6   r7   rS  rS  R  rc  r6   rS  c                       e Zd Zy)rT  Nrb  r5   r6   r7   rT  rT  X  rc  r6   rT  c                       e Zd Zy)rU  Nrb  r5   r6   r7   rU  rU  ^      r6   rU  c                   j    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y)ry   c                      || _         || _        y rS   rz   r{   )rM   rz   r{   s      r7   rD   zDrtProposition.__init__c  s     r6   c           	         | j                   |k(  rIt        |t              sJ d       t        |j                   | j                  j                  ||||            S t        | j                   | j                  j                  ||||            S )Nz4Can only replace a proposition label with a variable)rz   r   r   ry   r{   r   )rM   rz   rg   r   r   s        r7   r   zDrtProposition.replaceg  s    ==H$9 FEF  "##  :}mT 
 "  :}mT r6   c                 ^    t        | j                  | j                  j                               S rS   )ry   rz   r{   r   rP   s    r7   r   z!DrtProposition.eliminate_equalityv  s     dmmTXX-H-H-JKKr6   c                 @    |r| j                   j                  d      S g S NT)r{   r   r   s     r7   r   zDrtProposition.get_refsy  s    *3txx  &;;r6   c                     | j                   |j                   k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rS   )r   rz   r{   r   s     r7   rC  zDrtProposition.__eq__|  sA    NNeoo- &/&EII%	
r6   c                     | |k(   S rS   r5   r   s     r7   rE  zDrtProposition.__ne__  rF  r6   c                 6    | j                   j                         S rS   )r{   r   rP   s    r7   r   zDrtProposition.fol  s    xx||~r6   c                 >   | j                   j                         }dt        d| j                  z        z  }|d d D cg c]
  }|dz   |z    c}|dd D cg c]  }d| j                  z  dz   |z    c}z   |dd  D cg c]
  }|dz   |z    c}z   S c c}w c c}w c c}w )Nr  r*  r;   r<   r)   )r{   r   r  rz   )rM   drs_sr_  r(  s       r7   r   zDrtProposition._pretty  s      "c$.//,1"1I6IDUS[4I6=B1QZHZTtdmm#c)D0ZHI.3ABi8idus{T!i89	
6H8s   BB<Bc                 4     | || j                         g      S r	  )r{   rM   r   r  s      r7   r  zDrtProposition.visit  s    8DHH-.//r6   c                 H     || j                    || j                              S )r  rj  ru  s      r7   r   zDrtProposition.visit_structured  s    $--$(();<<r6   c                 <    d| j                    d| j                   dS )Nzprop(rI  )rj  rP   s    r7   rO  zDrtProposition.__str__  s    t}}oRz33r6   NrP  r   )r*   r+   r,   rD   r   r   r   rC  rE  r   rQ  r   r   r  r   rO  r5   r6   r7   ry   ry   b  sG    L<
! ""H
0=4r6   ry   c                        e Zd Zd ZddZd Zy)rf   c                 H    t        | j                  j                               S rS   )r   r   r   rP   s    r7   r   zDrtNegatedExpression.fol  s     11r6   c                 8    | j                   j                  |      S rZ  )r   r   r   s     r7   r   zDrtNegatedExpression.get_refs  s    yy!!),,r6   c                    | j                   j                         }|d d D cg c]  }d|z   	 c}|dd D cg c]  }d|z   	 c}z   |dd D cg c]  }d|z   	 c}z   |dd  D cg c]  }d|z   	 c}z   S c c}w c c}w c c}w c c}w )Nr<       r=   z__  r>   z  | )r   r   )rM   
term_linesr(  s      r7   r   zDrtNegatedExpression._pretty  s    YY&&(
'1"1~6~tVd]~6)3Aa9v}9:)3Aa9v}9: *4AB8v}89	
6998s   A6A;B %BNr   r*   r+   r,   r   r   r   r5   r6   r7   rf   rf     s    2-
r6   rf   c                   &    e Zd Zd Zd Zd ZddZy)r   c           	          | j                  || j                  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   rz   r   )rM   r   s     r7   r   z!DrtLambdaExpression.alpha_convert  s8    
 ~~IIdmm-B6-JDQ
 	
r6   c                 ^    t        | j                  | j                  j                               S rS   )r   rz   r   r   rP   s    r7   r   zDrtLambdaExpression.fol  s    tyy}}??r6   c                 l   | j                   g}| j                  }|j                  | j                  k(  rA|j                  |j                          |j                  }|j                  | j                  k(  rAdj	                  d |D              t
        j                  z   }|j                         }dt        |      z  }|d d D cg c]
  }d|z   |z    c}|dd D cg c]
  }d|z   |z    c}z   |dd D cg c]
  }d|z   |z    c}z   |dd  D cg c]
  }d|z   |z    c}z   S c c}w c c}w c c}w c c}w )	Nr  c              3   &   K   | ]	  }d |z    ywrK  r5   )r  r/  s     r7   r  z.DrtLambdaExpression._pretty.<locals>.<genexpr>  s     :	1dQh	rL  r;   r}  r<   z \  r=   z /\ )	rz   r   r   rs   r   r#   DOTr   r  )rM   r   r   
var_stringr~  r_  r(  s          r7   r   zDrtLambdaExpression._pretty  s5   ]]O	yynn.T]]+99D nn. XX:	::Y]]J
\\^
c*o%/9"1~>~tVe^d"~>2<Qq/B/$w%/BC7A!AGtw#d*GH 2<AB@v~$@A	
>BG@s   D"D'4D,D1c                 r    |r)| j                   g| j                  j                  d      z   S | j                   gS r   T)rz   r   r   r   s     r7   r   zDrtLambdaExpression.get_refs  s7     ;DT]]Odii0066	
JN--	
r6   Nr   )r*   r+   r,   r   r   r   r   r5   r6   r7   r   r     s    
@
 
r6   r   c                   0    e Zd ZddZd Zed        Zd Zy)r!  c                 x    |r7| j                   j                  d      | j                  j                  d      z   S g S r  )r   r   r   r   s     r7   r   zDrtBinaryExpression.get_refs  s;     GPDJJ%(<(<T(BB	
UW	
r6   c                     t         j                  | j                  | j                        | j	                         | j                  | j
                              S rS   )r!  r"  _pretty_subexr   getOpr   rP   s    r7   r   zDrtBinaryExpression._pretty  sB    "33tzz*JJLt{{+
 	
r6   c                    t        t        |       t        |            }t        | |      } t        ||      }dt        |      z  }t        t	        | |            }|d d D cg c]  \  }}d|z   dz   |z   dz   |z   dz    c}}|dd D cg c]  \  }}d|z   dz   |z   dz   |z   dz    c}}z   |dd  D cg c]  \  }}d|z   dz   |z   dz   |z   dz    c}}z   S c c}}w c c}}w c c}}w )Nr  r<   r=   (rx  )r  r  _pad_verticallyr  r<  )first_linesopsecond_lines	max_linesr_  first_second_lines
first_linesecond_lines           r7   r"  z$DrtBinaryExpression._assemble_pretty  sE   K(#l*;<	%k9=&|Y?c"g!#k<"@A 0B"1/E/E+J j 3&.4{BSH/E 0B!A/F/F+J j 3&+c1K?#E/F	 0B!"/E/E+J j 3&.4{BSH/E	
s   "CC 6C&c                 "    |j                         S rS   )r   )rM   subexs     r7   r  z!DrtBinaryExpression._pretty_subex  s    }}r6   Nr   )r*   r+   r,   r   r   staticmethodr"  r  r5   r6   r7   r!  r!    s%    

 
 
*r6   r!  c                       e Zd Zy)DrtBooleanExpressionNrb  r5   r6   r7   r  r    rg  r6   r  c                       e Zd Zd Zd Zy)r   c                 z    t        | j                  j                         | j                  j                               S rS   )r   r   r   r   rP   s    r7   r   zDrtOrExpression.fol  s%    DJJNN,dkkoo.?@@r6   c                     t        |t              r!|j                         D cg c]  }|dd 	 c}S t        j	                  | |      S c c}w Nr;   r  )r   r   r   r  r  rM   r  r(  s      r7   r  zDrtOrExpression._pretty_subex  sE    e_-+0==?;?4D2J?;;#11$>> <   AN)r*   r+   r,   r   r  r5   r6   r7   r   r     s    A?r6   r   c                       e Zd Zd Zy)r~   c                 z    t        | j                  j                         | j                  j                               S rS   )r   r   r   r   rP   s    r7   r   zDrtEqualityExpression.fol  s%    !$**.."2DKKOO4EFFr6   N)r*   r+   r,   r   r5   r6   r7   r~   r~     s    Gr6   r~   c                       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y)r   zDRS of the form '(DRS + DRS)'Nc                 @    t         j                  | ||       || _        y rS   )r  rD   r   )rM   r   r   r   s       r7   rD   zDrtConcatenation.__init__  s    %%dE6:$r6   c                    | j                   }| j                  }| j                  }|| j                         v rB|r|j	                  ||||      }|j	                  ||||      }|r|j	                  ||||      }n|rt        | j                  d            |j                         z  D ]U  }t        t        |            }	|j	                  ||	d|      }|j	                  ||	d|      }|sB|j	                  ||	d|      }W |j	                  ||||      }|j	                  ||||      }|r|j	                  ||||      }| j                  |||      S )r   T)
r   r   r   r   r   r   r   r   r   r   )
rM   rz   rg   r   r   r   r   r   r   r/  s
             r7   r   zDrtConcatenation.replace  sU    

__
 t}}&j-  j- !+!3!3 *m]"J t}}T23joo6GGC-oc.BCA!MM#q$FE#^^CD-HF!%/%7%7Qm%T
 H MM(J}UE^^Hj-WF'//j-
 ~~eVZ88r6   c                 f    | j                         }t        |t              rJ |j                         S rS   )r   r   r   r   rN  s     r7   r   z#DrtConcatenation.eliminate_equality@  s-    mmoc#3444%%''r6   c                 X   | j                   j                         }| j                  j                         }| j                  r| j                  j                         nd }t	        |t
              rt	        |t
              rt        |j                  d            t        |j                  d            z  D ])  }t        t        |            }|j                  ||d      }+ t        |j                  |j                  z   |j                  |j                  z   |      S | j                  |||      S rn  )r   r   r   r   r   r$   r   r   r   r   r   ro   rp   r   )rM   r   r   r   r   r   s         r7   r   zDrtConcatenation.simplifyF  s    

##%%%'37??T__--/
eS!j&=5>>$/03vt7L3MM.s/CDVT: N
 uzzFKK/v||1KZXX>>%<<r6   c                     | j                   j                  |      | j                  j                  |      z   }| j                  r,|r*|j	                  | j                  j                  d             |S r  )r   r   r   r   r  )rM   r   ro   s      r7   r   zDrtConcatenation.get_refsV  sS    zz""9-0D0DY0OO??yKK0067r6   c                 "    t         j                  S rS   )r#   r-   rP   s    r7   r  zDrtConcatenation.getOp]  s    !!!r6   c                    t        |t              r| j                         }|j                         }t        |      t        |      k(  r|}t	        ||      D ])  \  }}| j                  |      }|j                  ||d      }+ | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S yr;  )
r   r   r   r  r<  rx   r   r   r   r   )rM   r   	self_refs
other_refsr=  r>  r?  r@  s           r7   rC  zDrtConcatenation.__eq__`  s     e-.I)J9~Z0"'!)Z8FB 88<E&5&=&=b%&NO 9 JJ/"7"77 F'='==F?+E+EE
 r6   c                     | |k(   S rS   r5   r   s     r7   rE  zDrtConcatenation.__ne__r  rF  r6   c                     t        | j                  j                         | j                  j                               }| j                  r$t        || j                  j                               }|S rS   )r   r   r   r   r   r   )rM   r   s     r7   r   zDrtConcatenation.folw  sI    $**..*DKKOO,=>??a!4!4!67Ar6   c                 F   t         j                  | j                  | j                        | j	                         | j                  | j
                              }| j                  r=t         j                  |t        j                  | j                  j                               }|S rS   )
r!  r"  r  r   r  r   r   r#   r#  r   rN  s     r7   r   zDrtConcatenation._pretty}  sw    !22tzz*JJLt{{+

 ??%66Y]]DOO$;$;$=C 
r6   c                     t        |t              r!|j                         D cg c]  }|dd 	 c}S t        j	                  | |      S c c}w r  )r   r   r   r  r  r  s      r7   r  zDrtConcatenation._pretty_subex  sF    e-.+0==?;?4D2J?;;#11$>> <r  c                     | j                   r; | || j                         || j                         || j                         g      S  | || j                         || j                        g      S r	  )r   r   r   ru  s      r7   r  zDrtConcatenation.visit  s_    ??$**%x'<ht>WX  x

3Xdkk5JKLLr6   c                    | j                  | j                        }| j                  | j                        }t        j                  |z   dz   | j                         z   dz   |z   t        j                  z   }| j                  rKt        j                  |z   dz   t        j                  z   dz   d| j                  z  z   t        j                  z   S |S )Nr  r*  )

_str_subexr   r   r   rY   r  rn   r   r#   r#  )rM   r   r   r{   s       r7   rO  zDrtConcatenation.__str__  s    

+-kkE!C'$**,6<vET?? --  	
 () //" 
r6   c                 R    d|z  }t        |t              r|j                  |dd S |S )Nr*  r;   r  )r   r   r   )rM   r  r   s      r7   r  zDrtConcatenation._str_subex  s1    5Le-.53C3C3KQr7Nr6   rS   rP  r   )r*   r+   r,   r   rD   r   r   r   r   r  rC  rE  r  rQ  r   r   r  r  rO  r  r5   r6   r7   r   r     sZ    '%%9N(= "$! $,,H
?
M r6   r   c                        e Zd Zd ZddZd Zy)r   c                 z    t        | j                  j                         | j                  j                               S rS   )r	   r   r   r   rP   s    r7   r   zDrtApplicationExpression.fol  s)    $T]]%6%6%8$--:K:K:MNNr6   c                 x    |r7| j                   j                  d      | j                  j                  d      z   S g S r  )r   r   r   r   s     r7   r   z!DrtApplicationExpression.get_refs  s>      MM""4(4==+A+A$+GG	
 	
r6   c           
         | j                         \  }}|j                         }|D cg c]  }|j                          }}t        t        t        |g|z               }t        ||      }|D cg c]  }t        ||       }}t        t        |t        t        |                   }|d d D 	
cg c]  \  }	}
|	dz   dj                  |
      z   dz   ! c}
}	|dd D 	
cg c]  \  }	}
|	dz   dj                  |
      z   dz   ! c}
}	z   |dd  D 	
cg c]  \  }	}
|	dz   dj                  |
      z   dz   ! c}
}	z   S c c}w c c}w c c}
}	w c c}
}	w c c}
}	w )Nr<   r  r=   r  rH  rx  )	uncurryr   r  r
  r  r  r  r<  r   )rM   r   argsfunction_linesarg
args_linesr  	arg_linesfunc_args_lines	func_line	args_lines              r7   r   z DrtApplicationExpression._pretty  s}   $!))+/34tckkmt
4C.!1J!>?@	(CMWXZ	oi;Z
Xs>4Z8H3IJK -<BQ,?,?(Iy C#((9"55;,? -<Aa,@,@(Iy C#((9"55;,@	 -<AB,?,?(Iy C#((9"55;,?	
 5 Ys   D9.D>/$E$E	$ENr   r  r5   r6   r7   r   r     s    O

r6   r   c                 N    dt        | d         z  g}| ||t        |       z
  z  z   S )Nr  r   r]  )linesr  pad_lines      r7   r  r    s0    c%(m#$H8y3u:5666r6   c                   &    e Zd Zd ZddZd Zd Zy)PossibleAntecedentsc                     t        |       S )zSet of free variables.)r   rP   s    r7   r   zPossibleAntecedents.free  s    4yr6   c                 x    t               }| D ]*  }||k(  r| j                  |       | j                  |       , |S )r   )r  rs   )rM   rz   rg   r   r   resultitems          r7   r   zPossibleAntecedents.replace  s=     %&DxJ'D!	 
 r6   c                 2    d| z  }dt        |      z  }|||gS r\  r]  r^  s      r7   r   zPossibleAntecedents._pretty  s%    4Kc!fua  r6   c                 >    ddj                  d | D              z   dz   S )Nr'   rH  c              3   &   K   | ]	  }d |z    ywrK  r5   )r  its     r7   r  z.PossibleAntecedents.__str__.<locals>.<genexpr>  s     7$BdRi$rL  r(   )r   rP   s    r7   rO  zPossibleAntecedents.__str__  s!    SXX7$777#==r6   NrP  )r*   r+   r,   r   r   r   rO  r5   r6   r7   r  r    s    	!
>r6   r  c                       e Zd Zy)AnaphoraResolutionExceptionNrb  r5   r6   r7   r  r    rg  r6   r  c                    t        | t              r| j                         rt               }|D ]m  }|j	                         D ]X  }| j                  |      }|j                  | j                  j                  k(  s8|| j                  k(  rH|j                  |       Z o t        |      dk(  r|d   }n|}| j                  | j                  |      S t        | j                  || gz         }t        | j                  || gz         }| j                  ||      S t        | t              rg }	| j                  D ]  }
t        |
|| gz         }t        |t              r|t        |j                   t              r$|j                   }|j"                  |_        ||_        t        |j"                  t              r$|j"                  st%        d|j                   z        |	j                  |        | j&                  rt        | j&                  || gz         }nd }| j                  | j(                  |	|      S t        | t*              r| S t        | t,              r)| j                  t        | j.                  || gz               S t        | t0              rl| j&                  rt        | j&                  || gz         }nd }| j                  t        | j                   || gz         t        | j"                  || gz         |      S t        | t2              rB| j                  t        | j                   || gz         t        | j"                  || gz               S t        | t4              r4| j                  | j6                  t        | j.                  || gz               S y )Nr;   r   z+Variable '%s' does not resolve to anything.)r   r	   r   r  r   rx   r   r   rs   r  r   r   r   r$   rp   r   r   r   r  r   ro   r   r   r   r   r
   r   rz   )rg   trailpossible_antecedentsancestorr   refex
resolution
r_function
r_argumentr_condsr   r_condtempr   s                 r7   r   r     s=   *34))+#6#8 !#,,.C&>>sCE
 **=*=*G*GG!4!44,33E: / " '(A-1!4
1
55j6I6I:VV)**=*=u
|?STJ)**=*=u
|?STJ''
J??	J	$$$D%dEZL,@AF &"45fll,?@!<<D#)==FL$(FMfmm-@A!==935;\\B 
 NN6"# %$   )**?*?*AUVJJ##JOOWjII	J :	;	J 1	2##Z__ezl.BC
 	
 
J 0	1  )**?*?*AUVJJ##Z--u
|/CDZ..0DE
 	
 
J 0	1##Z--u
|/CDZ..0DE
 	

 
J 0	1##!1*//5J<CW!X
 	
 
2r6   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y)r   r=   
   r@   Nc                    d}|st               }|j                  d       t        dd      }|r}t        |dd      }||_        || _        | j                  || j                  | j                        \  }}t        || j                  z   d      }|| j                  z   }	t        |||	      }nt        |d	d	      }|j                          ||_        || _        || _        || _        y)
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)
rM   r{   size_canvasr  r  r  rightbottomr  r  s
             r7   rD   zDrsDrawer.__init__L  s     TFLL{4Da:"$"&++c4??DMM"REDOO3S9$//1eFCc#>KKMFKr6   c                 L    | j                   j                  j                  d      S )z Get the height of a line of text	linespace)r  r  metricsrP   s    r7   _get_text_heightzDrsDrawer._get_text_heightl  s    {{''44r6   c                     | j                  | j                  | j                  ||       | j                  r%t	               s| j                  j                          y| j                  | j                  ||      S )zDraw the DRSN)_handler{   _draw_commandr  r!   mainloopr  )rM   rN   ys      r7   r   zDrsDrawer.drawp  sP    TXXt111a8;;wyKK  ";;txxA..r6   c                 >    | j                  || 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
        )r  _visit_command)rM   rg   rN   r  s       r7   r  zDrsDrawer._visity  s     ||J(;(;QBBr6   c                    t        |t              r5| j                  j                  ||d| j                  j                  |       ntt        |t
              rd|\  }}| j                  j                  ||||       || j                         z   | j                  dz  z   }| j                  j                  ||||       | 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  textr<   )r   strr  create_textr  tuplecreate_rectangler  BUFFERcreate_liner  )rM   r  rN   r  r  r  horiz_line_ys          r7   r  zDrsDrawer._draw_command  s     dC KK##AqDKK<L<LSW#Xe$"OUFKK((Auf=D))++t{{Q?  KK##A|ULI""4A..r6   c                     t        |t              r;|| j                  j                  j	                  |      z   || j                         z   fS t        |t              r|S y)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  )rM   r  rN   r  s       r7   r  zDrsDrawer._visit_command  sU     dC ((0066D<Q<Q<S8STTe$K %r6   c                    || j                   k(  r#	 |j                  |z   }|j                  |z   }||fS t	        |t
              r| j                  }nt	        |t              r| j                  }nt	        |t              r| j                  }nt	        |t              r| j                  }nt	        |t              r| j                  }nvt	        |t              r| j                   }nYt	        |t"              r| j                  }n<t	        |t$              r| j&                  }nt)        |j*                  j,                         |||||      \  }}||z
  |_        ||z
  |_        ||fS # t        $ r Y 9w xY w)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
        )r  _drawing_width_drawing_heightr   r   r   _handle_VariableExpressionr$   _handle_DRSrf   _handle_NegatedExpressionr   _handle_LambdaExpressionr
   _handle_BinaryExpressionr   _handle_ApplicationExpressionr  ry   _handle_DrtPropositionr   r   r*   )rM   rg   commandrN   r  r  r  r   s           r7   r  zDrsDrawer._handle  sT    d)))"11A5#33a7v&
 j"?@55G
C(&&G
$8944G
$7833G
$4533G
$<=88G
$7855G
N311GJ0099::!*gq!< %*AI
!%+aZ
"v; " s   !E   	E-,E-c                      |d|z  ||      S )Nr*  r5   )rM   rg   r  rN   r  s        r7   r  z$DrsDrawer._handle_VariableExpression  s    tj(!Q//r6   c           
         | j                  t        j                  ||      d   }| j                  |j                  |||      \  }} |t        j                  || j                  |||z
  | j                                      ||fS rj   )r  r#   NOTr  r   _get_centered_topr  rM   rg   r  rN   r  r  r  s          r7   r  z#DrsDrawer._handle_NegatedExpression  s|    ##IMM1a8; ,,zJ 	MM""1fqj$2G2G2IJ	
 vr6   c                    || j                   z   }|| j                   z   }|j                  r#dj                  d |j                  D              }nd} ||||      \  }}|| j                   dz  z  }|j                  rD|j                  D ]4  }	| j	                  |	|||      \  }
}t        ||
      }|| j                   z  }6 n || j                         | j                   z   z  }|| j                   z  } |||f||      S )Nr  c              3   &   K   | ]	  }d |z    ywrK  r5   )r  rs     r7   r  z(DrsDrawer._handle_DRS.<locals>.<genexpr>  s     >oD1HorL  z     r<   )r  ro   r   rp   r  r  r  )rM   rg   r  rN   r  leftr  ro   	max_rightr   r  s              r7   r  zDrsDrawer._handle_DRS  s    4;;T[[ ??88>joo>>DD%dD&9F$++/! "(("&,,tWdF"K	51	$++% )
 d++-;;F 	T[[ 		6*Aq11r6   c                 (   |j                         \  }}t        |t              s|j                  }|j                  g}| j                  |||      d   }t        |g|D cg c]  }| j                  |||      d    c}z         }	|	|z
  }
| j                  ||
|j                        }| j                  ||||      d   }| j                  ||
| j                               } |t        j                  ||      d   }t        |      D ]i  \  }}| j                  ||
|j                        }| j                  ||||      d   }|dz   t        |      k  sL |t        j                  dz   ||      d   }k  |t        j                   ||      d   }||	fS c c}w )Nr;   r   r  )r  r   r   r   r   r  r  r  r  r  r  r#   rY   	enumerater  rl   rn   )rM   rg   r  rN   r  r   r  function_bottomr  
max_bottomline_heightfunction_drawing_topr  centred_string_topr   arg_drawing_tops                   r7   r  z'DrsDrawer._handle_ApplicationExpression  s   #++-$($AB!**H''(D ++h15a8d KdsS!Q!7!:d KK

 !1n  $55{H44 
 Xw3GHK "33{D113
 	/AB1E  oFAs"44; 3 3O LLguoFqIE1us4y 	# 5u>PQRST & 	0BCAFz""? !Ls   F
c           
      2   t         j                  d|j                  z  z   t         j                  z   }| j	                  |||      d   }| j                  |j                  |||      \  }} |||| j                  |||z
  | j                                      ||fS )Nr*  r   )	r#   LAMBDArz   r  r  r  r   r  r  )rM   rg   r  rN   r  r   r  r  s           r7   r  z"DrsDrawer._handle_LambdaExpression-  s    $$tj.A.A'AAIMMQ	##Iq!4Q7 ,,zJ 	q$00FQJ@U@U@WX	
 vr6   c           
         | j                  |j                  dd      d   }| j                  |j                  dd      d   }t        ||      }| j	                  ||| j                               } |t        j                  ||      d   }	|j                  j                  }| j                  |j                  ||	| j	                  |||            \  }	}
 |d|j                         z  |	|      d   }	|j                  j                  }| j                  |j                  ||	| j	                  |||            \  }	} |t        j                  |	|      d   }	|	t        |
|      fS )Nr   r;   z %s )r  r   r   r  r  r  r#   rY   r  r  r  rn   )rM   rg   r  rN   r  first_heightsecond_heightr%  r'  r  first_bottomsecond_bottoms               r7   r  z"DrsDrawer._handle_BinaryExpression<  sd   {{:#3#3Q:1=J$5$5q!<Q?,6 "33{D113
 	+=>qA "''77 $""1k<@	!
 !1!1!33U<NOPQR #))99!%""1k=A	"
 	0BCAFs<788r6   c                 z     ||j                   ||      d   }| j                  |j                  |||      \  }}||fS rj   )rz   r  r   r  s          r7   r  z DrsDrawer._handle_DrtPropositionb  sC    
++Q215 ,,z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.r<   r5   )rM   topfull_heightitem_heights       r7   r  zDrsDrawer._get_centered_topk  s     kK/1444r6   r  )r   r   )r*   r+   r,   r  r  r  rD   r  r   r  r  r  r  r  r  r  r  r  r  r  r  r5   r6   r7   r   r   G  sh    FHJ@5  8 /	C/,,\0 22)#V$9L5r6   r   c                     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      j                                t        d        | d      }t        |       |j	                  t        d            }t        |       t        ||k(         t        d       t        t         | d                   t        t         | d                   t        t         | d                   t        d        | d      j                           | d      j                           | d      j                           | d      j                           | d      j                          y )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   demor?  r  s   	
,-$$E	%&
'(	%+
,-	%)
*+	%+
,-	%7
89	%6
78	%/
01	%3
45	%=
>?	
,-	%&
'
+
+
-.	
VW	 	!B	"I			(3-	(B	"I	"(O	
9:	
5!PQ
RS	UVW 

5!@A
BC	
56	*""$	Kln	
45BBD	
ABOOQ	
=>KKMr6   c                      	 ddl m}  g d}|D ]'  }t        j                  |      }|j                          ) y # t        $ r}t        d      d }~ww xY w)Nr   )r   z,tkinter is required, but it's not available.)rN   r;  z([x],[])z([x],[man(x)])r6  r7  z\x.([],[man(x), walks(x)])z\x y.([],[sees(x,y)])z)([],[(([],[walks(x)]) + ([],[runs(x)]))])r8  r9  )tkinterr   ImportError
ValueErrorr   r   r   )r   r   expressionsds       r7   	test_drawrF    sW    IK $$Q'	 #  IGHHIs   9 	AAA__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   rA  r   r   tkinter.fontr    	nltk.utilr!   rB  r#   r9   r   r$   r   r   r   rS  rT  rU  ry   rf   r   r!  r  r   r~   r   r   r  r  r  r   r  r   r   r?  rF  r*   r5   r6   r7   <module>rM     s           :	"!!+ +4 4Dd dN|- |~/M3M "	!#?		!#=		#%<		9;M 	;4]J ;4|
=*; 
$"
-)9 "
J%-)9 %P	.0A 	?*L ?G/1C G
Y+ Yx!
}.C !
H7
>$z >2	) 	 (* P
fh5 h5V	%NP2 zF G,  		s   E0 0E98E9