U
    e                     @   sz  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 z,d dlm Z m!Z! d dl"m#Z# d dl$m%Z% W n e&k
r   Y nX G dd	 d	eZ'G d
d deZ(G dd dZ)G dd de)eZ*dd Z+G dd de)eZ,G dd de,eZ-G dd de,eZ.G dd de-eZ/G dd de,eZ0G dd de)eZ1G dd de)eZ2G d d! d!e)eZ3G d"d# d#e)eZ4G d$d% d%e4eZ5G d&d' d'e5eZ6G d(d) d)e4eZ7G d*d+ d+e5Z8G d,d- d-e)e
Z9d.d/ Z:G d0d1 d1e;e)eZ<G d2d3 d3e=Z>g fd4d5Z?G d6d7 d7Z@d8d9 ZAd:d; ZBeCd<krveA  dS )=    N)reduce)chain)APPAbstractVariableExpressionAllExpressionAndExpressionApplicationExpressionBinaryExpressionBooleanExpressionConstantExpressionEqualityExpressionEventVariableExpressionExistsExpression
ExpressionFunctionVariableExpressionImpExpressionIndividualVariableExpressionLambdaExpressionLogicParserNegatedExpressionOrExpressionTokensVariableis_eventvar
is_funcvar	is_indvarunique_variable)CanvasTk)Font)in_idlec                   @   sJ   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e
jeg e	 ZdS )	DrtTokensDRS+ZPRO[]:N)__name__
__module____qualname__r"   DRS_CONCPRONOUNOPEN_BRACKETCLOSE_BRACKETCOLONZPUNCTr   SYMBOLSTOKENS r1   r1   M/var/www/html/assets/scripts/venv/lib/python3.8/site-packages/nltk/sem/drt.pyr!   5   s   
r!   c                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd S )!	DrtParserz$A lambda calculus expression parser.c                 C   s   t |  tdd tjD dd tjD  tdfg dd tjtj	 D  tj
dfg tjdfg dd tjD  d	d tjD  d
g | _d S )Nc                 S   s   g | ]}|d fqS    r1   .0xr1   r1   r2   
<listcomp>K   s     z&DrtParser.__init__.<locals>.<listcomp>c                 S   s   g | ]}|d fqS )   r1   r6   r1   r1   r2   r9   L   s        c                 S   s   g | ]}|d fqS )   r1   r6   r1   r1   r2   r9   N   s           c                 S   s   g | ]}|d fqS )   r1   r6   r1   r1   r2   r9   Q   s     c                 S   s   g | ]}|d fqS )   r1   r6   r1   r1   r2   r9   R   s     )N	   )r   __init__dictr!   LAMBDA_LISTNOT_LISTr   ZEQ_LISTr   ZNEQ_LISTr.   r*   OR_LISTIMP_LISTZoperator_precedenceselfr1   r1   r2   rB   G   s(    


zDrtParser.__init__c                 C   s   t jS )z#This method exists to be overridden)r!   r/   rH   r1   r1   r2   get_all_symbolsV   s    zDrtParser.get_all_symbolsc                 C   s
   |t jkS N)r!   r0   )rI   tokr1   r1   r2   
isvariableZ   s    zDrtParser.isvariablec                 C   s   |t jkr| ||S |t jkr,| ||S |t jkrj| dr\| dt jkr\| 	||S | 
||S nb| t jkr| t j | 	||S | |r| dr| dt jkr| ||S | ||S dS )zgThis method is intended to be overridden for logics that
        use different operators or expressionsr   N)r!   rE   Zhandle_negationrD   Zhandle_lambdaOPENinRangetokenr,   
handle_DRShandle_openupperr"   assertNextTokenrM   r.   handle_propZhandle_variable)rI   rL   contextr1   r1   r2   handle]   s    



zDrtParser.handlec                 C   s   t |S rK   DrtNegatedExpression)rI   
expressionr1   r1   r2   make_NegatedExpressionv   s    z DrtParser.make_NegatedExpressionc                 C   sL   |   }| dr*| dtjkr*|   | |}| tj t||d S Nr   )	handle_refsrO   rP   r!   COMMAhandle_condsrT   CLOSEr"   )rI   rL   rV   refscondsr1   r1   r2   rQ   y   s    
zDrtParser.handle_DRSc                 C   sh   |  tj g }| drX| dtjkrX|rF| dtjkrF|   || d q|  tj |S )Nr   Z
quantified)	rT   r!   r,   rO   rP   r-   r^   appendZget_next_token_variable)rI   ra   r1   r1   r2   r]      s    zDrtParser.handle_refsc                 C   sh   |  tj g }| drX| dtjkrX|rF| dtjkrF|   || | q|  tj |S r\   )	rT   r!   r,   rO   rP   r-   r^   rc   process_next_expression)rI   rV   rb   r1   r1   r2   r_      s    zDrtParser.handle_condsc                 C   s*   |  |}| d | tj}t||S )Nr&   )make_VariableExpressionrT   rd   r!   r.   DrtProposition)rI   rL   rV   variabledrsr1   r1   r2   rU      s    

zDrtParser.handle_propc                 C   s
   t ||S )zlThis method serves as a hook for other logic parsers that
        have different equality expression classesDrtEqualityExpressionrI   firstsecondr1   r1   r2   make_EqualityExpression   s    z!DrtParser.make_EqualityExpressionc                 C   s>   |t jkrdd S |t jkr tS |t jkr6dd }|S dS dS )zbThis method serves as a hook for other logic parsers that
        have different boolean operatorsc                 S   s   t | |d S rK   DrtConcatenationrl   rm   r1   r1   r2   <lambda>       z9DrtParser.get_BooleanExpression_factory.<locals>.<lambda>c                 S   s@   t | trt| j| j|S t | tr4t| j| j|S tdd S Nz'Antecedent of implication must be a DRS)
