§
    'ê[fÓ/  ã                   óú   — d Z ddlZddlZddlmZmZ ddlmZmZ ddl	m
Z
mZ ddlmZ  G d„ dee¦  «        Z G d	„ d
ee¦  «        Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ ZdddgfdddgfgZd„ Zedk    r e¦   «          dS dS )zA
A model builder that makes use of the external 'Mace4' package.
é    N)ÚBaseModelBuilderCommandÚModelBuilder)ÚProver9CommandParentÚProver9Parent)Ú
ExpressionÚ	Valuation)Ú	is_indvarc                   ó”   — e Zd ZdZdZdd„Zed„ ¦   «         Zd„ Ze	d„ ¦   «         Z
e	d„ ¦   «         Ze	d	„ ¦   «         Zd
„ Zd„ Zg dfd„ZdS )ÚMaceCommandz¸
    A ``MaceCommand`` specific to the ``Mace`` model builder.  It contains
    a print_assumptions() method that is used to print the list
    of assumptions in multiple formats.
    Néô  c                 ó†   — |�t          |t          ¦  «        sJ ‚nt          |¦  «        }t          j        | |||¦  «         dS )a•  
        :param goal: Input expression to prove
        :type goal: sem.Expression
        :param assumptions: Input expressions to use as assumptions in
            the proof.
        :type assumptions: list(sem.Expression)
        :param max_models: The maximum number of models that Mace will try before
            simply returning false. (Use 0 for no maximum.)
        :type max_models: int
        N)Ú
isinstanceÚMacer   Ú__init__)ÚselfÚgoalÚassumptionsÚ
max_modelsÚmodel_builders        úG/var/www/piapp/venv/lib/python3.11/site-packages/nltk/inference/mace.pyr   zMaceCommand.__init__   sM   € ð Ð$Ý˜m­TÑ2Ô2Ð2Ð2Ð2Ð2å  Ñ,Ô,ˆMåÔ(¨¨}¸dÀKÑPÔPÐPÐPÐPó    c                 ó,   — |                       d¦  «        S )NÚ	valuation)Úmodel)Úmbcs    r   r   zMaceCommand.valuation1   s   € à�yŠy˜Ñ%Ô%Ð%r   c                 ó¾  — |                       |d¦  «        }g }|                     d¦  «        D �] }|                     ¦   «         }|                     d¦  «        rSt	          ||                     d¦  «        dz   |                     d¦  «        …                              ¦   «         ¦  «        }Œ|                     d¦  «        �r|                     d¦  «        d	k    rë||                     d¦  «        dz   |                     d¦  «        …                              ¦   «         }t          |¦  «        r|                     ¦   «         }t	          ||                     d
¦  «        dz   |                     d¦  «        …                              ¦   «         ¦  «        }| 	                    |t                               |¦  «        f¦  «         �Œ™|                     d¦  «        �rq||                     d¦  «        dz   d…         }d|v r±|d|                     d¦  «        …                              ¦   «         }d„ ||                     d
¦  «        dz   |                     d¦  «        …                              d¦  «        D ¦   «         }	| 	                    |t                               ||	¦  «        f¦  «         �Œ„|d|                     d¦  «        …                              ¦   «         }t	          ||                     d
¦  «        dz   |                     d¦  «        …                              ¦   «         ¦  «        }| 	                    ||dk    f¦  «         �Œ"t          |¦  «        S )z¦
        Transform the output file into an NLTK-style Valuation.

        :return: A model if one is generated; None otherwise.
        :rtype: sem.Valuation
        ÚstandardFÚinterpretationú(é   ú,ÚfunctionÚ_éÿÿÿÿú[ú]ÚrelationNc                 óP   — g | ]#}t          |                     ¦   «         ¦  «        ‘Œ$S © )ÚintÚstrip)Ú.0Úvs     r   ú
<listcomp>z,MaceCommand._convert2val.<locals>.<listcomp>S   s6   € ð ð ð àõ ˜AŸGšG™IœI™œðð ð r   )Ú_transform_outputÚ
splitlinesr+   Ú
startswithr*   ÚindexÚfindr	   ÚupperÚappendr   Ú_make_model_varÚsplitÚ_make_relation_setr   )
r   Úvaluation_strÚvaluation_standard_formatÚvalÚlineÚlÚnum_entitiesÚnameÚvalueÚvaluess
             r   Ú_convert2valzMaceCommand._convert2val5   så  € ð %)×$:Ò$:¸=È*Ñ$UÔ$UÐ!àˆØ-×8Ò8¸Ñ?Ô?ð 	3ñ 	3ˆDØ—
