o
    i                     @   sH  d dl Z d dlmZ d dlmZ d dlmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlm Z  G dd 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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Z/G d$d% d%e/eZ0G d&d' d'e.eZ1G d(d) d)e/Z2G d*d+ d+e#e
Z3d,d- Z4G d.d/ d/e5e#eZ6G d0d1 d1e7Z8g fd2d3Z9G d4d5 d5Z:d6d7 Z;d8d9 Z<e=d:kr"e;  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)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+PRO[]:N)__name__
__module____qualname__r   DRS_CONCPRONOUNOPEN_BRACKETCLOSE_BRACKETCOLONPUNCTr   SYMBOLSTOKENS r0   r0   G/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/nltk/sem/drt.pyr   +   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    r0   .0xr0   r0   r1   
<listcomp>A       z&DrtParser.__init__.<locals>.<listcomp>c                 S   r3   )   r0   r6   r0   r0   r1   r9   B   r:      c                 S   r3   )   r0   r6   r0   r0   r1   r9   D   r:         c                 S   r3   )   r0   r6   r0   r0   r1   r9   G   r:   c                 S   r3   )   r0   r6   r0   r0   r1   r9   H   r:   )N	   )r   __init__dictr   LAMBDA_LISTNOT_LISTr   EQ_LISTr   NEQ_LISTr,   r(   OR_LISTIMP_LISToperator_precedenceselfr0   r0   r1   rC   =   s(   



zDrtParser.__init__c                 C      t jS )z#This method exists to be overridden)r   r.   rL   r0   r0   r1   get_all_symbolsL   s   zDrtParser.get_all_symbolsc                 C   s
   |t jvS N)r   r/   )rM   tokr0   r0   r1   
isvariableP      
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   rF   handle_negationrE   handle_lambdaOPENinRangetokenr*   
handle_DRShandle_openupperr   assertNextTokenrR   r,   handle_prophandle_variable)rM   rQ   contextr0   r0   r1   handleS   s    



zDrtParser.handlec                 C      t |S rP   DrtNegatedExpression)rM   
expressionr0   r0   r1   make_NegatedExpressionl      z DrtParser.make_NegatedExpressionc                 C   sL   |   }| dr| dtjkr|   | |}| tj t||d S Nr   )	handle_refsrW   rX   r   COMMAhandle_condsr\   CLOSEr   )rM   rQ   r_   refscondsr0   r0   r1   rY   o   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   
quantified)	r\   r   r*   rW   rX   r+   ri   appendget_next_token_variable)rM   rl   r0   r0   r1   rh   z      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 rg   )	r\   r   r*   rW   rX   r+   ri   ro   process_next_expression)rM   r_   rm   r0   r0   r1   rj      rq   zDrtParser.handle_condsc                 C   s*   |  |}| d | tj}t||S )Nr$   )make_VariableExpressionr\   rr   r   r,   DrtProposition)rM   rQ   r_   variabledrsr0   r0   r1   r]      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rM   firstsecondr0   r0   r1   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 rP   DrtConcatenationr{   r|   r0   r0   r1   <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   rl   rm   r   r{   r|   	Exceptionr   r0   r0   r1   make_imp_expression   s
   

zDDrtParser.get_BooleanExpression_factory.<locals>.make_imp_expressionN)r   r(   rI   DrtOrExpressionrJ   )rM   rQ   r   r0   r0   r1   get_BooleanExpression_factory   s   


z'DrtParser.get_BooleanExpression_factoryc                 C   s
   |||S rP   r0   )rM   factoryr{   r|   r0   r0   r1   make_BooleanExpression   rS   z DrtParser.make_BooleanExpressionc                 C   rw   rP   DrtApplicationExpression)rM   functionargumentr0   r0   r1   make_ApplicationExpression   rS   z$DrtParser.make_ApplicationExpressionc                 C   s   t t|S rP   )DrtVariableExpressionr   )rM   namer0   r0   r1   rs         z!DrtParser.make_VariableExpressionc                 C   rw   rP   )DrtLambdaExpression)rM   	variablestermr0   r0   r1   make_LambdaExpression   rS   zDrtParser.make_LambdaExpressionN)r%   r&   r'   __doc__rC   rO   rR   r`   re   rY   rh   rj   r]   r}   r   r   r   rs   r   r0   r0   r0   r1   r2   :   s"    r2   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 rP   )_drt_parserparse)clssr0   r0   r1   
