o
    rZh                     @   s|  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&ye   Y nw 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r<eA  dS 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   ;/var/www/auris/lib/python3.10/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      g | ]}|d fqS    r1   .0xr1   r1   r2   
<listcomp>K       z&DrtParser.__init__.<locals>.<listcomp>c                 S   r4   )   r1   r7   r1   r1   r2   r:   L   r;      c                 S   r4   )   r1   r7   r1   r1   r2   r:   N   r;         c                 S   r4   )   r1   r7   r1   r1   r2   r:   Q   r;   c                 S   r4   )   r1   r7   r1   r1   r2   r:   R   r;   )N	   )r   __init__dictr!   LAMBDA_LISTNOT_LISTr   ZEQ_LISTr   ZNEQ_LISTr.   r*   OR_LISTIMP_LISToperator_precedenceselfr1   r1   r2   rD   G   s(   



zDrtParser.__init__c                 C      t jS )z#This method exists to be overridden)r!   r/   rK   r1   r1   r2   get_all_symbolsV   s   zDrtParser.get_all_symbolsc                 C   s
   |t jvS N)r!   r0   )rL   tokr1   r1   r2   
isvariableZ      
zDrtParser.isvariablec                 C   s   |t jv r| ||S |t jv r| ||S |t jkr4| dr.| dt jkr.| 	||S | 
||S | t jkrG| t j | 	||S | |re| 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tokenr,   
handle_DRShandle_openupperr"   assertNextTokenrQ   r.   handle_propZhandle_variable)rL   rP   contextr1   r1   r2   handle]   s    



zDrtParser.handlec                 C      t |S rO   DrtNegatedExpression)rL   
expressionr1   r1   r2   make_NegatedExpressionv      z DrtParser.make_NegatedExpressionc                 C   sL   |   }| dr| dtjkr|   | |}| tj t||d S Nr   )	handle_refsrT   rU   r!   COMMAhandle_condsrY   CLOSEr"   )rL   rP   r[   refscondsr1   r1   r2   rV   y   s   
zDrtParser.handle_DRSc                 C   s   |  tj g }| dr8| dtjkr8|r#| dtjkr#|   || d | dr8| dtjks|  tj |S )Nr   Z
quantified)	rY   r!   r,   rT   rU   r-   re   appendZget_next_token_variable)rL   rh   r1   r1   r2   rd         zDrtParser.handle_refsc                 C   s   |  tj g }| dr8| dtjkr8|r#| dtjkr#|   || | | dr8| dtjks|  tj |S rc   )	rY   r!   r,   rT   rU   r-   re   rj   process_next_expression)rL   r[   ri   r1   r1   r2   rf      rk   zDrtParser.handle_condsc                 C   s*   |  |}| d | tj}t||S )Nr&   )make_VariableExpressionrY   rl   r!   r.   DrtProposition)rL   rP   r[   variabledrsr1   r1   r2   rZ      s   


zDrtParser.handle_propc                 C   
   t ||S )zlThis method serves as a hook for other logic parsers that
        have different equality expression classesDrtEqualityExpressionrL   firstsecondr1   r1   r2   make_EqualityExpression   s   
z!DrtParser.make_EqualityExpressionc                 C   s:   |t jkr	dd S |t jv rtS |t jv rdd }|S dS )zbThis method serves as a hook for other logic parsers that
        have different boolean operatorsc                 S      t | |d S rO   DrtConcatenationru   rv   r1   r1   r2   <lambda>   s    z9DrtParser.get_BooleanExpression_factory.<locals>.<lambda>c                 S   s<   t | trt| j| j|S t | trt| j| j|S tdNz'Antecedent of implication must be a DRS)
isinstancer"   rh   ri   rz   ru   rv   	Exceptionr{   r1   r1   r2   make_imp_expression   s
   

zDDrtParser.get_BooleanExpression_factory.<locals>.make_imp_expressionN)r!   r*   rH   DrtOrExpressionrI   )rL   rP   r   r1   r1   r2   get_BooleanExpression_factory   s   