’
‘”ˆAà�|Š|Ð,Ñ-Ô-ð 3å" 1 Q§W¢W¨S¡\¤\°AÑ%5¸¿ºÀ¹¼Ð%DÔ#E×#KÒ#KÑ#MÔ#MÑNÔN��à—’˜jÑ)Ô)ñ 3¨a¯fªf°S©k¬k¸RÒ.?Ð.?à˜Ÿš ™œ¨Ñ)¨A¯GªG°C©L¬LÐ8Ô9×?Ò?ÑAÔA�Ý˜T‘?”?ð (ØŸ:š:™<œ<�DÝ˜A˜aŸgšg c™lœl¨QÑ.°·²¸±´Ð=Ô>×DÒDÑFÔFÑGÔG�Ø—
’
˜D¥+×"=Ò"=¸eÑ"DÔ"DÐEÑFÔFÐFÑFà—’˜jÑ)Ô)ñ 3Ø�a—g’g˜c‘l”l QÑ&Ð(Ð(Ô)�Ø˜!�8�8à˜^˜qŸwšw s™|œ|˜^Ô,×2Ò2Ñ4Ô4�Dðð à!" 1§7¢7¨3¡<¤<°!Ñ#3°a·g²g¸c±l´lÐ#BÔ!C×!IÒ!IÈ#Ñ!NÔ!Nðñ ô �Fð —J’JØ�{×=Ò=¸lÈFÑSÔSÐTñô ð ñ ð
 ˜^˜qŸwšw s™|œ|˜^Ô,×2Ò2Ñ4Ô4�DÝ  !§'¢'¨#¡,¤,°Ñ"2°Q·W²W¸S±\´\Ð"AÔ B× HÒ HÑ JÔ JÑKÔK�EØ—J’J  e¨q¢jÐ1Ñ2Ô2Ð2ùå˜‰~Œ~Ðr   c           
      óÒ   — t          ¦   «         }d„ t          |¦  «        D ¦   «         D ]>}|                     t          t                               ||| ¦  «        ¦  «        ¦  «         Œ?|S )a]  
        Convert a Mace4-style relation table into a dictionary.

        :param num_entities: the number of entities in the model; determines the row length in the table.
        :type num_entities: int
        :param values: a list of 1's and 0's that represent whether a relation holds in a Mace4 model.
        :type values: list of int
        c                 ó$   — g | ]\  }}|d k    ¯|‘ŒS )r    r)   )r,   Úposr-   s      r   r.   z2MaceCommand._make_relation_set.<locals>.<listcomp>m   s!   € ÐIÐIÐI¡ # qÀ!ÀqÂ&À&˜À&À&À&r   )ÚsetÚ	enumerateÚaddÚtupler   Ú_make_relation_tuple)r>   rA   ÚrÚpositions       r   r8   zMaceCommand._make_relation_setb   sq   € õ ‰EŒEˆØIÐI­Y°vÑ->Ô->ÐIÑIÔIð 	ð 	ˆHØ�EŠEÝ•k×6Ò6°xÀÈÑVÔVÑWÔWñô ð ð ð ˆr   c                 ó  — t          |¦  «        dk    rg S t          |¦  «        |z  }| |z  }t          | |z  ¦  «        }|||z  |dz   |z  …         }t                               |¦  «        gt                               |||¦  «        z   S ©Nr    )Úlenr*   r   r6   rJ   )rL   rA   r>   Úsublist_sizeÚsublist_startÚsublist_positionÚsublists          r   rJ   z MaceCommand._make_relation_tuples   s¢   € åˆv‰;Œ;˜!ÒÐØˆIå˜v™;œ;¨,Ñ6ˆLØ$¨Ñ4ˆMÝ" 8¨lÑ#:Ñ;Ô;ÐàØ Ñ,°ÀÑ0AÀ\Ñ/QÐQôˆGõ ×+Ò+¨MÑ:Ô:ðå×0Ò0Ø  '¨<ñô ñð r   c                 óT   — g d¢|          }| dz  }|dk    r|t          |¦  «        z   n|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
        )ÚaÚbÚcÚdÚeÚfÚgÚhÚiÚjÚkr=   ÚmÚnÚoÚpÚqrK   ÚsÚtÚur-   ÚwÚxÚyÚzé   r   )Ústr)r@   ÚletterÚnums      r   r6   zMaceCommand._make_model_var…   sF   € ð