fromstring      zDrtExpression.fromstringc                 C   s
   t | |S rP   r   rM   otherr0   r0   r1   applyto   rS   zDrtExpression.applytoc                 C      t | S rP   rb   rL   r0   r0   r1   __neg__   rf   zDrtExpression.__neg__c                 C   s   t S rP   )NotImplementedr   r0   r0   r1   __and__      zDrtExpression.__and__c                 C   s   t |tsJ t| |S rP   )r   r   r   r   r0   r0   r1   __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   rl   rm   r   r{   r|   r   r   r0   r0   r1   __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)rM   r   proverf1f2r0   r0   r1   r      s   	zDrtExpression.equivc                 C   s   t d| jj )Nz#'%s' object has no attribute 'type')AttributeError	__class__r%   rL   r0   r0   r1   type   s   
zDrtExpression.typec                 C      t  rP   NotImplementedError)rM   	signaturer0   r0   r1   	typecheck      zDrtExpression.typecheckc                 C   r~   rP   r   r   r0   r0   r1   __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   rM   	recursiver0   r0   r1   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   DrtAbstractVariableExpressionru   r   r   r)   r   DrtIndividualVariableExpressionrL   r0   r0   r1   is_pronoun_function   s   


z!DrtExpression.is_pronoun_functionc                 C   rw   rP   rx   rz   r0   r0   r1   r}   	  rS   z%DrtExpression.make_EqualityExpressionc                 C   ra   rP   )r   )rM   ru   r0   r0   r1   rs     rf   z%DrtExpression.make_VariableExpressionc                 C   r   rP   )resolve_anaphorarL   r0   r0   r1   r     rf   zDrtExpression.resolve_anaphorac                 C   s   |  dd | jS )Nc                 S      |   S rP   )eliminate_equality)er0   r0   r1   r         z2DrtExpression.eliminate_equality.<locals>.<lambda>)visit_structuredr   rL   r0   r0   r1   r        z DrtExpression.eliminate_equalityc                 C   s   d |  S )zG
        Draw the DRS
        :return: the pretty print string
        
)join_prettyrL   r0   r0   r1   pretty_format  s   zDrtExpression.pretty_formatc                 C   s   t |   d S rP   )printr   rL   r0   r0   r1   pretty_print     zDrtExpression.pretty_printc                 C   s   t |   d S rP   )	DrsDrawerdrawrL   r0   r0   r1   r     r   zDrtExpression.drawrP   F)r%   r&   r'   r   r2   r   classmethodr   r   r   r   r   r   r   propertyr   r   r   r   r   r}   rs   r   r   r   r   r   r0   r0   r0   r1   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)rl   rm   
consequent)rM   rl   rm   r   r0   r0   r1   rC   &  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.TNr5   c                       g | ]
}| d  qS Treplacer7   cond)alpha_convertrd   ru   r0   r1   r9   A      zDRS.replace.<locals>.<listcomp>c                    r   r   r   r   )r   newvarexrefr0   r1   r9   W  r   c                    s   g | ]
}|  qS r0   r   r   )r   rd   replace_boundru   r0   r1   r9   g  r   )rl   indexr   r   r   ru   rm   setfreer   r   )rM   ru   rd   r   r   ir   newvarr0   )r   rd   r   r   r   ru   r1   r   0  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 r0   )r   r7   cr0   r0   r1   r9   p  r:   zDRS.free.<locals>.<listcomp>)	r   operatoror_rm   r   r   updater   rl   )rM   
conds_freer0   r0   r1   r   n  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   r0   r0   r1   	<genexpr>y  s    zDRS.get_refs.<locals>.<genexpr>T)rl   listr   from_iterablerm   r   extendr   )rM   r   
conds_refsr0   r0   r1   r   u  s   zDRS.get_refsc                 C   s.   t t|| j}| jr||| j ||S z:see: Expression.visit())r   maprm   r   ro   )rM   r   
combinatorpartsr0   r0   r1   visit  s   z	DRS.visitc                 C   s.   | j r|| j nd}|| jtt|| j|S )#:see: Expression.visit_structured()N)r   rl   r   r   rm   )rM   r   r   r   r0   r0   r1   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   r5   F)lenrm   r   r   r{   r   r|   r   r   r   rl   ru   r   r   r   r   ro   )rM   rv   r   r   rm   new_condnew_cond_simpr   r0   r0   r1   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   r0   r   r   r0   r0   r1   r9     r:   zDRS.fol.<locals>.<listcomp>z-Cannot convert DRS with no conditions to FOL.c                 S   r   r0   r   r   r0   r0   r1   r9     r:   )r   rm   r   r   r   r   rl   r   r   r   r   _order_ref_stringsr   )rM   accumr   r0   r0   r1   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 r0   r0   )r7   	cond_liner   r0   r0   r1   r9     s    zDRS._pretty.<locals>.<listcomp>c                 S   s   g | ]}t d d | qS )c                 S   r   rP   )strip)r   r0   r0   r1   r     r   z(DRS._pretty.<locals>.<listcomp>.<lambda>)filterr   r   r0   r0   r1   r9     s    z __z_ |  |z|--z-|c                    s   g | ]}d |   d qS )r  r  )ljustr7   linelengthr0   r1   r9         z|_z_|)r   r   rl   rm   maxr   r   r   r	  r   DrtBinaryExpression_assemble_prettyr   IMPr   )rM   	refs_line
cond_linesrv   r0   r  r1   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 )%sr0   )r7   r   r0   r0   r1   r9     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   vr0   r0   r1   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   r5   r   r  r  r0   r0   r1   r        0 c                 S   r  r  r  r  r0   r0   r1   r     r  )r   ro   r   r   sorted)rM   rl   stringsind_vars	func_vars
event_vars
other_varsr   r0   r0   r1   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   rl   ziprs   r   r   rm   )rM   r   converted_otherr1r2varexc1c2r0   r0   r1   __eq__  s"   

