B
    >?[I                 @   s  d Z ddlmZmZ ddlZddlZddlZddlZddlm	Z	 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 ddl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eZ#G dd de Z$eG dd de$Z%eG dd de$Z&eG dd de$Z'G dd de'Z(G dd de'Z)G dd de'Z*G dd de'Z+G d d! d!e'Z,G d"d# d#e'Z-G d$d% d%e'Z.G d&d' d'e'Z/G d(d) d)e Z0G d*d+ d+e Z1G d,d- d-e2Z3e4d.kre	d/Z5e5j6d0d1d2d3d4d5d6 e5j6d7d8d9d3d4d:d6 e5j6d;d<d=d3d4d>d6 e5j6d?d@dAd3d4dBd6 e57 \Z8Z9e:e9dCkrje5;dD e1e8j<dEZ=e!e=j>e9d ?dFe8j@e8jAdGZBeBdkreCd n.eBD E ZBe8jFreCeBF G  neBH  dS )Ha  
An interface to Boxer.

This interface relies on the latest version of the development (subversion) version of
C&C and Boxer.

Usage:
  Set the environment variable CANDC to the bin directory of your CandC installation.
  The models directory should be in the CandC root directory.
  For example:
     /path/to/candc/
        bin/
            candc
            boxer
        models/
            boxer/
    )print_functionunicode_literalsN)OptionParser)reduce)find_binary)ExpectedMoreTokensExceptionLogicalExpressionExceptionUnexpectedTokenExceptionVariable)	DRSDrtApplicationExpressionDrtEqualityExpressionDrtNegatedExpressionDrtOrExpression	DrtParserDrtProposition	DrtTokensDrtVariableExpression)python_2_unicode_compatiblec               @   s   e Zd ZdZdddZdddZdd	d
Zd ddZd!ddZd"ddZ	d#ddZ
d$ddZd%ddZg dfddZdd Zdd ZdS )&Boxerz
    This class is an interface to Johan Bos's program Boxer, a wide-coverage
    semantic parser that produces Discourse Representation Structures (DRSs).
    NFTc             C   s0   |dkrt  }|| _|| _|| _| || dS )a  
        :param boxer_drs_interpreter: A class that converts from the
        ``AbstractBoxerDrs`` object hierarchy to a different object.  The
        default is ``NltkDrtBoxerDrsInterpreter``, which converts to the NLTK
        DRT hierarchy.
        :param elimeq: When set to true, Boxer removes all equalities from the
        DRSs and discourse referents standing in the equality relation are
        unified, but only if this can be done in a meaning-preserving manner.
        :param resolve: When set to true, Boxer will resolve all anaphoric DRSs and perform merge-reduction.
        Resolution follows Van der Sandt's theory of binding and accommodation.
        N)NltkDrtBoxerDrsInterpreter_boxer_drs_interpreter_resolve_elimeqset_bin_dir)selfZboxer_drs_interpreterZelimeqbin_dirverboseZresolve r   -lib/python3.7/site-packages/nltk/sem/boxer.py__init__C   s    zBoxer.__init__c             C   sF   |  d||| _tjtj| jd d d| _|  d||| _d S )NZcandcz	../modelsboxer)_find_binary
_candc_binospathnormpathjoin_candc_models_path
_boxer_bin)r   r   r   r   r   r   r   _   s    zBoxer.set_bin_dirc             C   s>   |dk	r|gnd}|  |gg|||\}|s:td||S )aI  
        Use Boxer to give a first order representation.

        :param input: str Input sentence to parse
        :param occur_index: bool Should predicates be occurrence indexed?
        :param discourse_id: str An identifier to be inserted to each occurrence-indexed predicate.
        :return: ``drt.DrtExpression``
        NzUnable to interpret: "{0}")interpret_multi_sents	Exceptionformat)r   inputdiscourse_idquestionr   discourse_idsdr   r   r   	interpretf   s
    	zBoxer.interpretc             C   s<   |dk	r|gnd}|  |g|||\}|s8td||S )ah  
        Use Boxer to give a first order representation.

        :param input: list of str Input sentences to parse as a single discourse
        :param occur_index: bool Should predicates be occurrence indexed?
        :param discourse_id: str An identifier to be inserted to each occurrence-indexed predicate.
        :return: ``drt.DrtExpression``
        NzUnable to interpret: "{0}")r+   r,   r-   )r   r.   r/   r0   r   r1   r2   r   r   r   interpret_multiu   s
    	zBoxer.interpret_multic             C   s   |  dd |D |||S )a{  
        Use Boxer to give a first order representation.

        :param inputs: list of str Input sentences to parse as individual discourses
        :param occur_index: bool Should predicates be occurrence indexed?
        :param discourse_ids: list of str Identifiers to be inserted to each occurrence-indexed predicate.
        :return: list of ``drt.DrtExpression``
        c             S   s   g | ]
}|gqS r   r   ).0r.   r   r   r   
<listcomp>   s    z)Boxer.interpret_sents.<locals>.<listcomp>)r+   )r   inputsr1   r0   r   r   r   r   interpret_sents   s    zBoxer.interpret_sentsc                s   |dk	r<t |t |kstttjdd |D s6td}nttttt |}d}| j	||||d}| j
||d}| ||  fdd|D S )	ac  
        Use Boxer to give a first order representation.

        :param inputs: list of list of str Input discourses to parse
        :param occur_index: bool Should predicates be occurrence indexed?
        :param discourse_ids: list of str Identifiers to be inserted to each occurrence-indexed predicate.
        :return: ``drt.DrtExpression``
        Nc             s   s   | ]}|d k	V  qd S )Nr   )r5   idr   r   r   	<genexpr>   s    z.Boxer.interpret_multi_sents.<locals>.<genexpr>TF)r   c                s   g | ]}  |d qS )N)get)r5   r9   )drs_dictr   r   r6      s    z/Boxer.interpret_multi_sents.<locals>.<listcomp>)lenAssertionErrorr   operatorand_listmapstrrange_call_candc_call_boxer_parse_to_drs_dict)r   r7   r1   r0   r   use_disc_id	candc_out	boxer_outr   )r<   r   r+      s    zBoxer.interpret_multi_sentsc          	   C   sN   dt j| jddg| ddg}| dtdd t||D g | j||S )aF  
        Call the ``candc`` binary with the given input.

        :param inputs: list of list of str Input discourses to parse
        :param discourse_ids: list of str Identifiers to be inserted to each occurrence-indexed predicate.
        :param filename: str A filename for the output file
        :return: stdout
        z--modelsr"   Z	questionsz--candc-printer
