§
    'ê[fªf  ã                   óü  — d 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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  G d„ de¦  «        Z G d„ d	e¦  «        Zd
„ Zd„ Zd„ Zd„ Z  G d„ de!¦  «        Z" ej#        d¦  «        Z$ ej#        d¦  «        Z% ej#        dej&        ¦  «        Z'd„ Z(d#d„Z) G d„ de!¦  «        Z* G d„ d¦  «        Z+dZ,d#d„Z-d$d„Z.d#d„Z/d#d„Z0d%d„Z1e2d k    r e1d!d¬"¦  «         dS dS )&zK
This module provides data structures for representing first-order
models.
é    N©Úpformat)Ú	decorator)ÚAbstractVariableExpressionÚAllExpressionÚAndExpressionÚApplicationExpressionÚEqualityExpressionÚExistsExpressionÚ
ExpressionÚIffExpressionÚImpExpressionÚIndividualVariableExpressionÚIotaExpressionÚLambdaExpressionÚNegatedExpressionÚOrExpressionÚVariableÚ	is_indvarc                   ó   — e Zd ZdS )ÚErrorN©Ú__name__Ú
__module__Ú__qualname__© ó    úE/var/www/piapp/venv/lib/python3.11/site-packages/nltk/sem/evaluate.pyr   r   ,   ó   € € € € € Ø€Dr   r   c                   ó   — e Zd ZdS )Ú	UndefinedNr   r   r   r   r!   r!   0   r   r   r!   c                 ó  — t          j        | ¦  «        }t          t          |d         |¦  «        ¦  «        }|                     dd ¦  «        r7t          ¦   «          |                     ¦   «         D ]}t          d|z  ¦  «         Œ | |i |¤ŽS )Nr   Útracez%s => %s)ÚinspectÚgetfullargspecÚdictÚzipÚpopÚprintÚitems)ÚfÚargsÚkwÚargspecÚdÚitems         r   r#   r#   4   s‹   € ÝÔ$ QÑ'Ô'€GÝ�S�˜”˜TÑ"Ô"Ñ#Ô#€AØ‡u‚uˆW�dÑÔð %Ý‰ŒˆØ—G’G‘I”Ið 	%ð 	%ˆDÝ�*˜tÑ#Ñ$Ô$Ð$Ð$Øˆ1ˆdˆ>�bˆ>ˆ>Ðr   c                 óú   — t          | ¦  «        dk    rdS t          d„ | D ¦   «         ¦  «        r<t          t          | ¦  «        ¦  «        t          t          | ¦  «        ¦  «        k    rdS t	          d| z  ¦  «        ‚)zœ
    Check whether a set represents a relation (of any arity).

    :param s: a set containing tuples of str elements
    :type s: set
    :rtype: bool
    r   Tc              3   ó@   K  — | ]}t          |t          ¦  «        V — Œd S ©N)Ú
isinstanceÚtuple)Ú.0Úels     r   ú	<genexpr>zis_rel.<locals>.<genexpr>J   s,   è è € Ð/Ð/ r�Z˜�EÑ"Ô"Ð/Ð/Ð/Ð/Ð/Ð/r   z.Set %r contains sequences of different lengths)ÚlenÚallÚmaxÚminÚ
ValueError)Úss    r   Úis_relr?   >   ss   € õ ˆ1�v„v�‚{€{Øˆtå	Ð/Ð/¨QÐ/Ñ/Ô/Ñ	/Ô	/ð OµC½¸A¹¼±K´KÅ3ÅsÈ1ÁvÄvÁ;Ä;Ò4NÐ4NØˆtåÐIÈAÑMÑNÔNÐNr   c                 ó  — t          ¦   «         }| D ]{}t          |t          ¦  «        r|                     |f¦  «         Œ.t          |t          ¦  «        r#|                     t          |¦  «        ¦  «         Œf|                     |¦  «         Œ||S )aR  
    Convert a set containing individuals (strings or numbers) into a set of
    unary tuples. Any tuples of strings already in the set are passed through
    unchanged.

    For example:
      - set(['a', 'b']) => set([('a',), ('b',)])
      - set([3, 27]) => set([('3',), ('27',)])

    :type s: set
    :rtype: set of tuple of str
    )Úsetr4   ÚstrÚaddÚint)r>   ÚnewÚelems      r   Úset2relrG   P   sˆ   € õ ‰%Œ%€CØð ð ˆÝ�d�CÑ Ô ð 	Ø�GŠG�T�GÑÔÐÐÝ˜�cÑ"Ô"ð 	Ø�GŠG•C˜‘I”IÑÔÐÐà�GŠG�D‰MŒMˆMˆMØ€Jr   c                 óp   — t          | ¦  «        dk    rdS t          t          | ¦  «        d         ¦  «        S )ze
    Check the arity of a relation.
    :type rel: set of tuples
    :rtype: int of tuple of str
    r   )r9   Úlist)Úrels    r   ÚarityrK   h   s0   € õ ˆ3�x„x�1‚}€}ØˆqÝ�t�C‰yŒy˜Œ|ÑÔÐr   c                   óp   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zed„ ¦   «         Zed„ ¦   «         Z	e
d„ ¦   «         Zˆ xZS )Ú	Valuationaâ  
    A dictionary which represents a model-theoretic Valuation of non-logical constants.
    Keys are strings representing the constants to be interpreted, and values correspond
    to individuals (represented as strings) and n-ary relations (represented as sets of tuples
    of strings).

    An instance of ``Valuation`` will raise a KeyError exception (i.e.,
    just behave like a standard  dictionary) if indexed with an expression that
    is not in its list of symbols.
    c                 ó\  •— t          ¦   «                              ¦   «          |D ]‡\  }}t          |t          ¦  «        st          |t          ¦  «        r|| |<   Œ5t          |t
          ¦  «        rt          |¦  «        | |<   Œ]t          j        d|›d|›�d¬¦  «        }t          |¦  «        ‚dS )z=
        :param xs: a list of (symbol, value) pairs.
        z@Error in initializing Valuation. Unrecognized value for symbol 'z':