z
DRS.__eq__c                 C   
   | |k S rP   r0   r   r0   r0   r1   __ne__  rS   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  Nr0   r   r0   r0   r1   r         zDRS.__str__.<locals>.<genexpr>r  r  )
formatr   r   rl   rm   r   r   rV   r  rk   rM   rv   r0   r0   r1   __str__  s(   	zDRS.__str__rP   FTr   )r%   r&   r'   r   rC   r   r   r   r   r   r   r   r   r   r,  r.  r   __hash__r6  r0   r0   r0   r1   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ru   r0   r0   r1   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 rP   r0   rL   r0   r0   r1   r   2  r   z!DrtAbstractVariableExpression.folFc                 C   s   g S r   r0   r   r0   r0   r1   r   5  s   z&DrtAbstractVariableExpression.get_refsc                 C   s    d|  }dt | }||||gS Nr  r  r   rM   r   blankr0   r0   r1   r   9  s   z%DrtAbstractVariableExpression._prettyc                 C   r=  rP   r0   rL   r0   r0   r1   r   >  r   z0DrtAbstractVariableExpression.eliminate_equalityNr   )r%   r&   r'   r   r   r   r   r0   r0   r0   r1   r   1  s
    
r   c                   @      e Zd ZdS )r   Nr%   r&   r'   r0   r0   r0   r1   r   B      r   c                   @   rC  )r9  NrD  r0   r0   r0   r1   r9  H  rE  r9  c                   @   rC  )r:  NrD  r0   r0   r0   r1   r:  N  rE  r:  c                   @   rC  )r;  NrD  r0   r0   r0   r1   r;  T      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 )rt   c                 C   s   || _ || _d S rP   ru   rv   )rM   ru   rv   r0   r0   r1   rC   Y  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)ru   r   r   rt   rv   r   )rM   ru   rd   r   r   r0   r0   r1   r   ]  s   
zDrtProposition.replacec                 C      t | j| j S rP   )rt   ru   rv   r   rL   r0   r0   r1   r   l  r   z!DrtProposition.eliminate_equalityc                 C   s   |r| j dS g S NT)rv   r   r   r0   r0   r1   r   o  s   zDrtProposition.get_refsc                 C   s$   | j |j ko| j|jko| j|jkS rP   )r   ru   rv   r   r0   r0   r1   r,  r  s
   

