
    i                        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    " 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      r* " S S\#\5      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      r3S+ r4 " S, S-\5\#\5      r6 " S. S/\75      r8/ 4S0 jr9 " S1 S25      r:S3 r;S4 r<\=S5:X  a  \;" 5         gg)6    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)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	)
	DrtTokens+   DRS+PRO[]: N)__name__
__module____qualname____firstlineno__r"   DRS_CONCPRONOUNOPEN_BRACKETCLOSE_BRACKETCOLONPUNCTr   SYMBOLSTOKENS__static_attributes__r(       F/home/james-whalen/.local/lib/python3.13/site-packages/nltk/sem/drt.pyr    r    +   sQ    
CHGLME|]E:Ennu$G]]cU"U*Fr6   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)	DrtParser:   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_LISTr1   r-   OR_LISTIMP_LISToperator_precedence)selfxs     r7   rE   DrtParser.__init__=   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    r3   rN   s    r7   get_all_symbolsDrtParser.get_all_symbolsL   s       r6   c                 (    U[         R                  ;  $ N)r    r4   )rN   toks     r7   
isvariableDrtParser.isvariableP   s    )****r6   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    rH   handle_negationrG   handle_lambdaOPENinRangetokenr/   
handle_DRShandle_openupperr"   assertNextTokenrX   r1   handle_prophandle_variable)rN   rW   contexts      r7   handleDrtParser.handleS   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	 "r6   c                     [        U5      $ rV   DrtNegatedExpression)rN   
expressions     r7   make_NegatedExpression DrtParser.make_NegatedExpressionl   s    #J//r6   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_refsr^   r_   r    COMMAhandle_condsrc   CLOSEr"   )rN   rW   rf   refscondss        r7   r`   DrtParser.handle_DRSo   sh    !LLOO

1 @JJL!!'*Y__-4%%r6   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)	rc   r    r/   r^   r_   r0   rr   appendget_next_token_variable)rN   ru   s     r7   rq   DrtParser.handle_refsz   s    Y334ll1oo$**Q-93J3J"J

18

