
    ǔ9i                        d dl Z d dlmZ d dlmZ d dlmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlm Z   G d de      Z! G d d	e      Z" G d
 d      Z# G d de#e      Z$d Z% G d de#e      Z& G d de&e      Z' G d de&e      Z( G d de'e      Z) G d de&e      Z* G d de#e      Z+ G d de#e      Z, G d de#e      Z- G d d e#e      Z. G d! d"e.e      Z/ G d# d$e/e      Z0 G d% d&e.e      Z1 G d' d(e/      Z2 G d) d*e#e
      Z3d+ Z4 G d, d-e5e#e      Z6 G d. d/e7      Z8g fd0Z9 G d1 d2      Z:d3 Z;d4 Z<e=d5k(  r e;        yy)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                   t    e Zd ZdZdZdZdZdZdZeeeegZ	e
j                  e	z   Ze
j                  egz   e	z   Zy)	DrtTokensDRS+PRO[]:N)__name__
__module____qualname__r!   DRS_CONCPRONOUNOPEN_BRACKETCLOSE_BRACKETCOLONPUNCTr   SYMBOLSTOKENS     V/var/www/html/backtest/airagagent/rag_env/lib/python3.12/site-packages/nltk/sem/drt.pyr    r    +   sQ    
CHGLME|]E:Ennu$G]]cU"U*Fr3   r    c                   j    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zy)	DrtParserz$A lambda calculus expression parser.c                 R   t        j                  |        t        t        j                  D cg c]  }|df c}t        j
                  D cg c]  }|df c}z   t        dfgz   t        j                  t        j                  z   D cg c]  }|df c}z   t        j                  dfgz   t        j                  dfgz   t        j                  D cg c]  }|df c}z   t        j                  D cg c]  }|df c}z   d	gz         | _        y c c}w c c}w c c}w c c}w c c}w )
N                        )N	   )r   __init__dictr    LAMBDA_LISTNOT_LISTr   EQ_LISTr   NEQ_LISTr.   r*   OR_LISTIMP_LISToperator_precedence)selfxs     r4   rA   zDrtParser.__init__=   s   T"#'&223aV3(112!1v23Qxj  )006??BC!1vCD #$	%
 ""A&'(  )001!1v12  )112!1v23 k
$
 32C 22s   DD
D
D
2D$
c                 "    t         j                  S )z#This method exists to be overridden)r    r0   rJ   s    r4   get_all_symbolszDrtParser.get_all_symbolsL   s       r3   c                 &    |t         j                  vS N)r    r1   )rJ   toks     r4   
isvariablezDrtParser.isvariableP   s    )****r3   c                    |t         j                  v r| j                  ||      S |t         j                  v r| j	                  ||      S |t         j
                  k(  rW| j                  d      r4| j                  d      t         j                  k(  r| j                  ||      S | j                  ||      S |j                         t         j                  k(  r1| j                  t         j
                         | j                  ||      S | j                  |      rW| j                  d      r4| j                  d      t         j                  k(  r| j!                  ||      S | j#                  ||      S y)zgThis method is intended to be overridden for logics that
        use different operators or expressionsr   N)r    rD   handle_negationrC   handle_lambdaOPENinRangetokenr,   
handle_DRShandle_openupperr!   assertNextTokenrR   r.   handle_prophandle_variable)rJ   rQ   contexts      r4   handlezDrtParser.handleS   s     )$$$''W55I)))%%c733INN"||A4::a=I4J4J#JsG44''W55YY[IMM)  0??300__S!||A4::a=IOO#C''W55++C99	 "r3   c                     t        |      S rP   DrtNegatedExpression)rJ   
expressions     r4   make_NegatedExpressionz DrtParser.make_NegatedExpressionl   s    #J//r3   c                 "   | j                         }| j                  d      r2| j                  d      t        j                  k(  r| j                          | j                  |      }| j                  t        j                         t        ||d       S Nr   )	handle_refsrW   rX   r    COMMAhandle_condsr\   CLOSEr!   )rJ   rQ   r_   refscondss        r4   rY   zDrtParser.handle_DRSo   sh    !LLO

1 @JJL!!'*Y__-4%%r3   c                    | j                  t        j                         g }| j                  d      r| j	                  d      t        j
                  k7  r|r2| j	                  d      t        j                  k(  r| j	                          |j                  | j                  d             | j                  d      r#| j	                  d      t        j
                  k7  r| j                  t        j
                         |S )Nr   
quantified)	r\   r    r,   rW   rX   r-   ri   appendget_next_token_variable)rJ   rl   s     r4   rh   zDrtParser.handle_refsz   s    Y334ll1o$**Q-93J3J"J

18

KK44\BC	 ll1o$**Q-93J3J"J
 	Y445r3   c                    | j                  t        j                         g }| j                  d      r| j	                  d      t        j
                  k7  r|r2| j	                  d      t        j                  k(  r| j	                          |j                  | j                  |             | j                  d      r#| j	                  d      t        j
                  k7  r| j                  t        j
                         |S rg   )	r\   r    r,   rW   rX   r-   ri   rp   process_next_expression)rJ   r_   rm   s      r4   rj   zDrtParser.handle_conds   s    Y334ll1o$**Q-93J3J"JA)//9