éB   )ÚwidthN)
ÚsuperÚ__init__r4   rB   ÚboolrA   rG   ÚtextwrapÚfillr=   )ÚselfÚxsÚsymÚvalÚmsgÚ	__class__s        €r   rR   zValuation.__init__   sÃ   ø€ õ 	‰Œ×ÒÑÔÐØð 	&ð 	&‰JˆS�#Ý˜#�sÑ#Ô#ð &¥z°#µtÑ'<Ô'<ð &Ø��S‘	�	Ý˜C¥Ñ%Ô%ð 	&Ý# C™LœL��S‘	�	å”m�màADÀÀÀcÀcðKàðñ ô �õ ! ‘o”oÐ%ð	&ð 	&r   c                 ód   — || v rt                                | |¦  «        S t          d|z  ¦  «        ‚)NzUnknown expression: '%s'©r&   Ú__getitem__r!   ©rV   Úkeys     r   r^   zValuation.__getitem__’   s5   € Ø�$ˆ;ˆ;Ý×#Ò# D¨#Ñ.Ô.Ð.åÐ6¸Ñ<Ñ=Ô=Ð=r   c                 ó    — t          | ¦  «        S r3   r   ©rV   s    r   Ú__str__zValuation.__str__˜   s   € Ý�t‰}Œ}Ðr   c                 ó  — g }|                       ¦   «         D ]a}t          |t          ¦  «        r|                     |¦  «         Œ-t          |t          ¦  «        s|                     d„ |D ¦   «         ¦  «         Œbt          |¦  «        S )z7Set-theoretic domain of the value-space of a Valuation.c                 ó    — g | ]}|D ]}|®|‘ŒŒS r3   r   )r6   Útuple_rF   s      r   ú
<listcomp>z$Valuation.domain.<locals>.<listcomp>¤   s*   € ÐSÐSÐS˜f¸ÐSÐS°À$ÐBR�TÐBRÐBRÐBRÐBRr   )Úvaluesr4   rB   ÚappendrS   ÚextendrA   )rV   ÚdomrY   s      r   ÚdomainzValuation.domain›   sŠ   € ð ˆØ—;’;‘=”=ð 	ð 	ˆCÝ˜#�sÑ#Ô#ð Ø—
’
˜3‘”��Ý ¥TÑ*Ô*ð Ø—
’
ØSÐS¨ÐSÑSÔSñô ð øõ �3‰xŒxˆr   c                 óD   — t          |                      ¦   «         ¦  «        S )z9The non-logical constants which the Valuation recognizes.)ÚsortedÚkeysrb   s    r   ÚsymbolszValuation.symbols¨   s   € õ �d—i’i‘k”kÑ"Ô"Ð"r   c                 ó    — t          |¦  «        S r3   )Úread_valuation)Úclsr>   s     r   Ú
fromstringzValuation.fromstring­   s   € å˜aÑ Ô Ð r   )r   r   r   Ú__doc__rR   r^   rc   Úpropertyrl   rp   Úclassmethodrt   Ú__classcell__©r[   s   @r   rM   rM   s   s±   ø€ € € € € ð	ð 	ð&ð &ð &ð &ð &ð&>ð >ð >ðð ð ð ð
ð 
ñ „Xð
ð ð#ð #ñ „Xð#ð ð!ð !ñ „[ð!ð !ð !ð !ð !r   rM   z	\s*=+>\s*z\s*,\s*zg\s*
                                (\([^)]+\))  # tuple-expression
                                \s*c                 óÂ  — t                                | ¦  «        }|d         }|d         }|                     d¦  «        r�|dd…         }t                               |¦  «        }|rNg }|D ]H}|dd…         }t          t                               |¦  «        ¦  «        }|                     |¦  «         ŒInt                               |¦  «        }t          |¦  «        }||fS )a  
    Read a line in a valuation file.

    Lines are expected to be of the form::

      noosa => n
      girl => {g1, g2}
      chase => {(b1, g1), (b2, g1), (g1, d1), (g2, d2)}

    :param s: input line
    :type s: str
    :return: a pair (symbol, value)
    :rtype: tuple
    r   é   ú{éÿÿÿÿ)	Ú_VAL_SPLIT_REÚsplitÚ
startswithÚ
_TUPLES_REÚfindallr5   Ú_ELEMENT_SPLIT_REri   rA   )r>   ÚpiecesÚsymbolÚvalueÚtuple_stringsÚset_elementsÚtsÚelements           r   Ú_read_valuation_liner‹   ¿   sì   € õ × Ò  Ñ#Ô#€FØ�AŒY€FØ�1ŒI€Eà×Ò˜ÑÔð "Ø�a˜�d”ˆÝ"×*Ò*¨5Ñ1Ô1ˆàð 	:ØˆLØ#ð -ð -�Ø˜˜"˜”X�ÝÕ 1× 7Ò 7¸Ñ ;Ô ;Ñ<Ô<�Ø×#Ò# GÑ,Ô,Ð,Ð,ð-õ
 -×2Ò2°5Ñ9Ô9ˆLÝ�LÑ!Ô!ˆØ�5ˆ=Ðr   c                 ó–  — |�|                       |¦  «        } g }t          |                      ¦   «         ¦  «        D ]€\  }}|                     ¦   «         }|                     d¦  «        s|dk    rŒ5	 |                     t          |¦  «        ¦  «         ŒY# t          $ r}t          d|› d|› �¦  «        |‚d}~ww xY wt          |¦  «        S )a  
    Convert a valuation string into a valuation.

    :param s: a valuation string
    :type s: str
    :param encoding: the encoding of the input string, if it is binary
    :type encoding: str
    :return: a ``nltk.sem`` valuation
    :rtype: Valuation
    Nú#Ú zUnable to parse line z: )	ÚdecodeÚ	enumerateÚ