KK44\BC	 ll1oo$**Q-93J3J"J
 	Y445r6   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$ rp   )	rc   r    r/   r^   r_   r0   rr   rz   process_next_expression)rN   rf   rv   s      r7   rs   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r6   c                     U R                  U5      nU R                  S5        U R                  [        R                  5      n[        X45      $ )Nr'   )make_VariableExpressionrc   r~   r    r1   DrtProposition)rN   rW   rf   variabledrss        r7   rd   DrtParser.handle_prop   s?    //4S!**9??;h,,r6   c                     [        X5      $ )zdThis method serves as a hook for other logic parsers that
have different equality expression classesDrtEqualityExpressionrN   firstseconds      r7   make_EqualityExpression!DrtParser.make_EqualityExpression   s     %U33r6   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      $ rV   DrtConcatenationr   r   s     r7   <lambda>9DrtParser.get_BooleanExpression_factory.<locals>.<lambda>   s    )9%)Nr6   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"   ru   rv   r   r   r   	Exceptionr   s     r7   make_imp_expressionDDrtParser.get_BooleanExpression_factory.<locals>.make_imp_expression   sW    eS))uzz5;;??e%566+EKKvNN IJJr6   N)r    r-   rK   DrtOrExpressionrL   )rN   rW   r   s      r7   get_BooleanExpression_factory'DrtParser.get_BooleanExpression_factory   sK     )$$$NNI%%%""I&&&K '&r6   c                     U" X#5      $ rV   r(   )rN   factoryr   r   s       r7   make_BooleanExpression DrtParser.make_BooleanExpression   s    u%%r6   c                     [        X5      $ rV   DrtApplicationExpression)rN   functionarguments      r7   make_ApplicationExpression$DrtParser.make_ApplicationExpression   s    ';;r6   c                 *    [        [        U5      5      $ rV   )DrtVariableExpressionr   )rN   names     r7   r   !DrtParser.make_VariableExpression   s    $Xd^44r6   c                     [        X5      $ rV   )DrtLambdaExpression)rN   	variablesterms      r7   make_LambdaExpressionDrtParser.make_LambdaExpression   s    "933r6   )rM   N)r)   r*   r+   r,   __doc__rE   rS   rX   rg   rm   r`   rq   rs   rd   r   r   r   r   r   r   r5   r(   r6   r7   r9   r9   :   sP    .
!+:20	&		-4
(&<54r6   r9   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      $ rV   )_drt_parserparse)clsss     r7   
fromstringDrtExpression.fromstring   s    $$Q''r6   c                     [        X5      $ rV   r   rN   others     r7   applytoDrtExpression.applyto   s    '44r6   c                     [        U 5      $ rV   rj   rR   s    r7   __neg__DrtExpression.__neg__   s    #D))r6   c                     [         $ rV   )NotImplementedr   s     r7   __and__DrtExpression.__and__   s    r6   c                 F    [        U[        5      (       d   e[        X5      $ rV   )r   r   r   r   s     r7   __or__DrtExpression.__or__   s     %////t++r6   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"   ru   rv   r   r   r   r   r   s     r7   __gt__DrtExpression.__gt__   sj    %////dC  tyy$**e44d,--#DJJUCCABBr6   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)rN   r   proverf1f2s        r7   r   DrtExpression.equiv   sO     %////]]_  "^^!!#xx##r6   c                 F    [        SU R                  R                  -  5      e)Nz#'%s' object has no attribute 'type')AttributeError	__class__r)   rR   s    r7   typeDrtExpression.type   s!    1DNN4K4KK
 	
r6   c                     [        5       erV   NotImplementedError)rN   	signatures     r7   	typecheckDrtExpression.typecheck   s    !##r6   c                     [        XS 5      $ rV   r   r   s     r7   __add__DrtExpression.__add__   s    T22r6   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   rN   	recursives     r7   get_refsDrtExpression.get_refs   s     "##r6   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    r.   r   DrtIndividualVariableExpressionrR   s    r7   is_pronoun_function!DrtExpression.is_pronoun_function   sd     t56 K4==*GHK&&++y/@/@@K 4==*IJ		
r6   c                     [        X5      $ rV   r   r   s      r7   r   %DrtExpression.make_EqualityExpression	  s    $U33r6   c                     [        U5      $ rV   )r   )rN   r   s     r7   r   %DrtExpression.make_VariableExpression  s    $X..r6   c                     [        U 5      $ rV   )resolve_anaphorarR   s    r7   r   DrtExpression.resolve_anaphora  s    %%r6   c                 <    U R                  S U R                  5      $ )Nc                 "    U R                  5       $ rV   )eliminate_equality)es    r7   r   2DrtExpression.eliminate_equality.<locals>.<lambda>  s    q/C/C/Er6   )visit_structuredr   rR   s    r7   r    DrtExpression.eliminate_equality  s    $$%Et~~VVr6   c                 @    SR                  U R                  5       5      $ )z/
Draw the DRS
:return: the pretty print string

)join_prettyrR   s    r7   pretty_formatDrtExpression.pretty_format  s    
 yy((r6   c                 6    [        U R                  5       5        g rV   )printr  rR   s    r7   pretty_printDrtExpression.pretty_print  s    d  "#r6   c                 6    [        U 5      R                  5         g rV   )	DrsDrawerdrawrR   s    r7   r
  DrtExpression.draw  s    $r6   r(   rV   F)r)   r*   r+   r,   r   r9   r   classmethodr   r   r   r   r   r   r   propertyr   r   r   r   r   r   r   r   r   r  r  r
  r5   r(   r6   r7   r   r      s    
 +K( (5*,C$ 
 

$3$
4/&W)$r6   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)ru   rv   
consequent)rN   ru   rv   r  s       r7   rE   DRS.__init__&  s     	
$r6   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<   )ru   indexr  replacer"   r   rv   setfreer   r   )rN   r   rl   replace_boundalpha_convertir  condrefnewvarnewvarexs              r7   r  DRS.replace0  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_rv   r  r  r  updateru   )rN   c
conds_frees      r7   r  DRS.freen  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     r7   	<genexpr>DRS.get_refs.<locals>.<genexpr>y  s     #IjJJt$4$4js   T)ru   listr   from_iterablerv   r  extendr   )rN   r   
conds_refss      r7   r   DRS.get_refsu  sh    T###Idjj#II& J !!$//":":4"@A99r6   c                     [        [        XR                  5      5      nU R                  (       a!  UR	                  U" U R                  5      5        U" U5      $ z:see: Expression.visit())r/  maprv   r  rz   )rN   r   
combinatorpartss       r7   visit	DRS.visit  s<    S::./??LL$//23%  r6   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  ru   r/  r6  rv   )rN   r   r7  r  s       r7   r   DRS.visit_structured  s9    26//Xdoo.t
$))T#h