isinstancer"   ra   rb   rp   rl   rm   	Exceptionrq   r1   r1   r2   make_imp_expression   s
    

zDDrtParser.get_BooleanExpression_factory.<locals>.make_imp_expressionN)r!   r*   rF   DrtOrExpressionrG   )rI   rL   rw   r1   r1   r2   get_BooleanExpression_factory   s    


z'DrtParser.get_BooleanExpression_factoryc                 C   s
   |||S rK   r1   )rI   factoryrl   rm   r1   r1   r2   make_BooleanExpression   s    z DrtParser.make_BooleanExpressionc                 C   s
   t ||S rK   DrtApplicationExpression)rI   functionargumentr1   r1   r2   make_ApplicationExpression   s    z$DrtParser.make_ApplicationExpressionc                 C   s   t t|S rK   )DrtVariableExpressionr   )rI   namer1   r1   r2   re      s    z!DrtParser.make_VariableExpressionc                 C   s
   t ||S rK   )DrtLambdaExpression)rI   	variablestermr1   r1   r2   make_LambdaExpression   s    zDrtParser.make_LambdaExpressionN)r'   r(   r)   __doc__rB   rJ   rM   rW   r[   rQ   r]   r_   rU   rn   ry   r{   r   re   r   r1   r1   r1   r2   r3   D   s    r3   c                   @   s   e Zd ZdZe Zedd Zdd Zdd Z	dd	 Z
d
d Zdd Zd*ddZedd Zd+ddZdd Zd,ddZdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) ZdS )-DrtExpressionz_
    This is the base abstract DRT Expression from which every DRT
    Expression extends.
    c                 C   s   | j |S rK   )_drt_parserparse)clssr1   r1   r2   
fromstring   s    zDrtExpression.fromstringc                 C   s
   t | |S rK   r|   rI   otherr1   r1   r2   applyto   s    zDrtExpression.applytoc                 C   s   t | S rK   rX   rH   r1   r1   r2   __neg__   s    zDrtExpression.__neg__c                 C   s   t S rK   )NotImplementedr   r1   r1   r2   __and__   s    zDrtExpression.__and__c                 C   s   t |tstt| |S rK   )ru   r   AssertionErrorrx   r   r1   r1   r2   __or__   s    zDrtExpression.__or__c                 C   sN   t |tstt | tr(t| j| j|S t | trBt| j| j|S t	dd S rt   )
ru   r   r   r"   ra   rb   rp   rl   rm   rv   r   r1   r1   r2   __gt__   s    

zDrtExpression.__gt__Nc                 C   s2   t |tst|   }|  }|||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``
        )ru   r   r   simplifyfolequiv)rI   r   Zproverf1f2r1   r1   r2   r      s    	zDrtExpression.equivc                 C   s   t d| jj d S )Nz#'%s' object has no attribute 'type')AttributeError	__class__r'   rH   r1   r1   r2   type   s    
zDrtExpression.typec                 C   s
   t  d S rK   NotImplementedError)rI   	signaturer1   r1   r2   	typecheck   s    zDrtExpression.typecheckc                 C   s   t | |d S rK   ro   r   r1   r1   r2   __add__   s    zDrtExpression.__add__Fc                 C   s
   t  dS )z
        Return the set of discourse referents in this DRS.
        :param recursive: bool Also find discourse referents in subterms?
        :return: list of ``Variable`` objects
        Nr   rI   	recursiver1   r1   r2   get_refs  s    zDrtExpression.get_refsc                 C   s2   t | to0t | jto0| jjjtjko0t | jt	S )zIs self of the form "PRO(x)"?)
ru   r}   r~   DrtAbstractVariableExpressionrg   r   r!   r+   r   DrtIndividualVariableExpressionrH   r1   r1   r2   is_pronoun_function
  s    


z!DrtExpression.is_pronoun_functionc                 C   s
   t ||S rK   ri   rk   r1   r1   r2   rn     s    z%DrtExpression.make_EqualityExpressionc                 C   s   t |S rK   )r   )rI   rg   r1   r1   r2   re     s    z%DrtExpression.make_VariableExpressionc                 C   s   t | S rK   )resolve_anaphorarH   r1   r1   r2   r     s    zDrtExpression.resolve_anaphorac                 C   s   |  dd | jS )Nc                 S   s   |   S rK   )eliminate_equality)er1   r1   r2   rr     rs   z2DrtExpression.eliminate_equality.<locals>.<lambda>)visit_structuredr   rH   r1   r1   r2   r     s    z DrtExpression.eliminate_equalityc                 C   s   d |  S )zG
        Draw the DRS
        :return: the pretty print string
        
)join_prettyrH   r1   r1   r2   pretty_format  s    zDrtExpression.pretty_formatc                 C   s   t |   d S rK   )printr   rH   r1   r1   r2   pretty_print&  s    zDrtExpression.pretty_printc                 C   s   t |   d S rK   )	DrsDrawerdrawrH   r1   r1   r2   r   )  s    zDrtExpression.draw)N)N)F)r'   r(   r)   r   r3   r   classmethodr   r   r   r   r   r   r   propertyr   r   r   r   r   rn   re   r   r   r   r   r   r1   r1   r1   r2   r      s.   




	r   c                   @   s   e Zd ZdZdddZd ddZd	d
 Zd!ddZdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZejZdd ZdS )"r"   z%A Discourse Representation Structure.Nc                 C   s   || _ || _|| _dS )z
        :param refs: list of ``DrtIndividualVariableExpression`` for the
            discourse referents
        :param conds: list of ``Expression`` for the conditions
        N)ra   rb   