splitlinesÚstripr€   ri   r‹   r=   rM   )r>   ÚencodingÚ
statementsÚlinenumÚlineÚes         r   rr   rr   â   sé   € ð ÐØ�HŠH�XÑÔˆØ€JÝ" 1§<¢<¡>¤>Ñ2Ô2ð Oð O‰ˆ�Ø�zŠz‰|Œ|ˆØ�?Š?˜3ÑÔð 	 4¨2¢: :Øð	OØ×ÒÕ2°4Ñ8Ô8Ñ9Ô9Ð9Ð9øÝð 	Oð 	Oð 	OÝÐF°WÐFÐFÀÐFÐFÑGÔGÈQÐNøøøøð	Oøøøå�ZÑ Ô Ð s   Á1"BÂ
B9ÂB4Â4B9c                   óJ   ‡ — e Zd ZdZd
ˆ fd„	Zd„ Zd„ Zd
d„Zd„ Zd„ Z	d	„ Z
ˆ xZS )Ú
Assignmentae  
    A dictionary which represents an assignment of values to variables.

    An assignment can only assign values from its domain.

    If an unknown expression *a* is passed to a model *M*\ 's
    interpretation function *i*, *i* will first check whether *M*\ 's
    valuation assigns an interpretation to *a* as a constant, and if
    this fails, *i* will delegate the interpretation of *a* to
    *g*. *g* only assigns values to individual variables (i.e.,
    members of the class ``IndividualVariableExpression`` in the ``logic``
    module. If a variable is not assigned a value by *g*, it will raise
    an ``Undefined`` exception.

    A variable *Assignment* is a mapping from individual variables to
    entities in the domain. Individual variables are usually indicated
    with the letters ``'x'``, ``'y'``, ``'w'`` and ``'z'``, optionally
    followed by an integer (e.g., ``'x0'``, ``'y332'``).  Assignments are
    created using the ``Assignment`` constructor, which also takes the
    domain as a parameter.

        >>> from nltk.sem.evaluate import Assignment
        >>> dom = set(['u1', 'u2', 'u3', 'u4'])
        >>> g3 = Assignment(dom, [('x', 'u1'), ('y', 'u2')])
        >>> g3 == {'x': 'u1', 'y': 'u2'}
        True

    There is also a ``print`` format for assignments which uses a notation
    closer to that in logic textbooks:

        >>> print(g3)
        g[u1/x][u2/y]

    It is also possible to update an assignment using the ``add`` method:

        >>> dom = set(['u1', 'u2', 'u3', 'u4'])
        >>> g4 = Assignment(dom)
        >>> g4.add('x', 'u1')
        {'x': 'u1'}

    With no arguments, ``purge()`` is equivalent to ``clear()`` on a dictionary:

        >>> g4.purge()
        >>> g4
        {}

    :param domain: the domain of discourse
    :type domain: set
    :param assign: a list of (varname, value) associations
    :type assign: list
    Nc                 ó:  •— t          ¦   «                              ¦   «          || _        |rU|D ]R\  }}|| j        v s#J d                     || j        ¦  «        ¦   «         ‚t	          |¦  «        sJ d|z  ¦   «         ‚|| |<   ŒSd | _        |                      ¦   «          d S )Nz'{}' is not in the domain: {}ú-Wrong format for an Individual Variable: '%s')rQ   rR   rl   Úformatr   ÚvariantÚ_addvariant)rV   rl   ÚassignÚvarrY   r[   s        €r   rR   zAssignment.__init__0  sÇ   ø€ Ý‰Œ×ÒÑÔÐØˆŒØð 		 Ø$ð  ð  ‘
