B
    >?ð[´s  ã               @   sB  d dl mZmZmZ d dlZd dlmZ d dlmZ d dl	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 d dlmZ d d	lmZ d d
lmZ dddddddœZdddg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%d#d d!„Z&e'd"kr>e&ƒ  dS )$é    )Úprint_functionÚdivisionÚunicode_literalsN)Úchain)Ústring_types)ÚCounter)ÚUnigramTaggerÚBigramTaggerÚTrigramTaggerÚRegexpTagger)Ú
ExpressionÚVariableÚVariableExpressionÚLambdaExpressionÚAbstractVariableExpression)Úpython_2_unicode_compatible)Údrt)ÚlinearlogicÚex_quantÚ
univ_quantZdef_artZno_quant)ÚaZanZeveryZtheZnoÚdefaultÚnmodÚvmodÚpunctc               @   sp   e Zd Zddd„Z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S )ÚGlueFormulaNc             C   s’   |s
t ƒ }t|tƒr"t |¡| _n$t|tƒr4|| _ntd||jf ƒ‚t|tƒrbt 	¡  
|¡| _n&t|tjƒrv|| _ntd||jf ƒ‚|| _d S )Nz1Meaning term neither string or expression: %s, %sz.Glue term neither string or expression: %s, %s)ÚsetÚ
isinstancer   r   Ú
fromstringÚmeaningÚRuntimeErrorÚ	__class__r   ÚLinearLogicParserÚparseÚglueÚindices)Úselfr   r$   r%   © r'   ú,lib/python3.7/site-packages/nltk/sem/glue.pyÚ__init__+   s"    


zGlueFormula.__init__c          	   C   sÐ   | j |j @ r t d| |f ¡‚n| j |j B }yt | j|j|j ¡}W n0 tjk
rt   t d|  ¡ | ¡ f ¡‚Y nX |j}|r¶x4| j ¡ jjddd… D ]}|  	t
d| ƒ|¡}qšW | j |¡}|  |||¡S )z‚ self = (\x.(walk x), (subj -o f))
            arg  = (john        ,  subj)
            returns ((walk john),          f)
        z0'%s' applied to '%s'.  Indices are not disjoint.z'%s' applied to '%s'Néÿÿÿÿzv%s)r%   r   ÚLinearLogicApplicationExceptionÚApplicationExpressionr$   Úsimplifyr   Ú
antecedentZdependenciesÚmake_LambdaExpressionr   Úapplytor!   )r&   ÚargZreturn_indicesZreturn_glueZarg_meaning_abstractedÚdepZreturn_meaningr'   r'   r(   r0   E   s$    zGlueFormula.applytoc             C   s   t |ƒS )N)r   )r&   Únamer'   r'   r(   Úmake_VariableExpressionf   s    z#GlueFormula.make_VariableExpressionc             C   s
   t ||ƒS )N)r   )r&   ÚvariableÚtermr'   r'   r(   r/   i   s    z!GlueFormula.make_LambdaExpressionc             C   sD   t |tƒst‚t |jtƒst‚|  |  |jj| j¡t 	|j
| j
¡¡S )N)r   r   ÚAssertionErrorr   r   r!   r/   r5   r   ÚImpExpressionr$   )r&   Úotherr'   r'   r(   Úlambda_abstractl   s
    zGlueFormula.lambda_abstractc             C   sB   |s
t ƒ }| j ¡  || j¡\}}||  | j|t| ¡ gƒ¡g S )z)From Iddo Lev's PhD Dissertation p108-109)r   r$   r-   Zcompile_posr!   r   r   Úget)r&   ÚcounterZcompiled_glueZ	new_formsr'   r'   r(   Úcompilet   s    
zGlueFormula.compilec             C   s   |   | j ¡ | j ¡ | j¡S )N)r!   r   r-   r$   r%   )r&   r'   r'   r(   r-      s    zGlueFormula.simplifyc             C   s$   | j |j ko"| j|jko"| j|jkS )N)r!   r   r$   )r&   r9   r'   r'   r(   Ú__eq__„   s    zGlueFormula.__eq__c             C   s
   | |k S )Nr'   )r&   r9   r'   r'   r(   Ú__ne__‹   s    zGlueFormula.__ne__c             C   s   t | ƒt |ƒk S )N)Ústr)r&   r9   r'   r'   r(   Ú__lt__   s    zGlueFormula.__lt__c             C   sL   t | jtƒst‚d| j| jf }| jrH|dd dd„ | jD ƒ¡ d 7 }|S )Nz%s : %sz : {z, c             s   s   | ]}t |ƒV  qd S )N)r@   )Ú.0Úindexr'   r'   r(   ú	<genexpr>–   s    z&GlueFormula.__str__.<locals>.<genexpr>Ú})r   r%   r   r7   r   r$   Újoin)r&   Úaccumr'   r'   r(   Ú__str__’   s
    "zGlueFormula.__str__c             C   s   d|  S )Nz%sr'   )r&   r'   r'   r(   Ú__repr__™   s    zGlueFormula.__repr__)N)N)Ú__name__Ú
