B
    >?[n                 @   s  d dl mZmZ d dlZd dlmZ d dlm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e0Z1eG dd de1eZ2dd Z3G dd de1eZ4G dd de4eZ5G dd de4eZ6G dd de5eZ7G dd de4eZ8eG dd  d e1eZ9G d!d" d"e1eZ:G d#d$ d$e1eZ;G d%d& d&e1eZ<G d'd( d(e<eZ=G d)d* d*e=e Z>G d+d, d,e<eZ?eG d-d. d.e=Z@G d/d0 d0e1eZAd1d2 ZBeG d3d4 d4eCe1eZDG d5d6 d6eEZFg fd7d8ZGG d9d: d:e0ZHd;d< ZId=d> ZJeKd?kreI  dS )@    )print_functionunicode_literalsN)reduce)chain)string_types)python_2_unicode_compatible)APPAbstractVariableExpressionAllExpressionAndExpressionApplicationExpressionBinaryExpressionBooleanExpressionConstantExpressionEqualityExpressionEventVariableExpressionExistsExpression
ExpressionFunctionVariableExpressionImpExpressionIndividualVariableExpressionLambdaExpressionTokensLogicParserNegatedExpressionOrExpression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 r5   r5   +lib/python3.7/site-packages/nltk/sem/drt.pyr%   8   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 )   r5   ).0xr5   r5   r6   
<listcomp>N   s    z&DrtParser.__init__.<locals>.<listcomp>c             S   s   g | ]}|d fqS )   r5   )r9   r:   r5   r5   r6   r;   O   s       c             S   s   g | ]}|d fqS )   r5   )r9   r:   r5   r5   r6   r;   Q   s          c             S   s   g | ]}|d fqS )   r5   )r9   r:   r5   r5   r6   r;   T   s    c             S   s   g | ]}|d fqS )   r5   )r9   r:   r5   r5   r6   r;   U   s    )N	   )r   __init__dictr%   LAMBDA_LISTNOT_LISTr   ZEQ_LISTr   ZNEQ_LISTr2   r.   OR_LISTIMP_LISTZoperator_precedence)selfr5   r5   r6   rD   J   s    
	zDrtParser.__init__c             C   s   t jS )z#This method exists to be overridden)r%   r3   )rJ   r5   r5   r6   get_all_symbolsY   s    zDrtParser.get_all_symbolsc             C   s
   |t jkS )N)r%   r4   )rJ   tokr5   r5   r6   
isvariable]   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%   rG   Zhandle_negationrF   Zhandle_lambdaOPENinRangetokenr0   
handle_DRSZhandle_openupperr&   assertNextTokenrM   r2   handle_propZhandle_variable)rJ   rL   contextr5   r5   r6   handle`   s    



zDrtParser.handlec             C   s   t |S )N)DrtNegatedExpression)rJ   
expressionr5   r5   r6   make_NegatedExpressiony   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_condsrS   CLOSEr&   )rJ   rL   rU   refscondsr5   r5   r6   rQ   |   s    
zDrtParser.handle_DRSc             C   sl   |  tj g }xJ| drZ| dtjkrZ|rH| dtjkrH|   || d qW |  tj |S )Nr   Z
quantified)	rS   r%   r0   rO   rP   r1   r[   appendZget_next_token_variable)rJ   r^   r5   r5   r6   rZ      s    zDrtParser.handle_refsc             C   sl   |  tj g }xJ| drZ| dtjkrZ|rH| dtjkrH|   || | qW |  tj |S )Nr   )	rS   r%   r0   rO   rP   r1   r[   r`   process_next_expression)rJ   rU   r_   r5   r5   r6   r\      s    zDrtParser.handle_condsc             C   s*   |  |}| d | tj}t||S )Nr*   )make_VariableExpressionrS   ra   r%   r2   DrtProposition)rJ   rL   rU   variabledrsr5   r5   r6   rT      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)rJ   firstsecondr5   r5   r6   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)rg   rh   r5   r5   r6   <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_   rj   rg   rh   	Exception)rg   rh   r5   r5   r6   make_imp_expression   s
    

zDDrtParser.get_BooleanExpression_factory.<locals>.make_imp_expressionN)r%   r.   rH   DrtOrExpressionrI   )rJ   rL   rn   r5   r5   r6   get_BooleanExpression_factory   s    