z'DrtParser.get_BooleanExpression_factoryc                 C   s
   |||S rO   r1   )rL   factoryru   rv   r1   r1   r2   make_BooleanExpression   rR   z DrtParser.make_BooleanExpressionc                 C   rq   rO   DrtApplicationExpression)rL   functionargumentr1   r1   r2   make_ApplicationExpression   rR   z$DrtParser.make_ApplicationExpressionc                 C   s   t t|S rO   )DrtVariableExpressionr   )rL   namer1   r1   r2   rm         z!DrtParser.make_VariableExpressionc                 C   rq   rO   )DrtLambdaExpression)rL   	variablestermr1   r1   r2   make_LambdaExpression   rR   zDrtParser.make_LambdaExpressionN)r'   r(   r)   __doc__rD   rN   rQ   r\   ra   rV   rd   rf   rZ   rw   r   r   r   rm   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      | j |S rO   )_drt_parserparse)clssr1   r1   r2   
fromstring      zDrtExpression.fromstringc                 C   s
   t | |S rO   r   rL   otherr1   r1   r2   applyto   rR   zDrtExpression.applytoc                 C      t | S rO   r^   rK   r1   r1   r2   __neg__   rb   zDrtExpression.__neg__c                 C   s   t S rO   )NotImplementedr   r1   r1   r2   __and__      zDrtExpression.__and__c                 C   s   t |tsJ t| |S rO   )r~   r   r   r   r1   r1   r2   __or__      
zDrtExpression.__or__c                 C   sJ   t |tsJ t | trt| j| j|S t | tr!t| j| j|S tdr}   )	r~   r   r"   rh   ri   rz   ru   rv   r   r   r1   r1   r2   __gt__   s   

zDrtExpression.__gt__Nc                 C   s2   t |tsJ |   }|  }|||S )a<  
        Check for logical equivalence.
        Pass the expression (self <-> other) to the theorem prover.
        If the prover says it is valid, then the self and other are equal.

        :param other: an ``DrtExpression`` to check equality against
        :param prover: a ``nltk.inference.api.Prover``
        )r~   r   simplifyfolequiv)rL   r   Zproverf1f2r1   r1   r2   r      s   	zDrtExpression.equivc                 C   s   t d| jj )Nz#'%s' object has no attribute 'type')AttributeError	__class__r'   rK   r1   r1   r2   type   s   
zDrtExpression.typec                 C      t  rO   NotImplementedError)rL   	signaturer1   r1   r2   	typecheck      zDrtExpression.typecheckc                 C   rx   rO   ry   r   r1   r1   r2   __add__   r   zDrtExpression.__add__Fc                 C   r   )z
        Return the set of discourse referents in this DRS.
        :param recursive: bool Also find discourse referents in subterms?
        :return: list of ``Variable`` objects
        r   rL   	recursiver1   r1   r2   get_refs  s   zDrtExpression.get_refsc                 C   s2   t | tot | jto| jjjtjkot | jt	S )zIs self of the form "PRO(x)"?)
r~   r   r   DrtAbstractVariableExpressionro   r   r!   r+   r   DrtIndividualVariableExpressionrK   r1   r1   r2   is_pronoun_function
  s   


z!DrtExpression.is_pronoun_functionc                 C   rq   rO   rr   rt   r1   r1   r2   rw     rR   z%DrtExpression.make_EqualityExpressionc                 C   r]   rO   )r   )rL   ro   r1   r1   r2   rm     rb   z%DrtExpression.make_VariableExpressionc                 C   r   rO   )resolve_anaphorarK   r1   r1   r2   r     rb   zDrtExpression.resolve_anaphorac                 C   s   |  dd | jS )Nc                 S      |   S rO   )eliminate_equality)er1   r1   r2   r|         z2DrtExpression.eliminate_equality.<locals>.<lambda>)visit_structuredr   rK   r1   r1   r2   r        z DrtExpression.eliminate_equalityc                 C   s   d |  S )zG
        Draw the DRS
        :return: the pretty print string
        
)join_prettyrK   r1   r1   r2   pretty_format  s   zDrtExpression.pretty_formatc                 C   s   t |   d S rO   )printr   rK   r1   r1   r2   pretty_print&     zDrtExpression.pretty_printc                 C   s   t |   d S rO   )	DrsDrawerdrawrK   r1   r1   r2   r   )  r   zDrtExpression.drawrO   F)r'   r(   r)   r   r3   r   classmethodr   r   r   r   r   r   r   propertyr   r   r   r   r   rw   rm   r   r   r   r   r   r1   r1   r1   r2   r      s0    




	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)rh   ri   