__module__Ú__qualname__r)   r0   r4   r/   r:   r=   r-   r>   r?   rA   rH   rI   r'   r'   r'   r(   r   )   s   
!
r   c               @   sŠ   e 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dd„ Zdd„ Zd d!„ ZdS )%ÚGlueDictNc             C   s   || _ || _|  ¡  d S )N)ÚfilenameÚfile_encodingÚ	read_file)r&   rN   Úencodingr'   r'   r(   r)   Ÿ   s    zGlueDict.__init__Tc             C   s~  |r|   ¡  ytjj| jd| jd}W nZ tk
r€ } z<ytjjd| j d| jd}W n tk
rn   |‚Y nX W d d }~X Y nX | ¡ }xì|D ]â}| ¡ }t	|ƒsªq’|d dkr¸q’| 
dd¡}g }d}d}	d}
d }t	|ƒdkr°xÈt|d ƒD ]¸\}}|d	kr"|dkr|d }	|d7 }qô|d
krr|d8 }|dkr¬|d |	|
… }|d |
d |… }| ||g¡ qô|dkrŒ|dkr¬|}
qô|dkrô|dkrªtd| ƒ‚P qôW t	|ƒdkr|d  d¡d }|d  d¡}||krðtƒ }n$tdd„ |d ||…  
d¡D ƒƒ}yH|d  d	¡}|d  d
¡}|d d |…  ¡ }|d |d |… }W n   |d  ¡ }d }Y nX || krŒi | |< |d kr*|rüxŠ| | D ]P}|| | krÄg | | |< | | | }| | |  |¡ | | |  |¡ q¦W n,d | | krg | | d < | | d   |¡ q’|| | krDg | | |< |rd| | |  | | | ¡ | | |  |¡ q’W d S )NÚtext)ÚformatrQ   zfile:r   ú#z : é   é   ú(ú)ú,z&Formula syntax is incorrect for entry ú[ú]c             s   s   | ]}|  ¡ V  qd S )N)Ústrip)rB   Úrr'   r'   r(   rD   î   s    z%GlueDict.read_file.<locals>.<genexpr>)ÚclearÚnltkÚdataÚloadrN   rO   ÚLookupErrorÚ
splitlinesr\   ÚlenÚsplitÚ	enumerateÚappendr    rC   Ú	frozensetÚextend)r&   Zempty_firstÚcontentsÚeÚlinesÚlineÚpartsZglue_formulasZparen_countZtuple_startZtuple_commaÚrelationshipsÚiÚcZmeaning_termZ	glue_termZ	rel_startZrel_endZstart_inheritanceZend_inheritanceZsemZ	supertypeZrelsr$   r'   r'   r(   rP   ¤   s¦    










"


zGlueDict.read_filec             C   s´   d}xª| D ]¢}d| }x”| | D ]ˆ}d}x~| | | D ]n}|dkrP||d 7 }n|dt |ƒd  7 }|d| 7 }|r”|t | | | ƒkr”|d| 7 }|d7 }|d7 }q6W q W q
W |S )	NÚ z%srV   z: ú rU   z : %sÚ
)rd   )r&   rG   ÚposZstr_posZrelsetrp   Úgfr'   r'   r(   rH     s    
zGlueDict.__str__Fc          	   C   s’   |d krF|j d }tt|d  ¡ Ž ƒ}|j |d  }|  ||tƒ |¡S |  |||¡}x8t|d  ¡ Ž D ]$}	|j |	 }
| |  ||
||¡¡ qfW |S )Nr   Údeps)ÚnodesÚlistr   ÚvaluesÚto_glueformula_listr   Úlookupri   )r&   ÚdepgraphÚnoder<   ÚverboseÚtopZdepListÚrootÚglueformulasZdep_idxr2   r'   r'   r(   r{   +  s    

zGlueDict.to_glueformula_listc             C   s   |   |¡}d }x|D ]}|| kr| | }P qW |d kr:g S |  ||¡ |  |||¡}t|ƒsztd|d |d |d f ƒ‚|  ||d |||¡S )NzKThere is no GlueDict entry for sem type of '%s' with tag '%s', and rel '%s'ÚwordÚtagÚrel)Úget_semtypesÚadd_missing_dependenciesÚ_lookup_semtype_optionrd   ÚKeyErrorÚ#get_glueformulas_from_semtype_entry)r&   r~   r}   r<   Zsemtype_namesÚsemtyper3   r|   r'   r'   r(   r|   <  s     