��cØ˜dœkÐ)Ð)Ð)Ð+J×+QÒ+QØØ”Kñ,ô ,Ñ)Ô)Ð)õ ! ‘~”~ð ð ØCÀcÑIñô ð ð  ��S‘	�	ØˆŒØ×ÒÑÔÐÐÐr   c                 ód   — || v rt                                | |¦  «        S t          d|z  ¦  «        ‚)Nz"Not recognized as a variable: '%s'r]   r_   s     r   r^   zAssignment.__getitem__@  s5   € Ø�$ˆ;ˆ;Ý×#Ò# D¨#Ñ.Ô.Ð.åÐ@À3ÑFÑGÔGÐGr   c                 óX   — t          | j        ¦  «        }|                     | ¦  «         |S r3   )r™   rl   Úupdate)rV   rE   s     r   ÚcopyzAssignment.copyF  s(   € Ý˜œÑ%Ô%ˆØ�
Š
�4ÑÔÐØˆ
r   c                 ób   — |r| |= n|                       ¦   «          |                      ¦   «          dS )z¼
        Remove one or all keys (i.e. logic variables) from an
        assignment, and update ``self.variant``.

        :param var: a Variable acting as a key for the assignment.
        N)Úclearrž   )rV   r    s     r   ÚpurgezAssignment.purgeK  s9   € ð ð 	Ø�S�	�	à�JŠJ‰LŒLˆLØ×ÒÑÔÐØˆtr   c                 óZ   — d}t          | j        ¦  «        }|D ]\  }}|d|› d|› d�z  }Œ|S )zQ
        Pretty printing for assignments. {'x', 'u'} appears as 'g[u/x]'
        Úgú[ú/ú])rn   r�   )rV   Úgstringr�   rY   r    s        r   rc   zAssignment.__str__Y  sP   € ð ˆå˜œÑ&Ô&ˆØ!ð 	(ð 	(‰JˆS�#ØÐ'˜3Ð'Ð' Ð'Ð'Ð'Ñ'ˆGˆGØˆr   c                 ó�   — g }|                       ¦   «         D ]'}|d         |d         f}|                     |¦  «         Œ(|| _        dS )zK
        Create a more pretty-printable version of the assignment.
        r{   r   N)r*   ri   r�   )rV   Úlist_r0   Úpairs       r   rž   zAssignment._addvariantd  sS   € ð ˆØ—J’J‘L”Lð 	ð 	ˆDØ˜”G˜T !œWÐ%ˆDØ�LŠL˜ÑÔÐÐØˆŒØˆtr   c                 óª   — || j         v sJ |› d| j         › �¦   «         ‚t          |¦  «        sJ d|z  ¦   «         ‚|| |<   |                      ¦   «          | S )zh
        Add a new variable-value pair to the assignment, and update
        ``self.variant``.

        z is not in the domain r›   )rl   r   rž   )rV   r    rY   s      r   rC   zAssignment.addo  sp   € ð �d”kÐ!Ð!Ð! cÐ#NÐ#NÀÄÐ#NÐ#NÑ!Ô!Ð!Ý˜‰~Œ~ÐTÐTÐNÐQTÑTÑTÔTÐTØˆˆS‰	Ø×ÒÑÔÐØˆr   r3   )r   r   r   ru   rR   r^   r¤   r§   rc   rž   rC   rx   ry   s   @r   r™   r™   û   sª   ø€ € € € € ð2ð 2ðhð ð ð ð ð ð Hð Hð Hðð ð ð
ð ð ð ð	ð 	ð 	ð	ð 	ð 	ð
ð 
ð 
ð 
ð 
ð 
ð 
r   r™   c                   óD   — e Zd ZdZd„ Zd„ Zd„ Zdd„Zdd„Zdd	„Z	dd„Z
dS )ÚModela[  
    A first order model is a domain *D* of discourse and a valuation *V*.

    A domain *D* is a set, and a valuation *V* is a map that associates
    expressions with values in the model.
    The domain of *V* should be a subset of *D*.

    Construct a new ``Model``.

    :type domain: set
    :param domain: A set of entities representing the domain of discourse of the model.
    :type valuation: Valuation
    :param valuation: the valuation of the model.
    :param prop: If this is set, then we are building a propositional    model and don't require the domain of *V* to be subset of *D*.
    c                 ó¸   — t          |t          ¦  «        sJ ‚|| _        || _        |                     |j        ¦  «        st          d|j        ›d|›�¦  «        ‚d S )NzThe valuation domain, z*, must be a subset of the model's domain, )r4   rA   rl   Ú	valuationÚ
issupersetr   )rV   rl   rµ   s      r   rR   zModel.__init__Ž  sr   € Ý˜&¥#Ñ&Ô&Ð&Ð&Ð&ØˆŒØ"ˆŒØ× Ò  Ô!1Ñ2Ô2ð 	Ý�%àÔ#Ð#Ð# V Vð-ñô ð ð	ð 	r   c                 ó(   — d| j         ›d| j        ›d�S )Nú(z, ú)©rl   rµ   rb   s    r   Ú__repr__zModel.__repr__˜  s   € Ø7�4”;Ð7Ð7 D¤NÐ7Ð7Ð7Ð7r   c                 ó&   — d| j         › d| j        › �S )Nz	Domain = z,
Valuation = 
rº   rb   s    r   rc   zModel.__str__›  s   € ØI˜4œ;ÐIÐI¸¼ÐIÐIÐIr   Nc                 ó  — 	 t          j        |¦  «        }|                      |||¬¦  «        }|r&t          ¦   «          t          d|› d|› d|› �¦  «         |S # t          $ r) |r#t          ¦   «          t          d|› d|› �¦  «         Y dS w xY w)aA  
        Read input expressions, and provide a handler for ``satisfy``
        that blocks further propagation of the ``Undefined`` error.
        :param expr: An ``Expression`` of ``logic``.
        :type g: Assignment
        :param g: an assignment to individual variables.
        :rtype: bool or 'Undefined'
        ©r#   ú'z' evaluates to z
 under M, z' is undefined under M, r!   )r   rt   Úsatisfyr)   r!   )rV   Úexprr©   r#   Úparsedr†   s         r   ÚevaluatezModel.evaluatež  s¾   € ð	ÝÔ*¨4Ñ0Ô0ˆFØ—L’L ¨°%�LÑ8Ô8ˆEØð EÝ‘”�ÝÐC˜$ÐCÐC¨uÐCÐCÀÐCÐCÑDÔDÐDØˆLøÝð 	ð 	ð 	Øð =Ý‘”�ÝÐ;˜$Ð;Ð;¸Ð;Ð;Ñ<Ô<Ð<Ø�;�;ð		øøøs   ‚AA Á/BÂ