consequent)rL   rh   ri   r   r1   r1   r2   rD   0  s   
zDRS.__init__FTc                    sZ  | j v r@s	| S | j }| jr| jd }nd}t| j d| jg | j |d d   fdd| jD |S  rt| j  @ D ]@t	}t
|| j }| jrh| jd }nd}t| j d| |g | j |d d   fdd| jD |} qK| jr| j }nd}t| j  fdd| jD |S )_Replace all instances of variable v with expression E in self,
        where v is free in self.TNr6   c                       g | ]
}| d  qS Treplacer8   cond)alpha_convertr`   ro   r1   r2   r:   K      zDRS.replace.<locals>.<listcomp>c                    r   r   r   r   )r   newvarexrefr1   r2   r:   a  r   c                    s   g | ]
}|  qS r1   r   r   )r   r`   replace_boundro   r1   r2   r:   q  r   )rh   indexr   r   r"   ro   ri   setfreer   r   )rL   ro   r`   r   r   ir   newvarr1   )r   r`   r   r   r   ro   r2   r   :  sZ   
&	$
zDRS.replacec                 C   s@   t tjdd | jD t }| jr|| j  |t| j S )z:see: Expression.free()c                 S      g | ]}|  qS r1   )r   r8   cr1   r1   r2   r:   z  r;   zDRS.free.<locals>.<listcomp>)	r   operatoror_ri   r   r   updater   rh   )rL   Z
conds_freer1   r1   r2   r   x  s   zDRS.freec                 C   sF   |r | j ttdd | jD  }| jr|| jd |S | j 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>T)rh   listr   from_iterableri   r   extendr   )rL   r   Z
conds_refsr1   r1   r2   r     s   zDRS.get_refsc                 C   s.   t t|| j}| jr||| j ||S z:see: Expression.visit())r   mapri   r   rj   )rL   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   rh   r   r   ri   )rL   r   r   r   r1   r1   r2   r     s   zDRS.visit_structuredc                 C   s0  | }d}|t |jk rd|j| }t|trYt|jtrYt|jtrYttt	|j
|jjh |jd | |j|d d   |j}|jj|jjkrU||jj|jdd}d}|d8 }|d7 }|t |jk sg }|jD ]}| }| }t|tr|j
s|js|jr|| qi|jr|j nd }t|j
||S )Nr   r6   F)lenri   r~   r   ru   r   rv   r"   r   r   rh   ro   r   r   r   r   rj   )rL   rp   r   r   ri   Znew_condZnew_cond_simpr   r1   r1   r2   r     sJ   




zDRS.eliminate_equalityc                 C   s   | j r5d }| jrttdd | jD }|rt|| j  }n| j  }| jd d d D ]}t||}q+|S | js<tdttdd | jD }t	t
| | jd d d D ]}t||}qU|S )Nc                 S   r   r1   r   r   r1   r1   r2   r:     r;   zDRS.fol.<locals>.<listcomp>z-Cannot convert DRS with no conditions to FOL.c                 S   r   r1   r   r   r1   r1   r2   r:     r;   )r   ri   r   r   r   r   rh   r   r   r   r   _order_ref_stringsr   )rL   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	r\t
|tj| j	 S |S )N c                 S   s   g | ]	}|D ]}|qqS r1   r1   )r8   Z	cond_liner   r1   r1   r2   r:     s    zDRS._pretty.<locals>.<listcomp>c                 S   s   g | ]}t d d | qS )c                 S   r   rO   )strip)r   r1   r1   r2   r|     r   z(DRS._pretty.<locals>.<listcomp>.<lambda>)filterr   r   r1   r1   r2   r:     s    z __z_ |  |z|--z-|c                    s   g | ]}d |   d qS )r   r   )ljustr8   linelengthr1   r2   r:         z|_z_|)r   r   rh   ri   maxr   r   r   r   r   DrtBinaryExpression_assemble_prettyr!   IMPr   )rL   Z	refs_lineZ
cond_linesrp   r1   r   r2   r     s*   	zDRS._prettyc                 C   s   dd |D }g }g }g }g }|D ]%}t |r|| qt|r'|| qt|r1|| q|| qt|t|dd d t|dd d t|dd d S )Nc                 S   s   g | ]}d | qS )%sr1   )r8   r   r1   r1   r2   r:     r;   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   r|     s   ( z(DRS._order_ref_strings.<locals>.<lambda>)keyc                 S   0   | d t | dd  dgt| dd  dk fS Nr   r6   r   r  r
  r1   r1   r2   r|        0 c                 S   r  r  r  r
  r1   r1   r2   r|      r  )r   rj   r   r   sorted)rL   rh   stringsZind_varsZ	func_varsZ