z'DrtParser.get_BooleanExpression_factoryc             C   s
   |||S )Nr5   )rJ   factoryrg   rh   r5   r5   r6   make_BooleanExpression   s    z DrtParser.make_BooleanExpressionc             C   s
   t ||S )N)DrtApplicationExpression)rJ   functionargumentr5   r5   r6   make_ApplicationExpression   s    z$DrtParser.make_ApplicationExpressionc             C   s   t t|S )N)DrtVariableExpressionr   )rJ   namer5   r5   r6   rb      s    z!DrtParser.make_VariableExpressionc             C   s
   t ||S )N)DrtLambdaExpression)rJ   	variablestermr5   r5   r6   make_LambdaExpression   s    zDrtParser.make_LambdaExpressionN)r+   r,   r-   __doc__rD   rK   rM   rV   rY   rQ   rZ   r\   rT   ri   rp   rr   rv   rb   r|   r5   r5   r5   r6   r7   G   s    r7   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 )N)_drt_parserparse)clssr5   r5   r6   
fromstring   s    zDrtExpression.fromstringc             C   s
   t | |S )N)rs   )rJ   otherr5   r5   r6   applyto   s    zDrtExpression.applytoc             C   s   t | S )N)rW   )rJ   r5   r5   r6   __neg__   s    zDrtExpression.__neg__c             C   s
   t  d S )N)NotImplementedError)rJ   r   r5   r5   r6   __and__   s    zDrtExpression.__and__c             C   s   t |tstt| |S )N)rl   r~   AssertionErrorro   )rJ   r   r5   r5   r6   __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)
rl   r~   r   r&   r^   r_   rj   rg   rh   rm   )rJ   r   r5   r5   r6   __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``
        )rl   r~   r   simplifyfolequiv)rJ   r   Zproverf1f2r5   r5   r6   r      s    	zDrtExpression.equivc             C   s   t d| jj d S )Nz#'%s' object has no attribute 'type')AttributeError	__class__r+   )rJ   r5   r5   r6   type   s    zDrtExpression.typec             C   s
   t  d S )N)r   )rJ   Z	signaturer5   r5   r6   	typecheck   s    zDrtExpression.typecheckc             C   s   t | |d S )N)rj   )rJ   r   r5   r5   r6   __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   )rJ   	recursiver5   r5   r6   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)"? )
