
    /h                        S SK r S SKJr  S SKJr  S SKJrJrJrJ	r	J
r
JrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJr   S SKJ r J!r!  S SK"J#r#  S SK$J%r%   " S S	\5      r' " S
 S\5      r( " S S5      r) " S S\)\5      r*S r+ " S S\)\5      r, " S S\,\5      r- " S S\,\5      r. " S S\-\5      r/ " S S\,\5      r0 " S S\)\5      r1 " S S\)\5      r2 " S S \)\5      r3 " S! S"\)\5      r4 " S# S$\4\5      r5 " S% S&\5\5      r6 " S' S(\4\5      r7 " S) S*\55      r8 " S+ S,\)\
5      r9S- r: " S. S/\;\)\5      r< " S0 S1\=5      r>/ 4S2 jr? " S3 S45      r@S5 rAS6 rB\CS7:X  a  \A" 5         gg! \& a     GNf = f)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                   |    \ rS rSrSrSrSrSrSrSr	\\\\	/r
\R                  \
-   r\R                  \/-   \
-   rSrg	)
	DrtTokens5   DRS+PRO[]: N)__name__
__module____qualname____firstlineno__r%   DRS_CONCPRONOUNOPEN_BRACKETCLOSE_BRACKETCOLONPUNCTr   SYMBOLSTOKENS__static_attributes__r+       D/var/www/auris/envauris/lib/python3.13/site-packages/nltk/sem/drt.pyr#   r#   5   sQ    
CHGLME|]E:Ennu$G]]cU"U*Fr9   r#   c                   r    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rSrg)	DrtParserD   z$A lambda calculus expression parser.c                 h   [         R                  " U 5        [        [        R                   Vs/ s H  oS4PM     sn[        R
                   Vs/ s H  oS4PM     sn-   [        S4/-   [        R                  [        R                  -    Vs/ s H  oS4PM     sn-   [        R                  S4/-   [        R                  S4/-   [        R                   Vs/ s H  oS4PM     sn-   [        R                   Vs/ s H  oS4PM     sn-   S	/-   5      U l        g s  snf s  snf s  snf s  snf s  snf )
N                        )N	   )r   __init__dictr#   LAMBDA_LISTNOT_LISTr   EQ_LISTr   NEQ_LISTr4   r0   OR_LISTIMP_LISToperator_precedence)selfxs     r:   rH   DrtParser.__init__G   s&   T"#'&2232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*
;D/
c                 "    [         R                  $ )z#This method exists to be overridden)r#   r6   rQ   s    r:   get_all_symbolsDrtParser.get_all_symbolsV   s       r9   c                 (    U[         R                  ;  $ N)r#   r7   )rQ   toks     r:   
isvariableDrtParser.isvariableZ   s    )****r9   c                    U[         R                  ;   a  U R                  X5      $ U[         R                  ;   a  U R	                  X5      $ U[         R
                  :X  a[  U R                  S5      (       a4  U R                  S5      [         R                  :X  a  U R                  X5      $ U R                  X5      $ UR                  5       [         R                  :X  a0  U R                  [         R
                  5        U R                  X5      $ U R                  U5      (       a[  U R                  S5      (       a4  U R                  S5      [         R                  :X  a  U R!                  X5      $ U R#                  X5      $ g)z_This method is intended to be overridden for logics that
use different operators or expressionsr   N)r#   rK   handle_negationrJ   handle_lambdaOPENinRangetokenr2   
handle_DRShandle_openupperr%   assertNextTokenr[   r4   handle_prophandle_variable)rQ   rZ   contexts      r:   handleDrtParser.handle]   s    )$$$''55I)))%%c33INN"||A4::a=I4J4J#Js44''55YY[IMM)  0??300__S!!||A4::a=IOO#C''55++C99	 "r9   c                     [        U5      $ rY   DrtNegatedExpression)rQ   
expressions     r:   make_NegatedExpression DrtParser.make_NegatedExpressionv   s    #J//r9   c                 ,   U R                  5       nU R                  S5      (       a3  U R                  S5      [        R                  :X  a  U R                  5         U R                  U5      nU R                  [        R                  5        [        X4S 5      $ Nr   )	handle_refsra   rb   r#   COMMAhandle_condsrf   CLOSEr%   )rQ   rZ   ri   refscondss        r:   rc   DrtParser.handle_DRSy   sh    !LLOO

1 @JJL!!'*Y__-4%%r9   c                 "   U R                  [        R                  5        / nU R                  S5      (       a  U R	                  S5      [        R
                  :w  a  U(       a3  U R	                  S5      [        R                  :X  a  U R	                  5         UR                  U R                  S5      5        U R                  S5      (       a%  U R	                  S5      [        R
                  :w  a  M  U R                  [        R
                  5        U$ )Nr   
quantified)	rf   r#   r2   ra   rb   r3   ru   appendget_next_token_variable)rQ   rx   s     r:   rt   DrtParser.handle_refs   s    Y334ll1oo$**Q-93J3J"J

18

KK44\BC	 ll1oo$**Q-93J3J"J
 	Y445r9   c                 "   U R                  [        R                  5        / nU R                  S5      (       a  U R	                  S5      [        R
                  :w  a  U(       a3  U R	                  S5      [        R                  :X  a  U R	                  5         UR                  U R                  U5      5        U R                  S5      (       a%  U R	                  S5      [        R
                  :w  a  M  U R                  [        R
                  5        U$ rs   )	rf   r#   r2   ra   rb   r3   ru   r}   process_next_expression)rQ   ri   ry   s      r:   rv   DrtParser.handle_conds   s    Y334ll1oo$**Q-93J3J"JA)//9

LL55g>?	 ll1oo$**Q-93J3J"J
 	Y445r9   c                     U R                  U5      nU R                  S5        U R                  [        R                  5      n[        X45      $ )Nr*   )make_VariableExpressionrf   r   r#   r4   DrtProposition)rQ   rZ   ri   variabledrss        r:   rg   DrtParser.handle_prop   s?    //4S!**9??;h,,r9   c                     [        X5      $ )zdThis method serves as a hook for other logic parsers that
have different equality expression classesDrtEqualityExpressionrQ   firstseconds      r:   make_EqualityExpression!DrtParser.make_EqualityExpression   s     %U33r9   c                     U[         R                  :X  a  S $ U[         R                  ;   a  [        $ U[         R                  ;   a  S nU$ g)zZThis method serves as a hook for other logic parsers that
have different boolean operatorsc                     [        XS 5      $ rY   DrtConcatenationr   r   s     r:   <lambda>9DrtParser.get_BooleanExpression_factory.<locals>.<lambda>   s    )9%)Nr9   c                     [        U [        5      (       a!  [        U R                  U R                  U5      $ [        U [        5      (       a!  [	        U R
                  U R                  U5      $ [        S5      eNz'Antecedent of implication must be a DRS)
isinstancer%   rx   ry   r   r   r   	Exceptionr   s     r:   make_imp_expressionDDrtParser.get_BooleanExpression_factory.<locals>.make_imp_expression   sW    eS))uzz5;;??e%566+EKKvNN IJJr9   N)r#   r0   rN   DrtOrExpressionrO   )rQ   rZ   r   s      r:   get_BooleanExpression_factory'DrtParser.get_BooleanExpression_factory   sK     )$$$NNI%%%""I&&&K '&r9   c                     U" X#5      $ rY   r+   )rQ   factoryr   r   s       r:   make_BooleanExpression DrtParser.make_BooleanExpression   s    u%%r9   c                     [        X5      $ rY   DrtApplicationExpression)rQ   functionarguments      r:   make_ApplicationExpression$DrtParser.make_ApplicationExpression   s    ';;r9   c                 *    [        [        U5      5      $ rY   )DrtVariableExpressionr   )rQ   names     r:   r   !DrtParser.make_VariableExpression   s    $Xd^44r9   c                     [        X5      $ rY   )DrtLambdaExpression)rQ   	variablesterms      r:   make_LambdaExpressionDrtParser.make_LambdaExpression   s    "933r9   )rP   N)r,   r-   r.   r/   __doc__rH   rV   r[   rj   rp   rc   rt   rv   rg   r   r   r   r   r   r   r8   r+   r9   r:   r<   r<   D   sP    .
!+:20	&		-4
(&<54r9   r<   c                       \ rS rSrSr\" 5       r\S 5       rS r	S r
S rS rS rSS
 jr\S 5       rSS jrS rSS jrS rS rS rS rS rS rS rS rSrg	)DrtExpression   zS
This is the base abstract DRT Expression from which every DRT
Expression extends.
c                 8    U R                   R                  U5      $ rY   )_drt_parserparse)clsss     r:   
fromstringDrtExpression.fromstring   s    $$Q''r9   c                     [        X5      $ rY   r   rQ   others     r:   applytoDrtExpression.applyto   s    '44r9   c                     [        U 5      $ rY   rm   rU   s    r:   __neg__DrtExpression.__neg__   s    #D))r9   c                     [         $ rY   )NotImplementedr   s     r:   __and__DrtExpression.__and__   s    r9   c                 F    [        U[        5      (       d   e[        X5      $ rY   )r   r   r   r   s     r:   __or__DrtExpression.__or__   s     %////t++r9   c                    [        U[        5      (       d   e[        U [        5      (       a!  [        U R                  U R                  U5      $ [        U [
        5      (       a!  [        U R                  U R                  U5      $ [        S5      er   )	r   r   r%   rx   ry   r   r   r   r   r   s     r:   __gt__DrtExpression.__gt__   sj    %////dC  tyy$**e44d,--#DJJUCCABBr9   Nc                     [        U[        5      (       d   eU R                  5       R                  5       nUR                  5       R                  5       nUR	                  XB5      $ )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)rQ   r   proverf1f2s        r:   r   DrtExpression.equiv   sO     %////]]_  "^^!!#xx##r9   c                 F    [        SU R                  R                  -  5      e)Nz#'%s' object has no attribute 'type')AttributeError	__class__r,   rU   s    r:   typeDrtExpression.type   s!    1DNN4K4KK
 	
r9   c                     [        5       erY   NotImplementedError)rQ   	signatures     r:   	typecheckDrtExpression.typecheck   s    !##r9   c                     [        XS 5      $ rY   r   r   s     r:   __add__DrtExpression.__add__   s    T22r9   c                     [        5       e)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   rQ   	recursives     r:   get_refsDrtExpression.get_refs  s     "##r9   c                    [        U [        5      =(       as    [        U R                  [        5      =(       aR    U R                  R                  R
                  [        R                  :H  =(       a    [        U R                  [        5      $ )zIs self of the form "PRO(x)"?)
r   r   r   DrtAbstractVariableExpressionr   r   r#   r1   r   DrtIndividualVariableExpressionrU   s    r:   is_pronoun_function!DrtExpression.is_pronoun_function
  sd     t56 K4==*GHK&&++y/@/@@K 4==*IJ		
r9   c                     [        X5      $ rY   r   r   s      r:   r   %DrtExpression.make_EqualityExpression  s    $U33r9   c                     [        U5      $ rY   )r   )rQ   r   s     r:   r   %DrtExpression.make_VariableExpression  s    $X..r9   c                     [        U 5      $ rY   )resolve_anaphorarU   s    r:   r   DrtExpression.resolve_anaphora  s    %%r9   c                 <    U R                  S U R                  5      $ )Nc                 "    U R                  5       $ rY   )eliminate_equality)es    r:   r   2DrtExpression.eliminate_equality.<locals>.<lambda>  s    q/C/C/Er9   )visit_structuredr   rU   s    r:   r    DrtExpression.eliminate_equality  s    $$%Et~~VVr9   c                 @    SR                  U R                  5       5      $ )z/
Draw the DRS
:return: the pretty print string

)join_prettyrU   s    r:   pretty_formatDrtExpression.pretty_format  s    
 yy((r9   c                 6    [        U R                  5       5        g rY   )printr  rU   s    r:   pretty_printDrtExpression.pretty_print&  s    d  "#r9   c                 6    [        U 5      R                  5         g rY   )	DrsDrawerdrawrU   s    r:   r  DrtExpression.draw)  s    $r9   r+   rY   F)r,   r-   r.   r/   r   r<   r   classmethodr   r   r   r   r   r   r   propertyr   r   r   r   r   r   r   r   r   r  r	  r  r8   r+   r9   r:   r   r      s    
 +K( (5*,C$ 
 

$3$
4/&W)$r9   r   c                       \ rS rSrSrSS jrSS jrS rSS jrS r	S	 r
S
 rS rS rS rS rS r\R$                  rS rSrg)r%   i-  z%A Discourse Representation Structure.Nc                 (    Xl         X l        X0l        g)z
:param refs: list of ``DrtIndividualVariableExpression`` for the
    discourse referents
:param conds: list of ``Expression`` for the conditions
N)rx   ry   
consequent)rQ   rx   ry   r  s       r:   rH   DRS.__init__0  s     	
$r9   c                    XR                   ;   a  U(       d  U $ U R                   R                  U5      nU R                  (       a  U R                  R                  XSU5      nOSn[	        U R                   SU UR
                  /-   U R                   US-   S -   U R                   Vs/ s H  nUR                  XSU5      PM     snU5      $ U(       a  [        U R                   5      UR                  5       -   H  n[        U5      n	[        U	5      n
U R                   R                  U5      nU R                  (       a  U R                  R                  XSU5      nOSn[	        U R                   SU U	/-   U R                   US-   S -   U R                   Vs/ s H  nUR                  XSU5      PM     snU5      n M     U R                  (       a  U R                  R                  XX45      nOSn[	        U R                   U R                   Vs/ s H  nUR                  XX45      PM     snU5      $ s  snf s  snf s  snf )WReplace all instances of variable v with expression E in self,
where v is free in self.TNr?   )rx   indexr  replacer%   r   ry   setfreer   r   )rQ   r   ro   replace_boundalpha_convertir  condrefnewvarnewvarexs              r:   r  DRS.replace:  s    yy  IIOOH-??!%!8!8 dM"J "&JIIbqMZ%8%8$99DIIa!eg<NN %)JJ$.D X4O$.    tyy>JOO,==C,S1F4V<H		,A%)__%<%<4&
 &*
		"10499QUW3EE )-

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

 * LL}T *  I, s   'H1
H6H;
c                 F   [        [        R                  U R                   Vs/ s H  oR	                  5       PM     sn[        5       5      nU R                  (       a)  UR                  U R                  R	                  5       5        U[        U R                  5      -
  $ s  snf )z:see: Expression.free())	r   operatoror_ry   r  r  r  updaterx   )rQ   c
conds_frees      r:   r  DRS.freex  sh    HLLTZZ*HZ668Z*H#%P
??doo2245C		N** +Is   B
c                    U(       az  U R                   [        [        R                  " S U R                   5       5      5      -   nU R
                  (       a*  UR                  U R
                  R                  S5      5        U$ U R                   $ )#:see: AbstractExpression.get_refs()c              3   B   #    U  H  oR                  S 5      v   M     g7fTN)r   ).0r(  s     r:   	<genexpr>DRS.get_refs.<locals>.<genexpr>  s     #IjJJt$4$4js   T)rx   listr   from_iterablery   r  extendr   )rQ   r   
conds_refss      r:   r   DRS.get_refs  sh    T###Idjj#II& J !!$//":":4"@A99r9   c                     [        [        XR                  5      5      nU R                  (       a!  UR	                  U" U R                  5      5        U" U5      $ z:see: Expression.visit())r2  mapry   r  r}   )rQ   r   
combinatorpartss       r:   visit	DRS.visit  s<    S::./??LL$//23%  r9   c           	          U R                   (       a  U" U R                   5      OSnU" U R                  [        [        XR                  5      5      U5      $ )#:see: Expression.visit_structured()N)r  rx   r2  r9  ry   )rQ   r   r:  r  s       r:   r   DRS.visit_structured  s9    26//Xdoo.t
$))T#h

*C%DjQQr9   c                    U nSnU[        UR                  5      :  GaV  UR                  U   n[        U[        5      (       Ga  [        UR                  [
        5      (       a  [        UR                  [
        5      (       a  [        [        [        UR                  5      UR                  R                  1-
  5      UR                  S U UR                  US-   S  -   UR                  5      nUR                  R                  UR                  R                  :w  a4  UR                  UR                  R                  UR                  SS5      nSnUS-  nUS-  nU[        UR                  5      :  a  GMV  / nUR                   H~  nUR                  5       nUR                  5       n[        U[        5      (       a5  UR                  (       d$  UR                  (       d  UR                  (       d  Mm  UR!                  U5        M     UR                  (       a  UR                  R                  5       OS n[        UR                  XG5      $ )Nr   r?   F)lenry   r   r   r   r   r   r%   r2  r  rx   r   r  r  r   r   r}   )rQ   r   r  r  ry   new_condnew_cond_simpr  s           r:   r   DRS.eliminate_equality  s   #cii. 99Q<D4!344tzz+EFFt{{,FGGSXX$++*>*>)??@IIbqMCIIa!eg$66NN
 ;;''4::+>+>>++dkk&:&:DJJuUCAQFA! #cii. $ IID..0H$--/M}c22 %% && +++X&  =@NNS^^668PT
388U//r9   c                    U R                   (       a  S nU R                  (       a8  [        [        U R                   Vs/ s H  o"R	                  5       PM     sn5      nU(       a$  [        XR                   R	                  5       5      nOU R                   R	                  5       nU R                  S S S2    H  n[        X15      nM     U$ U R                  (       d  [        S5      e[        [        U R                   Vs/ s H  o"R	                  5       PM     sn5      n[        [        U R                  U R                  5      S S S2   5       H  n[        X15      nM     U$ s  snf s  snf )Nz-Cannot convert DRS with no conditions to FOL.)r  ry   r   r   r   r   rx   r   r   r9  r   _order_ref_stringsr   )rQ   accumr(  r   s       r:   r   DRS.fol  s   ??Ezz}

.K
1uuw
.KL%e__-@-@-BC++-yy2%c1 ' L :: OPP=DJJ*GJq557J*GHE8T%<%<TYY%G"%MN(4 OL% /L +Hs   E
<E$
c           	         SR                  U R                  U R                  5      5      nU R                   Vs/ s H  n[	        S UR                  5       5      PM      sn VVs/ s H  nU  H  nUPM     M     nnn[        [        U5      /[        [        [        U5      5      -   5      nSSU-  -   S-   SUR                  U5      -   S-   SS	U-  -   S
-   /U Vs/ s H  nSUR                  U5      -   S-   PM     sn-   SSU-  -   S-   /-   nU R                  (       a=  [        R                  U[        R                  U R                  R                  5       5      $ U$ s  snf s  snnf s  snf )N c                 "    U R                  5       $ rY   )strip)r   s    r:   r   DRS._pretty.<locals>.<lambda>  s
    r9   z __z_ z| z |z|--z-|z|_z_|)r  rH  rx   ry   filterr  maxrB  r2  r9  ljustr  DrtBinaryExpression_assemble_prettyr#   IMP)rQ   	refs_liner  	cond_line
cond_lineslengthliner   s           r:   r  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                    U Vs/ s H  nSU-  PM
     nn/ n/ n/ n/ nU H}  n[        U5      (       a  UR                  U5        M&  [        U5      (       a  UR                  U5        MI  [        U5      (       a  UR                  U5        Ml  UR                  U5        M     [	        U5      [	        US S9-   [	        US S9-   [	        US S9-   $ s  snf )N%sc                 F    [        U SS  S/[        U SS  5      S:H     5      $ )Nr@   rG  r   intrB  vs    r:   r   (DRS._order_ref_strings.<locals>.<lambda>  s&    sAabE2;s1QR5zQ3O/Pr9   )keyc           	      P    U S   [        U SS  S/[        U SS  5      S:H     5      4$ Nr   r?   rG  ra  rc  s    r:   r   re    s0    qtS!AB%S12ZST_9U5V.Wr9   c           	      P    U S   [        U SS  S/[        U SS  5      S:H     5      4$ rh  ra  rc  s    r:   r   re     s0    adC12C!"JRSO8T4U-Vr9   )r   r}   r   r   sorted)	rQ   rx   r   stringsind_vars	func_vars
event_vars
other_varsr   s	            r:   rH  DRS._order_ref_strings  s    )-.#4#:.	

A||"A  #Q!!!$!!!$  :Z%PQRY$WXY X#VWX	
 /s   Cc                    [        U[        5      (       a  [        U R                  5      [        UR                  5      :X  a  Un[	        U R                  UR                  5       H(  u  p4U R                  U5      nUR                  XES5      nM*     U R                  UR                  :X  a]  [        U R                  5      [        UR                  5      :X  a1  [	        U R                  UR                  5       H  u  pgXg:X  a  M    g   ggzuDefines 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%   rB  rx   zipr   r  r  ry   )rQ   r   converted_otherr1r2varexc1c2s           r:   __eq__
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 "#( #I  r9   c                     X:X  + $ rY   r+   r   s     r:   __ne__
DRS.__ne__        r9   c                 r   SR                  SR                  U R                  U R                  5      5      SR                  S U R                   5       5      5      nU R
                  (       aK  [        R                  U-   S-   [        R                  -   S-   SU R
                  -  -   [        R                  -   $ U$ )Nz([{}],[{}]),, c              3   ,   #    U  H
  nS U-  v   M     g7fr_  Nr+   )r/  r  s     r:   r0  DRS.__str__.<locals>.<genexpr>  s     9jddTkj   rL  r_  )
formatr  rH  rx   ry   r  r#   r`   rW  rw   rQ   r   s     r:   __str__DRS.__str__  s    ""HHT,,TYY78II9djj99
 ?? --  	
 () //" 
r9   )ry   r  rx   rY   FTr  )r,   r-   r.   r/   r   rH   r  r  r   r<  r   r   r   r  rH  rz  r}  r   __hash__r  r8   r+   r9   r:   r%   r%   -  sV    /%<|+
!R
"0H04
,$! ""Hr9   r%   c                     [        U R                  5      (       a  [        U 5      $ [        U R                  5      (       a  [	        U 5      $ [        U R                  5      (       a  [        U 5      $ [        U 5      $ )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    r:   r   r   ,  s]    
 .x88	HMM	"	",X66	X]]	#	#)(33$X..r9   c                   0    \ rS rSrS rSS jrS rS rSrg)	r   i;  c                     U $ rY   r+   rU   s    r:   r   !DrtAbstractVariableExpression.fol<      r9   c                     / $ r,  r+   r   s     r:   r   &DrtAbstractVariableExpression.get_refs?  s    	r9   c                 0    SU -  nS[        U5      -  nX"X/$ Nr_  rL  rB  rQ   r   blanks      r:   r  %DrtAbstractVariableExpression._prettyC  s#    4Kc!fa''r9   c                     U $ rY   r+   rU   s    r:   r   0DrtAbstractVariableExpression.eliminate_equalityH  r  r9   r+   Nr  )	r,   r-   r.   r/   r   r   r  r   r8   r+   r9   r:   r   r   ;  s    (
r9   r   c                       \ rS rSrSrg)r   iL  r+   Nr,   r-   r.   r/   r8   r+   r9   r:   r   r   L       	r9   r   c                       \ rS rSrSrg)r  iR  r+   Nr  r+   r9   r:   r  r  R  r  r9   r  c                       \ rS rSrSrg)r  iX  r+   Nr  r+   r9   r:   r  r  X  r  r9   r  c                       \ rS rSrSrg)r  i^  r+   Nr  r+   r9   r:   r  r  ^      r9   r  c                   v    \ rS rSrS rSS jrS rSS jrS rS r	\
R                  rS rS	 rS
 rS rS rSrg)r   ib  c                     Xl         X l        g rY   r   r   )rQ   r   r   s      r:   rH   DrtProposition.__init__c  s     r9   c           	         U R                   U:X  aL  [        U[        5      (       d   S5       e[        UR                   U R                  R                  XX45      5      $ [        U R                   U R                  R                  XX45      5      $ )Nz4Can only replace a proposition label with a variable)r   r   r   r   r   r  )rQ   r   ro   r  r  s        r:   r  DrtProposition.replaceg  s    ==H$9  FEF  "##  }T 
 "  }T r9   c                 ^    [        U R                  U R                  R                  5       5      $ rY   )r   r   r   r   rU   s    r:   r   !DrtProposition.eliminate_equalityv  s     dmmTXX-H-H-JKKr9   c                 J    U(       a  U R                   R                  S5      $ / $ NT)r   r   r   s     r:   r   DrtProposition.get_refsy  s    *3txx  &;;r9   c                     U R                   UR                   :H  =(       a9    U R                  UR                  :H  =(       a    U R                  UR                  :H  $ rY   )r   r   r   r   s     r:   rz  DrtProposition.__eq__|  sA    NNeoo- &/&EII%	
r9   c                     X:X  + $ rY   r+   r   s     r:   r}  DrtProposition.__ne__  r  r9   c                 6    U R                   R                  5       $ rY   )r   r   rU   s    r:   r   DrtProposition.fol  s    xx||~r9   c                 L   U R                   R                  5       nS[        SU R                  -  5      -  nUS S  Vs/ s H
  o2S-   U-   PM     snUSS  Vs/ s H  nSU R                  -  S-   U-   PM     sn-   USS   Vs/ s H
  o2S-   U-   PM     sn-   $ s  snf s  snf s  snf )NrL  r_  r?   r@   r*   )r   r  rB  r   )rQ   drs_sr  r\  s       r:   r  DrtProposition._pretty  s      "c$.//,1"1I6IDS[4I6=B1QZHZTtdmm#c)D0ZHI.3ABi8ids{T!i89	
6H8s   BBB!c                 4    U" U" U R                   5      /5      $ r8  )r   rQ   r   r:  s      r:   r<  DrtProposition.visit  s    8DHH-.//r9   c                 H    U" U R                   U" U R                  5      5      $ )r?  r  r  s      r:   r   DrtProposition.visit_structured  s    $--$(();<<r9   c                 <    SU R                    SU R                   S3$ )Nzprop(r  )r  rU   s    r:   r  DrtProposition.__str__  s    t}}oRz33r9   )r   r   Nr  r  )r,   r-   r.   r/   rH   r  r   r   rz  r}  r   r  r   r  r<  r   r  r8   r+   r9   r:   r   r   b  sG    L<
! ""H
0=4r9   r   c                   *    \ rS rSrS rSS jrS rSrg)rn   i  c                 H    [        U R                  R                  5       5      $ rY   )r   r   r   rU   s    r:   r   DrtNegatedExpression.fol  s     11r9   c                 8    U R                   R                  U5      $ r  )r   r   r   s     r:   r   DrtNegatedExpression.get_refs  s    yy!!),,r9   c                 ,   U R                   R                  5       nUS S  Vs/ s H  nSU-   PM
     snUSS  Vs/ s H  nSU-   PM
     sn-   USS  Vs/ s H  nSU-   PM
     sn-   USS   Vs/ s H  nSU-   PM
     sn-   $ s  snf s  snf s  snf s  snf )Nr@       rA   z__  rB   z  | )r   r  )rQ   
term_linesr\  s      r:   r  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   BBB.Br+   Nr  r,   r-   r.   r/   r   r   r  r8   r+   r9   r:   rn   rn     s    2-
r9   rn   c                   0    \ rS rSrS rS rS rSS jrSrg)	r   i  c           	          U R                  UU R                  R                  U R                  [	        U5      S5      5      $ )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   )rQ   r!  s     r:   r  !DrtLambdaExpression.alpha_convert  s8    
 ~~IIdmm-B6-JDQ
 	
r9   c                 ^    [        U R                  U R                  R                  5       5      $ rY   )r   r   r   r   rU   s    r:   r   DrtLambdaExpression.fol  s    tyy}}??r9   c                    U R                   /nU R                  nUR                  U R                  :X  aC  UR                  UR                   5        UR                  nUR                  U R                  :X  a  MC  SR	                  S U 5       5      [
        R                  -   nUR                  5       nS[        U5      -  nUS S  Vs/ s H  nSU-   U-   PM     snUSS  Vs/ s H  nSU-   U-   PM     sn-   USS  Vs/ s H  nSU-   U-   PM     sn-   USS   Vs/ s H  nSU-   U-   PM     sn-   $ s  snf s  snf s  snf s  snf )	NrL  c              3   ,   #    U  H
  nS U-  v   M     g7fr  r+   )r/  rd  s     r:   r0  .DrtLambdaExpression._pretty.<locals>.<genexpr>  s     :	1dQh	r  r?   r  r@   z \  rA   z /\ )	r   r   r   r}   r  r#   DOTr  rB  )rQ   r   r   
var_stringr  r  r\  s          r:   r  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   D1 D6=D;E c                 |    U(       a)  U R                   /U R                  R                  S5      -   $ U R                   /$ r,  T)r   r   r   r   s     r:   r   DrtLambdaExpression.get_refs  s7     ;DT]]Odii0066	
JN--	
r9   r+   Nr  )	r,   r-   r.   r/   r  r   r  r   r8   r+   r9   r:   r   r     s    
@
 
r9   r   c                   :    \ rS rSrSS jrS r\S 5       rS rSr	g)	rU  i  c                     U(       a7  U R                   R                  S5      U R                  R                  S5      -   $ / $ r  )r   r   r   r   s     r:   r   DrtBinaryExpression.get_refs  s;     GPDJJ%(<(<T(BB	
UW	
r9   c                     [         R                  U R                  U R                  5      U R	                  5       U R                  U R
                  5      5      $ rY   )rU  rV  _pretty_subexr   getOpr   rU   s    r:   r  DrtBinaryExpression._pretty  sB    "33tzz*JJLt{{+
 	
r9   c                    [        [        U 5      [        U5      5      n[        X5      n [        X#5      nS[        U5      -  n[        [	        X5      5      nUS S  VVs/ s H  u  pgSU-   S-   U-   S-   U-   S-   PM     snnUSS  VVs/ s H  u  pgSU-   S-   U-   S-   U-   S-   PM     snn-   USS   VVs/ s H  u  pgSU-   S-   U-   S-   U-   S-   PM     snn-   $ s  snnf s  snnf s  snnf )NrL  r@   rA   (r  )rS  rB  _pad_verticallyr2  rs  )first_linesopsecond_lines	max_linesr  first_second_lines
first_linesecond_lines           r:   rV  $DrtBinaryExpression._assemble_pretty  s9   K(#l*;<	%k=&|?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#7 C)c                 "    UR                  5       $ rY   )r  )rQ   subexs     r:   r  !DrtBinaryExpression._pretty_subex  s    }}r9   r+   Nr  )
r,   r-   r.   r/   r   r  staticmethodrV  r  r8   r+   r9   r:   rU  rU    s%    

 
 
*r9   rU  c                       \ rS rSrSrg)DrtBooleanExpressioni  r+   Nr  r+   r9   r:   r  r    r  r9   r  c                        \ rS rSrS rS rSrg)r   i  c                 z    [        U R                  R                  5       U R                  R                  5       5      $ rY   )r   r   r   r   rU   s    r:   r   DrtOrExpression.fol  s%    DJJNN,dkkoo.?@@r9   c                     [        U[        5      (       a#  UR                  5        Vs/ s H  o"SS PM	     sn$ [        R	                  X5      $ s  snf Nr?   rG  )r   r   r  r  r  rQ   r  r\  s      r:   r  DrtOrExpression._pretty_subex  sD    e_--+0==?;?42J?;;#11$>> <   Ar+   N)r,   r-   r.   r/   r   r  r8   r+   r9   r:   r   r     s    A?r9   r   c                       \ rS rSrS rSrg)r   i  c                 z    [        U R                  R                  5       U R                  R                  5       5      $ rY   )r   r   r   r   rU   s    r:   r   DrtEqualityExpression.fol  s%    !$**.."2DKKOO4EFFr9   r+   N)r,   r-   r.   r/   r   r8   r+   r9   r:   r   r     s    Gr9   r   c                       \ rS rSrSrSS jrSS jrS rS rSS jr	S	 r
S
 rS r\R                  rS rS rS rS rS rS rSrg)r   i  zDRS of the form '(DRS + DRS)'Nc                 <    [         R                  XU5        X0l        g rY   )r  rH   r  )rQ   r   r   r  s       r:   rH   DrtConcatenation.__init__  s    %%d6:$r9   c                    U R                   nU R                  nU R                  nXR                  5       ;   aE  U(       a=  UR	                  XX45      nUR	                  XX45      nU(       a  UR	                  XX45      nOU(       a  [        U R                  S5      5      UR                  5       -   HY  n[        [        U5      5      n	UR	                  XSU5      nUR	                  XSU5      nU(       d  MF  UR	                  XSU5      nM[     UR	                  XX45      nUR	                  XX45      nU(       a  UR	                  XX45      nU R                  XVU5      $ )r  T)
r   r   r  r   r  r  r  r   r   r   )
rQ   r   ro   r  r  r   r   r  r   rd  s
             r:   r  DrtConcatenation.replace  s6    

__
 }}&-  - !+!3!3 m"J t}}T23joo6GGC-oc.BCA!MM#$FE#^^CD-HF!z%/%7%7m%T
 H MM(UE^^H-WF'//-
 ~~eZ88r9   c                 p    U R                  5       n[        U[        5      (       a   eUR                  5       $ rY   )r   r   r   r   r  s     r:   r   #DrtConcatenation.eliminate_equality@  s0    mmoc#34444%%''r9   c                 v   U R                   R                  5       nU R                  R                  5       nU R                  (       a  U R                  R                  5       OS n[	        U[
        5      (       a  [	        U[
        5      (       a  [        UR                  S5      5      [        UR                  S5      5      -   H)  n[        [        U5      5      nUR                  XES5      nM+     [        UR                  UR                  -   UR                  UR                  -   U5      $ U R                  XU5      $ r  )r   r   r   r  r   r%   r  r   r   r   r  rx   ry   r   )rQ   r   r   r  r   r!  s         r:   r   DrtConcatenation.simplifyF  s    

##%%%'37??T__--/
eS!!j&=&=5>>$/03vt7L3MM.s/CDT: N
 uzzFKK/v||1KZXX>>%<<r9   c                     U R                   R                  U5      U R                  R                  U5      -   nU R                  (       a1  U(       a*  UR	                  U R                  R                  S5      5        U$ r  )r   r   r   r  r4  )rQ   r   rx   s      r:   r   DrtConcatenation.get_refsV  sS    zz""9-0D0DY0OO??yKK0067r9   c                 "    [         R                  $ rY   )r#   r0   rU   s    r:   r  DrtConcatenation.getOp]  s    !!!r9   c                    [        U[        5      (       a  U R                  5       nUR                  5       n[        U5      [        U5      :X  a  Un[	        X#5       H(  u  pVU R                  U5      nUR                  XgS5      nM*     U R                  UR                  :H  =(       a9    U R                  UR                  :H  =(       a    U R                  UR                  :H  $ grr  )
r   r   r   rB  rs  r   r  r   r   r  )rQ   r   	self_refs
other_refsrt  ru  rv  rw  s           r:   rz  DrtConcatenation.__eq__`  s     e-..I)J9~Z0"'!)8FB 88<E&5&=&=b&NO 9 JJ/"7"77 F'='==F?+E+EE
 r9   c                     X:X  + $ rY   r+   r   s     r:   r}  DrtConcatenation.__ne__r  r  r9   c                     [        U R                  R                  5       U R                  R                  5       5      nU R                  (       a#  [        XR                  R                  5       5      nU$ rY   )r   r   r   r   r  r   )rQ   r   s     r:   r   DrtConcatenation.folw  sG    $**..*DKKOO,=>??a!4!4!67Ar9   c                 P   [         R                  U R                  U R                  5      U R	                  5       U R                  U R
                  5      5      nU R                  (       a=  [         R                  U[        R                  U R                  R                  5       5      nU$ rY   )
rU  rV  r  r   r  r   r  r#   rW  r  r  s     r:   r  DrtConcatenation._pretty}  sw    !22tzz*JJLt{{+

 ??%66Y]]DOO$;$;$=C 
r9   c                     [        U[        5      (       a#  UR                  5        Vs/ s H  o"SS PM	     sn$ [        R	                  X5      $ s  snf r  )r   r   r  r  r  r  s      r:   r  DrtConcatenation._pretty_subex  sE    e-..+0==?;?42J?;;#11$>> <r  c                     U R                   (       a;  U" U" U R                  5      U" U R                  5      U" U R                   5      /5      $ U" U" U R                  5      U" U R                  5      /5      $ r8  )r  r   r   r  s      r:   r<  DrtConcatenation.visit  s_    ??$**%x'<ht>WX  x

3Xdkk5JKLLr9   c                    U R                  U R                  5      nU R                  U R                  5      n[        R                  U-   S-   U R                  5       -   S-   U-   [        R                  -   nU R                  (       aK  [        R                  U-   S-   [        R                  -   S-   SU R                  -  -   [        R                  -   $ U$ )NrL  r_  )

_str_subexr   r   r   r`   r  rw   r  r#   rW  )rQ   r   r   r   s       r:   r  DrtConcatenation.__str__  s    

+-kkE!C'$**,6<vET?? --  	
 () //" 
r9   c                 ^    SU-  n[        U[        5      (       a  UR                  c  USS $ U$ )Nr_  r?   rG  )r   r   r  )rQ   r  r   s      r:   r  DrtConcatenation._str_subex  s4    5Le-..53C3C3KQr7Nr9   )r  rY   r  r  )r,   r-   r.   r/   r   rH   r  r   r   r   r  rz  r}  r  r  r   r  r  r<  r  r  r8   r+   r9   r:   r   r     sZ    '%%9N(= "$! $,,H
?
M r9   r   c                   *    \ rS rSrS rSS jrS rSrg)r   i  c                 z    [        U R                  R                  5       U R                  R                  5       5      $ rY   )r	   r   r   r   rU   s    r:   r   DrtApplicationExpression.fol  s)    $T]]%6%6%8$--:K:K:MNNr9   c                     U(       a7  U R                   R                  S5      U R                  R                  S5      -   $ / $ r  )r   r   r   r   s     r:   r   !DrtApplicationExpression.get_refs  s>      MM""4(4==+A+A$+GG	
 	
r9   c           
         U R                  5       u  pUR                  5       nU Vs/ s H  oDR                  5       PM     nn[        [        [        U/U-   5      5      n[        X65      nU Vs/ s H  n[        Xv5      PM     nn[        [        U[        [        U6 5      5      5      nUS S  V	V
s/ s H  u  pU	S-   SR                  U
5      -   S-   PM!     sn
n	USS  V	V
s/ s H  u  pU	S-   SR                  U
5      -   S-   PM!     sn
n	-   USS   V	V
s/ s H  u  pU	S-   SR                  U
5      -   S-   PM!     sn
n	-   $ s  snf s  snf s  sn
n	f s  sn
n	f s  sn
n	f )Nr@   rL  rA   r  r  r  )	uncurryr  rS  r9  rB  r  r2  rs  r  )rQ   r   argsfunction_linesarg
args_linesr  	arg_linesfunc_args_lines	func_line	args_lines              r:   r   DrtApplicationExpression._pretty  so   !))+/34tkkmt
4C.!1J!>?@	(CMWXZ	oi;Z
Xs>4Z8H3IJK -<BQ,?,?(I C#((9"55;,? -<Aa,@,@(I C#((9"55;,@	 -<AB,?,?(I C#((9"55;,?	
 5 Ys   E.E1&E"&E&Er+   Nr  r  r+   r9   r:   r   r     s    O

r9   r   c                 L    S[        U S   5      -  /nXU[        U 5      -
  -  -   $ )NrL  r   r  )linesr  pad_lines      r:   r  r    s.    c%(m#$Hy3u:5666r9   c                   0    \ rS rSrS rSS jrS rS rSrg)	PossibleAntecedentsi  c                     [        U 5      $ )zSet of free variables.)r  rU   s    r:   r  PossibleAntecedents.free  s    4yr9   c                 ~    [        5       nU  H,  nXa:X  a  U R                  U5        M  U R                  U5        M.     U$ )r  )r2  r}   )rQ   r   ro   r  r  resultitems          r:   r  PossibleAntecedents.replace  s;     %&DJ'D!	 
 r9   c                 0    SU -  nS[        U5      -  nX"U/$ r  r  r  s      r:   r  PossibleAntecedents._pretty  s#    4Kc!fa  r9   c                 >    SSR                  S U  5       5      -   S-   $ )Nr(   r  c              3   ,   #    U  H
  nS U-  v   M     g7fr  r+   )r/  its     r:   r0  .PossibleAntecedents.__str__.<locals>.<genexpr>  s     7$BdRi$r  r)   )r  rU   s    r:   r  PossibleAntecedents.__str__  s!    SXX7$777#==r9   r+   Nr  )	r,   r-   r.   r/   r  r  r  r  r8   r+   r9   r:   r2  r2    s    	!
>r9   r2  c                       \ rS rSrSrg)AnaphoraResolutionExceptioni  r+   Nr  r+   r9   r:   rA  rA    r  r9   rA  c                    [        U [        5      (       Ga  U R                  5       (       a  [        5       nU Hs  nUR	                  5        H\  nU R                  U5      nUR                  U R                  R                  :X  d  M:  XPR                  :X  a  MK  UR                  U5        M^     Mu     [        U5      S:X  a  US   nOUnU R                  U R                  U5      $ [        U R                  X/-   5      n[        U R                  X/-   5      nU R                  Xx5      $ [        U [        5      (       Ga  / n	U R                   H  n
[        XU /-   5      n[        U[        5      (       a  [        UR                   [        5      (       a#  UR                   nUR"                  Ul        Xl        [        UR"                  [        5      (       a)  UR"                  (       d  [%        SUR                   -  5      eU	R                  U5        M     U R&                  (       a  [        U R&                  X/-   5      nOS nU R                  U R(                  X5      $ [        U [*        5      (       a  U $ [        U [,        5      (       a(  U R                  [        U R.                  X/-   5      5      $ [        U [0        5      (       an  U R&                  (       a  [        U R&                  X/-   5      nOS nU R                  [        U R                   X/-   5      [        U R"                  X/-   5      U5      $ [        U [2        5      (       a@  U R                  [        U R                   X/-   5      [        U R"                  X/-   5      5      $ [        U [4        5      (       a3  U R                  U R6                  [        U R.                  X/-   5      5      $ g )Nr?   r   z+Variable '%s' does not resolve to anything.)r   r	   r   r2  r   r   r   r   r}   rB  r   r   r   r%   ry   r   r   r   rA  r  rx   r   r   r   r   r
   r   r   )ro   trailpossible_antecedentsancestorr   refex
resolution
r_function
r_argumentr_condsr  r_condtempr  s                 r:   r   r     s@   *34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	$	$$$D%dZL,@AF &"455fll,?@@!<<D#)==FL$(Mfmm-@AA!==935;\\B 
 NN6"# %$   )**?*?AUVJJ##JOOWII	J :	;	;	J 1	2	2##Z__el.BC
 	
 
J 0	1	1  )**?*?AUVJJ##Z--u|/CDZ..0DE
 	
 
J 0	1	1##Z--u|/CDZ..0DE
 	

 
J 0	1	1##!1*//5<CW!X
 	
 
2r9   c                       \ rS rSrSrSrSrSS jrS r\\4S jr	S	 r
S
 rS rSS jrS rS rS rS rS rS rS rS rSrg)r  iG  rA   
   rD   Nc                    SnU(       d  [        5       nUR                  S5        [        SSS9nU(       ap  [        USSS9nXSl        X0l        U R                  XR                  U R                  5      u  pg[        X`R                  -   S5      nXpR                  -   n	[        XHU	S9nO[        US	S	S9nUR                  5         XSl        X0l        Xl        X@l        g)
z
: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TOPSPACErS  packr   master)
rQ   r   size_canvasrZ  r_  rY  rightbottomrU  rV  s
             r:   rH   DrsDrawer.__init__L  s     TFLL{4Da:"$"&++c??DMM"REOO3S9//1FCc#>KKMKr9   c                 L    U R                   R                  R                  S5      $ )z Get the height of a line of text	linespace)rZ  rY  metricsrU   s    r:   _get_text_heightDrsDrawer._get_text_heightl  s    {{''44r9   c                     U R                  U R                  U R                  X5        U R                  (       a*  [	        5       (       d  U R                  R                  5         gU R                  U R                  X5      $ )zDraw the DRSN)_handler   _draw_commandr_  r!   mainloopr[  )rQ   rR   ys      r:   r  DrsDrawer.drawp  sN    TXXt1118;;wyyKK  ";;txx..r9   c                 :    U R                  XR                  X#5      $ )z
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
)rj  _visit_command)rQ   ro   rR   rm  s       r:   r[  DrsDrawer._visity  s     ||J(;(;QBBr9   c                    [        U[        5      (       a1  U R                  R                  X#SU R                  R                  US9  Os[        U[
        5      (       a^  Uu  pEU R                  R                  X#XE5        X0R                  5       -   U R                  S-  -   nU R                  R                  X&XF5        U R                  XU5      $ )z
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)anchorrY  textr@   )r   strrZ  create_textrY  tuplecreate_rectanglerg  BUFFERcreate_linerp  )rQ   r7  rR   rm  ra  rb  horiz_line_ys          r:   rk  DrsDrawer._draw_command  s     dC  KK##ADKK<L<LSW#Xe$$"OUKK((u=))++t{{Q?  KK##AUI""4A..r9   c                     [        U[        5      (       a9  X R                  R                  R	                  U5      -   X0R                  5       -   4$ [        U[        5      (       a  U$ g)z
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   rv  rZ  rY  measurerg  rx  )rQ   r7  rR   rm  s       r:   rp  DrsDrawer._visit_command  sW     dC  ((0066<Q<Q<S8STTe$$K %r9   c                 &   X R                   :X  a"   UR                  U-   nUR                  U-   nXV4$ [	        U[
        5      (       a  U R                  nGO[	        U[        5      (       a  U R                  nO[	        U[        5      (       a  U R                  nO[	        U[        5      (       a  U R                  nO[	        U[        5      (       a  U R                  nO[	        U[        5      (       a  U R                   nOc[	        U["        5      (       a  U R                  nOA[	        U[$        5      (       a  U R&                  nO[)        UR*                  R,                  5      eU" XX45      u  pVXS-
  Ul        Xd-
  Ul        XV4$ ! [         a     GN]f = f)a  
: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
)rp  _drawing_width_drawing_heightr   r   r   _handle_VariableExpressionr%   _handle_DRSrn   _handle_NegatedExpressionr   _handle_LambdaExpressionr
   _handle_BinaryExpressionr   _handle_ApplicationExpressionr2  r   _handle_DrtPropositionr   r   r,   )rQ   ro   commandrR   rm  ra  rb  r   s           r:   rj  DrsDrawer._handle  s\    )))"11A5#33a7&
 j"?@@55G
C((&&G
$89944G
$78833G
$45533G
$<==88G
$78855G
N3311GJ0099::!*q< %*I
!%+Z
"; " s    F 
FFc                     U" SU-  X45      $ )Nr_  r+   )rQ   ro   r  rR   rm  s        r:   r  $DrsDrawer._handle_VariableExpression  s    tj(!//r9   c           
          U R                  [        R                  X45      S   nU R                  UR                  X%U5      u  pVU" [        R                  UU R                  XFU-
  U R                  5       5      5        XV4$ rs   )rp  r#   NOTrj  r   _get_centered_toprg  rQ   ro   r  rR   rm  ra  rb  s          r:   r  #DrsDrawer._handle_NegatedExpression  sr    ##IMM18; ,,zJ 	MM""1qj$2G2G2IJ	
 r9   c                    X0R                   -   nX@R                   -   nUR                  (       a#  SR                  S UR                   5       5      nOSnU" XuU5      u  pX`R                   S-  -  nUR                  (       aA  UR                   H0  n	U R	                  XXV5      u  p[        X5      nX`R                   -  nM2     OX`R                  5       U R                   -   -  nXR                   -  nU" X4X45      $ )NrL  c              3   ,   #    U  H
  nS U-  v   M     g7fr  r+   )r/  rs     r:   r0  (DrsDrawer._handle_DRS.<locals>.<genexpr>  s     >oD1Hor  z     r@   )rz  rx   r  ry   rj  rS  rg  )rQ   ro   r  rR   rm  leftrb  rx   	max_rightr  ra  s              r:   r  DrsDrawer._handle_DRS  s    ;;[[ ??88>joo>>DD%d&9++/! "(("&,,td"K	1	++% )
 ++-;;F 	[[ 		*A11r9   c                    UR                  5       u  pV[        U[        5      (       d  UR                  nUR                  /nU R                  XSU5      S   n[        U/U Vs/ s H  oR                  XU5      S   PM     sn-   5      n	X-
  n
U R                  XJUR                  5      nU R                  XRX;5      S   nU R                  XJU R                  5       5      nU" [        R                  X5      S   n[        U5       Hg  u  pU R                  XJUR                  5      nU R                  XX5      S   nUS-   [        U5      :  d  MJ  U" [        R                  S-   X5      S   nMi     U" [        R                   X5      S   nX4$ s  snf )Nr?   r   rL  )r$  r   r   r   r   r[  rS  r  r  rj  rg  r#   r`   	enumeraterB  ru   rw   )rQ   ro   r  rR   rm  r   r%  function_bottomr'  
max_bottomline_heightfunction_drawing_topra  centred_string_topr  arg_drawing_tops                   r:   r  'DrsDrawer._handle_ApplicationExpression  s   #++-($ABB!**H''(D ++h15a8d KdsSQ!7!:d KK

 !n  $55H44 
 XHK "33D113
 	B1E  oFA"44 3 3O LLuFqIE1us4y 	# 5uQRST & 	CAF""? !Ls   !F

c           
      &   [         R                  SUR                  -  -   [         R                  -   nU R	                  XSU5      S   nU R                  UR                  X&U5      u  pgU" XSU R                  XGU-
  U R                  5       5      5        Xg4$ )Nr_  r   )	r#   LAMBDAr   r  rp  rj  r   r  rg  )rQ   ro   r  rR   rm  r   ra  rb  s           r:   r  "DrsDrawer._handle_LambdaExpression-  s    $$tj.A.A'AAIMMQ	##I!4Q7 ,,zJ 	$00QJ@U@U@WX	
 r9   c           
         U R                  UR                  SS5      S   nU R                  UR                  SS5      S   n[        XV5      nU R	                  XGU R                  5       5      nU" [        R                  X85      S   n	UR                  R                  nU R                  UR                  UU	U R	                  XGU5      5      u  pU" SUR                  5       -  X5      S   n	UR                  R                  nU R                  UR                  UU	U R	                  XGU5      5      u  pU" [        R                  X5      S   n	U	[        X5      4$ )Nr   r?   z %s )r[  r   r   rS  r  rg  r#   r`   r  rj  r  rw   )rQ   ro   r  rR   rm  first_heightsecond_heightr  r  ra  first_bottomsecond_bottoms               r:   r  "DrsDrawer._handle_BinaryExpression<  sM   {{:#3#3Q:1=J$5$5q!<Q?,6 "33D113
 	>qA "''77 $""1<@	!
 !1!1!33UOPQR #))99!%""1=A	"
 	CAFs<788r9   c                 r    U" UR                   X45      S   nU R                  UR                  X%U5      u  pVXV4$ rs   )r   rj  r   r  s          r:   r   DrsDrawer._handle_DrtPropositionb  s;    
++Q215 ,,zJr9   c                     XU-
  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@   r+   )rQ   topfull_heightitem_heights       r:   r  DrsDrawer._get_centered_topk  s     K/1444r9   )rZ  r   r_  r.  )r   r   )r,   r-   r.   r/   rz  r]  r\  rH   rg  r  r[  rk  rp  rj  r  r  r  r  r  r  r  r  r8   r+   r9   r:   r  r  G  sh    FHJ@5  8 /	C/,,\0 22)#V$9L5r9   r  c                     [        S5        [        R                  n [        U " S5      5        [        U " S5      5        [        U " S5      5        [        U " S5      5        [        U " S5      5        [        U " S5      5        [        U " S5      5        [        U " S	5      5        [        U " S
5      5        [        S5        [        U " S5      R                  5       5        [        S5        U " S5      n[        U5        UR	                  [        S5      5      n[        U5        [        X:H  5        [        S5        [        [        U " S5      5      5        [        [        U " S5      5      5        [        [        U " S5      5      5        [        S5        U " S5      R                  5         U " S5      R                  5         U " S5      R                  5         U " S5      R                  5         U " S5      R                  5         g )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      r:   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Mr9   c                       SSK Jn   / SQnU H(  n[        R                  U5      nUR                  5         M*     g ! [         a  n[        S5      eS nAff = f)Nr   )r   z,tkinter is required, but it's not available.)rR   r  z([x],[])z([x],[man(x)])r  r  z\x.([],[man(x), walks(x)])z\x y.([],[sees(x,y)])z)([],[(([],[walks(x)]) + ([],[runs(x)]))])r  r  )tkinterr   ImportError
ValueErrorr   r   r  )r   r   expressionsds       r:   	test_drawr    sW    IK $$Q'	 #  IGHHIs   ; 
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   r  r   r   tkinter.fontr    	nltk.utilr!   r  r#   r<   r   r%   r   r   r   r  r  r  r   rn   r   rU  r  r   r   r   r   r  r2  r2  r   rA  r   r  r  r  r,   r+   r9   r:   <module>r     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   E2 2E<;E<