event_varsZ
other_varsr   r1   r1   r2   r     s*   zDRS._order_ref_stringsc                 C   s   t |trNt| jt|jkrN|}t| j|jD ]\}}| |}|||d}q| j|jkrNt| jt|jkrNt| j|jD ]\}}||ksK dS q@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)	r~   r"   r   rh   ziprm   r   r   ri   )rL   r   converted_otherr1r2varexc1c2r1   r1   r2   __eq__  s"   

z
DRS.__eq__c                 C   
   | |k S rO   r1   r   r1   r1   r2   __ne__  rR   z
DRS.__ne__c                 C   s^   d d| | jddd | jD }| jr-tj| d tj d d| j  tj	 S |S )Nz([{}],[{}]),, c                 s       | ]}d | V  qdS r  Nr1   r   r1   r1   r2   r         zDRS.__str__.<locals>.<genexpr>r   r  )
formatr   r   rh   ri   r   r!   rS   r  rg   rL   rp   r1   r1   r2   __str__  s(   	zDRS.__str__rO   FTr   )r'   r(   r)   r   rD   r   r   r   r   r   r   r   r   r   r  r  r   __hash__r$  r1   r1   r1   r2   r"   -  s     


>
$r"   c                 C   s>   t | jr	t| S t| jrt| S t| jrt| S t| S )z
    This is a factory method that instantiates and returns a subtype of
    ``DrtAbstractVariableExpression`` appropriate for the given variable.
    )r   r   r   r   DrtFunctionVariableExpressionr   DrtEventVariableExpressionDrtConstantExpressionro   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 rO   r1   rK   r1   r1   r2   r   <  r   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   rL   r   blankr1   r1   r2   r   C  s   z%DrtAbstractVariableExpression._prettyc                 C   r+  rO   r1   rK   r1   r1   r2   r   H  r   z0DrtAbstractVariableExpression.eliminate_equalityNr   )r'   r(   r)   r   r   r   r   r1   r1   r1   r2   r   ;  s
    
