3
d                 @   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 y,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   ,/tmp/pip-build-v9q4h5k9/nltk/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 j|  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   )r5   r6   r1   r1   r2   r7   L   s       c             S   s   g | ]}|d fqS )   r1   )r5   r6   r1   r1   r2   r7   N   s          c             S   s   g | ]}|d fqS )   r1   )r5   r6   r1   r1   r2   r7   Q   s    c             S   s   g | ]}|d fqS )   r1   )r5   r6   r1   r1   r2   r7   R   s    	   )Nr?   )r   __init__dictr!   LAMBDA_LISTNOT_LISTr   ZEQ_LISTr   ZNEQ_LISTr.   r*   OR_LISTIMP_LISTZoperator_precedence)selfr1   r1   r2   r@   G   s    
	zDrtParser.__init__c             C   s   t jS )z#This method exists to be overridden)r!   r/   )rF   r1   r1   r2   get_all_symbolsV   s    zDrtParser.get_all_symbolsc             C   s
   |t jkS )N)r!   r0   )rF   tokr1   r1   r2   
isvariableZ   s    zDrtParser.isvariablec             C   s   |t jkr| j||S |t jkr,| j||S |t jkrj| jdr\| jdt jkr\| j	||S | j
||S nb|j t jkr| jt j | j	||S | j|r| jdr| jdt jkr| j||S | j||S dS )zgThis method is intended to be overridden for logics that
        use different operators or expressionsr   N)r!   rC   Zhandle_negationrB   Zhandle_lambdaOPENinRangetokenr,   
handle_DRShandle_openupperr"   assertNextTokenrI   r.   handle_propZhandle_variable)rF   rH   contextr1   r1   r2   handle]   s    



zDrtParser.handlec             C   s   t |S )N)DrtNegatedExpression)rF   
expressionr1   r1   r2   make_NegatedExpressionv   s    z DrtParser.make_NegatedExpressionc             C   sL   | j  }| jdr*| jdtjkr*| j  | j|}| jtj t||d S )Nr   )	handle_refsrK   rL   r!   COMMAhandle_condsrP   CLOSEr"   )rF   rH   rR   refscondsr1   r1   r2   rM   y   s    
zDrtParser.handle_DRSc             C   sl   | j tj g }xJ| jdrZ| jdtjkrZ|rH| jdtjkrH| j  |j| jd qW | j tj |S )Nr   Z
quantified)	rP   r!   r,   rK   rL   r-   rX   appendZget_next_token_variable)rF   r[   r1   r1   r2   rW      s    zDrtParser.handle_refsc             C   sl   | j tj g }xJ| jdrZ| jdtjkrZ|rH| jdtjkrH| j  |j| j| qW | j tj |S )Nr   )	rP   r!   r,   rK   rL   r-   rX   r]   process_next_expression)rF   rR   r\   r1   r1   r2   rY      s    zDrtParser.handle_condsc             C   s*   | j |}| jd | jtj}t||S )Nr&   )make_VariableExpressionrP   r^   r!   r.   DrtProposition)rF   rH   rR   variabledrsr1   r1   r2   rQ      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)rF   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 )N)DrtConcatenation)rd   re   r1   r1   r2   <lambda>   s    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"   r[   r\   rg   rd   re   	Exception)rd   re   r1   r1   r2   make_imp_expression   s
    

zDDrtParser.get_BooleanExpression_factory.<locals>.make_imp_expressionN)r!   r*   rD   DrtOrExpressionrE   )rF   rH   rk   r1   r1   r2   get_BooleanExpression_factory   s    


z'DrtParser.get_BooleanExpression_factoryc             C   s
   |||S )Nr1   )rF   factoryrd   re   r1   r1   r2   make_BooleanExpression   s    z DrtParser.make_BooleanExpressionc             C   s
   t ||S )N)DrtApplicationExpression)rF   functionargumentr1   r1   r2   make_ApplicationExpression   s    z$DrtParser.make_ApplicationExpressionc             C   s   t t|S )N)DrtVariableExpressionr   )rF   namer1   r1   r2   r_      s    z!DrtParser.make_VariableExpressionc             C   s
   t ||S )N)DrtLambdaExpression)rF   	variablestermr1   r1   r2   make_LambdaExpression   s    zDrtParser.make_LambdaExpressionN)r'   r(   r)   __doc__r@   rG   rI   rS   rV   rM   rW   rY   rQ   rf   rm   ro   rs   r_   ry   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 j|S )N)_drt_parserparse)clssr1   r1   r2   