consequent)rI   ra   rb   r   r1   r1   r2   rB   0  s    zDRS.__init__FTc                    sd  | j krs| S | j }| jr8| jd }nd}t| j d| jg | j |d d   fdd| jD |S nވ rt| j  @ D ]t	}t
|| j }| jr| jd }nd}t| j d| |g | j |d d   fdd| jD |} q| jr8| j }nd}t| j  fdd| jD |S dS )_Replace all instances of variable v with expression E in self,
        where v is free in self.TNr5   c                    s   g | ]}| d  qS Treplacer7   cond)alpha_convertrZ   rg   r1   r2   r9   K  s   zDRS.replace.<locals>.<listcomp>c                    s   g | ]}| d  qS r   r   r   )r   newvarexrefr1   r2   r9   a  s   c                    s   g | ]}|  qS r1   r   r   )r   rZ   replace_boundrg   r1   r2   r9   q  s   )ra   indexr   r   r"   rg   rb   setfreer   r   )rI   rg   rZ   r   r   ir   newvarr1   )r   rZ   r   r   r   rg   r2   r   :  sl    
   &	   $
   zDRS.replacec                 C   s@   t tjdd | jD t }| jr2|| j  |t| j S )z:see: Expression.free()c                 S   s   g | ]}|  qS r1   )r   r7   cr1   r1   r2   r9   z  s     zDRS.free.<locals>.<listcomp>)	r   operatoror_rb   r   r   updater   ra   )rI   Z
conds_freer1   r1   r2   r   x  s    zDRS.freec                 C   sJ   |r@| j ttdd | jD  }| jr<|| jd |S | j S dS )#:see: AbstractExpression.get_refs()c                 s   s   | ]}| d V  qdS )TN)r   r   r1   r1   r2   	<genexpr>  s     zDRS.get_refs.<locals>.<genexpr>TN)ra   listr   from_iterablerb   r   extendr   )rI   r   Z
conds_refsr1   r1   r2   r     s    zDRS.get_refsc                 C   s.   t t|| j}| jr&||| j ||S :see: Expression.visit())r   maprb   r   rc   )rI   r~   
combinatorpartsr1   r1   r2   visit  s    z	DRS.visitc                 C   s.   | j r|| j nd}|| jtt|| j|S )#:see: Expression.visit_structured()N)r   ra   r   r   rb   )rI   r~   r   r   r1   r1   r2   r     s    zDRS.visit_structuredc                 C   s&  | }d}|t |jk r|j| }t|trt|jtrt|jtrttt	|j
|jjh |jd | |j|d d   |j}|jj|jjkr||jj|jdd}d}|d8 }|d7 }qg }|jD ]:}| }| }t|tr|j
s|js|jr|| q|jr|j nd }t|j
||S )Nr   r5   F)lenrb   ru   r   rl   r   rm   r"   r   r   ra   rg   r   r   r   r   rc   )rI   rh   r   r   rb   Znew_condZnew_cond_simpr   r1   r1   r2   r     sF    




zDRS.eliminate_equalityc                 C   s   | j rjd }| jr&ttdd | jD }|r<t|| j  }n
| j  }| jd d d D ]}t||}qV|S | jsxtdttdd | jD }t	t
| | jd d d D ]}t||}q|S d S )Nc                 S   s   g | ]}|  qS r1   r   r   r1   r1   r2   r9     s     zDRS.fol.<locals>.<listcomp>z-Cannot convert DRS with no conditions to FOL.c                 S   s   g | ]}|  qS r1   r   r   r1   r1   r2   r9     s     )r   rb   r   r   r   r   ra   r   rv   r   r   _order_ref_stringsr   )rI   accumr   r1   r1   r2   r     s     
 zDRS.folc                    s   d | | j}dd dd | jD D }tt|gttt|  dd   d d|  d	 d
d   d g fdd|D  dd   d g }| j	rt
|tj| j	 S |S )N c                 S   s   g | ]}|D ]}|qqS r1   r1   )r7   Z	cond_liner   r1   r1   r2   r9     s    zDRS._pretty.<locals>.<listcomp>c                 S   s   g | ]}t d d | qS )c                 S   s   |   S rK   )strip)r   r1   r1   r2   rr     rs   z(DRS._pretty.<locals>.<listcomp>.<lambda>)filterr   r   r1   r1   r2   r9     s    z __z_ |  |z|--z-|c                    s   g | ]}d |   d qS )r   r   )ljustr7   linelengthr1   r2   r9     s     z|_z_|)r   r   ra   rb   maxr   r   r   r   r   DrtBinaryExpression_assemble_prettyr!   IMPr   )rI   Z	refs_lineZ
cond_linesrh   r1   r   r2   r     s.    	  zDRS._prettyc                 C   s   dd |D }g }g }g }g }|D ]J}t |r:|| q"t|rN|| q"t|rb|| q"|| q"t|t|dd d t|dd d t|dd d S )Nc                 S   s   g | ]}d | qS )%sr1   )r7   r   r1   r1   r2   r9     s     z*DRS._order_ref_strings.<locals>.<listcomp>c                 S   s(   t | dd  dgt| dd  dk S )Nr:   r   r   intr   vr1   r1   r2   rr     rs   z(DRS._order_ref_strings.<locals>.<lambda>)keyc                 S   s0   | d t | dd  dgt| dd  dk fS Nr   r5   r   r   r   r1   r1   r2   rr     rs   c                 S   s0   | d t | dd  dgt| dd  dk fS r   r   r   r1   r1   r2   rr      rs   )r   rc   r   r   sorted)rI   ra   stringsZind_varsZ	func_varsZ
event_varsZ
other_varsr   r1   r1   r2   r     s*    zDRS._order_ref_stringsc                 C   s   t |trt| jt|jkr|}t| j|jD ] \}}| |}|||d}q0| j|jkrt| jt|jkrt| j|jD ]\}}||ks dS qdS dS z}Defines equality modulo alphabetic variance.
        If we are comparing \x.M  and \y.N, then check equality of M and N[x/y].TF)	ru   r"   r   ra   zipre   r   r   rb   )rI   r   converted_otherr1r2varexc1c2r1   r1   r2   __eq__  s     