rl   rs   rt   DrtAbstractVariableExpressionrd   rx   r%   r/   ru   DrtIndividualVariableExpression)rJ   r5   r5   r6   is_pronoun_function  s    
z!DrtExpression.is_pronoun_functionc             C   s
   t ||S )N)rf   )rJ   rg   rh   r5   r5   r6   ri     s    z%DrtExpression.make_EqualityExpressionc             C   s   t |S )N)rw   )rJ   rd   r5   r5   r6   rb     s    z%DrtExpression.make_VariableExpressionc             C   s   t | S )N)resolve_anaphora)rJ   r5   r5   r6   r     s    zDrtExpression.resolve_anaphorac             C   s   |  dd | jS )Nc             S   s   |   S )N)eliminate_equality)er5   r5   r6   rk      s    z2DrtExpression.eliminate_equality.<locals>.<lambda>)visit_structuredr   )rJ   r5   r5   r6   r     s    z DrtExpression.eliminate_equalityc             C   s   d |  S )zG
        Draw the DRS
        :return: the pretty print string
        
)join_pretty)rJ   r5   r5   r6   pretty_format"  s    zDrtExpression.pretty_formatc             C   s   t |   d S )N)printr   )rJ   r5   r5   r6   pretty_print)  s    zDrtExpression.pretty_printc             C   s   t |   d S )N)	DrsDrawerdraw)rJ   r5   r5   r6   r   ,  s    zDrtExpression.draw)N)N)F)r+   r,   r-   r}   r7   r   classmethodr   r   r   r   r   r   r   propertyr   r   r   r   r   ri   rb   r   r   r   r   r   r5   r5   r5   r6   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)rJ   r^   r_   r   r5   r5   r6   rD   4  s    zDRS.__init__FTc                sh  | 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 xt| j  @ D ]t	}t
|| j }| jr| jd }nd}t| j d| |g | j |d d   fdd| jD |} qW | jr<| 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.TNr8   c                s   g | ]}| d  qS )T)replace)r9   cond)alpha_convertrX   rd   r5   r6   r;   P  s   zDRS.replace.<locals>.<listcomp>c                s   g | ]}| d  qS )T)r   )r9   r   )r   newvarexrefr5   r6   r;   f  s   c                s   g | ]}|  qS r5   )r   )r9   r   )r   rX   replace_boundrd   r5   r6   r;   v  s   )r^   indexr   r   r&   rd   r_   setfreer    rw   )rJ   rd   rX   r   r   ir   newvarr5   )r   rX   r   r   r   rd   r6   r   >  sH    
&$
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 r5   )r   )r9   cr5   r5   r6   r;   ~  s    zDRS.free.<locals>.<listcomp>)	r   operatoror_r_   r   r   updater   r^   )rJ   Z
conds_freer5   r5   r6   r   |  s    zDRS.freec             C   sH   |r>| j ttdd | jD   }| jr:|| jd |S | j S dS )z#:see: AbstractExpression.get_refs()c             s   s   | ]}| d V  qdS )TN)r   )r9   r   r5   r5   r6   	<genexpr>  s    zDRS.get_refs.<locals>.<genexpr>TN)r^   listr   r_   r   extendr   )rJ   r   Z
conds_refsr5   r5   r6   r     s    zDRS.get_refsc             C   s.   t t|| j}| jr&||| j ||S )z:see: Expression.visit())r   mapr_   r   r`   )rJ   rt   
combinatorpartsr5   r5   r6   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_   )rJ   rt   r   r   r5   r5   r6   r     s    zDRS.visit_structuredc             C   s8  | }d}x|t |jk r|j| }t|trt|jtrt|jtrttt	|j
t	|jjg |jd | |j|d d   |j}|jj|jjkr||jj|jdd}d}|d8 }|d7 }q
W g }xJ|jD ]@}| }| }t|tr|j
s|js|jr|| qW |jr&|j nd }t|j
||S )Nr   r8   F)lenr_   rl   r   rg   r	   rh   r&   r   r   r^   rd   r   r   r   r   r`   )rJ   re   r   r   r_   Znew_condZnew_cond_simpr   r5   r5   r6   r     s6    

zDRS.eliminate_equalityc             C   s   | j rnd }| jr&ttdd | jD }|r<t|| j  }n
| j  }x"| jd d d D ]}t||}qXW |S | js|tdttdd | jD }x.t	t
| | jd d d D ]}t||}qW |S d S )Nc             S   s   g | ]}|  qS r5   )r   )r9   r   r5   r5   r6   r;     s    zDRS.fol.<locals>.<listcomp>z-Cannot convert DRS with no conditions to FOL.c             S   s   g | ]}|  qS r5   )r   )r9   r   r5   r5   r6   r;     s    )r   r_   r   r   r   r   r^   r
   rm   r   r   _order_ref_stringsr   )rJ   Zaccumr   r5   r5   r6   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 r5   r5   )r9   Z	cond_liner   r5   r5   r6   r;     s   zDRS._pretty.<locals>.<listcomp>c             S   s   g | ]}t d d | qS )c             S   s   |   S )N)strip)r   r5   r5   r6   rk     s    z(DRS._pretty.<locals>.<listcomp>.<lambda>)filterr   )r9   r   r5   r5   r6   r;     s    z __z_ z| z |z|--z-|c                s   g | ]}d |   d qS )z| z |)ljust)r9   line)lengthr5   r6   r;     s    z|_z_|)r   r   r^   r_   maxr   r   r   r   r   DrtBinaryExpression_assemble_prettyr%   IMPr   )rJ   Z	refs_lineZ