r   c                   @      e Zd ZdS )r   Nr'   r(   r)   r1   r1   r1   r2   r   L      r   c                   @   r1  )r'  Nr2  r1   r1   r1   r2   r'  R  r3  r'  c                   @   r1  )r(  Nr2  r1   r1   r1   r2   r(  X  r3  r(  c                   @   r1  )r)  Nr2  r1   r1   r1   r2   r)  ^      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 )rn   c                 C   s   || _ || _d S rO   ro   rp   )rL   ro   rp   r1   r1   r2   rD   c  s   
zDrtProposition.__init__FTc                 C   sP   | j |krt|tsJ dt|j | j||||S t| j | j||||S )Nz4Can only replace a proposition label with a variable)ro   r~   r   rn   rp   r   )rL   ro   r`   r   r   r1   r1   r2   r   g  s   
zDrtProposition.replacec                 C      t | j| j S rO   )rn   ro   rp   r   rK   r1   r1   r2   r   v  r   z!DrtProposition.eliminate_equalityc                 C   s   |r| j dS g S NT)rp   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 rO   )r   ro   rp   r   r1   r1   r2   r  |  s
   

zDrtProposition.__eq__c                 C   r  rO   r1   r   r1   r1   r2   r    rR   zDrtProposition.__ne__c                 C   s
   | j  S rO   )rp   r   rK   r1   r1   r2   r     rR   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                       g | ]} d  | qS r   r1   r   r0  r1   r2   r:         z*DrtProposition._pretty.<locals>.<listcomp>r6   c                    s   g | ]}d  j  d | qS )r  r&   r*  r   rK   r1   r2   r:     r  r<   c                    r8  r9  r1   r   r:  r1   r2   r:     r;  )rp   r   r   ro   )rL   Zdrs_sr1   )r0  rL   r2   r     s   
zDrtProposition._prettyc                 C   s   ||| j gS r   )rp   rL   r   r   r1   r1   r2   r     s   zDrtProposition.visitc                 C   s   || j || jS )r   r5  r<  r1   r1   r2   r     s   zDrtProposition.visit_structuredc                 C   s   d| j  d| j dS )Nzprop(r  )r5  rK   r1   r1   r2   r$       zDrtProposition.__str__Nr%  r   )r'   r(   r)   rD   r   r   r   r  r  r   r&  r   r   r   r   r$  r1   r1   r1   r2   rn   b  s    

	rn   c                   @   &   e Zd Zdd Zd	ddZdd ZdS )
r_   c                 C   s   t | j S rO   )r   r   r   rK   r1   r1   r2   r     s   zDrtNegatedExpression.folFc                 C   r   r,  )r   r   r   r1   r1   r2   r     r   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      g | ]}d | qS z    r1   r   r1   r1   r2   r:     r;   z0DrtNegatedExpression._pretty.<locals>.<listcomp>r<   c                 S   r@  )z__  r1   r   r1   r1   r2   r:     r;   r=   c                 S   r@  )z  | r1   r   r1   r1   r2   r:     r;   r>   c                 S   r@  rA  r1   r   r1   r1   r2   r:     r;   )r   r   )rL   
term_linesr1   r1   r2   r     s   
zDrtNegatedExpression._prettyNr   r'   r(   r)   r   r   r   r1   r1   r1   r2   r_     s    
r_   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   ro   r   )rL   r   r1   r1   r2   r     s   z!DrtLambdaExpression.alpha_convertc                 C   r6  rO   )r   ro   r   r   rK   r1   r1   r2   r     r   zDrtLambdaExpression.folc                    s   | j g}| j}|j| jkr||j  |j}|j| jks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   r  r   r1   )r8   r  r1   r1   r2   r     r!  z.DrtLambdaExpression._pretty.<locals>.<genexpr>c                       g | ]}d   | qS rA  r1   r   r:  r1   r2   r:     r;  z/DrtLambdaExpression._pretty.<locals>.<listcomp>r6   c                    rD  )z \  r1   r   r:  r1   r2   r:     r;  r<   c                    rD  )z /\ r1   r   )
var_stringr1   r2   r:     r;  r=   c                    rD  rA  r1   r   r:  r1   r2   r:     r;  )	ro   r   r   rj   r   r!   DOTr   r   )rL   r   r   rB  r1   )r0  rE  r2   r     s"   zDrtLambdaExpression._prettyFc                 C   s    |r| j g| jd S | j gS r   T)ro   r   r   r   r1   r1   r2   r     s   zDrtLambdaExpression.get_refsNr   )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       |r| j d| jd S g S rG  )ru   r   rv   r   r1   r1   r2   r     s   zDrtBinaryExpression.get_refsc                 C   s"   t | | j|  | | jS rO   )r  r  _pretty_subexru   getOprv   rK   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                    ,   g | ]\}}d | d    d  | d  qS r9  r1   r8   
first_lineZsecond_liner:  r1   r2   r:         z8DrtBinaryExpression._assemble_pretty.<locals>.<listcomp>r<   c                    s,   g | ]\}}d | d   d | d qS )(r   r=  r1   rL  )opr1   r2   r:     rN  r=   c                    rK  r9  r1   rL  r:  r1   r2   r:     rN  )r  r   _pad_verticallyr   r  )Zfirst_linesrP  Zsecond_lines	max_linesZfirst_second_linesr1   )r0  rP  r2   r    s"   







z$DrtBinaryExpression._assemble_prettyc                 C   s   |  S rO   r   rL   subexr1   r1   r2   rI    rb   z!DrtBinaryExpression._pretty_subexNr   )r'   r(   r)   r   r   staticmethodr  rI  r1   r1   r1   r2   r    s    

r  c                   @   r1  )DrtBooleanExpressionNr2  r1   r1   r1   r2   rW    r4  rW  c                   @   s   e Zd Zdd Zdd ZdS )r   c                 C      t | j | j S rO   )r   ru   r   rv   rK   r1   r1   r2   r     r>  zDrtOrExpression.folc                 C   (   t |trdd | D S t| |S )Nc                 S      g | ]}|d d qS r6   r   r1   r   r1   r1   r2   r:   	  r;  z1DrtOrExpression._pretty_subex.<locals>.<listcomp>)r~   r   r   rW  rI  rT  r1   r1   r2   rI       
zDrtOrExpression._pretty_subexN)r'   r(   r)   r   rI  r1   r1   r1   r2   r     s    r   c                   @   s   e Zd Zdd ZdS )rs   c                 C   rX  rO   )r   ru   r   rv   rK   r1   r1   r2   r     r>  zDrtEqualityExpression.folN)r'   r(   r)   r   r1   r1   r1   r2   rs     s    rs   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 )$rz   zDRS of the form '(DRS + DRS)'Nc                 C   s   t | || || _d S rO   )rW  rD   r   )rL   ru   rv   r   r1   r1   r2   rD     r   zDrtConcatenation.__init__FTc           
      C   s   | j }| j}| j}||  v r,|r+|||||}|||||}|r+|||||}nJ|r\t| d| @ D ]"}tt|}	|||	d|}|||	d|}|r[|||	d|}q9|||||}|||||}|rv|||||}| 	|||S )r   T)
ru   rv   r   r   r   r   r   r   r   r   )
rL   ro   r`   r   r   ru   rv   r   r   r  r1   r1   r2   r     s>   zDrtConcatenation.replacec                 C   s   |   }t|trJ | S rO   )r   r~   rz   r   r#  r1   r1   r2   r   @  s   z#DrtConcatenation.eliminate_equalityc                 C   s   | j  }| j }| jr| j nd }t|trJt|trJt|dt|d@ D ]}tt	|}|
||d}q,t|j|j |j|j |S | |||S r7  )ru   r   rv   r   r~   r"   r   r   r   r   r   rh   ri   r   )rL   ru   rv   r   r   r   r1   r1   r2   r   F  s   

 zDrtConcatenation.simplifyc                 C   s8   | j || j| }| jr|r|| jd |S rG  )ru   r   rv   r   r   )rL   r   rh   r1   r1   r2   r   V  s   