fromstring   s    zDrtExpression.fromstringc             C   s
   t | |S )N)rp   )rF   otherr1   r1   r2   applyto   s    zDrtExpression.applytoc             C   s   t | S )N)rT   )rF   r1   r1   r2   __neg__   s    zDrtExpression.__neg__c             C   s
   t  d S )N)NotImplementedError)rF   r   r1   r1   r2   __and__   s    zDrtExpression.__and__c             C   s   t |tstt| |S )N)ri   r{   AssertionErrorrl   )rF   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 )Nz'Antecedent of implication must be a DRS)
ri   r{   r   r"   r[   r\   rg   rd   re   rj   )rF   r   r1   r1   r2   __gt__   s    

zDrtExpression.__gt__Nc             C   s2   t |tst| 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``
        )ri   r{   r   simplifyfolequiv)rF   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'   )rF   r1   r1   r2   type   s    zDrtExpression.typec             C   s
   t  d S )N)r   )rF   	signaturer1   r1   r2   	typecheck   s    zDrtExpression.typecheckc             C   s   t | |d S )N)rg   )rF   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
        N)r   )rF   	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)"?)
ri   rp   rq   DrtAbstractVariableExpressionra   ru   r!   r+   rr   DrtIndividualVariableExpression)rF   r1   r1   r2   is_pronoun_function
  s    
z!DrtExpression.is_pronoun_functionc             C   s
   t ||S )N)rc   )rF   rd   re   r1   r1   r2   rf     s    z%DrtExpression.make_EqualityExpressionc             C   s   t |S )N)rt   )rF   ra   r1   r1   r2   r_     s    z%DrtExpression.make_VariableExpressionc             C   s   t | S )N)resolve_anaphora)rF   r1   r1   r2   r     s    zDrtExpression.resolve_anaphorac             C   s   | j dd | jS )Nc             S   s   | j  S )N)eliminate_equality)er1   r1   r2   rh     s    z2DrtExpression.eliminate_equality.<locals>.<lambda>)visit_structuredr   )rF   r1   r1   r2   r     s    z DrtExpression.eliminate_equalityc             C   s   dj | j S )zG
        Draw the DRS
        :return: the pretty print string
        
)join_pretty)rF   r1   r1   r2   pretty_format  s    zDrtExpression.pretty_formatc             C   s   t | j  d S )N)printr   )rF   r1   r1   r2   pretty_print&  s    zDrtExpression.pretty_printc             C   s   t | j  d S )N)	DrsDrawerdraw)rF   r1   r1   r2   r   )  s    zDrtExpression.draw)N)N)F)r'   r(   r)   rz   r3   r|   classmethodr   r   r   r   r   r   r   propertyr   r   r   r   r   rf   r_   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)r[   r\   
consequent)rF   r[   r\   r   r1   r1   r2   r@   0  s    zDRS.__init__FTc                sh  | j krs| S | j j}| jr8| jjd }nd}t| j d| jg | j |d d   fdd| jD |S n r xt| j j @ D ]t	}t
|| j j}| jr| jjd }nd}t| j d| |g | j |d d   fdd| jD |} qW | jr<| jj }nd}t| j  fdd| jD |S dS )z_Replace all instances of variable v with expression E in self,
        where v is free in self.TNr4   c                s   g | ]}|j d  qS )T)replace)r5   cond)alpha_convertrU   ra   r1   r2   r7   L  s   zDRS.replace.<locals>.<listcomp>c                s   g | ]}|j d  qS )T)r   )r5   r   )r   newvarexrefr1   r2   r7   b  s   c                s   g | ]}|j  qS r1   )r   )r5   r   )r   rU   replace_boundra   r1   r2   r7   r  s   )r[   indexr   r   r"   ra   r\   setfreer   rt   )rF   ra   rU   r   r   ir   newvarr1   )r   rU   r   r   r   ra   r2   r   :  sH    
&$
zDRS.replacec             C   s@   t tjdd | jD t }| jr2|j| jj  |t| j S )z:see: Expression.free()c             S   s   g | ]}|j  qS r1   )r   )r5   cr1   r1   r2   r7   z  s    zDRS.free.<locals>.<listcomp>)	r   operatoror_r\   r   r   updater   r[   )rF   Z
conds_freer1   r1   r2   r   x  s    zDRS.freec             C   sJ   |r@| j ttjdd | jD  }| jr<|j| jjd |S | j S dS )z#:see: AbstractExpression.get_refs()c             s   s   | ]}|j d V  qdS )TN)r   )r5   r   r1   r1   r2   	<genexpr>  s    zDRS.get_refs.<locals>.<genexpr>TN)r[   listr   from_iterabler\   r   extendr   )rF   r   Z
conds_refsr1   r1   r2   r     s    zDRS.get_refsc             C   s.   t t|| j}| jr&|j|| j ||S )z:see: Expression.visit())r   mapr\   r   r]   )rF   rq   
combinatorpartsr1   r1   r2   visit  s    z	DRS.visitc             C   s.   | j r|| j nd}|| jtt|| j|S )z#:see: Expression.visit_structured()N)r   r[   r   r   r\   )rF   rq   r   r   r1   r1   r2   r     s    zDRS.visit_structuredc             C   s0  | }d}x|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|jdd}d}|d8 }|d7 }q
W g }xF|jD ]<}|j }|j }t|t p|j
p|jp|jr|j| qW |jr|jj nd }t|j
||S )Nr   r4   F)lenr\   ri   r   rd   r   re   r"   r   r   r[   ra   r   r   r   r   r]   )rF   rb   r   r   r\   Znew_condZnew_cond_simpr   r1   r1   r2   r     s6    