c             s   s"   | ]\}}d  |g| V  qdS )z<META>'{0}'N)r-   )r5   r2   r9   r   r   r   r:      s   z$Boxer._call_candc.<locals>.<genexpr>)r%   r&   r(   r)   _callsumzipr$   )r   r7   r1   r0   r   argsr   r   r   rE      s    
zBoxer._call_candcc             C   s   d}z.t jdddd\}}t|d}|| W d|r@|  X ddd	d
dddg| j dddg| j ddddd|g}| d| j	||}t
| |S )z
        Call the ``boxer`` binary with the given input.

        :param candc_out: str output from C&C parser
        :return: stdout
        Nzboxer-z.inT)prefixsuffixtextwz--boxZfalsez--semanticsdrsz	--resolvetruez--elimeqz--formatZprologz--instantiatez--input)tempfileZmkstempr%   fdopenwritecloser   r   rL   r*   remove)r   rI   r   ffdZtemp_filenamerO   stdoutr   r   r   rF      s2    

zBoxer._call_boxerc             C   s   t ||dgd||d g|dS )NZCANDCz)http://svn.ask.it.usyd.edu.au/trac/candc/z.exe)Zpath_to_binZenv_varsZurlZbinary_namesr   )r   )r   namer   r   r   r   r   r#      s    
zBoxer._find_binaryc       	      C   s   |r:t d| t d| t d| t d|d d|  |dkrb|g| }tj|tjtjd}n*d||d|}tj|tjtjd	d
}| \}}|rt d|j |rt d|d |rt d|d |jdkrtd|d||j||S )a  
        Call the binary with the given input.

        :param input_str: A string whose contents are used as stdin.
        :param binary: The location of the binary to call
        :param args: A list of command-line arguments.
        :return: stdout
        zCalling:zArgs:zInput:zCommand: N)r]   stderrzecho "{0}" | {1} {2}T)r]   r`   shellzReturn code:zstdout:
rK   zstderr:
r   z*ERROR CALLING: {0} {1}
Returncode: {2}
{3})	printr(   
subprocessPopenPIPEr-   Zcommunicate
returncoder,   )	r   Z	input_strZbinaryrO   r   cmdpr]   r`   r   r   r   rL      s.    	




zBoxer._callc             C   s  | d}i }d}x|t|k r|| }|dr|d}|d| }|d dkrr|d dkrr|dd }||d |d	 }	|d7 }|| }|d
|	st|dd  dkr|d d d }|dstd|td|	}
d}d}xt||
d  D ]n\}}|dkr&|d7 }|dkr|d8 }|dkr|
| d }|||d  dkrn|d }n|d }P qW |dkst||d  }| 	|||}| j
|||< |d7 }qW |S )NrK   r   zid(,   '   )zsem({0},z').'z).zcan't parse line: {0}z	sem({0},[[]z',')splitr=   
startswithindexr-   r>   endswith	enumeratestrip
_parse_drsr   r3   )r   rJ   rH   linesr<   ilineZ	comma_idxr/   Zdrs_idZsearch_startZbrace_countZ	drs_startjcZ	drs_inputZparsedr   r   r   rG   '  sJ    





zBoxer._parse_to_drs_dictc             C   s   t d |g| |S )N)BoxerOutputDrsParserparse)r   Z
drs_stringr/   rH   r   r   r   ry   Q  s    zBoxer._parse_drs)NFNFT)F)NFF)NFF)NFF)NFF)F)F)F)__name__
__module____qualname____doc__r    r   r3   r4   r8   r+   rE   rF   r#   rL   rG   ry   r   r   r   r   r   =   s"       







'

)*r   c               @   s  e Zd Zd@ddZdAd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$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Z d>d? Z!dS )Br   Nc             C   s"   t |  || _d| _dg| _dS )zz
        This class is used to parse the Prolog DRS output from Boxer into a
        hierarchy of python objects.
        N)rk   rk   \F)r   r    r/   Zsentence_id_offsetZquote_chars)r   r/   r   r   r   r    V  s    