z
DRS.__eq__c                 C   s
   | |k S rK   r1   r   r1   r1   r2   __ne__  s    z
DRS.__ne__c                 C   s^   d d| | jddd | jD }| jrZtj| d tj d d| j  tj	 S |S )Nz([{}],[{}]),, c                 s   s   | ]}d | V  qdS r   Nr1   r   r1   r1   r2   r     s     zDRS.__str__.<locals>.<genexpr>r   r   )
formatr   r   ra   rb   r   r!   rN   r   r`   rI   rh   r1   r1   r2   __str__  s(    	zDRS.__str__)N)FT)F)r'   r(   r)   r   rB   r   r   r   r   r   r   r   r   r   r   r   r   __hash__r  r1   r1   r1   r2   r"   -  s   


>
$r"   c                 C   sB   t | jrt| S t| jr$t| S t| jr6t| S t| S dS )z
    This is a factory method that instantiates and returns a subtype of
    ``DrtAbstractVariableExpression`` appropriate for the given variable.
    N)r   r   r   r   DrtFunctionVariableExpressionr   DrtEventVariableExpressionDrtConstantExpressionrg   r1   r1   r2   r   ,  s    


r   c                   @   s.   e Zd Zdd ZdddZdd Zdd	 Zd
S )r   c                 C   s   | S rK   r1   rH   r1   r1   r2   r   <  s    z!DrtAbstractVariableExpression.folFc                 C   s   g S r   r1   r   r1   r1   r2   r   ?  s    z&DrtAbstractVariableExpression.get_refsc                 C   s    d|  }dt | }||||gS Nr   r   r   rI   r   blankr1   r1   r2   r   C  s    z%DrtAbstractVariableExpression._prettyc                 C   s   | S rK   r1   rH   r1   r1   r2   r   H  s    z0DrtAbstractVariableExpression.eliminate_equalityN)F)r'   r(   r)   r   r   r   r   r1   r1   r1   r2   r   ;  s   
r   c                   @   s   e Zd ZdS )r   Nr'   r(   r)   r1   r1   r1   r2   r   L  s   r   c                   @   s   e Zd ZdS )r  Nr  r1   r1   r1   r2   r  R  s   r  c                   @   s   e Zd ZdS )r	  Nr  r1   r1   r1   r2   r	  X  s   r	  c                   @   s   e Zd ZdS )r
  Nr  r1   r1   r1   r2   r
  ^  s   r
  c                   @   sn   e Zd Zdd ZdddZdd Zdd	d
Zdd Zdd Ze	j
Z
dd Zdd Zdd Zdd Zdd ZdS )rf   c                 C   s   || _ || _d S rK   rg   rh   )rI   rg   rh   r1   r1   r2   rB   c  s    zDrtProposition.__init__FTc                 C   sT   | j |kr6t|tstdt|j | j||||S t| j | j||||S d S )Nz4Can only replace a proposition label with a variable)rg   ru   r   r   rf   rh   r   )rI   rg   rZ   r   r   r1   r1   r2   r   g  s    
 zDrtProposition.replacec                 C   s   t | j| j S rK   )rf   rg   rh   r   rH   r1   r1   r2   r   v  s    z!DrtProposition.eliminate_equalityc                 C   s   |r| j dS g S NT)rh   r   r   r1   r1   r2   r   y  s    zDrtProposition.get_refsc                 C   s$   | j |j ko"| j|jko"| j|jkS rK   )r   rg   rh   r   r1   r1   r2   r   |  s
    

zDrtProposition.__eq__c                 C   s
   | |k S rK   r1   r   r1   r1   r2   r     s    zDrtProposition.__ne__c                 C   s
   | j  S rK   )rh   r   rH   r1   r1   r2   r     s    zDrtProposition.folc                    sj   j  }dtdj    fdd|d d D fdd|dd D   fdd|dd  D  S )	Nr   r   c                    s   g | ]} d  | qS r   r1   r   r  r1   r2   r9     s     z*DrtProposition._pretty.<locals>.<listcomp>r5   c                    s   g | ]}d  j  d | qS )r   r&   r  r   rH   r1   r2   r9     s     r:   c                    s   g | ]} d  | qS r  r1   r   r  r1   r2   r9     s     )rh   r   r   rg   )rI   Zdrs_sr1   )r  rI   r2   r     s    
zDrtProposition._prettyc                 C   s   ||| j gS r   )rh   rI   r~   r   r1   r1   r2   r     s    zDrtProposition.visitc                 C   s   || j || jS )r   r  r  r1   r1   r2   r     s    zDrtProposition.visit_structuredc                 C   s   d| j  d| j dS )Nzprop(r  )r  rH   r1   r1   r2   r    s    zDrtProposition.__str__N)FT)F)r'   r(   r)   rB   r   r   r   r   r   r   r  r   r   r   r   r  r1   r1   r1   r2   rf   b  s   

	rf   c                   @   s&   e Zd Zdd Zd	ddZdd ZdS )
rY   c                 C   s   t | j S rK   )r   r   r   rH   r1   r1   r2   r     s    zDrtNegatedExpression.folFc                 C   s   | j |S r  )r   r   r   r1   r1   r2   r     s    zDrtNegatedExpression.get_refsc                 C   sb   | j  }dd |d d D dd |dd D  dd |dd D  dd |dd  D  S )	Nc                 S   s   g | ]}d | qS z    r1   r   r1   r1   r2   r9     s     z0DrtNegatedExpression._pretty.<locals>.<listcomp>r:   c                 S   s   g | ]}d | qS )z__  r1   r   r1   r1   r2   r9     s     r;   c                 S   s   g | ]}d | qS )z  | r1   r   r1   r1   r2   r9     s     r<   c                 S   s   g | ]}d | qS r  r1   r   r1   r1   r2   r9     s     )r   r   )rI   
term_linesr1   r1   r2   r     s    
zDrtNegatedExpression._prettyN)Fr'   r(   r)   r   r   r   r1   r1   r1   r2   rY     s   
rY   c                   @   s.   e Zd Zdd Zdd Zdd Zddd	Zd
S )r   c                 C   s   |  || 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   rg   r   )rI   r   r1   r1   r2   r     s    z!DrtLambdaExpression.alpha_convertc                 C   s   t | j| j S rK   )r   rg   r   r   rH   r1   r1   r2   r     s    zDrtLambdaExpression.folc                    s   | j g}| j}|j| jkr.||j  |j}qddd |D tj | }dt   fdd|d d D  fdd|dd D  fd	d|dd
 D   fdd|d
d  D  S )Nr   c                 s   s   | ]}d | V  qdS r  r1   )r7   r   r1   r1   r2   r     s     z.DrtLambdaExpression._pretty.<locals>.<genexpr>c                    s   g | ]}d   | qS r  r1   r   r  r1   r2   r9     s     z/DrtLambdaExpression._pretty.<locals>.<listcomp>r5   c                    s   g | ]}d   | qS )z \  r1   r   r  r1   r2   r9     s     r:   c                    s   g | ]}d   | qS )z /\ r1   r   )
var_stringr1   r2   r9     s     r;   c                    s   g | ]}d   | qS r  r1   r   r  r1   r2   r9     s     )	rg   r   r   rc   r   r!   DOTr   r   )rI   r   r   r  r1   )r  r  r2   r     s     zDrtLambdaExpression._prettyFc                 C   s    |r| j g| jd S | j gS r   T)rg   r   r   r   r1   r1   r2   r     s    zDrtLambdaExpression.get_refsN)F)r'   r(   r)   r   r   r   r   r1   r1   r1   r2   r     s   
r   c                   @   s2   e Zd ZdddZdd Zedd Zdd	 Zd
S )r   Fc                 C   s    |r| j d| jd S g S r  )rl   r   rm   r   r1   r1   r2   r     s    zDrtBinaryExpression.get_refsc                 C   s"   t | | j|  | | jS rK   )r   r   _pretty_subexrl   getOprm   rH   r1   r1   r2   r     s
    

zDrtBinaryExpression._prettyc                    s   t t| t|}t| |} t||}dt  tt| |} fdd|d d D fdd|dd D   fdd|dd  D  S )Nr   c                    s,   g | ]$\}}d | d    d  | d  qS r  r1   r7   
first_lineZsecond_liner  r1   r2   r9     s   z8DrtBinaryExpression._assemble_pretty.<locals>.<listcomp>r:   c                    s,   g | ]$\}}d | d   d | d qS )(r   r  r1   r   )opr1   r2   r9     s   r;   c                    s,   g | ]$\}}d | d    d  | d  qS r  r1   r   r  r1   r2   r9     s   )r   r   _pad_verticallyr   r   )Zfirst_linesr#  Zsecond_lines	max_linesZfirst_second_linesr1   )r  r#  r2   r     s"    







z$DrtBinaryExpression._assemble_prettyc                 C   s   |  S rK   r   rI   subexr1   r1   r2   r    s    z!DrtBinaryExpression._pretty_subexN)F)r'   r(   r)   r   r   staticmethodr   r  r1   r1   r1   r2   r     s
   

r   c                   @   s   e Zd ZdS )DrtBooleanExpressionNr  r1   r1   r1   r2   r*    s   r*  c                   @   s   e Zd Zdd Zdd ZdS )rx   c                 C   s   t | j | j S rK   )r   rl   r   rm   rH   r1   r1   r2   r     s    zDrtOrExpression.folc                 C   s(   t |trdd | D S t| |S )Nc                 S   s   g | ]}|d d qS r5   r   r1   r   r1   r1   r2   r9   	  s     z1DrtOrExpression._pretty_subex.<locals>.<listcomp>)ru   rx   r   r*  r  r'  r1   r1   r2   r    s    
zDrtOrExpression._pretty_subexN)r'   r(   r)   r   r  r1   r1   r1   r2   rx     s   rx   c                   @   s   e Zd Zdd ZdS )rj   c                 C   s   t | j | j S rK   )r   rl   r   rm   rH   r1   r1   r2   r     s    zDrtEqualityExpression.folN)r'   r(   r)   r   r1   r1   r1   r2   rj     s   rj   c                   @   s   e Zd ZdZd!ddZd"ddZd	d
 Zdd Zd#ddZdd Z	dd Z
dd ZejZdd Zdd Zdd Zdd Zdd Zdd  ZdS )$rp   zDRS of the form '(DRS + DRS)'Nc                 C   s   t | || || _d S rK   )r*  rB   r   )rI   rl   rm   r   r1   r1   r2   rB     s    zDrtConcatenation.__init__FTc           
      C   s   | j }| j}| j}||  krX|r|||||}|||||}|r|||||}n|rt| d| @ D ]D}tt|}	|||	d|}|||	d|}|rr|||	d|}qr|||||}|||||}|r|||||}| 	|||S )r   T)
rl   rm   r   r   r   r   r   r   r   r   )
rI   rg   rZ   r   r   rl   rm   r   r   r   r1   r1   r2   r     sR                zDrtConcatenation.replacec                 C   s   |   }t|trt| S rK   )r   ru   rp   r   r   r  r1   r1   r2   r   @  s    z#DrtConcatenation.eliminate_equalityc                 C   s   | j  }| j }| jr$| j nd }t|trt|trt|dt|d@ D ]}tt	|}|
||d}qXt|j|j |j|j |S | |||S d S r  )rl   r   rm   r   ru   r"   r   r   r   r   r   ra   rb   r   )rI   rl   rm   r   r   r   r1   r1   r2   r   F  s    

 zDrtConcatenation.simplifyc                 C   s8   | j || j| }| jr4|r4|| jd |S r  )rl   r   rm   r   r   )rI   r   ra   r1   r1   r2   r   V  s    
zDrtConcatenation.get_refsc                 C   s   t jS rK   )r!   r*   rH   r1   r1   r2   r  ]  s    zDrtConcatenation.getOpc                 C   s   t |tr~|  }| }t|t|kr~|}t||D ] \}}| |}|||d}q8| j|jko|| j|jko|| j	|j	kS dS r   )
ru   rp   r   r   r   re   r   rl   rm   r   )rI   r   Z	self_refsZ
other_refsr   r   r   r   r1   r1   r2   r   `  s    