zDrtProposition.__eq__c                 C   r-  rP   r0   r   r0   r0   r1   r.  y  rS   zDrtProposition.__ne__c                 C   s
   | j  S rP   )rv   r   rL   r0   r0   r1   r   ~  rS   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  r0   r
  rB  r0   r1   r9         z*DrtProposition._pretty.<locals>.<listcomp>r5   c                    s   g | ]}d  j  d | qS )r  r$   r<  r
  rL   r0   r1   r9     r  r;   c                    rJ  rK  r0   r
  rL  r0   r1   r9     rM  )rv   r   r   ru   )rM   drs_sr0   )rB  rM   r1   r     s   
zDrtProposition._prettyc                 C   s   ||| j gS r   )rv   rM   r   r   r0   r0   r1   r     s   zDrtProposition.visitc                 C   s   || j || jS )r   rG  rO  r0   r0   r1   r     s   zDrtProposition.visit_structuredc                 C   s   d| j  d| j dS )Nzprop(r0  )rG  rL   r0   r0   r1   r6       zDrtProposition.__str__Nr7  r   )r%   r&   r'   rC   r   r   r   r,  r.  r   r8  r   r   r   r   r6  r0   r0   r0   r1   rt   X  s    

	rt   c                   @   &   e Zd Zdd Zd	ddZdd ZdS )
rc   c                 C   s   t | j S rP   )r   r   r   rL   r0   r0   r1   r     s   zDrtNegatedExpression.folFc                 C   r   r>  )r   r   r   r0   r0   r1   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    r0   r
  r0   r0   r1   r9     r:   z0DrtNegatedExpression._pretty.<locals>.<listcomp>r;   c                 S   rS  )z__  r0   r
  r0   r0   r1   r9     r:   r<   c                 S   rS  )z  | r0   r
  r0   r0   r1   r9     r:   r=   c                 S   rS  rT  r0   r
  r0   r0   r1   r9     r:   )r   r   )rM   
term_linesr0   r0   r1   r     s   
zDrtNegatedExpression._prettyNr   r%   r&   r'   r   r   r   r0   r0   r0   r1   rc     s    
rc   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   ru   r   )rM   r   r0   r0   r1   r     s   z!DrtLambdaExpression.alpha_convertc                 C   rH  rP   )r   ru   r   r   rL   r0   r0   r1   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   r1  r2  r0   )r7   r  r0   r0   r1   r     r3  z.DrtLambdaExpression._pretty.<locals>.<genexpr>c                       g | ]}d   | qS rT  r0   r
  rL  r0   r1   r9     rM  z/DrtLambdaExpression._pretty.<locals>.<listcomp>r5   c                    rW  )z \  r0   r
  rL  r0   r1   r9     rM  r;   c                    rW  )z /\ r0   r
  )
var_stringr0   r1   r9     rM  r<   c                    rW  rT  r0   r
  rL  r0   r1   r9     rM  )	ru   r   r   ro   r   r   DOTr   r   )rM   r   r   rU  r0   )rB  rX  r1   r     s"   zDrtLambdaExpression._prettyFc                 C   s    |r| j g| jd S | j gS r   T)ru   r   r   r   r0   r0   r1   r     s   zDrtLambdaExpression.get_refsNr   )r%   r&   r'   r   r   r   r   r0   r0   r0   r1   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 rZ  )r{   r   r|   r   r0   r0   r1   r     s   zDrtBinaryExpression.get_refsc                 C   s"   t | | j|  | | jS rP   )r  r  _pretty_subexr{   getOpr|   rL   r0   r0   r1   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 rK  r0   r7   
first_linesecond_linerL  r0   r1   r9         z8DrtBinaryExpression._assemble_pretty.<locals>.<listcomp>r;   c                    s,   g | ]\}}d | d   d | d qS )(r  rP  r0   r_  )opr0   r1   r9     rb  r<   c                    r^  rK  r0   r_  rL  r0   r1   r9     rb  )r  r   _pad_verticallyr   r%  )first_linesrd  second_lines	max_linesfirst_second_linesr0   )rB  rd  r1   r    s"   