zGlueDict.lookupc             C   sb   |d   ¡ }|dkr^|j|d  }|  d||¡}|d }|d  |g ¡ |d |  |d ¡ d S )Nr…   ÚmainÚheadÚsubjrw   Úaddress)Úlowerrx   Úlookup_uniqueÚ
setdefaultrg   )r&   r~   r}   r…   ZheadnoderŽ   Zrelationr'   r'   r(   r‡   V  s    z!GlueDict.add_missing_dependenciesc                s¤   t ‡ fdd„t|d  ¡ Ž D ƒƒ}y|| }W np tk
rž   t ƒ }x6t|ƒtd gƒ D ] }t|ƒt|ƒkrX||k rX|}qXW |s’d |krŽd }nd S || }Y nX |S )Nc             3   s6   | ].}ˆ j | d   ¡ tkrˆ j | d   ¡ V  qdS )r…   N)rx   r   ÚOPTIONAL_RELATIONSHIPS)rB   r2   )r}   r'   r(   rD   c  s   z2GlueDict._lookup_semtype_option.<locals>.<genexpr>rw   )rh   r   rz   r‰   r   rd   )r&   r‹   r~   r}   ro   r|   Z
best_matchZrelset_optionr'   )r}   r(   rˆ   a  s"    
zGlueDict._lookup_semtype_optionc             C   s`   |d   ¡ }|d   ¡ }|dkr>|tkr2t| gS td gS n|dkrR|d |gS |d gS dS )zj
        Based on the node, return a list of plausible semtypes in order of
        plausibility.
        r…   rƒ   Úspecr   )r   r   r„   N)r   ÚSPEC_SEMTYPES)r&   r~   r…   rƒ   r'   r'   r(   r†     s    
zGlueDict.get_semtypesc             C   s|   g }|   ¡ }xj|D ]b\}}	||  ||¡|	ƒ}
t|ƒs<||
_nd|t|ƒd f |
_|  |
j||| ¡ ¡|
_| |
¡ qW |S )Nz%s%srV   )Úget_GlueFormula_factoryÚget_meaning_formulard   rƒ   Úinitialize_labelsr$   r;   rg   )r&   r|   rƒ   r~   r}   r<   r‚   ZglueFormulaFactoryr   r$   rv   r'   r'   r(   rŠ   ‘  s    z,GlueDict.get_glueformulas_from_semtype_entryc             C   s   |  dd¡}|  d|¡S )z 
        :param generic: A meaning formula string containing the
        parameter "<word>"
        :param word: The actual word to be replace "<word>"
        Ú.rr   z<word>)Úreplace)r&   Zgenericrƒ   r'   r'   r(   r—   £  s    zGlueDict.get_meaning_formulac          	   C   sp   t |tjƒrD|  |j ¡ |||¡}|d  ¡ r8t |¡S t |¡S n(t 	|  
|j|||¡|  
|j|||¡¡S d S )Nr   )r   r   ZAtomicExpressionÚfind_label_namer3   r   Úisupperr   ZConstantExpressionr8   r˜   r.   Z
consequent)r&   Úexprr~   r}   Úunique_indexr3   r'   r'   r(   r˜   ¬  s    
zGlueDict.initialize_labelsc       	   
   C   s<  yf|  d¡}|d |… }||d d … }|dkrJ|  ||j|d  ||¡S |  ||  |||¡||¡S W nÐ tk
r6   |  |¡}|dkrŽ|S |dkržd| S |dkr®d	| S |dkrÊ|  |j|d  ¡S |d
krâd| ¡ |f S |dkr |  |  d||¡¡S |dkr|  |  d||¡¡S |  |  |||¡¡S Y nX d S )Nr™   rV   Úsuperr   ÚfÚvz%svr]   z%srÚvarz%s%sr   ZconjaÚbZconjb)rC   r›   rx   r‘   Ú
ValueErrorÚ	get_labelÚupper)	r&   r3   r~   r}   rž   ÚdotZ
before_dotZ	after_dotZlblr'   r'   r(   r›   ¹  s:    




zGlueDict.find_label_namec             C   sp   |d }dddddddd	d
dddddddddddddddddg|d  }t |ƒd }|dkrh|t|ƒ S |S dS ) z³
        Pick an alphabetic character as identifier for an entity in the model.

        :param value: where to index into the list of characters
        :type value: int
        r   r    ÚgÚhrp   ÚjÚkÚlÚmÚnÚoÚpÚqr]   ÚsÚtÚur¡   ÚwÚxÚyÚzr   r£   rq   Údrk   rV   é   r   N)Úintr@   )r&   r~   ÚvalueZletterZnumr'   r'   r(   r¥   Ý  s@    
zGlueDict.get_labelc                sp   ‡ ‡fdd„t |d  ¡ Ž D ƒ}t|ƒdkrBtd|d ˆf ƒ‚n*t|ƒdkrdtd|d ˆf ƒ‚n|d S d	S )
z\
        Lookup 'key'. There should be exactly one item in the associated relation.
        c                s0   g | ](}ˆ j | d   ¡ ˆ ¡ krˆ j | ‘qS )r…   )rx   r   )rB   r2   )r}   r…   r'   r(   ú
<listcomp>  s   z*GlueDict.lookup_unique.<locals>.<listcomp>rw   r   z#'%s' doesn't contain a feature '%s'rƒ   rV   z&'%s' should only have one feature '%s'N)r   rz   rd   r‰   )r&   r…   r~   r}   rw   r'   )r}   r…   r(   r‘     s    zGlueDict.lookup_uniquec             C   s   t S )N)r   )r&   r'   r'   r(   r–     s    z GlueDict.get_GlueFormula_factory)N)T)NNF)rJ   rK   rL   r)   rP   rH   r{   r|   r‡   rˆ   r†   rŠ   r—   r˜   r›   r¥   r‘   r–   r'   r'   r'   r(   rM      s   

u
	$+rM   c               @   sh   e Zd Zd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d„ ZdS )ÚGlueNFc             C   sH   || _ || _|| _ddlm} |ƒ | _|r2|| _ntj 	ddd¡| _d S )Nr   )ÚProver9ÚgrammarsÚsample_grammarszglue.semtype)
r   Úremove_duplicatesÚ	depparserr_   r¿   ÚproverÚsemtype_fileÚosÚpathrF   )r&   rÅ   rÂ   rÃ   r   r¿   r'   r'   r(   r)      s    zGlue.__init__c          	   C   s6   |r| j  |¡ n | j  tj tj ddd¡¡¡ d S )NrÀ   rÁ   zglue_train.conll)	rÃ   ZtrainZtrain_from_filer_   r`   ÚfindrÆ   rÇ   rF   )r&   Z	depgraphsr'   r'   r(   Útrain_depparser2  s
    zGlue.train_depparserc             C   s,   g }x"|   |¡D ]}| |  |¡¡ qW |S )N)Úparse_to_compiledri   Úget_readings)r&   ÚsentenceÚreadingsÚagendar'   r'   r(   Úparse_to_meaning<  s    zGlue.parse_to_meaningc          
   C   s†  g }t |ƒ}tƒ }tƒ }xæ|r | ¡ }|j ¡ }t|tjƒrx |D ]˜}y|t|jtjƒrf|jj	}	nt 