zDrtConcatenation.__eq__c                 C   s
   | |k S rK   r1   r   r1   r1   r2   r   r  s    zDrtConcatenation.__ne__c                 C   s0   t | j | j }| jr,t|| j }|S rK   )r   rl   r   rm   r   r   )rI   r   r1   r1   r2   r   w  s    zDrtConcatenation.folc                 C   sB   t | | j|  | | j}| jr>t |tj| j	 }|S rK   )
r   r   r  rl   r  rm   r   r!   r   r   r  r1   r1   r2   r   }  s    

  zDrtConcatenation._prettyc                 C   s(   t |trdd | D S t| |S )Nc                 S   s   g | ]}|d d qS r+  r1   r   r1   r1   r2   r9     s     z2DrtConcatenation._pretty_subex.<locals>.<listcomp>)ru   rp   r   r*  r  r'  r1   r1   r2   r    s    
zDrtConcatenation._pretty_subexc                 C   sB   | j r&||| j|| j|| j gS ||| j|| jgS dS )r   N)r   rl   rm   r  r1   r1   r2   r     s
    zDrtConcatenation.visitc                 C   sn   |  | j}|  | j}tj| d |   d | tj }| jrjtj| d tj	 d d| j  tj S |S )Nr   r   )

_str_subexrl   rm   r   rN   r  r`   r   r!   r   )rI   rl   rm   rh   r1   r1   r2   r    s&    $	zDrtConcatenation.__str__c                 C   s,   d| }t |tr(|jd kr(|dd S |S )Nr   r5   r   )ru   rp   r   )rI   r(  r   r1   r1   r2   r,    s    zDrtConcatenation._str_subex)N)FT)F)r'   r(   r)   r   rB   r   r   r   r   r  r   r   r*  r  r   r   r  r   r  r,  r1   r1   r1   r2   rp     s    

'
	rp   c                   @   s&   e Zd Zdd Zd	ddZdd ZdS )
r}   c                 C   s   t | j | j S rK   )r   r~   r   r   rH   r1   r1   r2   r     s    zDrtApplicationExpression.folFc                 C   s    |r| j d| jd S g S r  )r~   r   r   r   r1   r1   r2   r     s    z!DrtApplicationExpression.get_refsc                    s   |   \}}| }dd |D }ttt|g|  t| } fdd|D }tt|tt| }dd |d d D dd |dd D  dd |dd  D  S )	Nc                 S   s   g | ]}|  qS r1   r&  r7   argr1   r1   r2   r9     s     z4DrtApplicationExpression._pretty.<locals>.<listcomp>c                    s   g | ]}t | qS r1   )r$  )r7   Z	arg_linesr%  r1   r2   r9     s     c                 S   s&   g | ]\}}|d  d  | d  qS r  r   r7   Z	func_lineZ	args_liner1   r1   r2   r9     s   r:   c                 S   s&   g | ]\}}|d  d | d qS )r"  r  r  r0  r1  r1   r1   r2   r9     s   r;   c                 S   s&   g | ]\}}|d  d  | d  qS r  r0  r1  r1   r1   r2   r9     s   )uncurryr   r   r   r   r$  r   r   )rI   r~   argsZfunction_linesZ
args_linesZfunc_args_linesr1   r/  r2   r     s&    



z DrtApplicationExpression._prettyN)Fr  r1   r1   r1   r2   r}     s   
r}   c                 C   s&   dt | d  g}| ||t |    S )Nr   r   r  )linesr%  pad_liner1   r1   r2   r$    s    r$  c                   @   s.   e Zd Zdd ZdddZdd Zd	d
 ZdS )PossibleAntecedentsc                 C   s   t | S )zSet of free variables.)r   rH   r1   r1   r2   r     s    zPossibleAntecedents.freeFTc                 C   s2   t  }| D ]"}||kr"| | q
| | q
|S )r   )r6  rc   )rI   rg   rZ   r   r   resultitemr1   r1   r2   r     s    zPossibleAntecedents.replacec                 C   s   d|  }dt | }|||gS r  r  r  r1   r1   r2   r     s    zPossibleAntecedents._prettyc                 C   s   dd dd | D  d S )Nr$   r  c                 s   s   | ]}d | V  qdS r  r1   )r7   itr1   r1   r2   r     s     z.PossibleAntecedents.__str__.<locals>.<genexpr>r%   r0  rH   r1   r1   r2   r    s    zPossibleAntecedents.__str__N)FT)r'   r(   r)   r   r   r   r  r1   r1   r1   r2   r6    s   
r6  c                   @   s   e Zd ZdS )AnaphoraResolutionExceptionNr  r1   r1   r1   r2   r:    s   r:  c                 C   sZ  t | tr|  rt }|D ]>}| D ]0}| |}|j| jjkr(|| jks(|| q(qt	|dkrr|d }n|}| 
| j|S t| j|| g }t| j|| g }| ||S nt | trpg }	| jD ]p}
t|
|| g }t |tr4t |jtr|j}|j|_||_t |jtr4|js4td|j |	| q| jr\t| j|| g }nd }| | j|	|S t | tr| S t | tr| t| j|| g S t | tr| jrt| j|| g }nd }| t| j|| g t| j|| g |S t | tr.| t| j|| g t| j|| g S t | trV| | jt| j|| g S d S )Nr5   r   z+Variable '%s' does not resolve to anything.)ru   r   r   r6  r   re   r   r   rc   r   rn   r   r~   r"   rb   r   rl   rm   r:  r   ra   r   r   r   rp   r	   r   rg   )rZ   trailZpossible_antecedentsZancestorr   Zrefex
resolutionZ
r_functionZ
r_argumentZr_condsr   Zr_condtempr   r1   r1   r2   r     s~    



 r   c                   @   s   e Zd ZdZdZdZd%ddZdd	 Zeefd
dZdd Z	dd Z
dd Zd&ddZdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ ZdS )'r   r;   
   r>   TNc           
      C   s   d}|st  }|d tddd}|rt|ddd}||_|| _| || j| j\}}t	|| j d}|| j }	t|||	d}nt|d	d	d}|
  ||_|| _|| _|| _dS )
a  
        :param drs: ``DrtExpression``, The DRS to be drawn
        :param size_canvas: bool, True if the canvas size should be the exact size of the DRS
        :param canvas: ``Canvas`` The canvas on which to draw the DRS.  If none is given, create a new canvas.
        NZDRTZ	helvetica   )familysizer   )widthheightd   i,  )r   titler   r   fontcanvas_visit
OUTERSPACETOPSPACEr   packrh   master)
rI   rh   Zsize_canvasrG  rL  rF  rightbottomrB  rC  r1   r1   r2   rB   L  s&    

zDrsDrawer.__init__c                 C   s   | j jdS )z Get the height of a line of textZ	linespace)rG  rF  ZmetricsrH   r1   r1   r2   _get_text_heightl  s    zDrsDrawer._get_text_heightc                 C   s@   |  | j| j|| | jr,t s,| j  n| | j||S dS )zDraw the DRSN)_handlerh   _draw_commandrL  r    ZmainlooprH  rI   r8   yr1   r1   r2   r   p  s    zDrsDrawer.drawc                 C   s   |  || 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
        )rP  _visit_command)rI   rZ   r8   rS  r1   r1   r2   rH  y  s    	zDrsDrawer._visitc                 C   s   t |tr&| jj||d| jj|d nLt |trr|\}}| j|||| ||   | jd  }| 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)anchorrF  textr:   )ru   strrG  Zcreate_textrF  tupleZcreate_rectanglerO  BUFFERZcreate_linerT  )rI   r8  r8   rS  rM  rN  Zhoriz_line_yr1   r1   r2   rQ    s    	

zDrsDrawer._draw_commandc                 C   s:   t |tr(|| jj| ||   fS t |tr6|S dS )a  
        Return the bottom-rightmost point without actually drawing the item

        :param item: the item to visit
        :param x: the top of the current drawing area
        :param y: the left side of the current drawing area
        :return: the bottom-rightmost point
        N)ru   rX  rG  rF  measurerO  rY  )rI   r8  r8   rS  r1   r1   r2   rT    s    	

zDrsDrawer._visit_commandr   c                 C   s  || j kr>z|j| }|j| }||fW S  tk
r<   Y nX t|trP| j}nt|trb| j}nxt|t	rt| j
}nft|tr| j}nTt|tr| j}nBt|tr| j}n0t|tr| j}nt|tr| j}nt|jj|||||\}}|| |_|| |_||fS )a1  
        :param expression: the expression to handle
        :param command: the function to apply, either _draw_command or _visit_command
        :param x: the top of the current drawing area
        :param y: the left side of the current drawing area
        :return: the bottom-rightmost point
        )rT  Z_drawing_width_drawing_heightr   ru   r   _handle_VariableExpressionr"   _handle_DRSrY   _handle_NegatedExpressionr   _handle_LambdaExpressionr	   _handle_BinaryExpressionr}   _handle_ApplicationExpressionr6  rf   _handle_DrtPropositionrv   r   r'   )rI   rZ   commandr8   rS  rM  rN  rz   r1   r1   r2   rP    s8    













zDrsDrawer._handlec                 C   s   |d| ||S )Nr   r1   )rI   rZ   rd  r8   rS  r1   r1   r2   r]    s    z$DrsDrawer._handle_VariableExpressionc              	   C   sR   |  tj||d }| |j|||\}}|tj|| ||| |   ||fS r\   )rT  r!   ZNOTrP  r   _get_centered_toprO  rI   rZ   rd  r8   rS  rM  rN  r1   r1   r2   r_    s    z#DrsDrawer._handle_NegatedExpressionc                 C   s   || j  }|| j  }|jr2ddd |jD }nd}||||\}}|| j d 7 }|jr|jD ],}	| |	|||\}
}t||
}|| j 7 }q`n||  | j  7 }|| j 7 }|||f||S )Nr   c                 s   s   | ]}d | V  qdS r  r1   )r7   rr1   r1   r2   r     s     z(DrsDrawer._handle_DRS.<locals>.<genexpr>z     r:   )rZ  ra   r   rb   rP  r   rO  )rI   rZ   rd  r8   rS  leftrN  ra   Z	max_rightr   rM  r1   r1   r2   r^    s    