zBoxerOutputDrsParser.__init__c             C   s   t | ||S )N)r   r   )r   dataZ	signaturer   r   r   r   `  s    zBoxerOutputDrsParser.parsec             C   s   ddddddgS )N(rn   ri   rp   rq   :r   )r   r   r   r   get_all_symbolsc  s    z$BoxerOutputDrsParser.get_all_symbolsc             C   s
   |  |S )N)
handle_drs)r   tokcontextr   r   r   handlef  s    zBoxerOutputDrsParser.handlec             C   s   |S )Nr   )r   
expressionr   r   r   r   attempt_adjunctsi  s    z%BoxerOutputDrsParser.attempt_adjunctsc             C   s(   |   }| ||}|dkr$t||S )zS
        Parse a DRS condition

        :return: list of ``DrtExpression``
        N)tokenhandle_conditionr	   )r   indicesr   accumr   r   r   parse_conditionl  s
    z$BoxerOutputDrsParser.parse_conditionc             C   sH   |dkr|   S |dkr*| | jd g S |dkrD| | jd g S d S )NrT   )mergeZsmerge)Zalfa)	parse_drs_handle_binary_expression_make_merge_expression_handle_alfa)r   r   r   r   r   r   x  s    zBoxerOutputDrsParser.handle_drsc                s  |dkr|   gS |dkr*| | jg n|dkrB| | jg n|dkrV|  g n|dkrj|  g n|dkr~|  g nz|dkr|  g nf|dkr|  g nR|d	kr| 	  n@|d
kr| 
 g n,|dkr|  g n|dkr|  g ng  t fdd| |D g S )zx
        Handle a DRS condition

        :param indices: list of int
        :return: list of ``DrtExpression``
        notorimpeqpropprednamedrelZtimexcardwhqZduplexc                s$   g | ]\  fd dD qS )c                s   g | ]}| qS r   r   )r5   cond)
sent_indexword_indicesr   r   r6     s    zDBoxerOutputDrsParser.handle_condition.<locals>.<listcomp>.<listcomp>r   )r5   )conds)r   r   r   r6     s   z9BoxerOutputDrsParser.handle_condition.<locals>.<listcomp>)_handle_notr   _make_or_expression_make_imp_expression
_handle_eq_handle_prop_handle_pred_handle_named_handle_rel_handle_timex_handle_card_handle_whq_handle_duplexrM   _sent_and_word_indices)r   r   r   r   )r   r   r     s:    


z%BoxerOutputDrsParser.handle_conditionc             C   s2   |  |  d | d }|  |  d t|S )Nr   rn   )assertTokenr   process_next_expressionBoxerNot)r   rT   r   r   r   r     s    
z BoxerOutputDrsParser._handle_notc                s     d    d     d    d t   d  fdd}|S )Nr   ri   rn   c                s   t j| | S )N)	BoxerPredr/   )r   r   )r^   posr   sensevariabler   r   _handle_pred_f  s    z9BoxerOutputDrsParser._handle_pred.<locals>._handle_pred_f)r   r   parse_variableint)r   r   r   )r^   r   r   r   r   r   r     s    z!BoxerOutputDrsParser._handle_predc                s     d g    d   d d   d    d d   d  fddS )Nr   r   ri   rn   c                s   t j| | S )N)BoxerWhqr/   )r   r   )	ans_typesd1d2refr   r   r   <lambda>  s   z5BoxerOutputDrsParser._handle_duplex.<locals>.<lambda>)r   r   r   r   )r   r   )r   r   r   r   r   r   r     s    

z#BoxerOutputDrsParser._handle_duplexc                s     d    d     d    d    d  fddS )Nr   ri   rn   c                s   t j| | S )N)
BoxerNamedr/   )r   r   )r^   r   r   typer   r   r   r     s   z4BoxerOutputDrsParser._handle_named.<locals>.<lambda>)r   r   r   )r   r   )r^   r   r   r   r   r   r     s    z"BoxerOutputDrsParser._handle_namedc                s     d    d    d     d t   d  fddS )Nr   ri   rn   c                s   t j| | S )N)BoxerRelr/   )r   r   )r   r   r   var1var2r   r   r     s   z2BoxerOutputDrsParser._handle_rel.<locals>.<lambda>)r   r   r   r   )r   r   )r   r   r   r   r   r   r     s    z BoxerOutputDrsParser._handle_relc             C   sF   |  |  d |  }|  |  d | |}|  |  d |S )Nr   ri   rn   )r   r   r   _handle_time_expression)r   argZ	new_condsr   r   r   r     s    
z"BoxerOutputDrsParser._handle_timexc                st       d dkr, }ndkr@ }nd S   d  fddgdd |D  S )	Nr   ZdateZtimern   c                s   t j| | ddS )Nnr   )r   r/   )r   r   )r   r   r   r   r   r     s   z>BoxerOutputDrsParser._handle_time_expression.<locals>.<lambda>c                s   g | ]  fd dqS )c                s    S )Nr   )r   r   )r   r   r   r     s    zIBoxerOutputDrsParser._handle_time_expression.<locals>.<listcomp>.<lambda>r   )r5   r   )r   r   r6     s    z@BoxerOutputDrsParser._handle_time_expression.<locals>.<listcomp>)r   r   _handle_date_handle_time)r   r   r   r   )r   r   r   r   r     s    z,BoxerOutputDrsParser._handle_time_expressionc       	   
   C   sx  g }|  |  \\}}| |  d |  }| |  d |t| j|||d|dd | |  d |  |  \\}}|  }|dkr|dd	}|t| j|||d
|dd | |  d |  |  \\}}|  }|dkr|t| j|||d|dd | |  d |  |  \\}}|  }|dkrt|t| j|||d|dd |S )Nr   rn   zdate_pol_{0}ar   ri   ZXXXXr   _zdate_year_{0}XXzdate_month_{0}zdate_day_{0})	r   _parse_index_listr   r   appendr   r/   r-   replace)	r   r   r   r   r   ZpolZyearZmonthZdayr   r   r   r      sv    

z!BoxerOutputDrsParser._handle_datec             C   s   g }|    |  }|dkr0|| d|| | |  d |    |  }|dkrl|| d|| | |  d |    |  }|dkr|| d|| |S )Nr   Zr_hour_2ri   Zr_min_2Zr_sec_2)r   r   r   
_make_atomr   )r   r   r   ZhourminZsecr   r   r   r   n  s     z!BoxerOutputDrsParser._handle_timec                sj       d       d       d       d  fddS )Nr   ri   rn   c                s   t  j| |S )N)	BoxerCardr/   )r   r   )r   r   valuer   r   r   r     s   z3BoxerOutputDrsParser._handle_card.<locals>.<lambda>)r   r   r   )r   r   )r   r   r   r   r   r     s    z!BoxerOutputDrsParser._handle_cardc                sR     d    d d    d  fddS )Nr   ri   rn   c                s   t j| | S )N)	BoxerPropr/   )r   r   )rT   r   r   r   r   r     s   z3BoxerOutputDrsParser._handle_prop.<locals>.<lambda>)r   r   r   r   )r   r   )rT   r   r   r   r     s    
z!BoxerOutputDrsParser._handle_propc             C   sh   g }|  |  d x6| ddkrJ||   | ddkr|   qW |   |  |  d |S )Nrp   r   rq   ri   r   )r   r   r   parse_index)r   r   r   r   r   r     s    z&BoxerOutputDrsParser._parse_index_listc             C   s   |  |  d |  |  d t }x>| ddkrd|  }||   | ddkr(|   q(W |   |  |  d |  |  d g }x@| ddkr|  }|| | | ddkr|   qW |   |  |  d tt	||S )Nr   rp   r   rq   ri   rn   )
r   r   setr   addr   extendr   BoxerDrsrA   )r   refsr   r   r   r   r   r     s(    zBoxerOutputDrsParser.parse_drsc                sT   |  |  d | d  |  |  d | d |  |  d  fddS )Nr   ri   rn   c                s   | | S )Nr   )r   r   )drs1drs2make_callbackr   r   r     s   z@BoxerOutputDrsParser._handle_binary_expression.<locals>.<lambda>)r   r   r   )r   r   r   )r   r   r   r   r     s    

z.BoxerOutputDrsParser._handle_binary_expressionc                sl   |  |  d |  }|  |  d | d  |  |  d | d |  |  d  fddS )Nr   ri   rn   c                s   | | S )Nr   )r   r   )r   r   r   r   r   r     s   z3BoxerOutputDrsParser._handle_alfa.<locals>.<lambda>)r   r   r   )r   r   r   r   )r   r   r   r   r     s    

z!BoxerOutputDrsParser._handle_alfac                sP       d       d       d  fddS )Nr   ri   rn   c                s   t  j| |S )N)BoxerEqr/   )r   r   )r   r   r   r   r   r     s   z1BoxerOutputDrsParser._handle_eq.<locals>.<lambda>)r   r   r   )r   r   )r   r   r   r   r     s    zBoxerOutputDrsParser._handle_eqc                s(    d   d g  xddkr }  d |dkrd   q&|dkr d  }|d	kr d
 q | q&   q&W     d d   d    d d   d  fddS )Nr   rp   r   rq   r   ZdesZnumZnumberZcoucountri   rn   c                s   t j| | S )N)r   r/   )r   r   )r   r   r   r   r   r   r   r     s   z2BoxerOutputDrsParser._handle_whq.<locals>.<lambda>)r   r   r   r   r   )r   cattypr   )r   r   r   r   r   r   r     s0    


z BoxerOutputDrsParser._handle_whqc             C   s   t |j|j |j|j S )N)r   r   r   )r   r   r   r   r   r   r   r   r      s    z+BoxerOutputDrsParser._make_merge_expressionc             C   s   t | j||||S )N)BoxerOrr/   )r   r   r   r   r   r   r   r   r     s    z(BoxerOutputDrsParser._make_or_expressionc             C   s   t |j|j|S )N)r   r   r   )r   r   r   r   r   r   r   r   r     s    z)BoxerOutputDrsParser._make_imp_expressionc             C   s    |   }td|st||S )Nz^[exps]\d+$)r   rematchr>   )r   varr   r   r   r   	  s    z#BoxerOutputDrsParser.parse_variablec             C   s   t |  S )N)r   r   )r   r   r   r   r     s    z BoxerOutputDrsParser.parse_indexc                sh   t dd |D }|rLg }x,|D ]$  fdd|D }| |f q W |S dd |D }d|fgS dS )zD
        :return: list of (sent_index, word_indices) tuples
        c             s   s"   | ]}|d kr|d d V  qdS )r   i  rm   Nr   )r5   r{   r   r   r   r:     s    z>BoxerOutputDrsParser._sent_and_word_indices.<locals>.<genexpr>c                s(   g | ] } |d  d kr|d  d qS )i  rm   r   )r5   r{   )r   r   r   r6     s    z?BoxerOutputDrsParser._sent_and_word_indices.<locals>.<listcomp>c             S   s   g | ]}|d  d qS )i  rm   r   )r5   r{   r   r   r   r6     s    N)r   r   )r   r   Zsent_indicesZpairsr   r   )r   r   r     s    
z+BoxerOutputDrsParser._sent_and_word_indices)N)N)"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   r   r   r   r   r   r   r   r   r   r   r   r   U  s>   


.!	N

r   c               @   sB   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dS )BoxerDrsParserzD
    Reparse the str form of subclasses of ``AbstractBoxerDrs``
    Nc             C   s   t |  || _d S )N)r   r    r/   )r   r/   r   r   r   r    (  s    
zBoxerDrsParser.__init__c             C   s   t jt jt jt jt jgS )N)r   OPENCLOSECOMMAZOPEN_BRACKETZCLOSE_BRACKET)r   r   r   r   r   ,  s
    zBoxerDrsParser.get_all_symbolsc             C   s   |S )Nr   )r   r   r   r   r   r   r   5  s    zBoxerDrsParser.attempt_adjunctsc          
   C   s   y|dkr|  tj | jd k	r(| jn|  }|  tj |  }|  tj ttt	| 
 }|  tj t	|  }|  tj |  }|  tj |  }|  tj t	|  }	|  tj t|||||||	S |dkr|  tj | jd k	r| jn|  }|  tj t	|  }|  tj tt	| 
 }|  tj t	|  }|  tj |  }|  tj |  }
|  tj t	|  }	|  tj t||||||
|	S |dkr|  tj | jd k	r| jn|  }|  tj |  }|  tj ttt	| 
 }|  tj t	|  }|  tj t	|  }|  tj |  }|  tj t	|  }	|  tj t|||||||	S |dkrB|  tj | jd k	r| jn|  }|  tj t	|  }|  tj ttt	| 
 }|  tj t	|  }|  tj | d }|  tj t|||||S |dkrv|  tj | d }|  tj t|S |dkr|  tj | d }|  tj | d }|  tj t|j|j|S |dkrn|  tj | jd k	r| jn|  }|  tj |  }|  tj tt	| 
 }|  tj | d }|  tj | d }|  tj t|||||S |dkr|  tj | jd k	r| jn|  }|  tj |  }|  tj ttt	| 
 }|  tj t	|  }|  tj t	|  }|  tj t|||||S |d	kr|  tj | jd k	rD| jn|  }|  tj |  }|  tj tt	| 
 }|  tj t	|  }|  tj |  }|  tj |  }
|  tj t||||||
S |d
kr|  tj | jd k	r | jn|  }|  tj |  }|  tj ttt	| 
 }|  tj | 
 }|  tj | d }|  tj t	|  }|  tj | d }|  tj t|||||||S W n4 tk
r } zt| jt|W d d }~X Y nX dstt|d S )Nr   r   r   r   r   r   r   r   r   r   F)ZassertNextTokenr   r   r/   r   r   nullableIntTokenrA   rB   r   Zhandle_refsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r,   r   Z_currentIndexrC   r>   repr)r   r   r   Zdisc_idZsent_idZword_idsr   r^   r   r   r   r   r   r   rT   r   r   r   r   r   er   r   r   r   8  s   

















"zBoxerDrsParser.handlec             C   s   |   }|dkrt|S d S )NNone)r   r   )r   tr   r   r   r     s    zBoxerDrsParser.nullableIntTokenc          
   C   s<   y|   S  tk
r6 } zt|jdW d d }~X Y nX d S )NzVariable expected.)r   r   ru   )r   Zdescriptionr   r   r   r   get_next_token_variable  s    z&BoxerDrsParser.get_next_token_variable)N)
r   r   r   r   r    r   r   r   r   r   r   r   r   r   r   #  s   
	 (r   c               @   sL   e 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S )AbstractBoxerDrsc             C   s$   |   \}}}|||B  ||| fS )zK
        :return: (set<variables>, set<events>, set<propositions>)
        )
_variables)r   	variablesZeventsZpropositionsr   r   r   r     s    zAbstractBoxerDrs.variablesc             C   s:   i }x0t d|  D ]\}}x|D ]}|||< q"W qW |S )N)zr   rh   )rN   r   )r   Zvartypesr   varsvr   r   r   variable_types  s
    
zAbstractBoxerDrs.variable_typesc             C   s   t  t  t  fS )zK
        :return: (set<variables>, set<events>, set<propositions>)
        )r   )r   r   r   r   r     s    zAbstractBoxerDrs._variablesc             C   s   t  S )N)r   )r   r   r   r   atoms  s    zAbstractBoxerDrs.atomsc             C   s   | S )Nr   )r   r   r   r   clean  s    zAbstractBoxerDrs.cleanc             C   s   | dd ddS )N-r   rk   )r   )r   r^   r   r   r   _clean_name  s    zAbstractBoxerDrs._clean_namec             C   s   | S )Nr   )r   r[   r   r   r   renumber_sentences  s    z#AbstractBoxerDrs.renumber_sentencesc             C   s   t d| S )Nz{0})hashr-   )r   r   r   r   __hash__  s    zAbstractBoxerDrs.__hash__N)r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r     s   r   c               @   sT   e Z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
ejZdS )r   Nc             C   s    t |  || _|| _|| _d S )N)r   r    r   r   
consequent)r   r   r   r  r   r   r   r      s    
zBoxerDrs.__init__c             C   s|   t  t  t  f}x4| jD ]*}x$t|| D ]\}}|| q,W qW | jd k	rxx&t|| j D ]\}}|| qbW |S )N)r   r   rN   r   updater  )r   r   r   sr   r   r   r   r     s    
zBoxerDrs._variablesc             C   s:   t tjdd | jD t }| jd k	r6|| j  |S )Nc             s   s   | ]}|  V  qd S )N)r   )r5   r   r   r   r   r:   "  s    z!BoxerDrs.atoms.<locals>.<genexpr>)r   r?   or_r   r   r  r  r   )r   r   r   r   r   r   !  s    
zBoxerDrs.atomsc             C   s.   | j r| j  nd }t| jdd | jD |S )Nc             S   s   g | ]}|  qS r   )r   )r5   r~   r   r   r   r6   )  s    z"BoxerDrs.clean.<locals>.<listcomp>)r  r   r   r   r   )r   r  r   r   r   r   '  s    zBoxerDrs.cleanc                s4   | j r| j  nd }t| j fdd| jD |S )Nc                s   g | ]}|  qS r   )r   )r5   r~   )r[   r   r   r6   .  s    z/BoxerDrs.renumber_sentences.<locals>.<listcomp>)r  r   r   r   r   )r   r[   r  r   )r[   r   r   +  s    zBoxerDrs.renumber_sentencesc             C   sL   dd dd | jD d dd | jD f }| jd k	rHd|| jf }|S )Nzdrs([%s], [%s])z, c             s   s   | ]}d | V  qdS )z%sNr   )r5   rr   r   r   r:   3  s    z$BoxerDrs.__repr__.<locals>.<genexpr>c             s   s   | ]}d | V  qdS )z%sNr   )r5   r~   r   r   r   r:   4  s    zimp(%s, %s))r(   r   r   r  )r   r  r   r   r   __repr__1  s    
zBoxerDrs.__repr__c             C   sX   | j |j koV| j|jkoVt| jt|jkoVttjdd t| j|jD oV| j|jkS )Nc             s   s   | ]\}}||kV  qd S )Nr   )r5   Zc1Zc2r   r   r   r:   @  s    z"BoxerDrs.__eq__.<locals>.<genexpr>)		__class__r   r=   r   r   r?   r@   rN   r  )r   otherr   r   r   __eq__:  s    zBoxerDrs.__eq__c             C   s
   | |k S )Nr   )r   r
  r   r   r   __ne__E  s    zBoxerDrs.__ne__)N)r   r   r   r    r   r   r   r   r  r  r  r   r  r   r   r   r   r     s   

	r   c               @   sR   e 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
ejZdS )r   c             C   s   t |  || _d S )N)r   r    rT   )r   rT   r   r   r   r    M  s    
zBoxerNot.__init__c             C   s
   | j  S )N)rT   r   )r   r   r   r   r   Q  s    zBoxerNot._variablesc             C   s
   | j  S )N)rT   r   )r   r   r   r   r   T  s    zBoxerNot.atomsc             C   s   t | j S )N)r   rT   r   )r   r   r   r   r   W  s    zBoxerNot.cleanc             C   s   t | j|S )N)r   rT   r   )r   r[   r   r   r   r   Z  s    zBoxerNot.renumber_sentencesc             C   s
   d| j  S )Nznot(%s))rT   )r   r   r   r   r  ]  s    zBoxerNot.__repr__c             C   s   | j |j ko| j|jkS )N)r	  rT   )r   r
  r   r   r   r  `  s    zBoxerNot.__eq__c             C   s
   | |k S )Nr   )r   r
  r   r   r   r  c  s    zBoxerNot.__ne__N)r   r   r   r    r   r   r   r   r  r  r  r   r  r   r   r   r   r   K  s   r   c               @   s:   e Zd Zdd Zdd Zdd Zdd ZejZd	d
 Z	dS )BoxerIndexedc             C   s    t |  || _|| _|| _d S )N)r   r    r/   r   r   )r   r/   r   r   r   r   r   r    k  s    