cond_linesre   r5   )r   r6   r     s    TzDRS._prettyc             C   s   dd |D }g }g }g }g }xR|D ]J}t |r<|| q$t|rP|| q$t|rd|| q$|| q$W t|t|dd d t|dd d t|dd d S )Nc             S   s   g | ]}d | qS )z%sr5   )r9   r   r5   r5   r6   r;     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   )vr5   r5   r6   rk     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   r8   r   )r   r   )r   r5   r5   r6   rk     s    c             S   s0   | d t | dd  dgt| dd  dk fS )Nr   r8   r   )r   r   )r   r5   r5   r6   rk     s    )r   r`   r   r   sorted)rJ   r^   ZstringsZind_varsZ	func_varsZ
event_varsZ
other_varsr   r5   r5   r6   r     s    
zDRS._order_ref_stringsc             C   s   t |trt| jt|jkr|}x2t| j|jD ] \}}| |}|||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)	rl   r&   r   r^   ziprb   r   r   r_   )rJ   r   converted_otherr1r2varexZc1Zc2r5   r5   r6   __eq__  s    

z
DRS.__eq__c             C   s
   | |k S )Nr5   )rJ   r   r5   r5   r6   __ne__  s    z
DRS.__ne__c             C   s^   dd | | jd dd | jD f }| jrZtj| d tj d d| j  tj S |S )Nz([%s],[%s]),z, c             s   s   | ]}d | V  qdS )z%sNr5   )r9   r   r5   r5   r6   r   !  s    zDRS.__str__.<locals>.<genexpr>r   z%s)	r   r   r^   r_   r   r%   rN   r   r]   )rJ   re   r5   r5   r6   __str__  s    (zDRS.__str__)N)FT)F)r+   r,   r-   r}   rD   r   r   r   r   r   r   r   r   r   r   r   r   __hash__r   r5   r5   r5   r6   r&   0  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   rx   r   r   DrtFunctionVariableExpressionr   DrtEventVariableExpressionDrtConstantExpression)rd   r5   r5   r6   rw   0  s    


rw   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 )Nr5   )rJ   r5   r5   r6   r   @  s    z!DrtAbstractVariableExpression.folFc             C   s   g S )z#:see: AbstractExpression.get_refs()r5   )rJ   r   r5   r5   r6   r   C  s    z&DrtAbstractVariableExpression.get_refsc             C   s    d|  }dt | }||||gS )Nz%sr   )r   )rJ   r   blankr5   r5   r6   r   G  s    z%DrtAbstractVariableExpression._prettyc             C   s   | S )Nr5   )rJ   r5   r5   r6   r   L  s    z0DrtAbstractVariableExpression.eliminate_equalityN)F)r+   r,   r-   r   r   r   r   r5   r5   r5   r6   r   ?  s   
r   c               @   s   e Zd ZdS )r   N)r+   r,   r-   r5   r5   r5   r6   r   P  s   r   c               @   s   e Zd ZdS )r   N)r+   r,   r-   r5   r5   r5   r6   r   V  s   r   c               @   s   e Zd ZdS )r   N)r+   r,   r-   r5   r5   r5   r6   r   \  s   r   c               @   s   e Zd ZdS )r   N)r+   r,   r-   r5   r5   r5   r6   r   b  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 )rc   c             C   s   || _ || _d S )N)rd   re   )rJ   rd   re   r5   r5   r6   rD   h  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)rd   rl   r   r   rc   re   r   )rJ   rd   rX   r   r   r5   r5   r6   r   l  s    

zDrtProposition.replacec             C   s   t | j| j S )N)rc   rd   re   r   )rJ   r5   r5   r6   r   {  s    z!DrtProposition.eliminate_equalityc             C   s   |r| j dS g S )NT)re   r   )rJ   r   r5   r5   r6   r   ~  s    zDrtProposition.get_refsc             C   s$   | j |j ko"| j|jko"| j|jkS )N)r   rd   re   )rJ   r   r5   r5   r6   r     s    zDrtProposition.__eq__c             C   s
   | |k S )Nr5   )rJ   r   r5   r5   r6   r     s    zDrtProposition.__ne__c             C   s
   | j  S )N)re   r   )rJ   r5   r5   r6   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   z%sc                s   g | ]} d  | qS )r   r5   )r9   r   )r   r5   r6   r;     s    z*DrtProposition._pretty.<locals>.<listcomp>r8   c                s   g | ]}d  j  d | qS )z%sr*   )rd   )r9   r   )rJ   r5   r6   r;     s    r<   c                s   g | ]} d  | qS )r   r5   )r9   r   )r   r5   r6   r;     s    )re   r   r   rd   )rJ   Zdrs_sr5   )r   rJ   r6   r     s    
zDrtProposition._prettyc             C   s   ||| j gS )z:see: Expression.visit())re   )rJ   rt   r   r5   r5   r6   r     s    zDrtProposition.visitc             C   s   || j || jS )z#:see: Expression.visit_structured())rd   re   )rJ   rt   r   r5   r5   r6   r     s    zDrtProposition.visit_structuredc             C   s   d| j | jf S )Nzprop(%s, %s))rd   re   )rJ   r5   r5   r6   r     s    zDrtProposition.__str__N)FT)F)r+   r,   r-   rD   r   r   r   r   r   r   r   r   r   r   r   r   r5   r5   r5   r6   rc   f  s   

	rc   c               @   s&   e Zd Zdd Zd	ddZdd ZdS )
rW   c             C   s   t | j S )N)r   r{   r   )rJ   r5   r5   r6   r     s    zDrtNegatedExpression.folFc             C   s   | j |S )z#:see: AbstractExpression.get_refs())r{   r   )rJ   r   r5   r5   r6   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    r5   )r9   r   r5   r5   r6   r;     s    z0DrtNegatedExpression._pretty.<locals>.<listcomp>r<   c             S   s   g | ]}d | qS )z__  r5   )r9   r   r5   r5   r6   r;     s    r=   c             S   s   g | ]}d | qS )z  | r5   )r9   r   r5   r5   r6   r;     s    r>   c             S   s   g | ]}d | qS )z    r5   )r9   r   r5   r5   r6   r;     s    )r{   r   )rJ   
term_linesr5   r5   r6   r     s    
zDrtNegatedExpression._prettyN)F)r+   r,   r-   r   r   r   r5   r5   r5   r6   rW     s   
rW   c               @   s$   e Zd Zdd Zdd Zdd ZdS )ry   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   rd   rw   )rJ   r   r5   r5   r6   r     s    z!DrtLambdaExpression.alpha_convertc             C   s   t | j| j S )N)r   rd   r{   r   )rJ   r5   r5   r6   r     s    zDrtLambdaExpression.folc                s   | j g}| j}x"|j| jkr0||j  |j}qW 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 )z%sNr5   )r9   r   r5   r5   r6   r     s    z.DrtLambdaExpression._pretty.<locals>.<genexpr>c                s   g | ]}d   | qS )z    r5   )r9   r   )r   r5   r6   r;     s    z/DrtLambdaExpression._pretty.<locals>.<listcomp>r8   c                s   g | ]}d   | qS )z \  r5   )r9   r   )r   r5   r6   r;     s    r<   c                s   g | ]}d   | qS )z /\ r5   )r9   r   )
var_stringr5   r6   r;     s    r=   c                s   g | ]}d   | qS )z    r5   )r9   r   )r   r5   r6   r;     s    )	rd   r{   r   r`   r   r%   DOTr   r   )rJ   rz   r{   r   r5   )r   r   r6   r     s    
zDrtLambdaExpression._prettyN)r+   r,   r-   r   r   r   r5   r5   r5   r6   ry     s   
ry   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 )z#:see: AbstractExpression.get_refs()T)rg   r   rh   )rJ   r   r5   r5   r6   r     s    zDrtBinaryExpression.get_refsc             C   s"   t | | j|  | | jS )N)r   r   _pretty_subexrg   getOprh   )rJ   r5   r5   r6   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   r5   )r9   
first_linesecond_line)r   r5   r6   r;     s   z8DrtBinaryExpression._assemble_pretty.<locals>.<listcomp>r<   c                s,   g | ]$\}}d | d   d | d qS )(r   )r5   )r9   r   r   )opr5   r6   r;     s   r=   c                s,   g | ]$\}}d | d    d  | d  qS )r   r5   )r9   r   r   )r   r5   r6   r;     s   )r   r   _pad_verticallyr   r   )Zfirst_linesr   Zsecond_lines	max_linesZfirst_second_linesr5   )r   r   r6   r     s    