*C%DjQQr6   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)lenrv   r   r   r   r   r   r"   r/  r  ru   r   r  r  r   r   rz   )rN   r   r  r  rv   new_condnew_cond_simpr  s           r7   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//r6   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  rv   r   r   r   r   ru   r   r   r6  r   _order_ref_stringsr   )rN   accumr%  r  s       r7   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       $ rV   )strip)r   s    r7   r   DRS._pretty.<locals>.<lambda>  s
    r6   z __z_ z| z |z|--z-|z|_z_|)r   rE  ru   rv   filterr  maxr?  r/  r6  ljustr  DrtBinaryExpression_assemble_prettyr    IMP)rN   	refs_liner  	cond_line
cond_lineslengthliner   s           r7   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=   rD  r   intr?  vs    r7   r   (DRS._order_ref_strings.<locals>.<lambda>  s&    sAabE2;s1QR5zQ3O/Pr6   )keyc           	      P    U S   [        U SS  S/[        U SS  5      S:H     5      4$ Nr   r<   rD  r^  r`  s    r7   r   rb    s0    qtS!AB%S12ZST_9U5V.Wr6   c           	      P    U S   [        U SS  S/[        U SS  5      S:H     5      4$ re  r^  r`  s    r7   r   rb    s0    adC12C!"JRSO8T4U-Vr6   )r   rz   r   r   sorted)	rN   ru   r  stringsind_vars	func_vars
event_vars
other_varsr   s	            r7   rE  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"   r?  ru   zipr   r  r  rv   )rN   r   converted_otherr1r2varexc1c2s           r7   __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  r6   c                     X:X  + $ rV   r(   r   s     r7   __ne__
DRS.__ne__        r6   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     r7   r-  DRS.__str__.<locals>.<genexpr>  s     9jddTkj   rI  r\  )
formatr   rE  ru   rv   r  r    r]   rT  rt   rN   r   s     r7   __str__DRS.__str__  s    ""HHT,,TYY78II9djj99
 ?? --  	
 () //" 
r6   )rv   r  ru   rV   FTr  )r)   r*   r+   r,   r   rE   r  r  r   r9  r   r   r   r  rE  rw  rz  r   __hash__r  r5   r(   r6   r7   r"   r"   #  sV    /%<|+
!R
"0H04
,$! ""Hr6   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    r7   r   r   "  s]    
 .x88	HMM	"	",X66	X]]	#	#)(33$X..r6   c                   0    \ rS rSrS rSS jrS rS rSrg)	r   i1  c                     U $ rV   r(   rR   s    r7   r   !DrtAbstractVariableExpression.fol2      r6   c                     / $ r)  r(   r   s     r7   r   &DrtAbstractVariableExpression.get_refs5  s    	r6   c                 0    SU -  nS[        U5      -  nX"X/$ Nr\  rI  r?  rN   r   blanks      r7   r  %DrtAbstractVariableExpression._pretty9  s#    4Kc!fa''r6   c                     U $ rV   r(   rR   s    r7   r   0DrtAbstractVariableExpression.eliminate_equality>  r  r6   r(   Nr  )	r)   r*   r+   r,   r   r   r  r   r5   r(   r6   r7   r   r   1  s    (