zBoxerIndexed.__init__c             C   s
   t | gS )N)r   )r   r   r   r   r   q  s    zBoxerIndexed.atomsc             C   sL   | j |j koJ| j|jkoJ| j|jkoJ| j|jkoJttjdd t| |D S )Nc             s   s   | ]\}}||kV  qd S )Nr   )r5   r  or   r   r   r:   z  s    z&BoxerIndexed.__eq__.<locals>.<genexpr>)r	  r/   r   r   r   r?   r@   rN   )r   r
  r   r   r   r  t  s
    zBoxerIndexed.__eq__c             C   s
   | |k S )Nr   )r   r
  r   r   r   r  }  s    zBoxerIndexed.__ne__c             C   sL   d|   | j| jddd | jD f }x| D ]}|d| 7 }q0W |d S )Nz%s(%s, %s, [%s]z, c             s   s   | ]}d | V  qdS )z%sNr   )r5   Zwir   r   r   r:     s    z(BoxerIndexed.__repr__.<locals>.<genexpr>z, %srn   )_predr/   r   r(   r   )r   r  r   r   r   r   r    s    
zBoxerIndexed.__repr__N)
r   r   r   r    r   r  r  r   r  r  r   r   r   r   r  i  s   	r  c               @   sD   e 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S )r   c             C   s,   t | ||| || _|| _|| _|| _d S )N)r  r    r   r^   r   r   )r   r/   r   r   r   r^   r   r   r   r   r   r      s
    zBoxerPred.__init__c             C   s   t | jgt  t  fS )N)r   r   )r   r   r   r   r     s    zBoxerPred._variablesc             C   s    t | j| j| j|| j| j| jS )N)r   r/   r   r   r^   r   r   )r   r   r   r   r   