zDRS.eliminate_equalityc             C   s   | j rnd }| jr&ttdd | jD }|r<t|| j j }n
| j j }x"| jd d d D ]}t||}qXW |S | js|tdttdd | jD }x.t	t
| j| jd d d D ]}t||}qW |S d S )Nc             S   s   g | ]}|j  qS r1   )r   )r5   r   r1   r1   r2   r7     s    zDRS.fol.<locals>.<listcomp>r4   z-Cannot convert DRS with no conditions to FOL.c             S   s   g | ]}|j  qS r1   )r   )r5   r   r1   r1   r2   r7     s    r   )r   r\   r   r   r   r   r[   r   rj   r   r   _order_ref_stringsr   )rF   accumr   r1   r1   r2   r     s     
"zDRS.folc                s   dj | j| j}dd dd | jD D }tt|gttt|  dd   d d|j  d	 d
d   d g fdd|D  dd   d g }| j	rt
j|tj| j	j S |S )N c             S   s   g | ]}|D ]}|qqS r1   r1   )r5   Z	cond_liner   r1   r1   r2   r7     s   zDRS._pretty.<locals>.<listcomp>c             S   s   g | ]}t d d |j qS )c             S   s   | j  S )N)strip)r   r1   r1   r2   rh     s    z(DRS._pretty.<locals>.<listcomp>.<lambda>)filterr   )r5   r   r1   r1   r2   r7     s    z __z_ z| z |z|--z-|c                s   g | ]}d |j   d qS )z| z |)ljust)r5   line)lengthr1   r2   r7     s    z|_z_|)r   r   r[   r\   maxr   r   r   r   r   DrtBinaryExpression_assemble_prettyr!   IMPr   )rF   Z	refs_lineZ
cond_linesrb   r1   )r   r2   r     s    TzDRS._prettyc             C   s   dd |D }g }g }g }g }xR|D ]J}t |r<|j| q$t|rP|j| q$t|rd|j| q$|j| q$W t|t|dd d t|dd d t|dd d S )Nc             S   s   g | ]}d | qS )z%sr1   )r5   r   r1   r1   r2   r7     s    z*DRS._order_ref_strings.<locals>.<listcomp>c             S   s(   t | dd  dgt| dd  dk S )Nr8   r4   r   r   )intr   )vr1   r1   r2   rh     s    z(DRS._order_ref_strings.<locals>.<lambda>)keyc             S   s0   | d t | dd  dgt| dd  dk fS )Nr   r4   r   )r   r   )r   r1   r1   r2   rh     s    c             S   s0   | d t | dd  dgt| dd  dk fS )Nr   r4   r   )r   r   )r   r1   r1   r2   rh      s    )r   r]   r   r   sorted)rF   r[   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|}x2t| j|jD ] \}}| j|}|j||d}q2W | j|jkrt| jt|jkrx&t| j|jD ]\}}||ksdS qW d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)	ri   r"   r   r[   zipr_   r   r   r\   )rF   r   converted_otherr1r2varexc1c2r1   r1   r2   __eq__  s    

z
DRS.__eq__c             C   s
   | |k S )Nr1   )rF   r   r1   r1   r2   __ne__  s    z
DRS.__ne__c             C   s^   dj dj| j| jdjdd | jD }| jrZtj| d tj d d| j  tj	 S |S )Nz([{}],[{}]),z, c             s   s   | ]}d | V  qdS )z%sNr1   )r5   r   r1   r1   r2   r     s    zDRS.__str__.<locals>.<genexpr>r   z%s)
formatr   r   r[   r\   r   r!   rJ   r   rZ   )rF   rb   r1   r1   r2   __str__  s    (zDRS.__str__)N)FT)F)r'   r(   r)   rz   r@   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   ru   r   r   DrtFunctionVariableExpressionr   DrtEventVariableExpressionDrtConstantExpression)ra   r1   r1   r2   rt   ,  s    