r6   r   c                       \ rS rSrSrg)r   iB  r(   Nr)   r*   r+   r,   r5   r(   r6   r7   r   r   B       	r6   r   c                       \ rS rSrSrg)r  iH  r(   Nr  r(   r6   r7   r  r  H  r  r6   r  c                       \ rS rSrSrg)r  iN  r(   Nr  r(   r6   r7   r  r  N  r  r6   r  c                       \ rS rSrSrg)r  iT  r(   Nr  r(   r6   r7   r  r  T      r6   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   iX  c                     Xl         X l        g rV   r   r   )rN   r   r   s      r7   rE   DrtProposition.__init__Y  s     r6   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  )rN   r   rl   r  r  s        r7   r  DrtProposition.replace]  s    ==H$9  FEF  "##  }T 
 "  }T r6   c                 ^    [        U R                  U R                  R                  5       5      $ rV   )r   r   r   r   rR   s    r7   r   !DrtProposition.eliminate_equalityl  s     dmmTXX-H-H-JKKr6   c                 J    U(       a  U R                   R                  S5      $ / $ NT)r   r   r   s     r7   r   DrtProposition.get_refso  s    *3txx  &;;r6   c                     U R                   UR                   :H  =(       a9    U R                  UR                  :H  =(       a    U R                  UR                  :H  $ rV   )r   r   r   r   s     r7   rw  DrtProposition.__eq__r  sA    NNeoo- &/&EII%	
r6   c                     X:X  + $ rV   r(   r   s     r7   rz  DrtProposition.__ne__y  r|  r6   c                 6    U R                   R                  5       $ rV   )r   r   rR   s    r7   r   DrtProposition.fol~  s    xx||~r6   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 )NrI  r\  r<   r=   r'   )r   r  r?  r   )rN   drs_sr  rY  s       r7   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      $ r5  )r   rN   r   r7  s      r7   r9  DrtProposition.visit  s    8DHH-.//r6   c                 H    U" U R                   U" U R                  5      5      $ )r<  r  r  s      r7   r   DrtProposition.visit_structured  s    $--$(();<<r6   c                 <    SU R                    SU R                   S3$ )Nzprop(r  )r  rR   s    r7   r  DrtProposition.__str__  s    t}}oRz33r6   )r   r   Nr  r  )r)   r*   r+   r,   rE   r  r   r   rw  rz  r   r  r   r  r9  r   r  r5   r(   r6   r7   r   r   X  sG    L<
! ""H
0=4r6   r   c                   *    \ rS rSrS rSS jrS rSrg)rk   i  c                 H    [        U R                  R                  5       5      $ rV   )r   r   r   rR   s    r7   r   DrtNegatedExpression.fol  s     11r6   c                 8    U R                   R                  U5      $ r  )r   r   r   s     r7   r   DrtNegatedExpression.get_refs  s    yy!!),,r6   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=       r>   z__  r?   z  | )r   r  )rN   
term_linesrY  s      r7   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  r5   r(   r6   r7   rk   rk     s    2-
r6   rk   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   )rN   r  s     r7   r  !DrtLambdaExpression.alpha_convert  s8    
 ~~IIdmm-B6-JDQ
 	
r6   c                 ^    [        U R                  U R                  R                  5       5      $ rV   )r   r   r   r   rR   s    r7   r   DrtLambdaExpression.fol  s    tyy}}??r6   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 )	NrI  c              3   ,   #    U  H
  nS U-  v   M     g7fr  r(   )r,  ra  s     r7   r-  .DrtLambdaExpression._pretty.<locals>.<genexpr>  s     :	1dQh	r  r<   r  r=   z \  r>   z /\ )	r   r   r   rz   r   r    DOTr  r?  )rN   r   r   