2
z$DrtBinaryExpression._assemble_prettyc             C   s   |  S )N)r   )rJ   subexr5   r5   r6   r     s    z!DrtBinaryExpression._pretty_subexN)F)r+   r,   r-   r   r   staticmethodr   r   r5   r5   r5   r6   r     s   
r   c               @   s   e Zd ZdS )DrtBooleanExpressionN)r+   r,   r-   r5   r5   r5   r6   r     s   r   c               @   s   e Zd Zdd Zdd ZdS )ro   c             C   s   t | j | j S )N)r   rg   r   rh   )rJ   r5   r5   r6   r     s    zDrtOrExpression.folc             C   s(   t |trdd | D S t| |S )Nc             S   s   g | ]}|d d qS )r8   r   r5   )r9   r   r5   r5   r6   r;     s    z1DrtOrExpression._pretty_subex.<locals>.<listcomp>)rl   ro   r   r   r   )rJ   r   r5   r5   r6   r     s    
zDrtOrExpression._pretty_subexN)r+   r,   r-   r   r   r5   r5   r5   r6   ro     s   ro   c               @   s   e Zd Zdd ZdS )rf   c             C   s   t | j | j S )N)r   rg   r   rh   )rJ   r5   r5   r6   r     s    zDrtEqualityExpression.folN)r+   r,   r-   r   r5   r5   r5   r6   rf     s   rf   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 )$rj   zDRS of the form '(DRS + DRS)'Nc             C   s   t | || || _d S )N)r   rD   r   )rJ   rg   rh   r   r5   r5   r6   rD     s    zDrtConcatenation.__init__FTc       
      C   s   | j }| j}| j}||  krX|r|||||}|||||}|r|||||}n|rx^t| d| @ D ]D}tt|}	|||	d|}|||	d|}|rt|||	d|}qtW |||||}|||||}|r|||||}| 	|||S )z_Replace all instances of variable v with expression E in self,
        where v is free in self.T)