Bc                 óp  ‡ ‡— t          |t          ¦  «        r |                     ¦   «         \  }}t          |t          ¦  «        r6‰                      |‰¦  «        }t          ˆˆ fd„|D ¦   «         ¦  «        }||v S ‰                      |j        ‰¦  «        }‰                      |j        ‰¦  «        }||         S t          |t          ¦  «        r‰                      |j	        ‰¦  «         S t          |t          ¦  «        r6‰                      |j        ‰¦  «        o‰                      |j        ‰¦  «        S t          |t          ¦  «        r6‰                      |j        ‰¦  «        p‰                      |j        ‰¦  «        S t          |t          ¦  «        r7‰                      |j        ‰¦  «         p‰                      |j        ‰¦  «        S t          |t          ¦  «        r8‰                      |j        ‰¦  «        ‰                      |j        ‰¦  «        k    S t          |t           ¦  «        r8‰                      |j        ‰¦  «        ‰                      |j        ‰¦  «        k    S t          |t"          ¦  «        r^‰                     ¦   «         }	‰ j        D ]@}
|	                     |j        j        |
¦  «         ‰                      |j	        |	¦  «        s dS ŒAdS t          |t.          ¦  «        r^‰                     ¦   «         }	‰ j        D ]@}
|	                     |j        j        |
¦  «         ‰                      |j	        |	¦  «        r dS ŒAdS t          |t0          ¦  «        r^‰                     ¦   «         }	‰ j        D ]@}
|	                     |j        j        |
¦  «         ‰                      |j	        |	¦  «        r dS ŒAdS t          |t2          ¦  «        rNi }|j        j        }‰ j        D ]6}
‰                      |j	        ‰                     ||
¦  «        ¦  «        }|||
<   Œ7|S ‰                      |‰|¦  «        S )a  
        Recursive interpretation function for a formula of first-order logic.

        Raises an ``Undefined`` error when ``parsed`` is an atomic string
        but is not a symbol or an individual variable.

        :return: Returns a truth value or ``Undefined`` if ``parsed`` is        complex, and calls the interpretation function ``i`` if ``parsed``        is atomic.

        :param parsed: An expression of ``logic``.
        :type g: Assignment
        :param g: an assignment to individual variables.
        c              3   óD   •K  — | ]}‰                      |‰¦  «        V — Œd S r3   )rÀ   )r6   Úargr©   rV   s     €€r   r8   z Model.satisfy.<locals>.<genexpr>É  s1   øè è € ÐJÐJ¸ §¢¨S°!Ñ 4Ô 4ÐJÐJÐJÐJÐJÐJr   FT)r4   r	   Úuncurryr   rÀ   r5   ÚfunctionÚargumentr   Útermr   ÚfirstÚsecondr   r   r   r
   r   r¤   rl   rC   ÚvariableÚnamer   r   r   Úi)rV   rÂ   r©   r#   rÈ   Ú	argumentsÚfunvalÚargvalsÚargvalÚnew_gÚuÚcfr    rY   s   ` `           r   rÀ   zModel.satisfy´  sò  øø€ õ  �fÕ3Ñ4Ô4ð 9	,Ø"(§.¢.Ñ"2Ô"2ÑˆH�iÝ˜(Õ$>Ñ?Ô?ð 	&àŸš h°Ñ2Ô2�ÝÐJÐJÐJÐJÐJÀ	ÐJÑJÔJÑJÔJ�Ø &Ð(Ð(ð Ÿš f¤o°qÑ9Ô9�ØŸš f¤o°qÑ9Ô9�Ø˜f”~Ð%Ý˜Õ 1Ñ2Ô2ð -	,Ø—|’| F¤K°Ñ3Ô3Ð3Ð3Ý˜¥Ñ.Ô.ð +	,Ø—<’< ¤¨aÑ0Ô0ÐS°T·\²\À&Ä-ÐQRÑ5SÔ5SÐSÝ˜¥Ñ-Ô-ð )	,Ø—<’< ¤¨aÑ0Ô0ÐR°D·L²LÀÄÐPQÑ4RÔ4RÐRÝ˜¥Ñ.Ô.ð '	,ØŸš V¤\°1Ñ5Ô5Ð5ÐX¸$¿,º,ÀvÄ}ÐVWÑ:XÔ:XÐXÝ˜¥Ñ.Ô.ð %	,Ø—<’< ¤¨aÑ0Ô0°D·L²LÀÄÐPQÑ4RÔ4RÒRÐRÝ˜Õ 2Ñ3Ô3ð #	,Ø—<’< ¤¨aÑ0Ô0°D·L²LÀÄÐPQÑ4RÔ4RÒRÐRÝ˜¥Ñ.Ô.ð !	,Ø—F’F‘H”HˆEØ”[ð !ð !�Ø—	’	˜&œ/Ô.°Ñ2Ô2Ð2Ø—|’| F¤K°Ñ7Ô7ð !Ø ˜5˜5ð!à�4Ý˜Õ 0Ñ1Ô1ð 	,Ø—F’F‘H”HˆEØ”[ð  ð  �Ø—	’	˜&œ/Ô.°Ñ2Ô2Ð2Ø—<’< ¤¨UÑ3Ô3ð  Ø˜4˜4ð à�5Ý˜¥Ñ/Ô/ð 	,Ø—F’F‘H”HˆEØ”[ð  ð  �Ø—	’	˜&œ/Ô.°Ñ2Ô2Ð2Ø—<’< ¤¨UÑ3Ô3ð  Ø˜4˜4ð à�5Ý˜Õ 0Ñ1Ô1ð 	,ØˆBØ”/Ô&ˆCØ”[ð ð �Ø—l’l 6¤;°·²°c¸1±´Ñ>Ô>�ð
 ��1‘�ØˆIà—6’6˜& ! UÑ+Ô+Ð+r   Fc                 óÒ   — |j         j        | j        j        v r| j        |j         j                 S t	          |t
          ¦  «        r||j         j                 S t          d|z  ¦  «        ‚)aÈ  
        An interpretation function.

        Assuming that ``parsed`` is atomic:

        - if ``parsed`` is a non-logical constant, calls the valuation *V*
        - else if ``parsed`` is an individual variable, calls assignment *g*
        - else returns ``Undefined``.

        :param parsed: an ``Expression`` of ``logic``.
        :type g: Assignment
        :param g: an assignment to individual variables.
        :return: a semantic value
        zCan't find a value for %s)rÍ   rÎ   rµ   rp   r4   r   r!   )rV   rÂ   r©   r#   s       r   rÏ   zModel.i   se   € ð$ Œ?Ô 4¤>Ô#9Ð9Ð9Ø”> &¤/Ô"6Ô7Ð7Ý˜Õ <Ñ=Ô=ð 	BØ�V”_Ô)Ô*Ð*õ Ð7¸&Ñ@ÑAÔAÐAr   r   c           
      óÒ  — d}|||z  z   }g }t          |t          ¦  «        rt          |¦  «        }	n|}	|	|                     ¦   «         v �r|r)t	          ¦   «          t	          ||z  d|› d|› �z   ¦  «         | j        D ]Ã}