var_stringr  r  rY  s          r7   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     r7   r   DrtLambdaExpression.get_refs  s7     ;DT]]Odii0066	
JN--	
r6   r(   Nr  )	r)   r*   r+   r,   r  r   r  r   r5   r(   r6   r7   r   r     s    
@
 
r6   r   c                   :    \ rS rSrSS jrS r\S 5       rS rSr	g)	rR  i  c                     U(       a7  U R                   R                  S5      U R                  R                  S5      -   $ / $ r  )r   r   r   r   s     r7   r   DrtBinaryExpression.get_refs  s;     GPDJJ%(<(<T(BB	
UW	
r6   c                     [         R                  U R                  U R                  5      U R	                  5       U R                  U R
                  5      5      $ rV   )rR  rS  _pretty_subexr   getOpr   rR   s    r7   r  DrtBinaryExpression._pretty  sB    "33tzz*JJLt{{+
 	
r6   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 )NrI  r=   r>   (r  )rP  r?  _pad_verticallyr/  rp  )first_linesopsecond_lines	max_linesr  first_second_lines
first_linesecond_lines           r7   rS  $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       $ rV   )r  )rN   subexs     r7   r  !DrtBinaryExpression._pretty_subex  s    }}r6   r(   Nr  )
r)   r*   r+   r,   r   r  staticmethodrS  r  r5   r(   r6   r7   rR  rR    s%    

 
 
*r6   rR  c                       \ rS rSrSrg)DrtBooleanExpressioni  r(   Nr  r(   r6   r7   r  r    r  r6   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      $ rV   )r   r   r   r   rR   s    r7   r   DrtOrExpression.fol  s%    DJJNN,dkkoo.?@@r6   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<   rD  )r   r   r  r  r  rN   r  rY  s      r7   r  DrtOrExpression._pretty_subex  sD    e_--+0==?;?42J?;;#11$>> <   Ar(   N)r)   r*   r+   r,   r   r  r5   r(   r6   r7   r   r     s    A?r6   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      $ rV   )r   r   r   r   rR   s    r7   r   DrtEqualityExpression.fol  s%    !$**.."2DKKOO4EFFr6   r(   N)r)   r*   r+   r,   r   r5   r(   r6   r7   r   r     s    Gr6   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 rV   )r  rE   r  )rN   r   r   r  s       r7   rE   DrtConcatenation.__init__  s    %%d6:$r6   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   )
rN   r   rl   r  r  r   r   r  r  ra  s
             r7   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8r6   c                 p    U R                  5       n[        U[        5      (       a   eUR                  5       $ rV   )r   r   r   r   r  s     r7   r   #DrtConcatenation.eliminate_equality6  s0    mmoc#34444%%''r6   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  ru   rv   r   )rN   r   r   r  r  r  s         r7   r   DrtConcatenation.simplify<  s    

##%%%'37??T__--/
eS!!j&=&=5>>$/03vt7L3MM.s/CDT: N
 uzzFKK/v||1KZXX>>%<<r6   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  r1  )rN   r   ru   s      r7   r   DrtConcatenation.get_refsL  sS    zz""9-0D0DY0OO??yKK0067r6   c                 "    [         R                  $ rV   )r    r-   rR   s    r7   r  DrtConcatenation.getOpS  s    !!!r6   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ro  )
r   r   r   r?  rp  r   r  r   r   r  )rN   r   	self_refs
other_refsrq  rr  rs  rt  s           r7   rw  DrtConcatenation.__eq__V  s     e-..I)J9~Z0"'!)8FB 88<E&5&=&=b&NO 9 JJ/"7"77 F'='==F?+E+EE
 r6   c                     X:X  + $ rV   r(   r   s     r7   rz  DrtConcatenation.__ne__h  r|  r6   c                     [        U R                  R                  5       U R                  R                  5       5      nU R                  (       a#  [        XR                  R                  5       5      nU$ rV   )r   r   r   r   r  r   )rN   r   s     r7   r   DrtConcatenation.folm  sG    $**..*DKKOO,=>??a!4!4!67Ar6   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$ rV   )
rR  rS  r  r   r  r   r  r    rT  r  r  s     r7   r  DrtConcatenation._prettys  sw    !22tzz*JJLt{{+

 ??%66Y]]DOO$;$;$=C 
r6   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      r7   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      $ r5  )r  r   r   r  s      r7   r9  DrtConcatenation.visit  s_    ??$**%x'<ht>WX  x

3Xdkk5JKLLr6   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$ )NrI  r\  )

_str_subexr   r   r   r]   r  rt   r  r    rT  )rN   r   r   r   s       r7   r  DrtConcatenation.__str__  s    

+-kkE!C'$**,6<vET?? --  	
 () //" 