rt   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 )Nr1   )rF   r1   r1   r2   r   <  s    z!DrtAbstractVariableExpression.folFc             C   s   g S )z#:see: AbstractExpression.get_refs()r1   )rF   r   r1   r1   r2   r   ?  s    z&DrtAbstractVariableExpression.get_refsc             C   s    d|  }dt | }||||gS )Nz%sr   )r   )rF   r   blankr1   r1   r2   r   C  s    z%DrtAbstractVariableExpression._prettyc             C   s   | S )Nr1   )rF   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   N)r'   r(   r)   r1   r1   r1   r2   r   R  s   r   c               @   s   e Zd ZdS )r   N)r'   r(   r)   r1   r1   r1   r2   r   X  s   r   c               @   s   e Zd ZdS )r   N)r'   r(   r)   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 )r`   c             C   s   || _ || _d S )N)ra   rb   )rF   ra   rb   r1   r1   r2   r@   c  s    zDrtProposition.__init__FTc             C   sT   | j |kr6t|tstdt|j | jj||||S t| j | jj||||S d S )Nz4Can only replace a proposition label with a variable)ra   ri   r   r   r`   rb   r   )rF   ra   rU   r   r   r1   r1   r2   r   g  s    

zDrtProposition.replacec             C   s   t | j| jj S )N)r`   ra   rb   r   )rF   r1   r1   r2   r   v  s    z!DrtProposition.eliminate_equalityc             C   s   |r| j jdS g S )NT)rb   r   )rF   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 )N)r   ra   rb   )rF   r   r1   r1   r2   r   |  s    zDrtProposition.__eq__c             C   s
   | |k S )Nr1   )rF   r   r1   r1   r2   r     s    zDrtProposition.__ne__c             C   s
   | j j S )N)rb   r   )rF   r1   r1   r2   r     s    zDrtProposition.folc                sj   j 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   z%sc                s   g | ]} d  | qS )r   r1   )r5   r   )r   r1   r2   r7     s    z*DrtProposition._pretty.<locals>.<listcomp>r4   c                s   g | ]}d  j  d | qS )z%sr&   )ra   )r5   r   )rF   r1   r2   r7     s    r8   c                s   g | ]} d  | qS )r   r1   )r5   r   )r   r1   r2   r7     s    )rb   r   r   ra   )rF   Zdrs_sr1   )r   rF   r2   r     s    
zDrtProposition._prettyc             C   s   ||| j gS )z:see: Expression.visit())rb   )rF   rq   r   r1   r1   r2   r     s    zDrtProposition.visitc             C   s   || j || jS )z#:see: Expression.visit_structured())ra   rb   )rF   rq   r   r1   r1   r2   r     s    zDrtProposition.visit_structuredc             C   s   d| j  d| j dS )Nzprop(z, ))ra   rb   )rF   r1   r1   r2   r     s    zDrtProposition.__str__N)FT)F)r'   r(   r)   r@   r   r   r   r   r   r   r   r   r   r   r   r   r1   r1   r1   r2   r`   b  s   

	r`   c               @   s&   e Zd Zdd Zd	ddZdd ZdS )
rT   c             C   s   t | jj S )N)r   rx   r   )rF   r1   r1   r2   r     s    zDrtNegatedExpression.folFc             C   s   | j j|S )z#:see: AbstractExpression.get_refs())rx   r   )rF   r   r1   r1   r2   r     s    zDrtNegatedExpression.get_refsc             C   sb   | j 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   )r5   r   r1   r1   r2   r7     s    z0DrtNegatedExpression._pretty.<locals>.<listcomp>r8   c             S   s   g | ]}d | qS )z__  r1   )r5   r   r1   r1   r2   r7     s    r9   c             S   s   g | ]}d | qS )z  | r1   )r5   r   r1   r1   r2   r7     s    r:   c             S   s   g | ]}d | qS )z    r1   )r5   r   r1   r1   r2   r7     s    )rx   r   )rF   
term_linesr1   r1   r2   r     s    
zDrtNegatedExpression._prettyN)F)r'   r(   r)   r   r   r   r1   r1   r1   r2   rT     s   
rT   c               @   s.   e Zd Zdd Zdd Zdd Zddd	Zd
S )rv   c             C   s   | 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   rx   r   ra   rt   )rF   r   r1   r1   r2   r     s    z!DrtLambdaExpression.alpha_convertc             C   s   t | j| jj S )N)r   ra   rx   r   )rF   r1   r1   r2   r     s    zDrtLambdaExpression.folc                s   | j g}| j}x"|j| jkr0|j|j  |j}qW djdd |D tj |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 )z%sNr1   )r5   r   r1   r1   r2   r     s    z.DrtLambdaExpression._pretty.<locals>.<genexpr>c                s   g | ]}d   | qS )z    r1   )r5   r   )r   r1   r2   r7     s    z/DrtLambdaExpression._pretty.<locals>.<listcomp>r4   c                s   g | ]}d   | qS )z \  r1   )r5   r   )r   r1   r2   r7     s    r8   c                s   g | ]}d   | qS )z /\ r1   )r5   r   )
var_stringr1   r2   r7     s    r9   c                s   g | ]}d   | qS )z    r1   )r5   r   )r   r1   r2   r7     s    )	ra   rx   r   r]   r   r!   DOTr   r   )rF   rw   rx   r   r1   )r   r   r2   r     s    
zDrtLambdaExpression._prettyFc             C   s    |r| j g| jjd S | j gS )z#:see: AbstractExpression.get_refs()T)ra   rx   r   )rF   r   r1   r1   r2   r     s    zDrtLambdaExpression.get_refsN)F)r'   r(   r)   r   r   r   r   r1   r1   r1   r2   rv     s   
rv   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 jd| jjd S g S )z#:see: AbstractExpression.get_refs()T)rd   r   re   )rF   r   r1   r1   r2   r     s    zDrtBinaryExpression.get_refsc             C   s"   t j| j| j| j | j| jS )N)r   r   _pretty_subexrd   getOpre   )rF   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   )r5   
first_linesecond_line)r   r1   r2   r7     s   z8DrtBinaryExpression._assemble_pretty.<locals>.<listcomp>r8   c                s,   g | ]$\}}d | d   d | d qS )(r   r   r1   )r5   r   r   )opr1   r2   r7     s   r9   c                s,   g | ]$\}}d | d    d  | d  qS )r   r1   )r5   r   r   )r   r1   r2   r7     s   )r   r   _pad_verticallyr   r   )Zfirst_linesr   Zsecond_lines	max_linesZfirst_second_linesr1   )r   r   r2   r     s    


2
z$DrtBinaryExpression._assemble_prettyc             C   s   |j  S )N)r   )rF   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 )DrtBooleanExpressionN)r'   r(   r)   r1   r1   r1   r2   r     s   r   c               @   s   e Zd Zdd Zdd ZdS )rl   c             C   s   t | jj | jj S )N)r   rd   r   re   )rF   r1   r1   r2   r     s    zDrtOrExpression.folc             C   s(   t |trdd |j D S tj| |S )Nc             S   s   g | ]}|d d qS )r4   r   r1   )r5   r   r1   r1   r2   r7   	  s    z1DrtOrExpression._pretty_subex.<locals>.<listcomp>)ri   rl   r   r   r   )rF   r   r1   r1   r2   r     s    
zDrtOrExpression._pretty_subexN)r'   r(   r)   r   r   r1   r1   r1   r2   rl     s   rl   c               @   s   e Zd Zdd ZdS )rc   c             C   s   t | jj | jj S )N)r   rd   r   re   )rF   r1   r1   r2   r     s    zDrtEqualityExpression.folN)r'   r(   r)   r   r1   r1   r1   r2   rc     s   rc   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 )$rg   zDRS of the form '(DRS + DRS)'Nc             C   s   t j| || || _d S )N)r   r@   r   )rF   rd   re   r   r1   r1   r2   r@     s    zDrtConcatenation.__init__FTc       
      C   s   | j }| j}| j}|| j krX|r|j||||}|j||||}|r|j||||}n|rx^t| jd|j @ D ]D}tt|}	|j||	d|}|j||	d|}|rt|j||	d|}qtW |j||||}|j||||}|r|j||||}| j	|||S )z_Replace all instances of variable v with expression E in self,
        where v is free in self.T)
rd   re   r   r   r   r   r   rt   r   r   )
rF   ra   rU   r   r   rd   re   r   r   r   r1   r1   r2   r     s2    zDrtConcatenation.replacec             C   s    | j  }t|t st|j S )N)r   ri   rg   r   r   )rF   rb   r1   r1   r2   r   @  s    z#DrtConcatenation.eliminate_equalityc             C   s   | j j }| jj }| jr$| jj nd }t|trt|trx>t|jdt|jd@ D ]}tt	|}|j
||d}qZW t|j|j |j|j |S | j|||S d S )NT)rd   r   re   r   ri   r"   r   r   rt   r   r   r[   r\   r   )rF   rd   re   r   r   r   r1   r1   r2   r   F  s    

"zDrtConcatenation.simplifyc             C   s8   | j j|| jj| }| jr4|r4|j| jjd |S )z#:see: AbstractExpression.get_refs()T)rd   r   re   r   r   )rF   r   r[   r1   r1   r2   r   V  s    
zDrtConcatenation.get_refsc             C   s   t jS )N)r!   r*   )rF   r1   r1   r2   r   ]  s    zDrtConcatenation.getOpc             C   s   t |tr| j }|j }t|t|kr|}x.t||D ] \}}| j|}|j||d}q:W | j|jko| j|jko| j	|j	k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)
ri   rg   r   r   r   r_   r   rd   re   r   )rF   r   Z	self_refsZ
other_refsr   r   r   r   r1   r1   r2   r   `  s    