change_var  s    zBoxerPred.change_varc             C   s(   t | j| j| j| j| | j| j| jS )N)	r   r/   r   r   r   r   r^   r   r   )r   r   r   r   r     s    
zBoxerPred.cleanc             C   s*   || j }t| j|| j| j| j| j| jS )N)r   r   r/   r   r   r^   r   r   )r   r[   Znew_sent_indexr   r   r   r     s    
zBoxerPred.renumber_sentencesc             C   s   t | j| j| j| jfS )N)iterr   r^   r   r   )r   r   r   r   __iter__  s    zBoxerPred.__iter__c             C   s   dS )Nr   r   )r   r   r   r   r    s    zBoxerPred._predN)
r   r   r   r    r   r  r   r   r  r  r   r   r   r   r     s   r   c               @   sD   e 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S )r   c             C   s,   t | ||| || _|| _|| _|| _d S )N)r  r    r   r^   r   r   )r   r/   r   r   r   r^   r   r   r   r   r   r      s
    zBoxerNamed.__init__c             C   s   t | jgt  t  fS )N)r   r   )r   r   r   r   r     s    zBoxerNamed._variablesc             C   s    t | j| j| j|| j| j| jS )N)r   r/   r   r   r^   r   r   )r   r   r   r   r   r    s    zBoxerNamed.change_varc             C   s(   t | j| j| j| j| | j| j| jS )N)	r   r/   r   r   r   r   r^   r   r   )r   r   r   r   r     s    