rg   rh   r   r   r   r   r   rw   r    r   )
rJ   rd   rX   r   r   rg   rh   r   r   r   r5   r5   r6   r     s2    zDrtConcatenation.replacec             C   s   |   }t|trt| S )N)r   rl   rj   r   r   )rJ   re   r5   r5   r6   r   @  s    z#DrtConcatenation.eliminate_equalityc             C   s   | j  }| j }| jr$| j nd }t|trt|trx>t|dt|d@ D ]}tt	|}|
||d}qZW t|j|j |j|j |S | |||S d S )NT)rg   r   rh   r   rl   r&   r   r   rw   r    r   r^   r_   r   )rJ   rg   rh   r   r   r   r5   r5   r6   r   F  s    

"zDrtConcatenation.simplifyc             C   s8   | j || j| }| jr4|r4|| jd |S )z#:see: AbstractExpression.get_refs()T)rg   r   rh   r   r   )rJ   r   r^   r5   r5   r6   r   V  s    
zDrtConcatenation.get_refsc             C   s   t jS )N)r%   r.   )rJ   r5   r5   r6   r   ]  s    zDrtConcatenation.getOpc             C   s   t |tr|  }| }t|t|kr|}x.t||D ] \}}| |}|||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)
rl   rj   r   r   r   rb   r   rg   rh   r   )rJ   r   Z	self_refsZ
other_refsr   r   r   r   r5   r5   r6   r   `  s    

zDrtConcatenation.__eq__c             C   s
   | |k S )Nr5   )rJ   r   r5   r5   r6   r   r  s    zDrtConcatenation.__ne__c             C   s0   t | j | j }| jr,t|| j }|S )N)r   rg   r   rh   r   r   )rJ   r   r5   r5   r6   r   w  s    zDrtConcatenation.folc             C   sD   t | | j|  | | j}| jr@t |tj| 	| j}|S )N)
r   r   r   rg   r   rh   r   r%   r   r   )rJ   re   r5   r5   r6   r   }  s    
zDrtConcatenation._prettyc             C   s(   t |trdd | D S t| |S )Nc             S   s   g | ]}|d d qS )r8   r   r5   )r9   r   r5   r5   r6   r;     s    z2DrtConcatenation._pretty_subex.<locals>.<listcomp>)rl   rj   r   r   r   )rJ   r   r5   r5   r6   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   rg   rh   )rJ   rt   r   r5   r5   r6   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   z%s)

_str_subexrg   rh   r   rN   r   r]   r   r%   r   )rJ   rg   rh   re   r5   r5   r6   r     s    $(zDrtConcatenation.__str__c             C   s,   d| }t |tr(|jd kr(|dd S |S )Nz%sr8   r   )rl   rj   r   )rJ   r   r   r5   r5   r6   r     s    zDrtConcatenation._str_subex)N)FT)F)r+   r,   r-   r}   rD   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r5   r5   r5   r6   rj     s    

'
	rj   c               @   s&   e Zd Zdd Zd	ddZdd ZdS )
rs   c             C   s   t | j | j S )N)r   rt   r   ru   )rJ   r5   r5   r6   r     s    zDrtApplicationExpression.folFc             C   s    |r| j d| jd S g S )z#:see: AbstractExpression.get_refs()T)rt   r   ru   )rJ   r   r5   r5   r6   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 r5   )r   )r9   argr5   r5   r6   r;     s    z4DrtApplicationExpression._pretty.<locals>.<listcomp>c                s   g | ]}t | qS r5   )r   )r9   Z	arg_lines)r   r5   r6   r;     s    c             S   s&   g | ]\}}|d  d  | d  qS )r   )r   )r9   	func_line	args_liner5   r5   r6   r;     s   r<   c             S   s&   g | ]\}}|d  d | d qS )r   r   r   )r   )r9   r   r   r5   r5   r6   r;     s   r=   c             S   s&   g | ]\}}|d  d  | d  qS )r   )r   )r9   r   r   r5   r5   r6   r;     s   )uncurryr   r   r   r   r   r   r   )rJ   rt   argsZfunction_linesZ
args_linesZfunc_args_linesr5   )r   r6   r     s    

*z DrtApplicationExpression._prettyN)F)r+   r,   r-   r   r   r   r5   r5   r5   r6   rs     s   
rs   c             C   s&   dt | d  g}| ||t |    S )Nr   r   )r   )linesr   Zpad_liner5   r5   r6   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   )rJ   r5   r5   r6   r     s    zPossibleAntecedents.freeFTc             C   s6   t  }x*| D ]"}||kr$| | q| | qW |S )z_Replace all instances of variable v with expression E in self,
        where v is free in self.)r   r`   )rJ   rd   rX   r   r   resultitemr5   r5   r6   r     s    