z$DrtBinaryExpression._assemble_prettyc                 C   s   |  S rP   r   rM   subexr0   r0   r1   r\    rf   z!DrtBinaryExpression._pretty_subexNr   )r%   r&   r'   r   r   staticmethodr  r\  r0   r0   r0   r1   r    s    

r  c                   @   rC  )DrtBooleanExpressionNrD  r0   r0   r0   r1   rn    rF  rn  c                   @   s   e Zd Zdd Zdd ZdS )r   c                 C      t | j | j S rP   )r   r{   r   r|   rL   r0   r0   r1   r     rQ  zDrtOrExpression.folc                 C   (   t |trdd | D S t| |S )Nc                 S      g | ]}|d d qS r5   r   r0   r
  r0   r0   r1   r9     rM  z1DrtOrExpression._pretty_subex.<locals>.<listcomp>)r   r   r   rn  r\  rk  r0   r0   r1   r\       
zDrtOrExpression._pretty_subexN)r%   r&   r'   r   r\  r0   r0   r0   r1   r     s    r   c                   @   s   e Zd Zdd ZdS )ry   c                 C   ro  rP   )r   r{   r   r|   rL   r0   r0   r1   r     rQ  zDrtEqualityExpression.folN)r%   r&   r'   r   r0   r0   r0   r1   ry     s    ry   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 )$r   zDRS of the form '(DRS + DRS)'Nc                 C   s   t | || || _d S rP   )rn  rC   r   )rM   r{   r|   r   r0   r0   r1   rC     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)
r{   r|   r   r   r   r   r   r   r   r   )
rM   ru   rd   r   r   r{   r|   r   r   r  r0   r0   r1   r     s>   zDrtConcatenation.replacec                 C   s   |   }t|trJ | S rP   )r   r   r   r   r5  r0   r0   r1   r   6  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 rI  )r{   r   r|   r   r   r   r   r   r   r   r   rl   rm   r   )rM   r{   r|   r   r   r   r0   r0   r1   r   <  s   

 zDrtConcatenation.simplifyc                 C   s8   | j || j| }| jr|r|| jd |S rZ  )r{   r   r|   r   r   )rM   r   rl   r0   r0   r1   r   L  s   
zDrtConcatenation.get_refsc                 C   rN   rP   )r   r(   rL   r0   r0   r1   r]  S  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   r   r   r   r%  rs   r   r{   r|   r   )rM   r   	self_refs
other_refsr&  r'  r(  r)  r0   r0   r1   r,  V  s   



zDrtConcatenation.__eq__c                 C   r-  rP   r0   r   r0   r0   r1   r.  h  rS   zDrtConcatenation.__ne__c                 C   s0   t | j | j }| jrt|| j }|S rP   )r   r{   r   r|   r   r   )rM   r   r0   r0   r1   r   m  s   zDrtConcatenation.folc                 C   sB   t | | j|  | | j}| jrt |tj| j	 }|S rP   )
r  r  r\  r{   r]  r|   r   r   r  r   r5  r0   r0   r1   r   s  s   