zBoxerNamed.cleanc             C   s&   t | j|| j| j| j| j| j| jS )N)r   r/   r   r   r   r^   r   r   )r   r[   r   r   r   r     s    zBoxerNamed.renumber_sentencesc             C   s   t | j| j| j| jfS )N)r  r   r^   r   r   )r   r   r   r   r    s    zBoxerNamed.__iter__c             C   s   dS )Nr   r   )r   r   r   r   r    s    zBoxerNamed._predN)
r   r   r   r    r   r  r   r   r  r  r   r   r   r   r     s   r   c               @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )r   c             C   s,   t | ||| || _|| _|| _|| _d S )N)r  r    r   r   r   r   )r   r/   r   r   r   r   r   r   r   r   r   r      s
    zBoxerRel.__init__c             C   s   t | j| jgt  t  fS )N)r   r   r   )r   r   r   r   r     s    zBoxerRel._variablesc          	   C   s(   t | j| j| j| j| j| | j| jS )N)	r   r/   r   r   r   r   r   r   r   )r   r   r   r   r      s    
zBoxerRel.cleanc             C   s&   t | j|| j| j| j| j| j| jS )N)r   r/   r   r   r   r   r   r   )r   r[   r   r   r   r     s    zBoxerRel.renumber_sentencesc             C   s   t | j| j| j| jfS )N)r  r   r   r   r   )r   r   r   r   r    s    zBoxerRel.__iter__c             C   s   dS )Nr   r   )r   r   r   r   r    s    zBoxerRel._predN)	r   r   r   r    r   r   r   r  r  r   r   r   r   r     s   r   c               @   sL   e 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S )r   c             C   s    t | ||| || _|| _d S )N)r  r    r   rT   )r   r/   r   r   r   rT   r   r   r   r      s    zBoxerProp.__init__c             C   s*   t ttjt t t| jgf| j S )N)tuplerB   r?   r  r   r   rT   r   )r   r   r   r   r   #  s    zBoxerProp._variablesc             C   s   t | jgS )N)r   rT   )r   r   r   r   referenced_labels(  s    zBoxerProp.referenced_labelsc             C   s
   | j  S )N)rT   r   )r   r   r   r   r   +  s    zBoxerProp.atomsc             C   s   t | j| j| j| j| j S )N)r   r/   r   r   r   rT   r   )r   r   r   r   r   .  s    zBoxerProp.cleanc             C   s$   t | j|| j| j| j| j|S )N)r   r/   r   r   r   rT   r   )r   r[   r   r   r   r   7  s    zBoxerProp.renumber_sentencesc             C   s   t | j| jfS )N)r  r   rT   )r   r   r   r   r  @  s    zBoxerProp.__iter__c             C   s   dS )Nr   r   )r   r   r   r   r  C  s    zBoxerProp._predN)r   r   r   r    r   r  r   r   r   r  r  r   r   r   r   r     s   		r   c               @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )r   c             C   s    t | ||| || _|| _d S )N)r  r    r   r   )r   r/   r   r   r   r   r   r   r   r    H  s    zBoxerEq.__init__c             C   s   t | j| jgt  t  fS )N)r   r   r   )r   r   r   r   r   M  s    zBoxerEq._variablesc             C   s   t  S )N)r   )r   r   r   r   r   P  s    zBoxerEq.atomsc             C   s   t | j|| j| j| j| jS )N)r   r/   r   r   r   r   )r   r[   r   r   r   r   S  s    zBoxerEq.renumber_sentencesc             C   s   t | j| jfS )N)r  r   r   )r   r   r   r   r  \  s    zBoxerEq.__iter__c             C   s   dS )Nr   r   )r   r   r   r   r  _  s    zBoxerEq._predN)	r   r   r   r    r   r   r   r  r  r   r   r   r   r   G  s   	r   c               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )r   c             C   s&   t | ||| || _|| _|| _d S )N)r  r    r   r   r   )r   r/   r   r   r   r   r   r   r   r   r    d  s    zBoxerCard.__init__c             C   s   t | jgt  t  fS )N)r   r   )r   r   r   r   r   j  s    zBoxerCard._variablesc             C   s"   t | j|| j| j| j| j| jS )N)r   r/   r   r   r   r   r   )r   r[   r   r   r   r   m  s    zBoxerCard.renumber_sentencesc             C   s   t | j| j| jfS )N)r  r   r   r   )r   r   r   r   r  w  s    zBoxerCard.__iter__c             C   s   dS )Nr   r   )r   r   r   r   r  z  s    zBoxerCard._predN)r   r   r   r    r   r   r  r  r   r   r   r   r   c  s
   