ð 
ð 
ð6 ô7ˆð8 �r‰kˆØ$'¨!¢G Gˆv�˜C™œÑ Ð °Ð7r   c                 ól   — |s|S |dk    r|                       |¦  «        S |                      ||¦  «        S )a_  
        Print out a Mace4 model using any Mace4 ``interpformat`` format.
        See https://www.cs.unm.edu/~mccune/mace4/manual/ for details.

        :param valuation_str: str with the model builder's output
        :param format: str indicating the format for displaying
        models. Defaults to 'standard' format.
        :return: str
        r   )rB   r/   ©r   r9   Úformats      r   Ú_decorate_modelzMaceCommand._decorate_model¬   sH   € ð ð 	AØ Ð Ø�{Ò"Ð"Ø×$Ò$ ]Ñ3Ô3Ð3à×)Ò)¨-¸Ñ@Ô@Ð@r   c                 ób   — |dv r|                       ||g¦  «        d         S t          d¦  «        ‚)zª
        Transform the output file into any Mace4 ``interpformat`` format.

        :param format: Output format for displaying models.
        :type format: str
        )r   Ú	standard2ÚportableÚtabularÚrawÚcookedÚxmlÚtexr   z#The specified format does not exist)Ú_call_interpformatÚLookupErrorrq   s      r   r/   zMaceCommand._transform_output½   sD   € ð ð 	
ð 	
ð 	
ð ×*Ò*¨=¸6¸(ÑCÔCÀAÔFÐFåÐCÑDÔDÐDr   Fc                 ó”   — | j         € | j                             d|¦  «        | _         | j                             || j         ||¦  «        S )a  
        Call the ``interpformat`` binary with the given input.

        :param input_str: A string whose contents are used as stdin.
        :param args: A list of command-line arguments.
        :return: A tuple (stdout, returncode)
        :see: ``config_prover9``
        NÚinterpformat)Ú_interpformat_binÚ_modelbuilderÚ_find_binaryÚ_call)r   Ú	input_strÚargsÚverboses       r   r|   zMaceCommand._call_interpformatÒ   sV   € ð Ô!Ð)Ø%)Ô%7×%DÒ%DØ ñ&ô &ˆDÔ"ð Ô!×'Ò'Ø�tÔ-¨t°Wñ
ô 
ð 	
r   )NNr   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r€   r   Úpropertyr   rB   Ústaticmethodr8   rJ   r6   rs   r/   r|   r)   r   r   r   r      sú   € € € € € ðð ð ÐðQð Qð Qð Qð$ ð&ð &ñ „Xð&ð+ð +ð +ðZ ðð ñ „\ðð  ðð ñ „\ðð" ð$8ð $8ñ „\ð$8ðLAð Að Að"Eð Eð Eð* 24¸Uð 
ð 
ð 
ð 
ð 
ð 
r   r   c                   ó.   — e Zd ZdZdd„Zdd„Zg dfd„ZdS )	r   Nr   c                 ó   — || _         d S )N)Ú	_end_size)r   Úend_sizes     r   r   zMace.__init__è   s   € Ø!ˆŒð	?ð 	?r   Fc                 óv   — |sg }|                       |                      ||¦  «        |¬¦  «        \  }}|dk    |fS )z 
        Use Mace4 to build a first order model.

        :return: ``True`` if a model was found (i.e. Mace returns value of 0),
        else ``False``
        )r†   r   )Ú_call_mace4Úprover9_input)r   r   r   r†   ÚstdoutÚ