zDrtConcatenation.__eq__c             C   s
   | |k S )Nr1   )rF   r   r1   r1   r2   r   r  s    zDrtConcatenation.__ne__c             C   s0   t | jj | jj }| jr,t|| jj }|S )N)r   rd   r   re   r   r   )rF   r   r1   r1   r2   r   w  s    zDrtConcatenation.folc             C   sB   t j| j| j| j | j| j}| jr>t j|tj| jj	 }|S )N)
r   r   r   rd   r   re   r   r!   r   r   )rF   rb   r1   r1   r2   r   }  s    
zDrtConcatenation._prettyc             C   s(   t |trdd |j D S tj| |S )Nc             S   s   g | ]}|d d qS )r4   r   r1   )r5   r   r1   r1   r2   r7     s    z2DrtConcatenation._pretty_subex.<locals>.<listcomp>)ri   rg   r   r   r   )rF   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 )z:see: Expression.visit()N)r   rd   re   )rF   rq   r   r1   r1   r2   r     s    zDrtConcatenation.visitc             C   sn   | j | j}| j | j}tj| d | j  d | tj }| jrjtj| d tj	 d d| j  tj S |S )Nr   z%s)

_str_subexrd   re   r   rJ   r   rZ   r   r!   r   )rF   rd   re   rb   r1   r1   r2   r     s    $(zDrtConcatenation.__str__c             C   s,   d| }t |tr(|jd kr(|dd S |S )Nz%sr4   r   )ri   rg   r   )rF   r   r   r1   r1   r2   r     s    zDrtConcatenation._str_subex)N)FT)F)r'   r(   r)   rz   r@   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r1   r1   r1   r2   rg     s    