|                     ¦   «         }|                     |	j        |
¦  «         |r|dk    r|dz
  }nd}|  	                    |||¦  «        }|rt	          |d|z  z   ¦  «         |dk    r|rt	          |d|› d	|› d
�z   ¦  «         Œ‘| 
                    |
¦  «         |rt	          |d|› d	|› d|› �z   ¦  «         ŒÄd„ |D ¦   «         }nt          |	j        › d|› �¦  «        ‚|S )a¥  
        Generate the entities from the model's domain that satisfy an open formula.

        :param parsed: an open formula
        :type parsed: Expression
        :param varex: the relevant free individual variable in ``parsed``.
        :type varex: VariableExpression or str
        :param g: a variable assignment
        :type g:  Assignment
        :return: a set of the entities that satisfy ``parsed``.
        z   zOpen formula is 'z' with assignment r{   r   z(trying assignment %s)Fz
value of 'z' under z	 is Falsez is c                 ó   — h | ]}|’ŒS r   r   )r6   Úcs     r   ú	<setcomp>z#Model.satisfiers.<locals>.<setcomp>N  s   € Ð,Ð,Ð,˜A�aÐ,Ð,Ð,r   z is not free in )r4   rB   r   Úfreer)   rl   r¤   rC   rÎ   rÀ   ri   r!   )rV   rÂ   Úvarexr©   r#   ÚnestingÚspacerÚindentÚ
candidatesr    rÕ   rÔ   Úlowtracer†   Úresults                  r   Ú
satisfierszModel.satisfiers  sé  € ð ˆØ˜6 GÑ+Ñ,ˆØˆ
å�e�SÑ!Ô!ð 	Ý˜5‘/”/ˆCˆCàˆCà�&—+’+‘-”-ÐÑØð Ý‘”�ÝØ˜gÑ%ØG¨&ÐGÐGÀAÐGÐGñHñô ð ð ”[ð Xð X�ØŸš™œ�Ø—	’	˜#œ( AÑ&Ô&Ð&Øð !˜U QšY˜YØ$ q™y�H�Hà �HØŸš V¨U°HÑ=Ô=�àð EÝ˜&Ð#;¸eÑ#CÑCÑDÔDÐDð ˜E’>�>Øð VÝ˜fÐ'T°FÐ'TÐ'TÀEÐ'TÐ'TÐ'TÑTÑUÔUÐUøð ×%Ò% aÑ(Ô(Ð(Øð XÝ˜fÐ'V°FÐ'VÐ'VÀEÐ'VÐ'VÈuÐ'VÐ'VÑVÑWÔWÐWøà,Ð, Ð,Ñ,Ô,ˆFˆFõ ˜sœxÐAÐA¸ÐAÐAÑBÔBÐBàˆr   r3   )F)Nr   )r   r   r   ru   rR   r»   rc   rÃ   rÀ   rÏ   rä   r   r   r   r³   r³   |  s§   € € € € € ðð ð"ð ð ð8ð 8ð 8ðJð Jð Jðð ð ð ð,I,ð I,ð I,ð I,ðXBð Bð Bð Bð49ð 9ð 9ð 9ð 9ð 9r   r³   é   c           
      ó¤  — t          g d¢¦  «        at          ¦   «         at	          t          t          ¦  «        at          t          ¦  «        at          ¦   «          t          dt          z  ¦  «         t          d¦  «         t          dt          z  ¦  «         t          d¦  «         t          ¦   «          t          dt
          ¦  «         t          dt          z  ¦  «         g d¢}|D ]g}| r0t          ¦   «          t
           
                    |t          | ¦  «         Œ4t          d|› dt
           
                    |t          ¦  «        › �¦  «         Œhd	S )
z!Example of a propositional model.))ÚPT)ÚQT)ÚRFÚ*zPropositional Formulas Demoz7(Propositional constants treated as nullary predicates)z
Model m1:
)z(P & Q)z(P & R)z- Pz- Rz- - Pz	- (P & R)z(P | R)z(R | P)z(R | R)z	(- P | R)z	(P | - P)z(P -> Q)z(P -> R)z(R -> P)z	(P <-> P)z	(R <-> R)z	(P <-> R)úThe value of 'ú' is: N)rM   Úval1rA   Údom1r³   Úm1r™   Úg1r)   ÚmultrÃ   )r#   Ú	sentencesÚsents      r   Úpropdemorô   ^  s>  € õ Ð=Ð=Ð=Ñ>Ô>€DÝ‰5Œ5€DÝ	�t•TÑ	Ô	€BÝ	•DÑ	Ô	€Bå	�G„G€GÝ	ˆ#•‰*ÑÔÐÝ	Ð
'Ñ(Ô(Ð(Ý	ˆ#•‰*ÑÔÐÝ	Ð
CÑDÔDÐDÝ	�G„G€GÝ	ˆ-�ÑÔÐÝ	ˆ#•‰*ÑÔÐðð ð €Ið( ð Hð HˆØð 	HÝ‰GŒGˆGÝ�KŠK˜�b %Ñ(Ô(Ð(Ð(åÐF 4ÐFÐF­r¯{ª{¸4ÅÑ/DÔ/DÐFÐFÑGÔGÐGÐGðHð Hr   Fc           
      óî  — ddddddhfddd	hfd