r6   c                 ^    SU-  n[        U[        5      (       a  UR                  c  USS $ U$ )Nr\  r<   rD  )r   r   r  )rN   r  r   s      r7   r  DrtConcatenation._str_subex  s4    5Le-..53C3C3KQr7Nr6   )r  rV   r  r  )r)   r*   r+   r,   r   rE   r  r   r   r   r  rw  rz  r  r  r   r  r  r9  r  r  r5   r(   r6   r7   r   r     sZ    '%%9N(= "$! $,,H
?
M r6   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      $ rV   )r	   r   r   r   rR   s    r7   r   DrtApplicationExpression.fol  s)    $T]]%6%6%8$--:K:K:MNNr6   c                     U(       a7  U R                   R                  S5      U R                  R                  S5      -   $ / $ r  )r   r   r   r   s     r7   r   !DrtApplicationExpression.get_refs  s>      MM""4(4==+A+A$+GG	
 	
r6   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=   rI  r>   r  r~  r  )	uncurryr  rP  r6  r?  r  r/  rp  r   )rN   r   argsfunction_linesarg
args_linesr  	arg_linesfunc_args_lines	func_line	args_lines              r7   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(   r6   r7   r   r     s    O

r6   r   c                 L    S[        U S   5      -  /nXU[        U 5      -
  -  -   $ )NrI  r   r  )linesr  pad_lines      r7   r  r    s.    c%(m#$Hy3u:5666r6   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  rR   s    r7   r  PossibleAntecedents.free  s    4yr6   c                 ~    [        5       nU  H,  nXa:X  a  U R                  U5        M  U R                  U5        M.     U$ )r  )r/  rz   )rN   r   rl   r  r  resultitems          r7   r  PossibleAntecedents.replace  s;     %&DJ'D!	 
 r6   c                 0    SU -  nS[        U5      -  nX"U/$ r  r  r  s      r7   r  PossibleAntecedents._pretty  s#    4Kc!fa  r6   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     r7   r-  .PossibleAntecedents.__str__.<locals>.<genexpr>  s     7$BdRi$r  r&   )r   rR   s    r7   r  PossibleAntecedents.__str__  s!    SXX7$777#==r6   r(   Nr  )	r)   r*   r+   r,   r  r  r  r  r5   r(   r6   r7   r/  r/    s    	!
>r6   r/  c                       \ rS rSrSrg)AnaphoraResolutionExceptioni  r(   Nr  r(   r6   r7   r>  r>    r  r6   r>  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   r/  r   r   r   r   rz   r?  r   r   r   r"   rv   r   r   r   r>  r  ru   r   r   r   r   r
   r   r   )rl   trailpossible_antecedentsancestorr  refex
resolution
r_function
r_argumentr_condsr  r_condtempr  s                 r7   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
 	
 
2r6   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	  i=  r>   
   rA   Nc                    SnU(       d  SSK JnJn  SSKJn  U" 5       nUR                  S5        U" SSS9nU(       aj  U" USSS	9nXl        X0l        U R                  XR                  U R                  5      u  p[        XR                  -   S
5      nXR                  -   nU" XKUS	9nOU" USSS	9nUR                  5         Xl        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.
Nr   )CanvasTk)FontDRT	helvetica   )familysize)widthheightd   i,  )tkinterrM  rN  tkinter.fontrO  titlefontcanvas_visit
OUTERSPACETOPSPACErP  packr   master)rN   r   size_canvasr\  ra  rM  rN  rO  r[  rightbottomrU  rV  s                r7   rE   DrsDrawer.__init__B  s      +)TFLL{4Da:"$"&++c??DMM"REOO3S9//1FCc#>KKMKr6   c                 L    U R                   R                  R                  S5      $ )z Get the height of a line of text	linespace)r\  r[  metricsrR   s    r7   _get_text_heightDrsDrawer._get_text_heighth  s    {{''44r6   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_commandra  r   mainloopr]  )rN   rO   ys      r7   r
  DrsDrawer.drawl  sN    TXXt1118;;wyyKK  ";;txx..r6   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
)rl  _visit_command)rN   rl   rO   ro  s       r7   r]  DrsDrawer._visitu  s     ||J(;(;QBBr6   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)anchorr[  textr=   )r   strr\  create_textr[  tuplecreate_rectangleri  BUFFERcreate_linerr  )rN   r4  rO   ro  rc  rd  horiz_line_ys          r7   rm  DrsDrawer._draw_command  s     dC  KK##ADKK<L<LSW#Xe$$"OUKK((u=))++t{{Q?  KK##AUI""4A..r6   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   rx  r\  r[  measureri  rz  )rN   r4  rO   ro  s       r7   rr  DrsDrawer._visit_command  sW     dC  ((0066<Q<Q<S8STTe$$K %r6   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
)rr  _drawing_width_drawing_heightr   r   r   _handle_VariableExpressionr"   _handle_DRSrk   _handle_NegatedExpressionr   _handle_LambdaExpressionr
   _handle_BinaryExpressionr   _handle_ApplicationExpressionr/  r   _handle_DrtPropositionr   r   r)   )rN   rl   commandrO   ro  rc  rd  r   s           r7   rl  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(   )rN   rl   r  rO   ro  s        r7   r  $DrsDrawer._handle_VariableExpression  s    tj(!//r6   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$ rp   )rr  r    NOTrl  r   _get_centered_topri  rN   rl   r  rO   ro  rc  rd  s          r7   r  #DrsDrawer._handle_NegatedExpression  sr    ##IMM18; ,,zJ 	MM""1qj$2G2G2IJ	
 r6   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      $ )NrI  c              3   ,   #    U  H
  nS U-  v   M     g7fr  r(   )r,  rs     r7   r-  (DrsDrawer._handle_DRS.<locals>.<genexpr>  s     >oD1Hor  z     r=   )r|  ru   r   rv   rl  rP  ri  )rN   rl   r  rO   ro  leftrd  ru   	max_rightr  rc  s              r7   r  DrsDrawer._handle_DRS  s    ;;[[ ??88>joo>>DD%d&9++/! "(("&,,td"K	1	++% )
 ++-;;F 	[[ 		*A11r6   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   rI  )r!  r   r   r   r   r]  rP  r  r  rl  ri  r    r]   	enumerater?  rr   rt   )rN   rl   r  rO   ro  r   r"  function_bottomr$  