zDrtConcatenation._prettyc                 C   rp  )Nc                 S   rq  rr  r0   r
  r0   r0   r1   r9     rM  z2DrtConcatenation._pretty_subex.<locals>.<listcomp>)r   r   r   rn  r\  rk  r0   r0   r1   r\    rs  zDrtConcatenation._pretty_subexc                 C   s>   | j r||| j|| j|| j gS ||| j|| jgS r   )r   r{   r|   rO  r0   r0   r1   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_subexr{   r|   r   rV   r]  rk   r   r   r  )rM   r{   r|   rv   r0   r0   r1   r6    s&   $	zDrtConcatenation.__str__c                 C   s,   d| }t |tr|jd u r|dd S |S )Nr  r5   r   )r   r   r   )rM   rl  r   r0   r0   r1   rv    s   zDrtConcatenation._str_subexrP   r7  r   )r%   r&   r'   r   rC   r   r   r   r   r]  r,  r.  rn  r8  r   r   r\  r   r6  rv  r0   r0   r0   r1   r     s"    

'
	r   c                   @   rR  )
r   c                 C   ro  rP   )r   r   r   r   rL   r0   r0   r1   r     rQ  zDrtApplicationExpression.folFc                 C   r[  rZ  )r   r   r   r   r0   r0   r1   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   r0   rj  r7   argr0   r0   r1   r9     r:   z4DrtApplicationExpression._pretty.<locals>.<listcomp>c                    s   g | ]}t | qS r0   )re  )r7   	arg_linesrh  r0   r1   r9     s    c                 S   &   g | ]\}}|d  d  | d  qS rK  r   r7   	func_line	args_liner0   r0   r1   r9         r;   c                 S   s&   g | ]\}}|d  d | d qS )rc  r/  rP  r|  r}  r0   r0   r1   r9     r  r<   c                 S   r{  rK  r|  r}  r0   r0   r1   r9     r  )uncurryr   r  r   r   re  r   r%  )rM   r   argsfunction_lines
args_linesfunc_args_linesr0   rz  r1   r     s&   



z DrtApplicationExpression._prettyNr   rV  r0   r0   r0   r1   r     s    
r   c                 C   s&   dt | d  g}| ||t |    S )Nr  r   r@  )linesrh  pad_liner0   r0   r1   re    s   re  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   rL   r0   r0   r1   r     s   zPossibleAntecedents.freeFTc                 C   s2   t  }| D ]}||kr| | q| | q|S )r   )r  ro   )rM   ru   rd   r   r   resultitemr0   r0   r1   r     s   zPossibleAntecedents.replacec                 C   s   d|  }dt | }|||gS r?  r@  rA  r0   r0   r1   r     s   
zPossibleAntecedents._prettyc                 C   s   dd dd | D  d S )Nr"   r/  c                 s   r1  r2  r0   )r7   itr0   r0   r1   r     r3  z.PossibleAntecedents.__str__.<locals>.<genexpr>r#   r|  rL   r0   r0   r1   r6    s   zPossibleAntecedents.__str__Nr7  )r%   r&   r'   r   r   r   r6  r0   r0   r0   r1   r    s
    
r  c                   @   rC  )AnaphoraResolutionExceptionNrD  r0   r0   r0   r1   r    rF  r  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 )Nr5   r   z+Variable '%s' does not resolve to anything.)r   r   r   r  r   rs   r   r   ro   r   r}   r   r   r   rm   r   r{   r|   r  r   rl   r   r   r   r   r	   r   ru   )rd   trailpossible_antecedentsancestorr   refex
resolution
r_function
r_argumentr_condsr   r_condtempr   r0   r0   r1   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}|s]ddl m}m} ddlm} | }|d |ddd}|rO||ddd	}||_|| _| || j	| j
\}	}
t|	| j	 d
}|
| j	 }||||d	}n||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.
        Nr   )CanvasTk)FontDRT	helvetica   )familysize)widthheightd   i,  )tkinterr  r  tkinter.fontr  titlefontcanvas_visit
OUTERSPACETOPSPACEr  packrv   master)rM   rv   size_canvasr  r  r  r  r  r  rightbottomr  r  r0   r0   r1   rC   B  s*   