dhfdh d£fga t          t           ¦  «        at          j        at          t          t          ¦  «        at          t          ddg¦  «        a| �s†t          ¦   «          t          dt          z  ¦  «         t          d¦  «         t          dt          z  ¦  «         t          dddt          ¦  «         t          dt          ¦  «         g d¢}d„ |D ¦   «         }t          ¦   «          |D ]X}	 t          d|›dt                               |t          ¦  «        ›�¦  «         Œ7# t          $ r t          d|z  ¦  «         Y ŒUw xY wg d¢}|D ]‘\  }}	 t                               t          j        |¦  «        t          ¦  «        }t          d„ |D ¦   «         ¦  «        }	t          |› d|› d|	|v › �¦  «         Œk# t          $ r t          |› d|› d�¦  «         Y ŒŒw xY wd S d S )!zExample of a first-order model.)ÚadamÚb1)Úbettyrð   )ÚfidoÚd1Úgirlrð   Úg2Úboyr÷   Úb2Údogrú   Úlove>   ©r÷   rð   ©rþ   rü   ©rð   r÷   ©rü   r÷   )Úxr÷   )Úyrü   rê   zModels Demoz
Model m2:
z--------------Ú
zVariable assignment = )rö   rý   r   Úwalksr  r  Úzc                 ó6   — g | ]}t          j        |¦  «        ‘ŒS r   ©r   rt   )r6   r—   s     r   rg   zfolmodel.<locals>.<listcomp>«  s#   € Ð@Ð@Ð@°Q�
Ô-¨aÑ0Ô0Ð@Ð@Ð@r   zThe interpretation of 'z' in m2 is z-The interpretation of '%s' in m2 is Undefined))rý   rö   )r  )rö   )r   )rö   r  )r   )r  rö   c              3   óz   K  — | ]6}t                                t          j        |¦  «        t          ¦  «        V — Œ7d S r3   )Úm2rÏ   r   rt   rü   )r6   rÆ   s     r   r8   zfolmodel.<locals>.<genexpr>Á  s;   è è € ÐUÐUÈ¥§¢¥ZÔ%:¸3Ñ%?Ô%?ÅÑ DÔ DÐUÐUÐUÐUÐUÐUr   r¸   z) evaluates to z) evaluates to UndefinedN)Úv2rM   Úval2rl   Údom2r³   r  r™   rü   r)   rñ   rÏ   r!   r   rt   r5   )
Úquietr#   ÚexprsÚparsed_exprsrÂ   ÚapplicationsÚfunr,   rÑ   Úargsvals
             r   Úfolmodelr  �  s{  € ð 	ØØØ	�$˜�ÐØ	��t�ÐØ	��ˆØ	ÐIÐIÐIÐJð
€Bõ •R‰=Œ=€DÝŒ;€DÝ	�t•TÑ	Ô	€BÝ	•D˜;¨Ð4Ñ	5Ô	5€Bàñ "?Ý‰ŒˆÝˆc•D‰jÑÔÐÝˆmÑÔÐÝˆc•D‰jÑÔÐÝˆm˜X t­RÑ0Ô0Ð0ÝÐ&­Ñ+Ô+Ð+à?Ð?Ð?ˆØ@Ð@¸%Ð@Ñ@Ô@ˆå‰ŒˆØ"ð 	Pð 	PˆFðPÝ�à�v�v�rŸtšt F­BÑ/Ô/Ð/ð1ñô ð ð øõ ð Pð Pð PÝÐEÈÑNÑOÔOÐOÐOÐOðPøøøð
ð 
ð 
ˆð (ð 	?ð 	?‰KˆS�$ð?ÝŸš�jÔ3°CÑ8Ô8½"Ñ=Ô=�ÝÐUÐUÐPTÐUÑUÔUÑUÔU�Ý˜ÐGÐG˜tÐGÐG°G¸vÐ4EÐGÐGÑHÔHÐHÐHøÝð ?ð ?ð ?Ý˜Ð=Ð=˜tÐ=Ð=Ð=Ñ>Ô>Ð>Ð>Ð>ð?øøøðC"?ð "?ð8	?ð 	?s%   Ä3D;Ä;EÅEÅ)A$GÇG0Ç/G0c           
      ó®  — t          d¬¦  «         t          ¦   «          t          dt          z  ¦  «         t          d¦  «         t          dt          z  ¦  «         g d¢}|D ]r}t                               ¦   «          | r"t
                               |t          | ¦  «         Œ?t          d|› dt
                               |t          ¦  «        › �¦  «         ŒsdS )	zF
    Interpretation of closed expressions in a first-order model.
    T©r  rê   zFOL Formulas Demo)zlove (adam, betty)z(adam = mia)z\x. (boy(x) | girl(x))z\x. boy(x)(adam)z\x y. love(x, y)z\x y. love(x, y)(adam)(betty)z\x y. love(x, y)(adam, betty)z\x y. (boy(x) & love(x, y))z#\x. exists y. (boy(x) & love(x, y))zexists z1. boy(z1)z!exists x. (boy(x) &  -(x = adam))z&exists x. (boy(x) & all y. love(y, x))zall x. (boy(x) | girl(x))z1all x. (girl(x) -> exists y. boy(y) & love(x, y))z3exists x. (boy(x) & all y. (girl(y) -> love(y, x)))z3exists x. (boy(x) & all y. (girl(y) -> love(x, y)))zall x. (dog(x) -> - girl(x))z-exists x. exists y. (love(x, y) & love(x, y))rë   rì   N)r  r)   rñ   rü   r§   r  rÃ   )r#   ÚformulasÚfmlas      r   Úfoldemor  Ë  sà   € õ �4ÐÑÔÐå	�G„G€GÝ	ˆ#•‰*ÑÔÐÝ	Ð