'
	rg   c               @   s&   e Zd Zdd Zd	ddZdd ZdS )
rp   c             C   s   t | jj | jj S )N)r   rq   r   rr   )rF   r1   r1   r2   r     s    zDrtApplicationExpression.folFc             C   s    |r| j jd| jjd S g S )z#:see: AbstractExpression.get_refs()T)rq   r   rr   )rF   r   r1   r1   r2   r     s    z!DrtApplicationExpression.get_refsc                s   | j  \}}|j }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 | ]}|j  qS r1   )r   )r5   argr1   r1   r2   r7     s    z4DrtApplicationExpression._pretty.<locals>.<listcomp>c                s   g | ]}t | qS r1   )r   )r5   Z	arg_lines)r   r1   r2   r7     s    c             S   s&   g | ]\}}|d  d j | d  qS )r   )r   )r5   	func_line	args_liner1   r1   r2   r7     s   r8   c             S   s&   g | ]\}}|d  dj | d qS )r   r   r   )r   )r5   r   r   r1   r1   r2   r7     s   r9   c             S   s&   g | ]\}}|d  d j | d  qS )r   )r   )r5   r   r   r1   r1   r2   r7     s   )uncurryr   r   r   r   r   r   r   )rF   rq   argsZfunction_linesZ
args_linesZfunc_args_linesr1   )r   r2   r     s    

*z DrtApplicationExpression._prettyN)F)r'   r(   r)   r   r   r   r1   r1   r1   r2   rp     s   
rp   c             C   s&   dt | d  g}| ||t |    S )Nr   r   )r   )linesr   Z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   )rF   r1   r1   r2   r     s    zPossibleAntecedents.freeFTc             C   s6   t  }x*| D ]"}||kr$| j| q| j| qW |S )z_Replace all instances of variable v with expression E in self,
        where v is free in self.)r   r]   )rF   ra   rU   r   r   resultitemr1   r1   r2   r     s    