returncodes         r   Ú_build_modelzMace._build_modelí   sV   € ð ð 	ØˆKà!×-Ò-Ø×Ò˜t [Ñ1Ô1¸7ð .ñ 
ô 
Ñˆ�
ð ˜a’ Ð(Ð(r   c                 ó¾   — | j         €|                      d|¦  «        | _         d}| j        dk    r|d| j        z  z  }||z  }|                      || j         ||¦  «        S )a  
        Call the ``mace4`` binary with the given input.

        :param input_str: A string whose contents are used as stdin.
        :param args: A list of command-line arguments.
        :return: A tuple (stdout, returncode)
        :see: ``config_prover9``
        NÚmace4Ú r   zassign(end_size, %d).

)Ú
_mace4_binr‚   r�   rƒ   )r   r„   r…   r†   Úupdated_input_strs        r   r’   zMace._call_mace4ü   so   € ð Œ?Ð"Ø"×/Ò/°¸ÑAÔAˆDŒOàÐØŒ>˜AÒÐØÐ!<¸t¼~Ñ!MÑMÐØ˜YÑ&Ðà�zŠzÐ+¨T¬_¸dÀGÑLÔLÐLr   )r   )NNF)r‡   rˆ   r‰   rš   r   r–   r’   r)   r   r   r   r   å   sb   € € € € € Ø€Jð?ð ?ð ?ð ?ð
)ð )ð )ð )ð +-°eð Mð Mð Mð Mð Mð Mr   r   é   c                 ó*   — t          d| z  ¦  «         d S )NÚ-)Úprint)ro   s    r   Úspacerr      s   € Ý	ˆ#�‰)ÑÔÐÐÐr   c                 ó   — ddddœ|          S )zq
    Decode the result of model_found()

    :param found: The output of model_found()
    :type found: bool
    zCountermodel foundzNo countermodel foundÚNone)TFNr)   )Úfounds    r   Údecode_resultr¤     s   € ð 'Ð/FÈfÐUÐUØôð r   c           	      ó  — | D ]…\  }}t          j        |¦  «        }d„ |D ¦   «         }t          ||d¬¦  «        }|                     ¦   «         }|D ]}t	          d|z  ¦  «         Œt	          d|› dt          |¦  «        › d�¦  «         Œ†dS )	z2
    Try some proofs and exhibit the results.
    c                 óB   — g | ]}t                                |¦  «        ‘ŒS r)   ©ÚlpÚparse©r,   rU   s     r   r.   z$test_model_found.<locals>.<listcomp>&  s"   € Ð2Ð2Ð2 •—’˜!‘”Ð2Ð2Ð2r   é2   )r   r   ú   %sú|- ú: Ú
N)r   Ú
fromstringr   Úbuild_modelrŸ   r¤   )Ú	argumentsr   r   r[   Úalistr`   r£   rU   s           r   Útest_model_foundr´      s·   € ð  )ð 3ð 3Ñˆˆ{ÝÔ! $Ñ'Ô'ˆØ2Ð2 kÐ2Ñ2Ô2ˆÝ˜ u¸Ð<Ñ<Ô<ˆØ—’‘”ˆØð 	ð 	ˆAÝ�'˜A‘+ÑÔÐÐÝÐ1�AÐ1Ð1� uÑ-Ô-Ð1Ð1Ð1Ñ2Ô2Ð2Ð2ð3ð 3r   c           	      óþ  — t          j        d¦  «        }d„ dD ¦   «         }t          ||¬¦  «        }|                     ¦   «          t	          ¦   «          t          d¦  «         t	          ¦   «          |D ]}t          d|z  ¦  «         Œt          d|› dt          |                     ¦   «         ¦  «        › d	�¦  «         t	          ¦   «          t          d
¦  «         t	          ¦   «          t          |j        d	¦  «         dS )z0
    Try to build a ``nltk.sem.Valuation``.
    zall x.man(x)c                 ó6   — g | ]}t          j        |¦  «        ‘ŒS r)   )r   r°   rª   s     r   r.   z$test_build_model.<locals>.<listcomp>3  s3   € ð 
ð 
ð 
àõ 	Ô˜aÑ Ô ð
ð 
ð 
r   )z	man(John)úman(Socrates)z	man(Bill)z,some x.(-(x = John) & man(x) & sees(John,x))zsome x.(-(x = Bill) & man(x))z,all x.some y.(man(x) -> gives(Socrates,x,y))©r   zAssumptions and Goalr¬   r­   r®   r¯   r   N)r   r°   r   r±   r    rŸ   r¤   r   )r²   r[   r³   r`   rU   s        r   Útest_build_modelr¹   .  s  € õ 	Ô˜nÑ-Ô-€Að
ð 
ð
ð
ñ 
ô 
€Eõ 	�A 5Ð)Ñ)Ô)€AØ‡M‚M�O„O€OÝ
�H„H€HÝ	Ð
 Ñ!Ô!Ð!Ý