r   c               @   sD   e 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S )r   c             C   s    t | ||| || _|| _d S )N)r  r    r   r   )r   r/   r   r   r   r   r   r   r   r      s    zBoxerOr.__init__c             C   s   t ttj| j | j S )N)r  rB   r?   r  r   r   r   )r   r   r   r   r     s    zBoxerOr._variablesc             C   s   | j  | j B S )N)r   r   r   )r   r   r   r   r     s    zBoxerOr.atomsc             C   s"   t | j| j| j| j | j S )N)r   r/   r   r   r   r   r   )r   r   r   r   r     s    zBoxerOr.cleanc             C   s   t | j|| j| j| j| jS )N)r   r/   r   r   r   r   )r   r[   r   r   r   r     s    zBoxerOr.renumber_sentencesc             C   s   t | j| jfS )N)r  r   r   )r   r   r   r   r    s    zBoxerOr.__iter__c             C   s   dS )Nr   r   )r   r   r   r   r    s    zBoxerOr._predN)
r   r   r   r    r   r   r   r   r  r  r   r   r   r   r   ~  s   		r   c               @   sD   e 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S )r   c             C   s,   t | ||| || _|| _|| _|| _d S )N)r  r    r   r   r   r   )r   r/   r   r   r   r   r   r   r   r   r   r      s
    zBoxerWhq.__init__c             C   s2   t ttjt| jgt t f| j | j S )N)	r  rB   r?   r  r   r   r   r   r   )r   r   r   r   r     s    zBoxerWhq._variablesc             C   s   | j  | j B S )N)r   r   r   )r   r   r   r   r     s    zBoxerWhq.atomsc          	   C   s*   t | j| j| j| j| j | j| j S )N)	r   r/   r   r   r   r   r   r   r   )r   r   r   r   r     s    zBoxerWhq.cleanc             C   s&   t | j|| j| j| j| j| j| jS )N)r   r/   r   r   r   r   r   r   )r   r[   r   r   r   r     s    zBoxerWhq.renumber_sentencesc             C   s&   t dd| j d | j| j| jfS )Nrp   ri   rq   )r  r(   r   r   r   r   )r   r   r   r   r    s    zBoxerWhq.__iter__c             C   s   dS )Nr   r   )r   r   r   r   r    s    zBoxerWhq._predN)