zPossibleAntecedents.replacec             C   s   d|  }dt | }|||gS )Nz%sr   )r   )rJ   r   r   r5   r5   r6   r     s    zPossibleAntecedents._prettyc             C   s   dd dd | D  d S )Nr(   r   c             s   s   | ]}d | V  qdS )z%sNr5   )r9   itr5   r5   r6   r     s    z.PossibleAntecedents.__str__.<locals>.<genexpr>r)   )r   )rJ   r5   r5   r6   r     s    zPossibleAntecedents.__str__N)FT)r+   r,   r-   r   r   r   r   r5   r5   r5   r6   r     s   
r   c               @   s   e Zd ZdS )AnaphoraResolutionExceptionN)r+   r,   r-   r5   r5   r5   r6   r     s   r   c             C   sf  t | tr|  rt }xJ|D ]B}x<| D ]0}| |}|j| jjkr,|| jks,|| q,W qW t	|dkrz|d }n|}| 
| j|S t| j|| g }t| j|| g }| ||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 |	| qW | jrht| 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rb| | jt| j|| g S d S )Nr8   r   z+Variable '%s' does not resolve to anything.)rl   r   r   r   r   rb   r   ru   r`   r   ri   r   rt   r&   r_   r   rg   rh   r   r   r^   r	   r   r{   rj   r   r   rd   )rX   trailZpossible_antecedentsZancestorr   ZrefexZ
resolutionZ
r_functionZ
r_argumentZr_condsr   Zr_condZtempr   r5   r5   r6   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   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   )Zfamilysizer   )widthheightd   i,  )r"   titler#   r!   fontcanvas_visit
OUTERSPACETOPSPACEr   Zpackre   master)
rJ   re   Zsize_canvasr  r	  r  rightbottomr   r  r5   r5   r6   rD   M  s&    

zDrsDrawer.__init__c             C   s   | j jdS )z Get the height of a line of textZ	linespace)r  r  Zmetrics)rJ   r5   r5   r6   _get_text_heightm  s    zDrsDrawer._get_text_heightc             C   s@   |  | j| j|| | jr,t s,| j  n| | j||S dS )zDraw the DRSN)_handlere   _draw_commandr	  r$   Zmainloopr  )rJ   r:   yr5   r5   r6   r   q  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
        )r  _visit_command)rJ   rX   r:   r  r5   r5   r6   r  z  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
        Znw)Zanchorr  textr<   )rl   r   r  Zcreate_textr  tupleZcreate_rectangler  BUFFERZcreate_liner  )rJ   r   r:   r  r
  r  Zhoriz_line_yr5   r5   r6   r    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)rl   r   r  r  Zmeasurer  r  )rJ   r   r:   r  r5   r5   r6   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   rl   r   _handle_VariableExpressionr&   _handle_DRSrW   _handle_NegatedExpressionry   _handle_LambdaExpressionr   _handle_BinaryExpressionrs   _handle_ApplicationExpressionr   rc   _handle_DrtPropositionrm   r   r+   )rJ   rX   commandr:   r  r
  r  rq   r5   r5   r6   r    s8    












zDrsDrawer._handlec             C   s   |d| ||S )Nz%sr5   )rJ   rX   r  r:   r  r5   r5   r6   r    s    z$DrsDrawer._handle_VariableExpressionc          	   C   sR   |  tj||d }| |j|||\}}|tj|| ||| |   ||fS )Nr   )r  r%   ZNOTr  r{   _get_centered_topr  )rJ   rX   r  r:   r  r
  r  r5   r5   r6   r    s    z#DrsDrawer._handle_NegatedExpressionc             C   s   || j  }|| j  }|jr2ddd |jD }nd}||||\}}|| j d 7 }|jrxJ|jD ],}	| |	|||\}
}t||
}|| j 7 }qbW n||  | j  7 }|| j 7 }|||f||S )Nr   c             s   s   | ]}d | V  qdS )z%sNr5   )r9   rr5   r5   r6   r     s    z(DrsDrawer._handle_DRS.<locals>.<genexpr>z     r<   )r  r^   r   r_   r  r   r  )rJ   rX   r  r:   r  leftr  r^   Z	max_rightr   r
  r5   r5   r6   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 }x^t|D ]R\}} |	|j} 	||||d }|d t|k r|tjd ||d }qW |tj||d }||fS )Nr8   c                s   g | ]}  |d  qS )r8   )r  )r9   r   )rJ   r:   r  r5   r6   r;     s    z;DrsDrawer._handle_ApplicationExpression.<locals>.<listcomp>r   r   )r   rl   r   rt   ru   r  r   r  r  r  r  r%   rN   	enumerater   r[   r]   )rJ   rX   r  r:   r  rt   r   Zfunction_bottomZ
max_bottomline_heightZfunction_drawing_topr
  centred_string_topr   r   Zarg_drawing_topr5   )rJ   r:   r  r6   r    s,    
z'DrsDrawer._handle_ApplicationExpressionc          	   C   sd   t jd|j  t j }| |||d }| |j|||\}}|||| ||| |   ||fS )Nz%sr   )	r%   ZLAMBDArd   r   r  r  r{   r  r  )rJ   rX   r  r:   r  rz   r
  r  r5   r5   r6   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   r8   z %s )r  rg   rh   r   r  r  r%   rN   r  r  r   r]   )rJ   rX   r  r:   r  Zfirst_heightZsecond_heightr!  r"  r
  Zfirst_bottomZsecond_bottomr5   r5   r6   r  =  s*    
z"DrsDrawer._handle_BinaryExpressionc             C   s0   ||j ||d }| |j|||\}}||fS )Nr   )rd   r  r{   )rJ   rX   r  r:   r  r
  r  r5   r5   r6   r  c  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<   r5   )rJ   topZfull_heightZitem_heightr5   r5   r6   r  l  s    zDrsDrawer._get_centered_top)TN)r   r   )r+   r,   r-   r  r  r  rD   r  r   r  r  r  r  r  r  r  r  r  r  r  r  r5   r5   r5   r6   r   H  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====================z([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)]))])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([],[])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dexprZe1Ze2r5   r5   r6   demos  s>    
r%  c              C   sx   yddl m}  W n( tk
r8   ddlm} |dY nX ddddd	d
dddddg}x|D ]}t|}|  qZW d S )Nr   )r"   )SkipTestz,tkinter is required, but it's not available.r:   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)]))]))six.moves.tkinterr"   ImportErrorZnoser&  r~   r   r   )r"   r&  Zexpressionsr   dr5   r5   r6   	test_draw  s&    

r*  __main__)LZ
__future__r   r   r   	functoolsr   	itertoolsr   Zsixr   Znltk.compatr   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    r'  r!   r"   Zsix.moves.tkinter_fontr#   Z	nltk.utilr$   r(  r%   r7   objectr~   r&   rw   r   r   r   r   r   rc   rW   ry   r   r   ro   rf   rj   rs   r   r   r   rm   r   r   r   r%  r*  r+   r5   r5   r5   r6   <module>   sj   l g
  



>(
 $S  -(