zDrsDrawer._handle_DRSc                    s  |  \}}t|ts$|j}|jg} |d }t|g fdd|D  }| }	 |	|j}
 	|||
d } |	 
 }|tj||d }t|D ]R\}} |	|j} 	||||d }|d t|k r|tjd ||d }q|tj||d }||fS )Nr5   c                    s   g | ]}  |d  qS r4   )rH  r-  rR  r1   r2   r9     s     z;DrsDrawer._handle_ApplicationExpression.<locals>.<listcomp>r   r   )r2  ru   r   r~   r   rH  r   re  r\  rP  rO  r!   rN   	enumerater   r^   r`   )rI   rZ   rd  r8   rS  r~   r3  Zfunction_bottomZ
max_bottomline_heightZfunction_drawing_toprM  centred_string_topr   r.  Zarg_drawing_topr1   rR  r2   rb    s@    
      z'DrsDrawer._handle_ApplicationExpressionc              	   C   sd   t jd|j  t j }| |||d }| |j|||\}}|||| ||| |   ||fS )Nr   r   )	r!   ZLAMBDArg   r  rT  rP  r   re  rO  )rI   rZ   rd  r8   rS  r   rM  rN  r1   r1   r2   r`  -  s      z"DrsDrawer._handle_LambdaExpressionc              
   C   s   |  |jddd }|  |jddd }t||}| |||  }|tj||d }	|jj}| 	|j||	| |||\}	}