max_bottomline_heightfunction_drawing_toprc  centred_string_topr  arg_drawing_tops                   r7   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  rr  rl  r   r  ri  )rN   rl   r  rO   ro  r   rc  rd  s           r7   r  "DrsDrawer._handle_LambdaExpression)  s    $$tj.A.A'AAIMMQ	##I!4Q7 ,,zJ 	$00QJ@U@U@WX	
 r6   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   rP  r  ri  r    r]   r  rl  r  rt   )rN   rl   r  rO   ro  first_heightsecond_heightr  r  rc  first_bottomsecond_bottoms               r7   r  "DrsDrawer._handle_BinaryExpression8  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8r6   c                 r    U" UR                   X45      S   nU R                  UR                  X%U5      u  pVXV4$ rp   )r   rl  r   r  s          r7   r   DrsDrawer._handle_DrtProposition^  s;    
++Q215 ,,zJr6   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(   )rN   topfull_heightitem_heights       r7   r  DrsDrawer._get_centered_topg  s     K/1444r6   )r\  r   ra  r+  )r   r   )r)   r*   r+   r,   r|  r_  r^  rE   ri  r
  r]  rm  rr  rl  r  r  r  r  r  r  r  r  r5   r(   r6   r7   r	  r	  =  sh    FHJ$L5  8 /	C/,,\0 22)#V$9L5r6   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      r7   demor  n  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                       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   )rN  z,tkinter is required, but it's not available.)rO   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  )rX  rN  ImportError
ValueErrorr   r   r
  )rN  r   expressionsds       r7   	test_drawr    sW    IK $$Q'	 #  IGHHIs   ; 
AAA__main__)>r"  	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   	nltk.utilr   r    r9   r   r"   r   r   r   r  r  r  r   rk   r   rR  r  r   r   r   r   r  r/  r/  r   r>  r   r	  r  r  r)   r(   r6   r7   <module>r     s           6 + +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n5 n5b	%NP2 zF r6   