zDrtConcatenation.get_refsc                 C   rM   rO   )r!   r*   rK   r1   r1   r2   rJ  ]  r   zDrtConcatenation.getOpc                 C   s   t |tr?|  }| }t|t|kr?|}t||D ]\}}| |}|||d}q| j|jko>| j|jko>| j	|j	kS dS r  )
r~   rz   r   r   r  rm   r   ru   rv   r   )rL   r   Z	self_refsZ
other_refsr  r  r  r  r1   r1   r2   r  `  s   



zDrtConcatenation.__eq__c                 C   r  rO   r1   r   r1   r1   r2   r  r  rR   zDrtConcatenation.__ne__c                 C   s0   t | j | j }| jrt|| j }|S rO   )r   ru   r   rv   r   r   )rL   r   r1   r1   r2   r   w  s   zDrtConcatenation.folc                 C   sB   t | | j|  | | j}| jrt |tj| j	 }|S rO   )
r  r  rI  ru   rJ  rv   r   r!   r  r   r#  r1   r1   r2   r   }  s   

zDrtConcatenation._prettyc                 C   rY  )Nc                 S   rZ  r[  r1   r   r1   r1   r2   r:     r;  z2DrtConcatenation._pretty_subex.<locals>.<listcomp>)r~   rz   r   rW  rI  rT  r1   r1   r2   rI    r\  zDrtConcatenation._pretty_subexc                 C   s>   | j r||| j|| j|| j gS ||| j|| jgS r   )r   ru   rv   r<  r1   r1   r2   r     s
   zDrtConcatenation.visitc                 C   sn   |  | j}|  | j}tj| d |   d | tj }| jr5tj| d tj	 d d| j  tj S |S )Nr   r  )

_str_subexru   rv   r   rS   rJ  rg   r   r!   r  )rL   ru   rv   rp   r1   r1   r2   r$    s&   $	zDrtConcatenation.__str__c                 C   s,   d| }t |tr|jd u r|dd S |S )Nr  r6   r   )r~   rz   r   )rL   rU  r   r1   r1   r2   r]    s   zDrtConcatenation._str_subexrO   r%  r   )r'   r(   r)   r   rD   r   r   r   r   rJ  r  r  rW  r&  r   r   rI  r   r$  r]  r1   r1   r1   r2   rz     s"    

'
	rz   c                   @   r?  )
r   c                 C   rX  rO   )r   r   r   r   rK   r1   r1   r2   r     r>  zDrtApplicationExpression.folFc                 C   rH  rG  )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   r   r1   rS  r8   argr1   r1   r2   r:     r;   z4DrtApplicationExpression._pretty.<locals>.<listcomp>c                    s   g | ]}t | qS r1   )rQ  )r8   Z	arg_linesrR  r1   r2   r:     s    c                 S   &   g | ]\}}|d  d  | d  qS r9  r   r8   Z	func_lineZ	args_liner1   r1   r2   r:         r<   c                 S   s&   g | ]\}}|d  d | d qS )rO  r  r=  rb  rc  r1   r1   r2   r:     rd  r=   c                 S   ra  r9  rb  rc  r1   r1   r2   r:     rd  )uncurryr   r  r   r   rQ  r   r  )rL   r   argsZfunction_linesZ
args_linesZfunc_args_linesr1   r`  r2   r     s&   