r   r   r   r    r   r   r   r   r  r  r   r   r   r   r     s   	
r   c               @   s   e Zd Zdd ZdS )PassthroughBoxerDrsInterpreterc             C   s   |S )Nr   )r   exr   r   r   r3     s    z(PassthroughBoxerDrsInterpreter.interpretN)r   r   r   r3   r   r   r   r   r    s   r  c               @   s.   e Zd ZdddZdd Zdd Zdd	 Zd
S )r   Fc             C   s
   || _ d S )N)_occur_index)r   occur_indexr   r   r   r      s    z#NltkDrtBoxerDrsInterpreter.__init__c             C   s  t |trJtdd |jD tt| j|j}|jdk	rF| |j|_|S t |t	rdt
| |jS t |tr| d|j|jf |}| ||jS t |tr| d|j|jf |}| ||jS t |t r| d|j |}| ||j|jS t |trtt|j| |jS t |trBttt|jtt|jS t |trt| d|j|jf |}| ||jS t |t rt!| |j"| |j#S t |t$r| |j"}| |j#}t|j|j |j|j S dst%d	|j&j'|f dS )
zT
        :param ex: ``AbstractBoxerDrs``
        :return: ``DrtExpression``
        c             S   s   g | ]}t |qS r   )r
   )r5   r  r   r   r   r6     s    z8NltkDrtBoxerDrsInterpreter.interpret.<locals>.<listcomp>Nz%s_%szne_%s_%sz%sz
card_%s_%sFz%s: %s)(
isinstancer   r   r   rA   rB   r3   r   r  r   r   rT   r   _add_occur_indexingr   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  rT   r   r   r   r   r   r   r3     sB    
"



z$NltkDrtBoxerDrsInterpreter.interpretc             G   s0   t t|}x|D ]}t|t t|}qW |S )N)r   r
   r   )r   r   rO   r   r   r   r   r   r     s
    
z%NltkDrtBoxerDrsInterpreter._make_atomc             C   sL   | j rH|jd k	rH|jr$|d|j 7 }|d|j 7 }|dt|jd  7 }|S )Nz_%sz_s%sz_w%sr   )r  r   r/   sortedr   )r   baser  r   r   r   r    s    z.NltkDrtBoxerDrsInterpreter._add_occur_indexingN)F)r   r   r   r    r3   r   r  r   r   r   r   r     s   
)r   c               @   s   e Zd ZdS )UnparseableInputExceptionN)r   r   r   r   r   r   r   r    s   r  __main__zusage: %prog TEXT [options]z	--verbosez-vzdisplay verbose logs
store_trueFr   )helpactiondefaultdestz--folz-fz
output FOLfolz
--questionz-qzinput is a questionr0   z--occurz-ozoccurrence indexr  rm   zincorrect number of arguments)r  z\n)r0   r   )Ir   Z
__future__r   r   r%   r   r?   rc   Zoptparser   rV   	functoolsr   Znltk.internalsr   Znltk.sem.logicr   r   r	   r
   Znltk.sem.drtr   r   r   r   r   r   r   r   r   Znltk.compatr   objectr   r   r   r   r   r   r  r   r   r   r   r   r   r   r   r  r   r,   r  r   ZoptsZ
add_option
parse_argsZoptionsrO   r=   errorr  Zinterpreterr4   rs   r0   r   rT   rb   ZsimplifyZeliminate_equalityr$  Z	normalizeZpretty_printr   r   r   r   <module>   s   ,     Q H%;$43(*%6>