zPossibleAntecedents.replacec             C   s   d|  }dt | }|||gS )Nz%sr   )r   )rF   r   r   r1   r1   r2   r     s    zPossibleAntecedents._prettyc             C   s   ddj dd | D  d S )Nr$   r   c             s   s   | ]}d | V  qdS )z%sNr1   )r5   itr1   r1   r2   r     s    z.PossibleAntecedents.__str__.<locals>.<genexpr>r%   )r   )rF   r1   r1   r2   r     s    zPossibleAntecedents.__str__N)FT)r'   r(   r)   r   r   r   r   r1   r1   r1   r2   r     s   
r   c               @   s   e Zd ZdS )AnaphoraResolutionExceptionN)r'   r(   r)   r1   r1   r1   r2   r     s   r   c             C   sh  t | tr| j rt }xL|D ]D}x>|j D ]2}| j|}|j| jjkr,|| jk r,|j| q,W qW t	|dkr||d }n|}| j
| j|S t| j|| g }t| j|| g }| j||S nt | tr~g }	xz| jD ]p}
t|
|| g }t |tr@t |jtr|j}|j|_||_t |jtr@|js@td|j |	j| qW | jrjt| j|| g }nd }| j| j|	|S t | tr| S t | tr| jt| j|| g S t | tr| jrt| j|| g }nd }| jt| j|| g t| j|| g |S t | tr<| jt| j|| g t| j|| g S t | trd| j| jt| j|| g S d S )Nr4   r   z+Variable '%s' does not resolve to anything.)ri   r   r   r   r   r_   r   rr   r]   r   rf   r   rq   r"   r\   r   rd   re   r   r   r[   r   r   rx   rg   r	   r   ra   )rU   trailZpossible_antecedentsZancestorr   Zrefex
resolutionZ
r_functionZ
r_argumentZr_condsr   Zr_condtempr   r1   r1   r2   r     sn    




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   r9   
   r<   TNc       
      C   s   d}|st  }|jd tddd}|rt|ddd}||_|| _| j|| j| j\}}t	|| j d}|| j }	t|||	d}nt|d	d	d}|j
  ||_|| _|| _|| _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   packrb   master)
rF   rb   Zsize_canvasr  r  r  rightbottomr  r  r1   r1   r2   r@   L  s&    

zDrsDrawer.__init__c             C   s   | j jjdS )z Get the height of a line of textZ	linespace)r  r  Zmetrics)rF   r1   r1   r2   _get_text_heightl  s    zDrsDrawer._get_text_heightc             C   sB   | j | j| j|| | jr.t  r.| jj  n| j| j||S dS )zDraw the DRSN)_handlerb   _draw_commandr  r    Zmainloopr  )rF   r6   yr1   r1   r2   r   p  s    zDrsDrawer.drawc             C   s   | 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)rF   rU   r6   r  r1   r1   r2   r  y  s    	zDrsDrawer._visitc             C   s   t |tr&| jj||d| jj|d nLt |trr|\}}| jj|||| || j  | jd  }| 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  textr8   )ri   strr  Zcreate_textr  tupleZcreate_rectangler  BUFFERZcreate_liner  )rF   r   r6   r  r  r  Zhoriz_line_yr1   r1   r2   r    s    	

zDrsDrawer._draw_commandc             C   s:   t |tr(|| jj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)ri   r  r  r  Zmeasurer  r  )rF   r   r6   r  r1   r1   r2   r    s    	

zDrsDrawer._visit_commandr   c             C   s  || j kr<y|j| }|j| }||fS  tk
r:   Y nX t|trN| j}nt|tr`| j}nxt|t	rr| 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
        )r  Z_drawing_width_drawing_heightr   ri   r   _handle_VariableExpressionr"   _handle_DRSrT   _handle_NegatedExpressionrv   _handle_LambdaExpressionr	   _handle_BinaryExpressionrp   _handle_ApplicationExpressionr   r`   _handle_DrtPropositionrj   r   r'   )rF   rU   commandr6   r  r  r  rn   r1   r1   r2   r    s8    












zDrsDrawer._handlec             C   s   |d| ||S )Nz%sr1   )rF   rU   r'  r6   r  r1   r1   r2   r     s    z$DrsDrawer._handle_VariableExpressionc             C   sR   | j tj||d }| j|j|||\}}|tj|| j||| | j  ||fS )Nr   )r  r!   ZNOTr  rx   _get_centered_topr  )rF   rU   r'  r6   r  r  r  r1   r1   r2   r"    s    z#DrsDrawer._handle_NegatedExpressionc             C   s   || j  }|| j  }|jr2djdd |jD }nd}||||\}}|| j d 7 }|jrxJ|jD ],}	| j|	|||\}
}t||
}|| j 7 }qbW n|| j | j  7 }|| j 7 }|||f||S )Nr   c             s   s   | ]}d | V  qdS )z%sNr1   )r5   rr1   r1   r2   r     s    z(DrsDrawer._handle_DRS.<locals>.<genexpr>z     r8   )r  r[   r   r\   r  r   r  )rF   rU   r'  r6   r  leftr  r[   Z	max_rightr   r  r1   r1   r2   r!    s    