z DrtApplicationExpression._prettyNr   rC  r1   r1   r1   r2   r     s    
r   c                 C   s&   dt | d  g}| ||t |    S )Nr   r   r.  )linesrR  pad_liner1   r1   r2   rQ    s   rQ  c                   @   s.   e Zd Zdd ZdddZdd Zd	d
 ZdS )PossibleAntecedentsc                 C   r   )zSet of free variables.)r   rK   r1   r1   r2   r     s   zPossibleAntecedents.freeFTc                 C   s2   t  }| D ]}||kr| | q| | q|S )r   )ri  rj   )rL   ro   r`   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   r  r   r1   )r8   itr1   r1   r2   r     r!  z.PossibleAntecedents.__str__.<locals>.<genexpr>r%   rb  rK   r1   r1   r2   r$    s   zPossibleAntecedents.__str__Nr%  )r'   r(   r)   r   r   r   r$  r1   r1   r1   r2   ri    s
    
ri  c                   @   r1  )AnaphoraResolutionExceptionNr2  r1   r1   r1   r2   rm    r4  rm  c                 C   sB  t | trZ|  rBt }|D ]}| D ]}| |}|j| jjkr,|| jks,|| qqt	|dkr9|d }n|}| 
| j|S t| j|| g }t| j|| g }| ||S t | trg }	| jD ]4}
t|
|| g }t |trt |jtr|j}|j|_||_t |jtr|jstd|j |	| qd| jrt| 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r| | jt| j|| g S d S )Nr6   r   z+Variable '%s' does not resolve to anything.)r~   r   r   ri  r   rm   r   r   rj   r   rw   r   r   r"   ri   r   ru   rv   rm  r   rh   r   r   r   rz   r	   r   ro   )r`   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}|sOt  }|d tddd}|rAt|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  packrp   master)
rL   rp   Zsize_canvasrz  r  ry  rightbottomru  rv  r1   r1   r2   rD   L  s&   


zDrsDrawer.__init__c                 C   s   | j jdS )z Get the height of a line of textZ	linespace)rz  ry  ZmetricsrK   r1   r1   r2   _get_text_heightl  s   zDrsDrawer._get_text_heightc                 C   s>   |  | j| j|| | jrt s| j  dS | | j||S )zDraw the DRSN)_handlerp   _draw_commandr  r    Zmainloopr{  rL   r9   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
        )r  _visit_command)rL   r`   r9   r  r1   r1   r2   r{  y  s   	zDrsDrawer._visitc                 C   s   t |tr| jj||d| jj|d n&t |tr9|\}}| 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)anchorry  textr<   )r~   strrz  Zcreate_textry  tupleZcreate_rectangler  BUFFERZcreate_liner  )rL   rk  r9   r  r  r  Zhoriz_line_yr1   r1   r2   r    s   
	
zDrsDrawer._draw_commandc                 C   s:   t |tr|| jj| ||   fS t |tr|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)r~   r  rz  ry  measurer  r  )rL   rk  r9   r  r1   r1   r2   r    s
   
	
zDrsDrawer._visit_commandr   c                 C   s  || j krz|j| }|j| }||fW S  ty   Y nw t|tr'| j}nEt|tr0| j}n<t|t	r9| j
}n3t|trB| j}n*t|trK| j}n!t|trT| j}nt|tr]| j}nt|trf| 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   r~   r   _handle_VariableExpressionr"   _handle_DRSr_   _handle_NegatedExpressionr   _handle_LambdaExpressionr	   _handle_BinaryExpressionr   _handle_ApplicationExpressionri  rn   _handle_DrtPropositionr   r   r'   )rL   r`   commandr9   r  r  r  r   r1   r1   r2   r    s:   