LL55g>?	 ll1o$**Q-93J3J"J
 	Y445r3   c                     | j                  |      }| j                  d       | j                  t        j                        }t        ||      S )Nr&   )make_VariableExpressionr\   rs   r    r.   DrtProposition)rJ   rQ   r_   variabledrss        r4   r]   zDrtParser.handle_prop   sA    //4S!**9??;h,,r3   c                     t        ||      S )zlThis method serves as a hook for other logic parsers that
        have different equality expression classesDrtEqualityExpressionrJ   firstseconds      r4   make_EqualityExpressionz!DrtParser.make_EqualityExpression   s     %UF33r3   c                     |t         j                  k(  rd S |t         j                  v rt        S |t         j                  v rd }|S y)zbThis method serves as a hook for other logic parsers that
        have different boolean operatorsc                     t        | |d       S rP   DrtConcatenationr}   r~   s     r4   <lambda>z9DrtParser.get_BooleanExpression_factory.<locals>.<lambda>   s    )9%)N r3   c                     t        | t              r!t        | j                  | j                  |      S t        | t              r!t	        | j
                  | j                  |      S t        d      Nz'Antecedent of implication must be a DRS)
isinstancer!   rl   rm   r   r}   r~   	Exceptionr   s     r4   make_imp_expressionzDDrtParser.get_BooleanExpression_factory.<locals>.make_imp_expression   sQ    eS)uzz5;;??e%56+EKKvNN IJJr3   N)r    r*   rG   DrtOrExpressionrH   )rJ   rQ   r   s      r4   get_BooleanExpression_factoryz'DrtParser.get_BooleanExpression_factory   sK     )$$$NNI%%%""I&&&K '&r3   c                      |||      S rP   r2   )rJ   factoryr}   r~   s       r4   make_BooleanExpressionz DrtParser.make_BooleanExpression   s    uf%%r3   c                     t        ||      S rP   DrtApplicationExpression)rJ   functionarguments      r4   make_ApplicationExpressionz$DrtParser.make_ApplicationExpression   s    '(;;r3   c                 *    t        t        |            S rP   )DrtVariableExpressionr   )rJ   names     r4   ru   z!DrtParser.make_VariableExpression   s    $Xd^44r3   c                     t        ||      S rP   )DrtLambdaExpression)rJ   	variablesterms      r4   make_LambdaExpressionzDrtParser.make_LambdaExpression   s    "9d33r3   N)r'   r(   r)   __doc__rA   rN   rR   r`   re   rY   rh   rj   r]   r   r   r   r   ru   r   r2   r3   r4   r6   r6   :   sP    .
!+:20	&		-4
(&<54r3   r6   c                       e Zd ZdZ e       Zed        Zd Zd Z	d Z
d Zd Zdd	Zed
        ZddZd ZddZd Zd Zd Zd Zd Zd Zd Zd Zy)DrtExpressionz_
    This is the base abstract DRT Expression from which every DRT
    Expression extends.
    c                 8    | j                   j                  |      S rP   )_drt_parserparse)clsss     r4   
fromstringzDrtExpression.fromstring   s    $$Q''r3   c                     t        | |      S rP   r   rJ   others     r4   applytozDrtExpression.applyto   s    'e44r3   c                     t        |       S rP   rb   rM   s    r4   __neg__zDrtExpression.__neg__   s    #D))r3   c                     t         S rP   )NotImplementedr   s     r4   __and__zDrtExpression.__and__   s    r3   c                 >    t        |t              sJ t        | |      S rP   )r   r   r   r   s     r4   __or__zDrtExpression.__or__   s    %///tU++r3   c                     t        |t              sJ t        | t              r!t        | j                  | j                  |      S t        | t
              r!t        | j                  | j                  |      S t        d      r   )	r   r   r!   rl   rm   r   r}   r~   r   r   s     r4   __gt__zDrtExpression.__gt__   sa    %///dC tyy$**e44d,-#DJJUCCABBr3   Nc                     t        |t              sJ | j                         j                         }|j                         j                         }|j	                  ||      S )a<  
        Check for logical equivalence.
        Pass the expression (self <-> other) to the theorem prover.
        If the prover says it is valid, then the self and other are equal.

        :param other: an ``DrtExpression`` to check equality against
        :param prover: a ``nltk.inference.api.Prover``
        )r   r   simplifyfolequiv)rJ   r   proverf1f2s        r4   r   zDrtExpression.equiv   sN     %///]]_  "^^!!#xxF##r3   c                 F    t        d| j                  j                  z        )Nz#'%s' object has no attribute 'type')AttributeError	__class__r'   rM   s    r4   typezDrtExpression.type   s!    1DNN4K4KK
 	
r3   c                     t               rP   NotImplementedError)rJ   	signatures     r4   	typecheckzDrtExpression.typecheck   s    !##r3   c                     t        | |d       S rP   r   r   s     r4   __add__zDrtExpression.__add__   s    eT22r3   c                     t               )z
        Return the set of discourse referents in this DRS.
        :param recursive: bool Also find discourse referents in subterms?
        :return: list of ``Variable`` objects
        r   rJ   	recursives     r4   get_refszDrtExpression.get_refs   s     "##r3   c                     t        | t              xri t        | j                  t              xrM | j                  j                  j
                  t        j                  k(  xr t        | j                  t              S )zIs self of the form "PRO(x)"?)
r   r   r   DrtAbstractVariableExpressionrw   r   r    r+   r   DrtIndividualVariableExpressionrM   s    r4   is_pronoun_functionz!DrtExpression.is_pronoun_function   sd     t56 K4==*GHK&&++y/@/@@K 4==*IJ		
r3   c                     t        ||      S rP   rz   r|   s      r4   r   z%DrtExpression.make_EqualityExpression	  s    $UF33r3   c                     t        |      S rP   )r   )rJ   rw   s     r4   ru   z%DrtExpression.make_VariableExpression  s    $X..r3   c                     t        |       S rP   )resolve_anaphorarM   s    r4   r   zDrtExpression.resolve_anaphora  s    %%r3   c                 <    | j                  d | j                        S )Nc                 "    | j                         S rP   )eliminate_equality)es    r4   r   z2DrtExpression.eliminate_equality.<locals>.<lambda>  s    q/C/C/E r3   )visit_structuredr   rM   s    r4   r   z DrtExpression.eliminate_equality  s    $$%Et~~VVr3   c                 @    dj                  | j                               S )zG
        Draw the DRS
        :return: the pretty print string
        
)join_prettyrM   s    r4   pretty_formatzDrtExpression.pretty_format  s    
 yy((r3   c                 6    t        | j                                y rP   )printr   rM   s    r4   pretty_printzDrtExpression.pretty_print  s    d  "#r3   c                 6    t        |       j                          y rP   )	DrsDrawerdrawrM   s    r4   r   zDrtExpression.draw  s    $r3   rP   F)r'   r(   r)   r   r6   r   classmethodr   r   r   r   r   r   r   propertyr   r   r   r   r   r   ru   r   r   r   r   r   r2   r3   r4   r   r      s    
 +K( (5*,C$ 
 

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

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

 LL:}mT  I, s   H
H1H
c                 8   t        t        j                  | j                  D cg c]  }|j	                          c}t                     }| j                  r)|j                  | j                  j	                                |t        | j                        z
  S c c}w )z:see: Expression.free())	r   operatoror_rm   r   r   r   updaterl   )rJ   c
conds_frees      r4   r   zDRS.freen  sf    HLLTZZ*H1668*H#%P
??doo2245C		N** +Is   B
c                    |rt| j                   t        t        j                  d | j                  D                    z   }| j
                  r*|j                  | j
                  j                  d             |S | j                   S )#:see: AbstractExpression.get_refs()c              3   >   K   | ]  }|j                  d         ywTN)r   ).0r   s     r4   	<genexpr>zDRS.get_refs.<locals>.<genexpr>y  s     #IAJJt$4#Is   T)rl   listr   from_iterablerm   r   extendr   )rJ   r   
conds_refss      r4   r   zDRS.get_refsu  sh    T###Idjj#II& J !!$//":":4"@A99r3   c                     t        t        || j                              }| j                  r!|j	                   || j                                ||      S z:see: Expression.visit())r  maprm   r   rp   )rJ   r   
combinatorpartss       r4   visitz	DRS.visit  s>    S4::./??LL$//23%  r3   c           	          | j                   r || j                         nd} || j                  t        t        || j                              |      S )#:see: Expression.visit_structured()N)r   rl   r  r  rm   )rJ   r   r  r   s       r4   r   zDRS.visit_structured  s;    26//Xdoo.t
$))T#h

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

.K1quuw.KL%eT__-@-@-BC++-yy2 2%c512 L :: OPP=DJJ*Gq1557*GHE8T%<%<TYY%G"%MN 5(e45L% /L +Hs   E
&E
c           	         dj                  | j                  | j                              }| j                  D cg c]  }t	        d |j                                c}D cg c]  }|D ]  }|  }}}t        t        |      gt        t        t        |            z         }dd|z  z   dz   d|j                  |      z   dz   dd	|z  z   d
z   g|D cg c]  }d|j                  |      z   dz    c}z   dd|z  z   dz   gz   }| j                  r=t        j                  |t        j                  | j                  j                               S |S c c}w c c}}w c c}w )N c                 "    | j                         S rP   )strip)r   s    r4   r   zDRS._pretty.<locals>.<lambda>  s     r3   z __z_ z| z |z|--z-|z|_z_|)r   r  rl   rm   filterr   maxr  r  r  ljustr   DrtBinaryExpression_assemble_prettyr    IMP)rJ   	refs_liner   	cond_line
cond_lineslengthlinerx   s           r4   r   zDRS._pretty  sq   HHT44TYY?@	
 IM

@D*DLLN;
 "

 	 


 
 c)n%Sj-A(BBC sV|#d*yv..5sV|#d*
 =GGDtdjj((4/GH cFl"T)*+ 	 ??&77Y]]DOO$;$;$=  
'
 Hs   "E!EEc                    |D cg c]  }d|z  	 }}g }g }g }g }|D ]j  }t        |      r|j                  |        t        |      r|j                  |       =t        |      r|j                  |       Z|j                  |       l t	        |      t	        |d       z   t	        |d       z   t	        |d       z   S c c}w )N%sc                 F    t        | dd  dgt        | dd        dk(           S )Nr9   r  r   intr  vs    r4   r   z(DRS._order_ref_strings.<locals>.<lambda>  s(    sAabE2;s1QR5zQ3O/P r3   )keyc           	      P    | d   t        | dd  dgt        | dd        dk(           fS Nr   r8   r  r)  r+  s    r4   r   z(DRS._order_ref_strings.<locals>.<lambda>  s2    qtS!AB%S12ZST_9U5V.W r3   c           	      P    | d   t        | dd  dgt        | dd        dk(           fS r/  r)  r+  s    r4   r   z(DRS._order_ref_strings.<locals>.<lambda>  s2    adC12C!"JRSO8T4U-V r3   )r   rp   r   r   sorted)	rJ   rl   r   stringsind_vars	func_vars
event_vars
other_varsr   s	            r4   r  zDRS._order_ref_strings  s    )-.#4#:..	

 	%A|"A  #Q!!!$!!!$	% :Z%PQRY$WXY X#VWX	
 /s   Cc                    t        |t              rt        | j                        t        |j                        k(  r|}t	        | j                  |j                        D ])  \  }}| j                  |      }|j                  ||d      }+ | j                  |j                  k(  r[t        | j                        t        |j                        k(  r0t	        | j                  |j                        D ]  \  }}||k(  r y yyz}Defines equality modulo alphabetic variance.
        If we are comparing \x.M  and \y.N, then check equality of M and N[x/y].TF)	r   r!   r  rl   zipru   r   r   rm   )rJ   r   converted_otherr1r2varexc1c2s           r4   __eq__z
DRS.__eq__  s     eS!499~UZZ0"'!$))_-A-AB OFB 88<E&5&=&=b%&NOO ??o&@&@@SJJF../F0 #&djj/2G2G"H )B "b#()  r3   c                     | |k(   S rP   r2   r   s     r4   __ne__z
DRS.__ne__      5=  r3   c                 h   dj                  dj                  | j                  | j                              dj                  d | j                  D                    }| j
                  rKt        j                  |z   dz   t        j                  z   dz   d| j
                  z  z   t        j                  z   S |S )Nz([{}],[{}]),, c              3   &   K   | ]	  }d |z    ywr'  Nr2   )r   r   s     r4   r   zDRS.__str__.<locals>.<genexpr>  s     9ddTk9   r  r'  )
formatr   r  rl   rm   r   r    rV   r   rk   rJ   rx   s     r4   __str__zDRS.__str__  s    ""HHT,,TYY78II9djj99
 ?? --  	
 () //" 
r3   rP   FTr   )r'   r(   r)   r   rA   r   r   r   r
  r   r   r   r   r  r@  rB  r   __hash__rL  r2   r3   r4   r!   r!   #  sV    /%<|+
!R
"0H04
,$! ""Hr3   r!   c                     t        | j                        rt        |       S t        | j                        rt	        |       S t        | j                        rt        |       S t        |       S )z
    This is a factory method that instantiates and returns a subtype of
    ``DrtAbstractVariableExpression`` appropriate for the given variable.
    )r   r   r   r   DrtFunctionVariableExpressionr   DrtEventVariableExpressionDrtConstantExpression)rw   s    r4   r   r   "  sT    
 .x88	HMM	",X66	X]]	#)(33$X..r3   c                   &    e Zd Zd ZddZd Zd Zy)r   c                     | S rP   r2   rM   s    r4   r   z!DrtAbstractVariableExpression.fol2      r3   c                     g S r   r2   r   s     r4   r   z&DrtAbstractVariableExpression.get_refs5  s    	r3   c                 4    d| z  }dt        |      z  }||||gS Nr'  r  r  rJ   r   blanks      r4   r   z%DrtAbstractVariableExpression._pretty9  s'    4Kc!fua''r3   c                     | S rP   r2   rM   s    r4   r   z0DrtAbstractVariableExpression.eliminate_equality>  rU  r3   Nr   )r'   r(   r)   r   r   r   r   r2   r3   r4   r   r   1  s    (
r3   r   c                       e Zd Zy)r   Nr'   r(   r)   r2   r3   r4   r   r   B       	r3   r   c                       e Zd Zy)rP  Nr_  r2   r3   r4   rP  rP  H  r`  r3   rP  c                       e Zd Zy)rQ  Nr_  r2   r3   r4   rQ  rQ  N  r`  r3   rQ  c                       e Zd Zy)rR  Nr_  r2   r3   r4   rR  rR  T      r3   rR  c                   j    e Zd Zd ZddZd ZddZd Zd Ze	j                  Z
d Zd Zd	 Zd
 Zd Zy)rv   c                      || _         || _        y rP   rw   rx   )rJ   rw   rx   s      r4   rA   zDrtProposition.__init__Y  s     r3   c           	         | j                   |k(  rIt        |t              sJ d       t        |j                   | j                  j                  ||||            S t        | j                   | j                  j                  ||||            S )Nz4Can only replace a proposition label with a variable)rw   r   r   rv   rx   r   )rJ   rw   rd   r   r   s        r4   r   zDrtProposition.replace]  s    ==H$9 FEF  "##  :}mT 
 "  :}mT r3   c                 ^    t        | j                  | j                  j                               S rP   )rv   rw   rx   r   rM   s    r4   r   z!DrtProposition.eliminate_equalityl  s     dmmTXX-H-H-JKKr3   c                 @    |r| j                   j                  d      S g S NT)rx   r   r   s     r4   r   zDrtProposition.get_refso  s    *3txx  &;;r3   c                     | j                   |j                   k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rP   )r   rw   rx   r   s     r4   r@  zDrtProposition.__eq__r  sA    NNeoo- &/&EII%	
r3   c                     | |k(   S rP   r2   r   s     r4   rB  zDrtProposition.__ne__y  rC  r3   c                 6    | j                   j                         S rP   )rx   r   rM   s    r4   r   zDrtProposition.fol~  s    xx||~r3   c                 >   | j                   j                         }dt        d| j                  z        z  }|d d D cg c]
  }|dz   |z    c}|dd D cg c]  }d| j                  z  dz   |z    c}z   |dd  D cg c]
  }|dz   |z    c}z   S c c}w c c}w c c}w )Nr  r'  r8   r9   r&   )rx   r   r  rw   )rJ   drs_sr\  r%  s       r4   r   zDrtProposition._pretty  s      "c$.//,1"1I6DUS[46=B1QZHTtdmm#c)D0HI.3ABi8dus{T!89	
6H8s   BB<Bc                 4     | || j                         g      S r  )rx   rJ   r   r  s      r4   r
  zDrtProposition.visit  s    8DHH-.//r3   c                 H     || j                    || j                              S )r  rg  rr  s      r4   r   zDrtProposition.visit_structured  s    $--$(();<<r3   c                 <    d| j                    d| j                   dS )Nzprop(rF  )rg  rM   s    r4   rL  zDrtProposition.__str__  s    t}}oRz33r3   NrM  r   )r'   r(   r)   rA   r   r   r   r@  rB  r   rN  r   r   r
  r   rL  r2   r3   r4   rv   rv   X  sG    L<
! ""H
0=4r3   rv   c                        e Zd Zd ZddZd Zy)rc   c                 H    t        | j                  j                               S rP   )r   r   r   rM   s    r4   r   zDrtNegatedExpression.fol  s     11r3   c                 8    | j                   j                  |      S rW  )r   r   r   s     r4   r   zDrtNegatedExpression.get_refs  s    yy!!),,r3   c                    | j                   j                         }|d d D cg c]  }d|z   	 c}|dd D cg c]  }d|z   	 c}z   |dd D cg c]  }d|z   	 c}z   |dd  D cg c]  }d|z   	 c}z   S c c}w c c}w c c}w c c}w )Nr9       r:   z__  r;   z  | )r   r   )rJ   
term_linesr%  s      r4   r   zDrtNegatedExpression._pretty  s    YY&&(
'1"1~6tVd]6)3Aa9v}9:)3Aa9v}9: *4AB8v}89	
6998s   A6A;B %BNr   r'   r(   r)   r   r   r   r2   r3   r4   rc   rc     s    2-
r3   rc   c                   &    e Zd Zd Zd Zd ZddZy)r   c           	          | j                  || j                  j                  | j                  t	        |      d            S )zRename all occurrences of the variable introduced by this variable
        binder in the expression to ``newvar``.
        :param newvar: ``Variable``, for the new variable
        T)r   r   r   rw   r   )rJ   r   s     r4   r   z!DrtLambdaExpression.alpha_convert  s8    
 ~~IIdmm-B6-JDQ
 	
r3   c                 ^    t        | j                  | j                  j                               S rP   )r   rw   r   r   rM   s    r4   r   zDrtLambdaExpression.fol  s    tyy}}??r3   c                 l   | j                   g}| j                  }|j                  | j                  k(  rA|j                  |j                          |j                  }|j                  | j                  k(  rAdj	                  d |D              t
        j                  z   }|j                         }dt        |      z  }|d d D cg c]
  }d|z   |z    c}|dd D cg c]
  }d|z   |z    c}z   |dd D cg c]
  }d|z   |z    c}z   |dd  D cg c]
  }d|z   |z    c}z   S c c}w c c}w c c}w c c}w )	Nr  c              3   &   K   | ]	  }d |z    ywrH  r2   )r   r,  s     r4   r   z.DrtLambdaExpression._pretty.<locals>.<genexpr>  s     :1dQh:rI  r8   rz  r9   z \  r:   z /\ )	rw   r   r   rp   r   r    DOTr   r  )rJ   r   r   
var_stringr{  r\  r%  s          r4   r   zDrtLambdaExpression._pretty  s%   ]]O	yynn.T]]+99D nn. XX:	::Y]]J
\\^
c*o%/9"1~>tVe^d">2<Qq/B$w%BC7A!AGtw#d*GH 2<AB@v~$@A	
>BG@s   D"D'4D,D1c                 r    |r)| j                   g| j                  j                  d      z   S | j                   gS r   T)rw   r   r   r   s     r4   r   zDrtLambdaExpression.get_refs  s7     ;DT]]Odii0066	
JN--	
r3   Nr   )r'   r(   r)   r   r   r   r   r2   r3   r4   r   r     s    
@
 
r3   r   c                   0    e Zd ZddZd Zed        Zd Zy)r  c                 x    |r7| j                   j                  d      | j                  j                  d      z   S g S r  )r}   r   r~   r   s     r4   r   zDrtBinaryExpression.get_refs  s;     GPDJJ%(<(<T(BB	
UW	
r3   c                     t         j                  | j                  | j                        | j	                         | j                  | j
                              S rP   )r  r  _pretty_subexr}   getOpr~   rM   s    r4   r   zDrtBinaryExpression._pretty  sB    "33tzz*JJLt{{+
 	
r3   c                    t        t        |       t        |            }t        | |      } t        ||      }dt        |      z  }t        t	        | |            }|d d D cg c]  \  }}d|z   dz   |z   dz   |z   dz    c}}|dd D cg c]  \  }}d|z   dz   |z   dz   |z   dz    c}}z   |dd  D cg c]  \  }}d|z   dz   |z   dz   |z   dz    c}}z   S c c}}w c c}}w c c}}w )Nr  r9   r:   (ru  )r  r  _pad_verticallyr  r9  )first_linesopsecond_lines	max_linesr\  first_second_lines
first_linesecond_lines           r4   r  z$DrtBinaryExpression._assemble_pretty  s3   K(#l*;<	%k9=&|Y?c"g!#k<"@A 0B"1/E+J j 3&.4{BSH 0B!A/F+J j 3&+c1K?#E	 0B!"/E+J j 3&.4{BSH	
s   "CC 6C&c                 "    |j                         S rP   )r   )rJ   subexs     r4   r  z!DrtBinaryExpression._pretty_subex  s    }}r3   Nr   )r'   r(   r)   r   r   staticmethodr  r  r2   r3   r4   r  r    s%    

 
 
*r3   r  c                       e Zd Zy)DrtBooleanExpressionNr_  r2   r3   r4   r  r    rd  r3   r  c                       e Zd Zd Zd Zy)r   c                 z    t        | j                  j                         | j                  j                               S rP   )r   r}   r   r~   rM   s    r4   r   zDrtOrExpression.fol  s%    DJJNN,dkkoo.?@@r3   c                     t        |t              r!|j                         D cg c]  }|dd 	 c}S t        j	                  | |      S c c}w Nr8   r  )r   r   r   r  r  rJ   r  r%  s      r4   r  zDrtOrExpression._pretty_subex  sA    e_-+0==?;4D2J;;#11$>> <   AN)r'   r(   r)   r   r  r2   r3   r4   r   r     s    A?r3   r   c                       e Zd Zd Zy)r{   c                 z    t        | j                  j                         | j                  j                               S rP   )r   r}   r   r~   rM   s    r4   r   zDrtEqualityExpression.fol  s%    !$**.."2DKKOO4EFFr3   N)r'   r(   r)   r   r2   r3   r4   r{   r{     s    Gr3   r{   c                       e Zd ZdZddZddZd Zd ZddZd Z	d	 Z
d
 Zej                  Zd Zd Zd Zd Zd Zd Zy)r   zDRS of the form '(DRS + DRS)'Nc                 @    t         j                  | ||       || _        y rP   )r  rA   r   )rJ   r}   r~   r   s       r4   rA   zDrtConcatenation.__init__  s    %%dE6:$r3   c                    | j                   }| j                  }| j                  }|| j                         v rB|r|j	                  ||||      }|j	                  ||||      }|r|j	                  ||||      }n|rt        | j                  d            |j                         z  D ]U  }t        t        |            }	|j	                  ||	d|      }|j	                  ||	d|      }|sB|j	                  ||	d|      }W |j	                  ||||      }|j	                  ||||      }|r|j	                  ||||      }| j                  |||      S )r   T)
r}   r~   r   r   r   r   r   r   r   r   )
rJ   rw   rd   r   r   r}   r~   r   r   r,  s
             r4   r   zDrtConcatenation.replace  s[    

__
 t}}&j-  j- !+!3!3 *m]"J t}}T23joo6GG UC-oc.BCA!MM#q$FE#^^CD-HF!%/%7%7Qm%T
U MM(J}UE^^Hj-WF'//j-
 ~~eVZ88r3   c                 f    | j                         }t        |t              rJ |j                         S rP   )r   r   r   r   rK  s     r4   r   z#DrtConcatenation.eliminate_equality6  s-    mmoc#3444%%''r3   c                 X   | j                   j                         }| j                  j                         }| j                  r| j                  j                         nd }t	        |t
              rt	        |t
              rt        |j                  d            t        |j                  d            z  D ])  }t        t        |            }|j                  ||d      }+ t        |j                  |j                  z   |j                  |j                  z   |      S | j                  |||      S rk  )r}   r   r~   r   r   r!   r   r   r   r   r   rl   rm   r   )rJ   r}   r~   r   r   r   s         r4   r   zDrtConcatenation.simplify<  s    

##%%%'37??T__--/
eS!j&=5>>$/03vt7L3MM ;.s/CDVT:;
 uzzFKK/v||1KZXX>>%<<r3   c                     | j                   j                  |      | j                  j                  |      z   }| j                  r,|r*|j	                  | j                  j                  d             |S r  )r}   r   r~   r   r  )rJ   r   rl   s      r4   r   zDrtConcatenation.get_refsL  sS    zz""9-0D0DY0OO??yKK0067r3   c                 "    t         j                  S rP   )r    r*   rM   s    r4   r  zDrtConcatenation.getOpS  s    !!!r3   c                    t        |t              r| j                         }|j                         }t        |      t        |      k(  r|}t	        ||      D ])  \  }}| j                  |      }|j                  ||d      }+ | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S yr8  )
r   r   r   r  r9  ru   r   r}   r~   r   )rJ   r   	self_refs
other_refsr:  r;  r<  r=  s           r4   r@  zDrtConcatenation.__eq__V  s     e-.I)J9~Z0"'!)Z8 OFB 88<E&5&=&=b%&NOO JJ/"7"77 F'='==F?+E+EE
 r3   c                     | |k(   S rP   r2   r   s     r4   rB  zDrtConcatenation.__ne__h  rC  r3   c                     t        | j                  j                         | j                  j                               }| j                  r$t        || j                  j                               }|S rP   )r   r}   r   r~   r   r   )rJ   r   s     r4   r   zDrtConcatenation.folm  sI    $**..*DKKOO,=>??a!4!4!67Ar3   c                 F   t         j                  | j                  | j                        | j	                         | j                  | j
                              }| j                  r=t         j                  |t        j                  | j                  j                               }|S rP   )
r  r  r  r}   r  r~   r   r    r   r   rK  s     r4   r   zDrtConcatenation._prettys  sw    !22tzz*JJLt{{+

 ??%66Y]]DOO$;$;$=C 
r3   c                     t        |t              r!|j                         D cg c]  }|dd 	 c}S t        j	                  | |      S c c}w r  )r   r   r   r  r  r  s      r4   r  zDrtConcatenation._pretty_subex  sB    e-.+0==?;4D2J;;#11$>> <r  c                     | j                   r; | || j                         || j                         || j                         g      S  | || j                         || j                        g      S r  )r   r}   r~   rr  s      r4   r
  zDrtConcatenation.visit  s_    ??$**%x'<ht>WX  x

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

_str_subexr}   r~   r   rV   r  rk   r   r    r   )rJ   r}   r~   rx   s       r4   rL  zDrtConcatenation.__str__  s    

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

 
J 0	1##!1*//5J<CW!X
 	
 
2r3   c                   |    e Zd ZdZdZdZddZd ZeefdZd Z	d	 Z
d
 ZddZd Zd Zd Zd Zd Zd Zd Zd Zy)r   r:   
   r=   Nc                    d}|sddl m}m} ddlm}  |       }|j                  d        |dd      }|rw ||dd	      }||_        || _        | j                  || j                  | j                        \  }	}
t        |	| j                  z   d
      }|
| j                  z   } ||||	      }n ||dd	      }|j                          ||_        || _        || _        || _        y)a  
        :param drs: ``DrtExpression``, The DRS to be drawn
        :param size_canvas: bool, True if the canvas size should be the exact size of the DRS
        :param canvas: ``Canvas`` The canvas on which to draw the DRS.  If none is given, create a new canvas.
        Nr   )CanvasTk)FontDRT	helvetica   )familysize)widthheightd   i,  )tkinterr  r  tkinter.fontr  titlefontcanvas_visit
OUTERSPACETOPSPACEr  packrx   master)rJ   rx   size_canvasr  r  r  r  r  r  rightbottomr  r  s                r4   rA   zDrsDrawer.__init__B  s      +)TFLL{4Da:"$"&++c4??DMM"REDOO3S9$//1eFCc#>KKMFKr3   c                 L    | j                   j                  j                  d      S )z Get the height of a line of text	linespace)r  r  metricsrM   s    r4   _get_text_heightzDrsDrawer._get_text_heighth  s    {{''44r3   c                     | j                  | j                  | j                  ||       | j                  r%t	               s| j                  j                          y| j                  | j                  ||      S )zDraw the DRSN)_handlerx   _draw_commandr  r   mainloopr  )rJ   rK   ys      r4   r   zDrsDrawer.drawl  sP    TXXt111a8;;wyKK  ";;txxA..r3   c                 >    | j                  || j                  ||      S )a!  
        Return the bottom-rightmost point without actually drawing the item

        :param expression: the item to visit
        :param x: the top of the current drawing area
        :param y: the left side of the current drawing area
        :return: the bottom-rightmost point
        )r  _visit_command)rJ   rd   rK   r  s       r4   r  zDrsDrawer._visitu  s     ||J(;(;QBBr3   c                    t        |t              r5| j                  j                  ||d| j                  j                  |       ntt        |t
              rd|\  }}| j                  j                  ||||       || j                         z   | j                  dz  z   }| j                  j                  ||||       | j                  |||      S )a   
        Draw the given item at the given location

        :param item: the item to draw
        :param x: the top of the current drawing area
        :param y: the left side of the current drawing area
        :return: the bottom-rightmost point
        nw)anchorr  textr9   )r   strr  create_textr  tuplecreate_rectangler  BUFFERcreate_liner   )rJ   r  rK   r  r  r  horiz_line_ys          r4   r  zDrsDrawer._draw_command  s     dC KK##AqDKK<L<LSW#Xe$"OUFKK((Auf=D))++t{{Q?  KK##A|ULI""4A..r3   c                     t        |t              r;|| j                  j                  j	                  |      z   || j                         z   fS t        |t              r|S y)a  
        Return the bottom-rightmost point without actually drawing the item

        :param item: the item to visit
        :param x: the top of the current drawing area
        :param y: the left side of the current drawing area
        :return: the bottom-rightmost point
        N)r   r  r  r  measurer  r  )rJ   r  rK   r  s       r4   r   zDrsDrawer._visit_command  sU     dC ((0066D<Q<Q<S8STTe$K %r3   c                    || j                   k(  r#	 |j                  |z   }|j                  |z   }||fS t	        |t
              r| j                  }nt	        |t              r| j                  }nt	        |t              r| j                  }nt	        |t              r| j                  }nt	        |t              r| j                  }nvt	        |t              r| j                   }nYt	        |t"              r| j                  }n<t	        |t$              r| j&                  }nt)        |j*                  j,                         |||||      \  }}||z
  |_        ||z
  |_        ||fS # t        $ r Y 9w xY w)a1  
        :param expression: the expression to handle
        :param command: the function to apply, either _draw_command or _visit_command
        :param x: the top of the current drawing area
        :param y: the left side of the current drawing area
        :return: the bottom-rightmost point
        )r   _drawing_width_drawing_heightr   r   r   _handle_VariableExpressionr!   _handle_DRSrc   _handle_NegatedExpressionr   _handle_LambdaExpressionr
   _handle_BinaryExpressionr   _handle_ApplicationExpressionr  rv   _handle_DrtPropositionr   r   r'   )rJ   rd   commandrK   r  r  r  r   s           r4   r  zDrsDrawer._handle  sT    d)))"11A5#33a7v&
 j"?@55G
C(&&G
$8944G
$7833G
$4533G
$<=88G
$7855G
N311GJ0099::!*gq!< %*AI
!%+aZ
"v; " s   !E   	E-,E-c                      |d|z  ||      S )Nr'  r2   )rJ   rd   r  rK   r  s        r4   r  z$DrsDrawer._handle_VariableExpression  s    tj(!Q//r3   c           
         | j                  t        j                  ||      d   }| j                  |j                  |||      \  }} |t        j                  || j                  |||z
  | j                                      ||fS rg   )r   r    NOTr  r   _get_centered_topr  rJ   rd   r  rK   r  r  r  s          r4   r  z#DrsDrawer._handle_NegatedExpression  s|    ##IMM1a8; ,,zJ 	MM""1fqj$2G2G2IJ	
 vr3   c                    || j                   z   }|| j                   z   }|j                  r#dj                  d |j                  D              }nd} ||||      \  }}|| j                   dz  z  }|j                  rD|j                  D ]4  }	| j	                  |	|||      \  }
}t        ||
      }|| j                   z  }6 n || j                         | j                   z   z  }|| j                   z  } |||f||      S )Nr  c              3   &   K   | ]	  }d |z    ywrH  r2   )r   rs     r4   r   z(DrsDrawer._handle_DRS.<locals>.<genexpr>  s     >D1H>rI  z     r9   )r	  rl   r   rm   r  r  r  )rJ   rd   r  rK   r  leftr  rl   	max_rightr   r  s              r4   r  zDrsDrawer._handle_DRS  s    4;;T[[ ??88>joo>>DD%dD&9F$++/! "(( &"&,,tWdF"K	51	$++%&
 d++-;;F 	T[[ 		6*Aq11r3   c                 (   |j                         \  }}t        |t              s|j                  }|j                  g}| j                  |||      d   }t        |g|D cg c]  }| j                  |||      d    c}z         }	|	|z
  }
| j                  ||
|j                        }| j                  ||||      d   }| j                  ||
| j                               } |t        j                  ||      d   }t        |      D ]i  \  }}| j                  ||
|j                        }| j                  ||||      d   }|dz   t        |      k  sL |t        j                  dz   ||      d   }k  |t        j                   ||      d   }||	fS c c}w )Nr8   r   r  )r  r   r   r   r   r  r  r  r  r  r  r    rV   	enumerater  ri   rk   )rJ   rd   r  rK   r  r   r  function_bottomr  
max_bottomline_heightfunction_drawing_topr  centred_string_topr   arg_drawing_tops                   r4   r  z'DrsDrawer._handle_ApplicationExpression  s   #++-$($AB!**H''(D ++h15a8d KsS!Q!7!: KK

 !1n  $55{H44 
 Xw3GHK "33{D113
 	/AB1E  o 	UFAs"44; 3 3O LLguoFqIE1us4y 	# 5u>PQRST	U 	0BCAFz""? !Ls   F
c           
      2   t         j                  d|j                  z  z   t         j                  z   }| j	                  |||      d   }| j                  |j                  |||      \  }} |||| j                  |||z
  | j                                      ||fS )Nr'  r   )	r    LAMBDArw   r  r   r  r   r  r  )rJ   rd   r  rK   r  r   r  r  s           r4   r  z"DrsDrawer._handle_LambdaExpression)  s    $$tj.A.A'AAIMMQ	##Iq!4Q7 ,,zJ 	q$00FQJ@U@U@WX	
 vr3   c           
         | j                  |j                  dd      d   }| j                  |j                  dd      d   }t        ||      }| j	                  ||| j                               } |t        j                  ||      d   }	|j                  j                  }| j                  |j                  ||	| j	                  |||            \  }	}
 |d|j                         z  |	|      d   }	|j                  j                  }| j                  |j                  ||	| j	                  |||            \  }	} |t        j                  |	|      d   }	|	t        |
|      fS )Nr   r8   z %s )r  r}   r~   r  r  r  r    rV   r  r  r  rk   )rJ   rd   r  rK   r  first_heightsecond_heightr'  r)  r  first_bottomsecond_bottoms               r4   r  z"DrsDrawer._handle_BinaryExpression8  sd   {{:#3#3Q:1=J$5$5q!<Q?,6 "33{D113
 	+=>qA "''77 $""1k<@	!
 !1!1!33U<NOPQR #))99!%""1k=A	"
 	0BCAFs<788r3   c                 z     ||j                   ||      d   }| j                  |j                  |||      \  }}||fS rg   )rw   r  r   r  s          r4   r  z DrsDrawer._handle_DrtProposition^  sC    
++Q215 ,,zJvr3   c                     |||z
  dz  z   S )zGet the y-coordinate of the point that a figure should start at if
        its height is 'item_height' and it needs to be centered in an area that
        starts at 'top' and is 'full_height' tall.r9   r2   )rJ   topfull_heightitem_heights       r4   r  zDrsDrawer._get_centered_topg  s     kK/1444r3   r   )r   r   )r'   r(   r)   r	  r  r  rA   r  r   r  r  r   r  r  r  r  r  r  r  r  r  r2   r3   r4   r   r   =  sh    FHJ$L5  8 /	C/,,\0 22)#V$9L5r3   r   c                     t        d       t        j                  } t         | d             t         | d             t         | d             t         | d             t         | d             t         | d             t         | d             t         | d	             t         | d
             t        d       t         | d      j                                t        d        | d      }t        |       |j	                  t        d            }t        |       t        ||k(         t        d       t        t         | d                   t        t         | d                   t        t         | d                   t        d        | d      j                           | d      j                           | d      j                           | d      j                           | d      j                          y )Nz2====================TEST PARSE====================([x,y],[sees(x,y)])([x],[man(x), walks(x)])z\x.\y.([],[sees(x,y)])z\x.([],[walks(x)])(john)z$(([x],[walks(x)]) + ([y],[runs(y)]))z#(([],[walks(x)]) -> ([],[runs(x)]))z([x],[PRO(x), sees(John,x)]) ([x],[man(x), -([],[walks(x)])])*([],[(([x],[man(x)]) -> ([],[walks(x)]))])z2====================Test fol()====================z\====================Test alpha conversion and lambda expression equality====================z\x.([],[P(x)])zz?====================Test resolve_anaphora()====================z,([x,y,z],[dog(x), cat(y), walks(z), PRO(z)])z3([],[(([x],[dog(x)]) -> ([y],[walks(y), PRO(y)]))])z(([x,y],[]) + ([],[PRO(x)]))z;====================Test pretty_print()====================([],[])z@([],[([x],[big(x), dog(x)]) -> ([],[bark(x)]) -([x],[walk(x)])])z'([x,y],[x=y]) + ([z],[dog(z), walk(z)])z4([],[([x],[]) | ([y],[]) | ([z],[dog(z), walk(z)])])z0\P.\Q.(([x],[]) + P(x) + Q(x))(\x.([],[dog(x)])))r   r   r   r   r   r   r   r   )dexpre1e2s      r4   demorA  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Mr3   c                      	 ddl m}  g d}|D ]'  }t        j                  |      }|j                          ) y # t        $ r}t        d      d }~ww xY w)Nr   )r  z,tkinter is required, but it's not available.)rK   r=  z([x],[])z([x],[man(x)])r8  r9  z\x.([],[man(x), walks(x)])z\x y.([],[sees(x,y)])z)([],[(([],[walks(x)]) + ([],[runs(x)]))])r:  r;  )r  r  ImportError
ValueErrorr   r   r   )r  r   expressionsds       r4   	test_drawrG    s\    IK  $$Q'	#  IGHHIs   9 	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    r6   r   r!   r   r   r   rP  rQ  rR  rv   rc   r   r  r  r   r{   r   r   r  r  r  r   r  r   r   rA  rG  r'   r2   r3   r4   <module>rM     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 r3   