zDrsDrawer._handle_DRSc                s   |j  \}}t|ts$|j}|jg} j|d }t|g fdd|D  }| }	 j|	|j}
 j	|||
d } j|	 j
 }|tj||d }x^t|D ]R\}} j|	|j} j	||||d }|d t|k r|tjd ||d }qW |tj||d }||fS )Nr4   c                s   g | ]} j |d  qS )r4   )r  )r5   r   )rF   r6   r  r1   r2   r7     s    z;DrsDrawer._handle_ApplicationExpression.<locals>.<listcomp>r   r   )r   ri   r   rq   rr   r  r   r(  r  r  r  r!   rJ   	enumerater   rX   rZ   )rF   rU   r'  r6   r  rq   r   Zfunction_bottomZ
max_bottomline_heightZfunction_drawing_topr  centred_string_topr   r   Zarg_drawing_topr1   )rF   r6   r  r2   r%    s,    
z'DrsDrawer._handle_ApplicationExpressionc             C   sd   t jd|j  t j }| j|||d }| j|j|||\}}|||| j||| | j  ||fS )Nz%sr   )	r!   ZLAMBDAra   r   r  r  rx   r(  r  )rF   rU   r'  r6   r  rw   r  r  r1   r1   r2   r#  -  s    z"DrsDrawer._handle_LambdaExpressionc             C   s   | j |jddd }| j |jddd }t||}| j||| j }|tj||d }	|jj}| j	|j||	| j|||\}	}
|d|j
  |	|d }	|jj}| j	|j||	| j|||\}	}|tj|	|d }	|	t|
|fS )Nr   r4   z %s )r  rd   re   r   r(  r  r!   rJ   r  r  r   rZ   )rF   rU   r'  r6   r  Zfirst_heightZsecond_heightr,  r-  r  Zfirst_bottomZsecond_bottomr1   r1   r2   r$  <  s*    
z"DrsDrawer._handle_BinaryExpressionc             C   s0   ||j ||d }| j|j|||\}}||fS )Nr   )ra   r  rx   )rF   rU   r'  r6   r  r  r  r1   r1   r2   r&  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.r8   r1   )rF   topZfull_heightZitem_heightr1   r1   r2   r(  k  s    zDrsDrawer._get_centered_top)TN)r   r   )r'   r(   r)   r  r  r  r@   r  r   r  r  r  r  r   r"  r!  r%  r#  r$  r&  r(  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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  d S )/N=   z
TEST PARSEz([x,y],[sees(x,y)])z([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)])z ([x],[man(x), -([],[walks(x)])])z*([],[(([x],[man(x)]) -> ([],[walks(x)]))])z
Test fol()z4Test alpha conversion and lambda expression equalityz\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([],[])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)]))z====================z====================TEST PARSEz====================z2====================TEST PARSE====================z====================z====================Test fol()z====================z2====================Test fol()====================z====================zH====================Test alpha conversion and lambda expression equalityz====================z\====================Test alpha conversion and lambda expression equality====================z====================z+====================Test resolve_anaphora()z====================z?====================Test resolve_anaphora()====================z====================z'====================Test pretty_print()z====================z;====================Test pretty_print()====================)r   r{   r   r   r   r   r   r   )ZdexprZe1e2r1   r1   r2   demor  s>    
r3  c              C   sz   yddl m}  W n* tk
r: } ztdW Y d d }~X nX dddddd	d
ddddg}x|D ]}tj|}|j  q\W d S )Nr   )r   z,tkinter is required, but it's not available.r6   z([],[])z([x],[])z([x],[man(x)])z([x,y],[sees(x,y)])z([x],[man(x), walks(x)])z\x.([],[man(x), walks(x)])z\x y.([],[sees(x,y)])z)([],[(([],[walks(x)]) + ([],[runs(x)]))])z ([x],[man(x), -([],[walks(x)])])z*([],[(([x],[man(x)]) -> ([],[walks(x)]))]))tkinterr   ImportError
ValueErrorr{   r   r   )r   r   Zexpressionsdr1   r1   r2   	test_draw  s$    

r8  __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   r4  r   r   Ztkinter.fontr   Z	nltk.utilr    r5  r!   r3   r{   r"   rt   r   r   r   r   r   r`   rT   rv   r   r   rl   rc   rg   rp   r   r   r   rj   r   r   r   r3  r8  r'   r1   r1   r1   r2   <module>	   s\   l g  


>%(
 $S  -(