|d|
  |	|d }	|jj}| 	|j||	| |||\}	}|tj|	|d }	|	t|
|fS )Nr   r5   z %s )rH  rl   rm   r   re  rO  r!   rN   r\  rP  r  r`   )rI   rZ   rd  r8   rS  Zfirst_heightZsecond_heightrj  rk  rM  Zfirst_bottomZsecond_bottomr1   r1   r2   ra  <  s4    
  z"DrsDrawer._handle_BinaryExpressionc                 C   s0   ||j ||d }| |j|||\}}||fS r\   )rg   rP  r   rf  r1   r1   r2   rc  b  s    z DrsDrawer._handle_DrtPropositionc                 C   s   ||| d  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:   r1   )rI   topZfull_heightZitem_heightr1   r1   r2   re  k  s    zDrsDrawer._get_centered_top)TN)r   r   )r'   r(   r)   rZ  rJ  rI  rB   rO  r   rH  rQ  rT  rP  r]  r_  r^  rb  r`  ra  rc  re  r1   r1   r1   r2   r   G  s$   
 	
.+&	r   c                  C   sL  t d tj} t | d t | d t | d t | d t | d t | d t | d t | d	 t | d
 t d t | d  t d | d}t | |td}t | t ||k t d t t| d t t| d t t| d t d | d  | d  | d  | d  | d  d S )Nz2====================TEST PARSE====================([x,y],[sees(x,y)])([x],[man(x), walks(x)])z\x.\y.([],[sees(x,y)])z\x.([],[walks(x)])(john)z$(([x],[walks(x)]) + ([y],[runs(y)]))z#(([],[walks(x)]) -> ([],[runs(x)]))z([x],[PRO(x), sees(John,x)]) ([x],[man(x), -([],[walks(x)])])*([],[(([x],[man(x)]) -> ([],[walks(x)]))])z2====================Test fol()====================z\====================Test alpha conversion and lambda expression equality====================z\x.([],[P(x)])zz?====================Test resolve_anaphora()====================z,([x,y,z],[dog(x), cat(y), walks(z), PRO(z)])z3([],[(([x],[dog(x)]) -> ([y],[walks(y), PRO(y)]))])z(([x,y],[]) + ([],[PRO(x)]))z;====================Test pretty_print()====================([],[])z@([],[([x],[big(x), dog(x)]) -> ([],[bark(x)]) -([x],[walk(x)])])z'([x,y],[x=y]) + ([z],[dog(z), walk(z)])z4([],[([x],[]) | ([y],[]) | ([z],[dog(z), walk(z)])])z0\P.\Q.(([x],[]) + P(x) + Q(x))(\x.([],[dog(x)])))r   r   r   r   r   r   r   r   )Zdexpre1e2r1   r1   r2   demor  sB    
ru  c                  C   sv   zddl m}  W n* tk
r: } ztdW 5 d }~X Y nX dddddd	d
ddddg}|D ]}t|}|  qZd S )Nr   )r   z,tkinter is required, but it's not available.r8   rr  z([x],[])z([x],[man(x)])rm  rn  z\x.([],[man(x), walks(x)])z\x y.([],[sees(x,y)])z)([],[(([],[walks(x)]) + ([],[runs(x)]))])ro  rp  )tkinterr   ImportError
ValueErrorr   r   r   )r   r   Zexpressionsdr1   r1   r2   	test_draw  s&    
rz  __main__)Dr   	functoolsr   	itertoolsr   Z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   rv  r   r   Ztkinter.fontr   Z	nltk.utilr    rw  r!   r3   r   r"   r   r   r   r  r	  r
  rf   rY   r   r   r*  rx   rj   rp   r}   r$  r   r6  rv   r:  r   r   ru  rz  r'   r1   r1   r1   r2   <module>	   sh   l g  
 
 
 >%(
 $S  -(