zDrsDrawer.__init__c                 C   s   | j jdS )z Get the height of a line of text	linespace)r  r  metricsrL   r0   r0   r1   _get_text_heighth  s   zDrsDrawer._get_text_heightc                 C   s>   |  | j| j|| | jrt s| j  dS | | j||S )zDraw the DRSN)_handlerv   _draw_commandr  r   mainloopr  rM   r8   yr0   r0   r1   r   l  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)rM   rd   r8   r  r0   r0   r1   r  u  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)anchorr  textr;   )r   strr  create_textr  tuplecreate_rectangler  BUFFERcreate_liner  )rM   r  r8   r  r  r  horiz_line_yr0   r0   r1   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  r  r  measurer  r  )rM   r  r8   r  r0   r0   r1   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  _drawing_width_drawing_heightr   r   r   _handle_VariableExpressionr   _handle_DRSrc   _handle_NegatedExpressionr   _handle_LambdaExpressionr	   _handle_BinaryExpressionr   _handle_ApplicationExpressionr  rt   _handle_DrtPropositionr   r   r%   )rM   rd   commandr8   r  r  r  r   r0   r0   r1   r    s:   













zDrsDrawer._handlec                 C   s   |d| ||S )Nr  r0   )rM   rd   r  r8   r  r0   r0   r1   r    r   z$DrsDrawer._handle_VariableExpressionc              	   C   sR   |  tj||d }| |j|||\}}|tj|| ||| |   ||fS rg   )r  r   NOTr  r   _get_centered_topr  rM   rd   r  r8   r  r  r  r0   r0   r1   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   r1  r2  r0   )r7   rr0   r0   r1   r     r3  z(DrsDrawer._handle_DRS.<locals>.<genexpr>z     r;   )r  rl   r   rm   r  r  r  )rM   rd   r  r8   r  leftr  rl   	max_rightr   r  r0   r0   r1   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 )Nr5   c                    s   g | ]}  |d  qS r4   )r  rw  r  r0   r1   r9     r  z;DrsDrawer._handle_ApplicationExpression.<locals>.<listcomp>r   r  )r  r   r   r   r   r  r  r  r  r  r  r   rV   	enumerater   ri   rk   )rM   rd   r  r8   r  r   r  function_bottom
max_bottomline_heightfunction_drawing_topr  centred_string_topr   rx  arg_drawing_topr0   r  r1   r    s6   

z'DrsDrawer._handle_ApplicationExpressionc              	   C   sd   t jd|j  t j }| |||d }| |j|||\}}|||| ||| |   ||fS )Nr  r   )	r   LAMBDAru   rY  r  r  r   r  r  )rM   rd   r  r8   r  r   r  r  r0   r0   r1   r  )  s   z"DrsDrawer._handle_LambdaExpressionc              
   C   s   |  |jddd }|  |jddd }t||}| |||  }|tj||d }	|jj}| 	|j||	| |||\}	}
|d|
  |	|d }	|jj}| 	|j||	| |||\}	}|tj|	|d }	|	t|
|fS )Nr   r5   z %s )r  r{   r|   r  r  r  r   rV   r  r  r]  rk   )rM   rd   r  r8   r  first_heightsecond_heightr  r  r  first_bottomsecond_bottomr0   r0   r1   r  8  s0   

z"DrsDrawer._handle_BinaryExpressionc                 C   s0   ||j ||d }| |j|||\}}||fS rg   )ru   r  r   r  r0   r0   r1   r  ^  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;   r0   )rM   topfull_heightitem_heightr0   r0   r1   r  g  s   zDrsDrawer._get_centered_topr   )r   r   )r%   r&   r'   r  r  r  rC   r  r   r  r  r  r  r  r  r  r  r  r  r  r  r0   r0   r0   r1   r   =  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   )dexpre1e2r0   r0   r1   demon  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.)r8   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  )r  r  ImportError
ValueErrorr   r   r   )r  r   expressionsdr0   r0   r1   	test_draw  s   

r  __main__)>r   	functoolsr   	itertoolsr   nltk.sem.logicr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   	nltk.utilr   r   r2   r   r   r   r   r   r9  r:  r;  rt   rc   r   r  rn  r   ry   r   r   re  r   r  r   r  r   r   r  r  r%   r0   r0   r0   r1   <module>   s\   l g  


>%(
 $S  3(