ÑÔÐÝ	ˆ#•‰*ÑÔÐðð ð €Hð* ð Hð HˆÝ
�Š‰
Œ
ˆ
Øð 	HÝ�KŠK˜�b %Ñ(Ô(Ð(Ð(åÐF 4ÐFÐF­r¯{ª{¸4ÅÑ/DÔ/DÐFÐFÑGÔGÐGÐGðHð Hr   c                 ó  — t          ¦   «          t          dt          z  ¦  «         t          d¦  «         t          dt          z  ¦  «         t          d¬¦  «         g d¢}| rt          t          ¦  «         |D ]%}t          |¦  «         t	          j        |¦  «         Œ&d„ |D ¦   «         }|D ]^}t                               ¦   «          t          d                     |t           	                    |dt          | ¦  «        ¦  «        ¦  «         Œ_d	S )
z5Satisfiers of an open formula in a first order model.rê   zSatisfiers DemoTr  )zboy(x)z(x = x)z(boy(x) | girl(x))z(boy(x) & girl(x))zlove(adam, x)zlove(x, adam)z-(x = adam)zexists z22. love(x, z22)úexists y. love(y, x)zall y. (girl(y) -> love(x, y))zall y. (girl(y) -> love(y, x))z)all y. (girl(y) -> (boy(x) & love(y, x)))z)(boy(x) & all y. (girl(y) -> love(x, y)))z)(boy(x) & all y. (girl(y) -> love(y, x)))z+(boy(x) & exists y. (girl(y) & love(y, x)))z(girl(x) -> dog(x))zall y. (dog(y) -> (x = y))r  z&exists y. (love(adam, y) & love(y, x))c                 ó6   — g | ]}t          j        |¦  «        ‘ŒS r   r  )r6   r  s     r   rg   zsatdemo.<locals>.<listcomp>  s#   € Ð?Ð?Ð?¨d�jÔ# DÑ)Ô)Ð?Ð?Ð?r   zThe satisfiers of '{}' are: {}r  N)
r)   rñ   r  r  r   rt   rü   r§   rœ   rä   )r#   r  r  rÂ   Úps        r   Úsatdemor!  ÷  s  € õ 
�G„G€GÝ	ˆ#•‰*ÑÔÐÝ	Ð
ÑÔÐÝ	ˆ#•‰*ÑÔÐå�4ÐÑÔÐðð ð €Hð, ð Ý�b‰	Œ	ˆ	àð $ð $ˆÝˆd‰ŒˆÝÔ˜dÑ#Ô#Ð#Ð#à?Ð?°hÐ?Ñ?Ô?€Fàð 
ð 
ˆÝ
�Š‰
Œ
ˆ
ÝØ,×3Ò3°Aµr·}²}ÀQÈÍRÐQVÑ7WÔ7WÑXÔXñ	
ô 	
ð 	
ð 	
ð
ð 
r   c                 ó²   — t           t          t          t          dœ}	  ||          |¬¦  «         dS # t          $ r |D ]}  ||          |¬¦  «         ŒY dS w xY w)aO  
    Run exists demos.

     - num = 1: propositional logic demo
     - num = 2: first order model demo (only if trace is set)
     - num = 3: first order sentences demo
     - num = 4: satisfaction of open formulas demo
     - any other value: run all the demos

    :param trace: trace = 1, or trace = 2 for more verbose tracing
    )r{   é   é   é   r¾   N)rô   r  r  r!  ÚKeyError)Únumr#   Údemoss      r   Údemor)  '  sŠ   € õ �X­'µgÐ>Ð>€Eð$ØˆˆcŒ
˜ÐÑÔÐÐÐøÝð $ð $ð $Øð 	$ð 	$ˆCØˆE�#ŒJ˜UÐ#Ñ#Ô#Ð#Ð#ð	$ð 	$ð 	$ð$øøøs   �1 ±!AÁAÚ__main__r#  r¾   r3   )FN)r   N)3ru   r$   ÚreÚsysrT   Úpprintr   Únltk.decoratorsr   Únltk.sem.logicr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   Ú	Exceptionr   r!   r#   r?   rG   rK   r&   rM   Úcompiler~   rƒ   ÚVERBOSEr�   r‹   rr   r™   r³   rñ   rô   r  r  r!  r)  r   r   r   r   ú<module>r3     s>  ððð ð
 €€€Ø 	€	€	€	Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ð Ð à %Ð %Ð %Ð %Ð %Ð %ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð(	ð 	ð 	ð 	ð 	ˆIñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	�ñ 	ô 	ð 	ðð ð ðOð Oð Oð$ð ð ð0ð ð ð<!ð <!ð <!ð <!ð <!�ñ <!ô <!ð <!ðD �”
˜<Ñ(Ô(€Ø�B”J˜zÑ*Ô*Ð ØˆRŒZð'ð „Jñ	ô €
ð ð  ð  ðF!ð !ð !ð !ð2~ð ~ð ~ð ~ð ~�ñ ~ô ~ð ~ðBWð Wð Wð Wð Wñ Wô Wð Wð| 
€ð*Hð *Hð *Hð *Hðb5?ð 5?ð 5?ð 5?ðx%Hð %Hð %Hð %HðX-
ð -
ð -
ð -
ð`$ð $ð $ð $ð* ˆzÒÐØ€Dˆ�!ÐÑÔÐÐÐð Ðr   