�H„H€HØð ð ˆÝˆg˜‰kÑÔÐÐÝ	Ð
7�Ð
7Ð
7•] 1§=¢=¡?¤?Ñ3Ô3Ð
7Ð
7Ð
7Ñ8Ô8Ð8Ý
�H„H€Hõ 
ˆ+ÑÔÐÝ
�H„H€HÝ	ˆ!Œ+�tÑÔÐÐÐr   c                 óÒ  — t          j        | d         ¦  «        }d„ | d         D ¦   «         }t          ||¬¦  «        }|                     ¦   «          |D ]}t	          d|z  ¦  «         Œt	          d|› d|                     ¦   «         › d�¦  «         d	D ]S}t          ¦   «          t	          d
|z  ¦  «         t          ¦   «          t	          |                     |¬¦  «        ¦  «         ŒTdS )zJ
    Transform the model into various Mace4 ``interpformat`` formats.
    r   c                 óB   — g | ]}t                                |¦  «        ‘ŒS r)   r§   rª   s     r   r.   z)test_transform_output.<locals>.<listcomp>T  s"   € Ð3Ð3Ð3˜Q�R�XŠX�a‰[Œ[Ð3Ð3Ð3r   r    r¸   r¬   r­   r®   r¯   )r   rv   rz   ry   zUsing '%s' format)rr   N)r   r°   r   r±   rŸ   r    r   )Úargument_pairr[   r³   r`   rU   rr   s         r   Útest_transform_outputr½   O  sü   € õ 	Ô˜m¨AÔ.Ñ/Ô/€AØ3Ð3 -°Ô"2Ð3Ñ3Ô3€EÝ�A 5Ð)Ñ)Ô)€AØ‡M‚M�O„O€OØð ð ˆÝˆg˜‰kÑÔÐÐÝ	Ð
(�Ð
(Ð
(�Q—]’]‘_”_Ð
(Ð
(Ð
(Ñ)Ô)Ð)Ø;ð &ð &ˆÝ‰ŒˆÝÐ! FÑ*Ñ+Ô+Ð+Ý‰ŒˆÝˆa�gŠg˜VˆgÑ$Ô$Ñ%Ô%Ð%Ð%ð	&ð &r   c                  ó*  — t          t                               dg d¢¬¦  «        ddhk    ¦  «         t          t                               dg d¢¬¦  «        dhk    ¦  «         t          t                               dg d	¢¬¦  «        d
dhk    ¦  «         d S )Né   )r    r   r    )r>   rA   )rW   )rU   )	r   r   r   r   r   r   r    r   r   )rW   rU   é   )r   r   r    r   r   r   r    r   )rU   rV   rU   )rV   rV   rU   )rŸ   r   r8   r)   r   r   Útest_make_relation_setrÁ   a  sÇ   € Ý	Ý×&Ò&°A¸i¸i¸iÐ&ÑHÔHØ�FÐò	ñô ð õ 
Ý×&Ò&ØÐ#>Ð#>Ð#>ð 	'ñ 	
ô 	
ð ˆ<ò	ñô ð õ 
Ý×&Ò&°AÐ>VÐ>VÐ>VÐ&ÑWÔWØ˜_Ð-ò	.ñô ð ð ð r   zmortal(Socrates)zall x.(man(x) -> mortal(x))r·   z(not mortal(Socrates))c                  óŠ   — t          t          ¦  «         t          t          ¦  «         t          t          d         ¦  «         d S rN   )r´   r²   r¹   r½   r)   r   r   ÚdemorÃ   x  s6   € Ý•YÑÔÐÝ•YÑÔÐÝ�) Aœ,Ñ'Ô'Ð'Ð'Ð'r   Ú__main__)rœ   )rŠ   ÚosÚtempfileÚnltk.inference.apir   r   Únltk.inference.prover9r   r   Únltk.semr   r   Únltk.sem.logicr	   r   r   r    r¤   r´   r¹   r½   rÁ   r²   rÃ   r‡   r)   r   r   ú<module>rË      s¡  ððð ð 
€	€	€	Ø €€€à DÐ DÐ DÐ DÐ DÐ DÐ DÐ DØ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FØ *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø $Ð $Ð $Ð $Ð $Ð $ðL
ð L
ð L
ð L
ð L
Ð&Ð(?ñ L
ô L
ð L
ð^(Mð (Mð (Mð (Mð (Mˆ=˜,ñ (Mô (Mð (MðVð ð ð ð	ð 	ð 	ð3ð 3ð 3ðð ð ðB&ð &ð &ð$ð ð ð$ Ð7¸ÐIÐJØÐ =¸ÐOÐPð€	ð(ð (ð (ð ˆzÒÐØ€D�F„F€F€F€Fð Ðr   