zDrsDrawer._handlec                 C   s   |d| ||S )Nr  r1   )rL   r`   r  r9   r  r1   r1   r2   r    r   z$DrsDrawer._handle_VariableExpressionc              	   C   sR   |  tj||d }| |j|||\}}|tj|| ||| |   ||fS rc   )r  r!   NOTr  r   _get_centered_topr  rL   r`   r  r9   r  r  r  r1   r1   r2   r    s   z#DrsDrawer._handle_NegatedExpressionc                 C   s   || j  }|| j  }|jrddd |jD }nd}||||\}}|| j d 7 }|jrH|jD ]}	| |	|||\}
}t||
}|| j 7 }q0n	||  | j  7 }|| j 7 }|||f||S )Nr   c                 s   r  r   r1   )r8   rr1   r1   r2   r     r!  z(DrsDrawer._handle_DRS.<locals>.<genexpr>z     r<   )r  rh   r   ri   r  r  r  )rL   r`   r  r9   r  leftr  rh   Z	max_rightr   r  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 ])\}} |	|j} 	||||d }|d t|k r|tjd ||d }qW|tj||d }||fS )Nr6   c                    s   g | ]}  |d  qS r5   )r{  r^  r  r1   r2   r:     r  z;DrsDrawer._handle_ApplicationExpression.<locals>.<listcomp>r   r   )re  r~   r   r   r   r{  r  r  r  r  r  r!   rS   	enumerater   re   rg   )rL   r`   r  r9   r  r   rf  Zfunction_bottomZ
max_bottomline_heightZfunction_drawing_topr  centred_string_topr   r_  Zarg_drawing_topr1   r  r2   r    s6   

z'DrsDrawer._handle_ApplicationExpressionc              	   C   sd   t jd|j  t j }| |||d }| |j|||\}}|||| ||| |   ||fS )Nr  r   )	r!   ZLAMBDAro   rF  r  r  r   r  r  )rL   r`   r  r9   r  r   r  r  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   r6   z %s )r{  ru   rv   r  r  r  r!   rS   r  r  rJ  rg   )rL   r`   r  r9   r  Zfirst_heightZsecond_heightr  r  r  Zfirst_bottomZsecond_bottomr1   r1   r2   r  <  s0   

z"DrsDrawer._handle_BinaryExpressionc                 C   s0   ||j ||d }| |j|||\}}||fS rc   )ro   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.r<   r1   )rL   topZfull_heightZitem_heightr1   r1   r2   r  k  s   zDrsDrawer._get_centered_topr   )r   r   )r'   r(   r)   r  r}  r|  rD   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  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  sD   
r  c               
   C   sZ   zddl m}  W n ty } ztdd }~ww g d}|D ]}t|}|  qd S )Nr   )r   z,tkinter is required, but it's not available.)r9   r  z([x],[])z([x],[man(x)])r  r  z\x.([],[man(x), walks(x)])z\x y.([],[sees(x,y)])z)([],[(([],[walks(x)]) + ([],[runs(x)]))])r  r  )tkinterr   ImportError
ValueErrorr   r   r   )r   r   Zexpressionsdr1   r1   r2   	test_draw  s   

r  __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   r  r   r   Ztkinter.fontr   Z	nltk.utilr    r  r!   r3   r   r"   r   r   r   r'  r(  r)  rn   r_   r   r  rW  r   rs   rz   r   rQ  r   ri  r   rm  r   r   r  r  r'   r1   r1   r1   r2   <module>   sh   l g  


>%(
 $S  -(