¡ }	|j ||	¡ xH|| D ]<}
|j|
j@ s†y| | |
¡¡ W q† tjk
rÀ   Y q†X q†W W qH tjk
rÞ   Y qHX qHW y||j  |¡ W n" tk
r   |g||j< Y nX qxª|D ]¢}xš|| D ]Ž}ynt|jtjƒrR|jj	}	nt 
¡ }	| ||	¡ |j|j@ s¢y| | |¡¡ W n tjk
r    Y nX W n tjk
r¼   Y nX q2W q$W y||  |¡ W q tk
rü   |g||< Y qX qW x>|D ]6}x.|| D ]"}t |jƒ|kr|  ||¡ qW qW x>|D ]6}x.|| D ]"}t |jƒ|krV|  ||¡ qVW qHW |S )N)rd   ÚdictÚpopr$   r-   r   r   r8   r,   ÚbindingsZBindingDictr.   Zunifyr%   rg   r0   r+   ZUnificationExceptionr‰   Ú_add_to_reading_list)r&   rÎ   rÍ   Zagenda_lengthZatomicsZ
nonatomicsZcurZ	glue_simpÚkeyrÒ   ZatomicZ	nonatomicÚentryrv   r'   r'   r(   rË   B  sn    









zGlue.get_readingsc             C   st   d}| j r`xT|D ]L}y| |j| j¡r,d}P W q tk
rZ } ztd|ƒ W d d }~X Y qX qW |rp| |j¡ d S )NTFz2Error when checking logical equality of statements)rÂ   Zequivr   rÄ   Ú	ExceptionÚprintrg   )r&   ZglueformulaZreading_listZadd_readingÚreadingrk   r'   r'   r(   rÓ   †  s    
 zGlue._add_to_reading_listc                s*   ‡ fdd„ˆ   |¡D ƒ}‡ fdd„|D ƒS )Nc                s   g | ]}ˆ   |¡‘qS r'   )Údepgraph_to_glue)rB   Zdg)r&   r'   r(   r½   ˜  s    z*Glue.parse_to_compiled.<locals>.<listcomp>c                s   g | ]}ˆ   |¡‘qS r'   )Úgfl_to_compiled)rB   Úgfl)r&   r'   r(   r½   ™  s    )Ú	dep_parse)r&   rÌ   Zgflsr'   )r&   r(   rÊ   —  s    zGlue.parse_to_compiledc             C   sH   | j dkr&ddlm} ||  ¡ d| _ | j js6|  ¡  | j j|| jdS )z³
        Return a dependency graph for the sentence.

        :param sentence: the sentence to be parsed
        :type sentence: list(str)
        :rtype: DependencyGraph
        Nr   )Ú
MaltParser)Útagger)r   )rÃ   Ú
nltk.parserÝ   Úget_pos_taggerZ_trainedrÉ   r#   r   )r&   rÌ   rÝ   r'   r'   r(   rÜ   ›  s    

zGlue.dep_parsec             C   s   |   ¡  |¡S )N)Úget_glue_dictr{   )r&   r}   r'   r'   r(   rÙ   ­  s    zGlue.depgraph_to_gluec             C   s
   t | jƒS )N)rM   rÅ   )r&   r'   r'   r(   rá   °  s    zGlue.get_glue_dictc             C   sP   t ƒ }g }x|D ]}| | |¡¡ qW | jrLtdƒ x|D ]}t|ƒ q<W |S )NzCompiled Glue Premises:)r   ri   r=   r   r×   )r&   rÛ   Zindex_counterZreturn_listrv   Zcgfr'   r'   r(   rÚ   ³  s    

zGlue.gfl_to_compiledc          
   C   sj   ddl m} tddddddd	d
dg	ƒ}|jdd}t||d}t||d}t||d}tddg|d}|S )Nr   )Úbrown)z^-?[0-9]+(.[0-9]+)?$ZCD)z(The|the|A|a|An|an)$ÚAT)z.*able$ÚJJ)z.*ness$ÚNN)z.*ly$ZRB)z.*s$ZNNS)z.*ing$ZVBG)z.*ed$ZVBD)z.*rå   Znews)Z
categories)Zbackoff)z(A|a|An|an)$r   )z(Every|every|All|all)$r   )Znltk.corpusrâ   r   Ztagged_sentsr   r	   r
   )r&   râ   Zregexp_taggerZbrown_trainZunigram_taggerZbigram_taggerZtrigram_taggerZmain_taggerr'   r'   r(   rà   À  s&    zGlue.get_pos_tagger)NFNF)N)rJ   rK   rL   r)   rÉ   rÏ   rË   rÓ   rÊ   rÜ   rÙ   rá   rÚ   rà   r'   r'   r'   r(   r¾     s   


Dr¾   c               @   s&   e Zd Zddd„Zdd„ Zdd„ ZdS )	ÚDrtGlueFormulaNc             C   s–   |s
t ƒ }t|tƒr$tj |¡| _n&t|tjƒr8|| _ntd||jf ƒ‚t|tƒrft	 
¡  |¡| _n&t|t	jƒrz|| _ntd||jf ƒ‚|| _d S )Nz1Meaning term neither string or expression: %s, %sz.Glue term neither string or expression: %s, %s)r   r   r   r   ZDrtExpressionr   r   r    r!   r   r"   r#   r$   r   r%   )r&   r   r$   r%   r'   r'   r(   r)   ß  s"    

zDrtGlueFormula.__init__c             C   s
   t  |¡S )N)r   ZDrtVariableExpression)r&   r3   r'   r'   r(   r4   ù  s    z&DrtGlueFormula.make_VariableExpressionc             C   s   t  ||¡S )N)r   ZDrtLambdaExpression)r&   r5   r6   r'   r'   r(   r/   ü  s    z$DrtGlueFormula.make_LambdaExpression)N)rJ   rK   rL   r)   r4   r/   r'   r'   r'   r(   ræ   Þ  s   
ræ   c               @   s   e Zd Zdd„ ZdS )ÚDrtGlueDictc             C   s   t S )N)ræ   )r&   r'   r'   r(   r–     s    z#DrtGlueDict.get_GlueFormula_factoryN)rJ   rK   rL   r–   r'   r'   r'   r(   rç      s   rç   c               @   s   e Zd Zddd„Zdd„ ZdS )ÚDrtGlueNFc             C   s*   |st j ddd¡}t | ||||¡ d S )NrÀ   rÁ   zdrt_glue.semtype)rÆ   rÇ   rF   r¾   r)   )r&   rÅ   rÂ   rÃ   r   r'   r'   r(   r)     s    
zDrtGlue.__init__c             C   s
   t | jƒS )N)rç   rÅ   )r&   r'   r'   r(   rá     s    zDrtGlue.get_glue_dict)NFNF)rJ   rK   rL   r)   rá   r'   r'   r'   r(   rè     s   
rè   r*   c       	   	   C   s¸   ddl m} ddddddg}td	ƒ td
dddddddgƒ}||d}t|dd}x`t|ƒD ]T\}}|| kst| dkr\td||f ƒ x"| | ¡ ¡D ]}t| ¡ ƒ q”W tdƒ q\W d S )Nr   )rÝ   zDavid sees MaryzDavid eats a sandwichzevery man chases a dogzevery man believes a dog sleepszJohn gives David a sandwichzJohn chases himselfz"============== DEMO ==============)z^(David|Mary|John)$ZNNP)zN^(sees|eats|chases|believes|gives|sleeps|chases|persuades|tries|seems|leaves)$ÚVB)z!^(go|order|vanish|find|approach)$ré   )z^(a)$r   )z	^(every)$r   )z.^(sandwich|man|dog|pizza|unicorn|cat|senator)$rå   )z^(big|gray|former)$rä   )z^(him|himself)$ZPRP)rÞ   F)rÃ   r   r*   z[[[Example %s]]]  %srr   )	rß   rÝ   r×   r   r¾   rf   rÏ   re   r-   )	Zshow_examplerÝ   ZexamplesrÞ   rÃ   r$   rp   rÌ   rØ   r'   r'   r(   Údemo  s2    
rê   Ú__main__)r*   )(Z
__future__r   r   r   rÆ   Ú	itertoolsr   Zsixr   r_   Znltk.internalsr   Znltk.tagr   r	   r
   r   Znltk.sem.logicr   r   r   r   r   Znltk.compatr   Znltk.semr   r   r•   r“   Úobjectr   rÐ   rM   r¾   ræ   rç   rè   rê   rJ   r'   r'   r'   r(   Ú<module>   s@   
s    @"
2
