ó
    ´OÂffc  ã                   óð  • S r SSKrSSKrSSKrSSKrSSKJr  SSKJr  SSK	J
r
JrJrJrJrJrJrJrJrJrJrJrJrJrJrJr   " S S\5      r " S S	\5      rS
 rS rS rS r  " S S\!5      r"\RF                  " S5      r$\RF                  " S5      r%\RF                  " S\RL                  5      r'S r(S"S jr) " S S\!5      r* " S S5      r+Sr,S"S jr-S#S jr.S"S jr/S"S jr0S$S jr1\2S:X  a  \1" S SS!9  gg)%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                   ó   • \ rS rSrSrg)ÚErroré,   © N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__static_attributes__r   ó    Ú3/usr/lib/python3/dist-packages/nltk/sem/evaluate.pyr   r   ,   ó   † Úr    r   c                   ó   • \ rS rSrSrg)Ú	Undefinedé0   r   Nr   r   r    r!   r$   r$   0   r"   r    r$   c                 óú   • [         R                  " U 5      n[        [        US   U5      5      nUR	                  SS 5      (       a/  [        5         UR                  5        H  n[        SU-  5        M     U " U0 UD6$ )Nr   Útracez%s => %s)ÚinspectÚgetfullargspecÚdictÚzipÚpopÚprintÚitems)ÚfÚargsÚkwÚargspecÚdÚitems         r!   r'   r'   4   sh   € Ü×$Ò$ QÓ'€GÜŒS�˜‘˜TÓ"Ó#€AØ‡u�uˆW�d×ÑÜŒØ—G‘G–IˆDÜ�*˜tÑ#Ö$ñ áˆdˆ>�b‰>Ðr    c                 óÂ   • [        U 5      S:X  a  g[        S U  5       5      (       a+  [        [        U 5      5      [        [        U 5      5      :X  a  g[	        SU -  5      e)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   óB   #   • U  H  n[        U[        5      v •  M     g 7f©N)Ú
isinstanceÚtuple)Ú.0Úels     r!   Ú	<genexpr>Úis_rel.<locals>.<genexpr>J   s   é € Ð/ªQ rŒZ˜œE×"Ð"ªQùs   ‚z.Set %r contains sequences of different lengths)ÚlenÚallÚmaxÚminÚ
ValueError)Úss    r!   Úis_relrD   >   sN   € ô ˆ1ƒv�ƒ{Øä	Ñ/©QÓ/×	/Ñ	/´C¼¸A»³KÄ3ÄsÈ1ÃvÃ;Ó4NØäÐIÈAÑMÓNÐNr    c                 ó  • [        5       nU  Hn  n[        U[        5      (       a  UR                  U45        M,  [        U[        5      (       a  UR                  [        U5      5        M]  UR                  U5        Mp     U$ )a.  
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
)Úsetr8   ÚstrÚaddÚint)rC   ÚnewÚelems      r!   Úset2relrL   P   s_   € ô ‹%€CÛˆÜ�dœC× Ñ Ø�G‰G�T�GÖÜ˜œc×"Ñ"Ø�G‰G”C˜“IÖà�G‰G�DŽMñ ð €Jr    c                 óP   • [        U 5      S:X  a  g[        [        U 5      S   5      $ )zU
Check the arity of a relation.
:type rel: set of tuples
:rtype: int of tuple of str
r   )r>   Úlist)Úrels    r!   ÚarityrP   h   s%   € ô ˆ3ƒx�1ƒ}ØÜŒt�C‹y˜‰|ÓÐr    c                   óh   ^ • \ rS rSrSrU 4S jrS rS r\S 5       r	\S 5       r
\S 5       rS	rU =r$ )
Ú	Valuationés   aÂ  
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U ]  5         U H  u  p#[        U[        5      (       d  [        U[        5      (       a  X0U'   M5  [        U[
        5      (       a  [        U5      X'   MY  [        R                  " SU< SU< 3SS9n[        U5      e   g)z-
:param xs: a list of (symbol, value) pairs.
z@Error in initializing Valuation. Unrecognized value for symbol 'z':
éB   )ÚwidthN)
ÚsuperÚ__init__r8   rG   ÚboolrF   rL   ÚtextwrapÚfillrB   )ÚselfÚxsÚsymÚvalÚmsgÚ	__class__s        €r!   rX   ÚValuation.__init__   s|   ø€ ô 	‰ÑÔÛ‰HˆCÜ˜#œs×#Ñ#¤z°#´t×'<Ñ'<Ø�S“	Ü˜C¤×%Ñ%Ü# C›L�“	ä—m“mãADÂcðKàñ�ô ! “oÐ%ò r    c                 óR   • X;   a  [         R                  X5      $ [        SU-  5      e)NzUnknown expression: '%s'©r*   Ú__getitem__r$   ©r\   Úkeys     r!   re   ÚValuation.__getitem__’   s)   € Ø‹;Ü×#Ñ# DÓ.Ð.äÐ6¸Ñ<Ó=Ð=r    c                 ó   • [        U 5      $ r7   r   ©r\   s    r!   Ú__str__ÚValuation.__str__˜   s   € Ü�t‹}Ðr    c           	      ó6  • / nU R                  5        Hs  n[        U[        5      (       a  UR                  U5        M+  [        U[        5      (       a  MB  UR                  U VVs/ s H  o3  H	  oDc  M  UPM     M     snn5        Mu     [        U5      $ s  snnf )z7Set-theoretic domain of the value-space of a Valuation.)Úvaluesr8   rG   ÚappendrY   ÚextendrF   )r\   Údomr_   Útuple_rK   s        r!   ÚdomainÚValuation.domain›   su   € ð ˆØ—;‘;–=ˆCÜ˜#œs×#Ñ#Ø—
‘
˜3–Ü ¤T×*Ó*Ø—
‘
Ù(+ÔSª˜f»°—T¹‘T©ÒSöñ	 !ô �3‹xˆùó Ts   Á%BÁ4
Bc                 ó4   • [        U R                  5       5      $ )z9The non-logical constants which the Valuation recognizes.)ÚsortedÚkeysrj   s    r!   ÚsymbolsÚValuation.symbols¨   s   € ô �d—i‘i“kÓ"Ð"r    c                 ó   • [        U5      $ r7   )Úread_valuation)ÚclsrC   s     r!   Ú
fromstringÚValuation.fromstring­   s   € ä˜aÓ Ð r    r   )r   r   r   r   Ú__doc__rX   re   rk   Úpropertyrs   rx   Úclassmethodr}   r   Ú__classcell__©ra   s   @r!   rR   rR   s   sS   ø† ñ	õ&ò&>òð ñ
ó ð
ð ñ#ó ð#ð ñ!ó ö!r    rR   z	\s*=+>\s*z\s*,\s*zg\s*
                                (\([^)]+\))  # tuple-expression
                                \s*c                 ót  • [         R                  U 5      nUS   nUS   nUR                  S5      (       a�  USS n[        R	                  U5      nU(       a@  / nU H7  nUSS n[        [        R                  U5      5      nUR                  U5        M9     O[        R                  U5      n[        U5      nX#4$ )zð
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Úfindallr9   Ú_ELEMENT_SPLIT_REro   rF   )rC   ÚpiecesÚsymbolÚvalueÚtuple_stringsÚset_elementsÚtsÚelements           r!   Ú_read_valuation_liner•   ¿   s·   € ô × Ñ  Ó#€FØ�A‰Y€FØ�1‰I€Eà×Ñ˜×ÑØ�a˜�ˆÜ"×*Ñ*¨5Ó1ˆæØˆLÛ#�Ø˜˜"�X�ÜÔ 1× 7Ñ 7¸Ó ;Ó<�Ø×#Ñ# GÖ,ò $ô
 -×2Ñ2°5Ó9ˆLÜ�LÓ!ˆØˆ=Ðr    c                 ób  • Ub  U R                  U5      n / n[        U R                  5       5       HN  u  p4UR                  5       nUR	                  S5      (       d  US:X  a  M3   UR                  [        U5      5        MP     [        U5      $ ! [         a  n[        SU SU 35      UeSnAff = f)zä
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Š   ro   r•   rB   rR   )rC   ÚencodingÚ
statementsÚlinenumÚlineÚes         r!   r{   r{   â   s­   € ð ÑØ�H‰H�XÓˆØ€JÜ" 1§<¡<£>Ö2‰ˆØ�z‰z‹|ˆØ�?‰?˜3×Ñ 4¨2£:Ùð	OØ×ÑÔ2°4Ó8Ö9ñ 3ô �ZÓ Ð øô ó 	OÜÐ4°W°I¸RÀ¸vÐFÓGÈQÐNûð	Oús   Á$BÂ
B.ÂB)Â)B.c                   óX   ^ • \ rS rSrSrSU 4S jjrS rS rSS jrS r	S r
S	 rS
rU =r$ )Ú
Assignmentéû   aÉ  
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
c                 ó  >• [         TU ]  5         Xl        U(       aY  U HS  u  p4X@R                  ;   d!   SR                  UU R                  5      5       e[	        U5      (       d
   SU-  5       eX@U'   MU     S U l        U R                  5         g )Nz'{}' is not in the domain: {}ú-Wrong format for an Individual Variable: '%s')rW   rX   rs   Úformatr   ÚvariantÚ_addvariant)r\   rs   ÚassignÚvarr_   ra   s        €r!   rX   ÚAssignment.__init__0  sŽ   ø€ Ü‰ÑÔØŒÞÛ"‘�ØŸk™kÓ)ð Ð+J×+QÑ+QØØ—K‘Kó,ó Ð)ô ! —~‘~ð ØCÀcÑIó�~ð  �S“	ñ #ð ˆŒØ×ÑÕr    c                 óR   • X;   a  [         R                  X5      $ [        SU-  5      e)Nz"Not recognized as a variable: '%s'rd   rf   s     r!   re   ÚAssignment.__getitem__@  s)   € Ø‹;Ü×#Ñ# DÓ.Ð.äÐ@À3ÑFÓGÐGr    c                 óR   • [        U R                  5      nUR                  U 5        U$ r7   )r£   rs   Úupdate)r\   rJ   s     r!   ÚcopyÚAssignment.copyF  s!   € Ü˜Ÿ™Ó%ˆØ�
‰
�4ÔØˆ
r    c                 óX   • U(       a  X	 OU R                  5         U R                  5         g)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©   )r\   r«   s     r!   ÚpurgeÚAssignment.purgeK  s$   € ö Ø‘	à�J‰JŒLØ×ÑÔØr    c                 ób   • Sn[        U R                  5      nU H  u  p4USU SU S3-  nM     U$ )zA
Pretty printing for assignments. {'x', 'u'} appears as 'g[u/x]'
ÚgÚ[Ú/Ú])rv   r¨   )r\   Úgstringr¨   r_   r«   s        r!   rk   ÚAssignment.__str__Y  sA   € ð ˆä˜Ÿ™Ó&ˆÛ‰HˆCØ˜˜3˜%˜q   QÐ'Ñ'ŠGñ  àˆr    c                 óx   • / nU R                  5        H  nUS   US   4nUR                  U5        M      Xl        g)z;
Create a more pretty-printable version of the assignment.
r…   r   N)r.   ro   r¨   )r\   Úlist_r4   Úpairs       r!   r©   ÚAssignment._addvariantd  sA   € ð ˆØ—J‘J–LˆDØ˜‘G˜T !™WÐ%ˆDØ�L‰L˜Öñ !ð ŒØr    c                 ó¬   • X R                   ;   d   U SU R                    35       e[        U5      (       d
   SU-  5       eX U'   U R                  5         U $ )zP
Add a new variable-value pair to the assignment, and update
``self.variant``.

z is not in the domain r¦   )rs   r   r©   )r\   r«   r_   s      r!   rH   ÚAssignment.addo  s[   € ð —k‘kÓ!ÐN c UÐ*@ÀÇÁÀÐ#NÓNÐ!Ü˜�~‰~ÐTÐNÐQTÑTÓTˆ~ØˆS‰	Ø×ÑÔØˆr    )rs   r¨   r7   )r   r   r   r   r   rX   re   r±   rµ   rk   r©   rH   r   r‚   rƒ   s   @r!   r£   r£   û   s2   ø† ñ2÷hò Hòô
ò	ò	÷
ð 
r    r£   c                   óR   • \ rS rSrSrS rS rS rSS jrSS jr	SS	 jr
SS
 jrSrg)ÚModeli|  a/  
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                 óÄ   • [        U[        5      (       d   eXl        X l        UR	                  UR                  5      (       d  [        SUR                  < SU< 35      eg )NzThe valuation domain, z*, must be a subset of the model's domain, )r8   rF   rs   Ú	valuationÚ
issupersetr   )r\   rs   rÇ   s      r!   rX   ÚModel.__init__Ž  sX   € Ü˜&¤#×&Ñ&Ð&Ð&ØŒØ"ŒØ× Ñ  ×!1Ñ!1×2Ñ2Ýà×#Ô#¢Vð-óð ð 3r    c                 ó@   • SU R                   < SU R                  < S3$ )NÚ(z, Ú)©rs   rÇ   rj   s    r!   Ú__repr__ÚModel.__repr__˜  s    € Ø�4—;‘;‘/  D§N¡NÑ#5°QÐ7Ð7r    c                 ó:   • SU R                    SU R                   3$ )Nz	Domain = z,
Valuation = 
rÍ   rj   s    r!   rk   ÚModel.__str__›  s   € Ø˜4Ÿ;™;˜-Ð'8¸¿¹Ð8HÐIÐIr    Nc                 ó  •  [         R                  " U5      nU R                  XBUS9nU(       a  [        5         [        SU SU SU 35        U$ ! [         a%    U(       a  [        5         [        SU SU 35         gf = f)a	  
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   r}   Úsatisfyr-   r$   )r\   Úexprr¸   r'   Úparsedr�   s         r!   ÚevaluateÚModel.evaluatež  s�   € ð	Ü×*Ò*¨4Ó0ˆFØ—L‘L °%�LÐ8ˆEÞÜ”Ü˜˜$˜˜¨u¨g°ZÀ¸sÐCÔDØˆLøÜó 	ÞÜ”Ü˜˜$˜Ð7¸°sÐ;Ô<Ùð		ús   ‚AA Á,A>Á=A>c                 ó	  ^ ^• [        U[        5      (       a�  UR                  5       u  pE[        U[        5      (       a,  T R	                  UT5      n[        UU 4S jU 5       5      nXv;   $ T R	                  UR                  T5      nT R	                  UR                  T5      nXh   $ [        U[        5      (       a!  T R	                  UR                  T5      (       + $ [        U[        5      (       a?  T R	                  UR                  T5      =(       a    T R	                  UR                  T5      $ [        U[        5      (       a?  T R	                  UR                  T5      =(       d    T R	                  UR                  T5      $ [        U[        5      (       aD  T R	                  UR                  T5      (       + =(       d    T R	                  UR                  T5      $ [        U[        5      (       a9  T R	                  UR                  T5      T R	                  UR                  T5      :H  $ [        U[         5      (       a9  T R	                  UR                  T5      T R	                  UR                  T5      :H  $ [        U["        5      (       am  TR%                  5       n	T R&                   HL  n
U	R)                  UR*                  R,                  U
5        T R	                  UR                  U	5      (       a  ML    g   g[        U[.        5      (       am  TR%                  5       n	T R&                   HL  n
U	R)                  UR*                  R,                  U
5        T R	                  UR                  U	5      (       d  ML    g   g[        U[0        5      (       am  TR%                  5       n	T R&                   HL  n
U	R)                  UR*                  R,                  U
5        T R	                  UR                  U	5      (       d  ML    g   g[        U[2        5      (       a\  0 nUR*                  R,                  nT R&                   H2  n
T R	                  UR                  TR)                  XÊ5      5      nXÛU
'   M4     U$ T R5                  UTU5      $ )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   óH   >#   • U  H  nTR                  UT5      v •  M     g 7fr7   )rÕ   )r:   Úargr¸   r\   s     €€r!   r<   Ú Model.satisfy.<locals>.<genexpr>É  s   øé € ÐJÂ	¸ §¡¨S°!× 4Ð 4Â	ùs   ƒ"FT)r8   r	   Úuncurryr   rÕ   r9   ÚfunctionÚargumentr   Útermr   ÚfirstÚsecondr   r   r   r
   r   r±   rs   rH   ÚvariableÚnamer   r   r   Úi)r\   r×   r¸   r'   rß   Ú	argumentsÚfunvalÚargvalsÚargvalÚnew_gÚuÚcfr«   r_   s   ` `           r!   rÕ   ÚModel.satisfy´  sI  ù€ ô  �fÔ3×4Ñ4Ø"(§.¡.Ó"2ÑˆHÜ˜(Ô$>×?Ñ?àŸ™ h°Ó2�ÜÕJÁ	ÓJÓJ�ØÑ(Ð(ð Ÿ™ f§o¡o°qÓ9�ØŸ™ f§o¡o°qÓ9�Ø‘~Ð%Ü˜Ô 1×2Ñ2Ø—|‘| F§K¡K°Ó3Ô3Ð3Ü˜¤×.Ñ.Ø—<‘< §¡¨aÓ0×S°T·\±\À&Ç-Á-ÐQRÓ5SÐSÜ˜¤×-Ñ-Ø—<‘< §¡¨aÓ0×R°D·L±LÀÇÁÐPQÓ4RÐRÜ˜¤×.Ñ.ØŸ™ V§\¡\°1Ó5Ô5×X¸$¿,¹,ÀvÇ}Á}ÐVWÓ:XÐXÜ˜¤×.Ñ.Ø—<‘< §¡¨aÓ0°D·L±LÀÇÁÐPQÓ4RÑRÐRÜ˜Ô 2×3Ñ3Ø—<‘< §¡¨aÓ0°D·L±LÀÇÁÐPQÓ4RÑRÐRÜ˜¤×.Ñ.Ø—F‘F“HˆEØ—[”[�Ø—	‘	˜&Ÿ/™/×.Ñ.°Ô2Ø—|‘| F§K¡K°×7Ó7Ù ñ !ð Ü˜Ô 0×1Ñ1Ø—F‘F“HˆEØ—[”[�Ø—	‘	˜&Ÿ/™/×.Ñ.°Ô2Ø—<‘< §¡¨U×3Ó3Ùñ !ð Ü˜¤×/Ñ/Ø—F‘F“HˆEØ—[”[�Ø—	‘	˜&Ÿ/™/×.Ñ.°Ô2Ø—<‘< §¡¨U×3Ó3Ùñ !ð Ü˜Ô 0×1Ñ1ØˆBØ—/‘/×&Ñ&ˆCØ—[”[�Ø—l‘l 6§;¡;°·±°c³Ó>�ð
 �1“ñ !ð ˆIà—6‘6˜& ! UÓ+Ð+r    c                 ó  • UR                   R                  U R                  R                  ;   a#  U R                  UR                   R                     $ [	        U[
        5      (       a  X!R                   R                     $ [        SU-  5      e)ax  
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Ç   rx   r8   r   r$   )r\   r×   r¸   r'   s       r!   ræ   ÚModel.i   sm   € ð$ �?‰?×Ñ 4§>¡>×#9Ñ#9Ó9Ø—>‘> &§/¡/×"6Ñ"6Ñ7Ð7Ü˜Ô <×=Ñ=Ø—_‘_×)Ñ)Ñ*Ð*ô Ð7¸&Ñ@ÓAÐAr    c           
      óâ  • SnXfU-  -   n/ n[        U[        5      (       a  [        U5      n	OUn	X‘R                  5       ;   Ga  U(       a   [	        5         [	        Xe-  SU SU 3-   5        U R
                   HÅ  n
UR                  5       nUR                  U	R                  U
5        U(       a  US:”  a  US-
  nOSnU R                  XU5      nU(       a  [	        USU-  -   5        US:X  a   U(       a  [	        USU S	U S
3-   5        M’  M”  UR                  U
5        U(       d  M®  [	        USU S	U SU 3-   5        MÇ     U Vs1 s H  oîiM     nnU$ [        U	R                   SU 35      es  snf )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 z is not free in )r8   rG   r   Úfreer-   rs   r±   rH   rå   rÕ   ro   r$   )r\   r×   Úvarexr¸   r'   ÚnestingÚspacerÚindentÚ
candidatesr«   rì   rë   Úlowtracer�   ÚcÚresults                   r!   Ú
satisfiersÚModel.satisfiers  sz  € ð ˆØ GÑ+Ñ,ˆØˆ
ä�eœS×!Ñ!Ü˜5“/‰CàˆCà—+‘+“-ÔÞÜ”ÜØÑ%Ø)¨&¨Ð1CÀAÀ3ÐGñHôð —[”[�ØŸ™›�Ø—	‘	˜#Ÿ(™( AÔ&Þ˜U Q›YØ$ q™y‘Hà �HØŸ™ V°HÓ=�æÜ˜&Ð#;¸eÑ#CÑCÔDð ˜E“>ÞÜ˜f¨°F°8¸8ÀEÀ7È)Ð'TÑTÖUñ ð
 ×%Ñ% aÔ(ß�uÜ˜f¨°F°8¸8ÀEÀ7È$ÈuÈgÐ'VÑVÖWñ+ !ñ. ",Ó,¢˜A’a¡ˆFÐ,ð
 ˆô ˜sŸx™x˜jÐ(8¸¸ÐAÓBÐBùò -s   ÅE,rÍ   r7   )F)Nr   )r   r   r   r   r   rX   rÎ   rk   rØ   rÕ   ræ   rû   r   r   r    r!   rÅ   rÅ   |  s.   † ñò"ò8òJôô,I,ôXB÷49r    rÅ   é   c           
      ó   • [        / SQ5      q[        5       q[	        [        [        5      q[        [        5      q[        5         [        S[        -  5        [        S5        [        S[        -  5        [        S5        [        5         [        S[
        5        [        S[        -  5        / SQnU HZ  nU (       a'  [        5         [
        R                  U[        U 5        M1  [        SU S[
        R                  U[        5       35        M\     g	)
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)rR   Úval1rF   Údom1rÅ   Úm1r£   Úg1r-   ÚmultrØ   )r'   Ú	sentencesÚsents      r!   Úpropdemor  _  sÂ   € ô Ò=Ó>€DÜ‹5€DÜ	Œt”TÓ	€BÜ	”DÓ	€Bä	„GÜ	ˆ#”‰*ÔÜ	Ð
'Ô(Ü	ˆ#”‰*ÔÜ	Ð
CÔDÜ	„GÜ	ˆ-œÔÜ	ˆ#”‰*Ôò€Ió( ˆÞÜŒGÜ�K‰K˜œb %Ö(ä�N 4 &¨¬r¯{©{¸4ÄÓ/DÐ.EÐFÖGò r    c           
      ó®  • SSSSSS14SSS	14S
S14S1 Sk4/q [        [         5      q[        R                  q[        [        [        5      q[        [        SS/5      qU (       Gd*  [        5         [        S[        -  5        [        S5        [        S[        -  5        [        SSS[        5        [        S[        5        / SQnU Vs/ s H  n[        R                  " U5      PM     nn[        5         U H/  n [        SU< S[        R                  U[        5      < 35        M1     / SQnU H[  u  px [        R                  [        R                  " U5      [        5      n	[        S U 5       5      n
[        U SU SX©;    35        M]     ggs  snf ! [         a    [        SU-  5         Mº  f = f! [         a    [        U SU S35         M£  f = f) 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  Úzz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   ó~   #   • U  H3  n[         R                  [        R                  " U5      [        5      v •  M5     g 7fr7   )Úm2ræ   r   r}   r  )r:   rÜ   s     r!   r<   Úfolmodel.<locals>.<genexpr>Â  s+   é € ÐUÒPTÈ¤§¡¤Z×%:Ò%:¸3Ó%?Ä× DÐ DÒPTùs   ‚;=rË   z) evaluates to z) evaluates to UndefinedN)Úv2rR   Úval2rs   Údom2rÅ   r#  r£   r  r-   r	  r   r}   ræ   r$   r9   )Úquietr'   Úexprsr¡   Úparsed_exprsr×   ÚapplicationsÚfunr0   rè   Úargsvals              r!   Úfolmodelr.  �  s»  € ð 	ØØØ	�$˜�ÐØ	��t�ÐØ	��ˆØ	ÒIÐJð
€Bô ”R‹=€DÜ�;‰;€DÜ	Œt”TÓ	€BÜ	”D˜;¨Ð4Ó	5€BçÜŒÜˆc”D‰jÔÜˆmÔÜˆc”D‰jÔÜˆm˜X t¬RÔ0ÜÐ&¬Ô+â?ˆÙ:?Ó@º%°Qœ
×-Ò-¨aÖ0¹%ˆÐ@äŒÛ"ˆFðPÝãœrŸt™t F¬BÕ/ð1öñ #ò
ˆó &‰IˆCð?ÜŸ™œj×3Ò3°CÓ8¼"Ó=�ÜÑUÑPTÓUÓU�Ü˜˜˜Q˜t˜f O°GÑ4EÐ3FÐGÖHò	 &ð9 ùò Aøô ó PÜÐEÈÑN×OðPûô ó ?Ü˜˜˜Q˜t˜fÐ$<Ð=×>ð?ús+   Ã	 FÃ;+FÄ6AF5ÆF2Æ1F2Æ5GÇGc           
      ód  • [        SS9  [        5         [        S[        -  5        [        S5        [        S[        -  5        / SQnU Hd  n[        R	                  5         U (       a  [
        R                  U[        U 5        M;  [        SU S[
        R                  U[        5       35        Mf     g)	z>
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!   Úfoldemor3  Ì  s‚   € ô �4Òä	„GÜ	ˆ#”‰*ÔÜ	Ð
ÔÜ	ˆ#”‰*Ôò€Hó* ˆÜ
�‰Œ
ÞÜ�K‰K˜œb %Ö(ä�N 4 &¨¬r¯{©{¸4ÄÓ/DÐ.EÐFÖGò r    c                 ó
  • [        5         [        S[        -  5        [        S5        [        S[        -  5        [        SS9  / SQnU (       a  [        [        5        U H$  n[        U5        [        R
                  " U5        M&     U Vs/ s H  n[        R
                  " U5      PM     nnU HL  n[        R                  5         [        SR                  U[        R                  US[        U 5      5      5        MN     gs  snf )	z5Satisfiers of an open formula in a first order model.r  zSatisfiers DemoTr0  )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))r5  z&exists y. (love(adam, y) & love(y, x))zThe satisfiers of '{}' are: {}r  N)
r-   r	  r.  r#  r   r}   r  rµ   r§   rû   )r'   r1  r2  r×   Úps        r!   Úsatdemor7  ø  sÆ   € ô 
„GÜ	ˆ#”‰*ÔÜ	Ð
ÔÜ	ˆ#”‰*Ôä�4Òò€Hö, ÜŒbŒ	ãˆÜˆdŒÜ×Ò˜dÖ#ñ ñ 7?Ó?²h¨dŒj×#Ò# DÖ)±h€FÐ?ãˆÜ
�‰Œ
ÜØ,×3Ñ3°A´r·}±}ÀQÈÌRÐQVÓ7WÓXö	
ò ùò @s   Â D c                 ó†   • [         [        [        [        S.n X    " US9  g! [         a    U H  n X    " US9  M      gf = f)a/  
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.  r3  r7  ÚKeyError)Únumr'   Údemoss      r!   Údemor?  (  sD   € ô œX¬'´gÑ>€Eð$ØŠ
˜ÓøÜó $ÛˆCØŠJ˜UÔ#ó ð$ús   ™" ¢A ¿A Ú__main__r9  rÓ   r7   )FN)r   N)3r   r(   ÚreÚsysrZ   Úpprintr   Únltk.decoratorsr   Únltk.sem.logicr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   Ú	Exceptionr   r$   r'   rD   rL   rP   r*   rR   Úcompilerˆ   r�   ÚVERBOSEr‹   r•   r{   r£   rÅ   r	  r  r.  r3  r7  r?  r   r   r    r!   Ú<module>rI     s  ðñó
 Û 	Û 
Û Ý å %÷÷ ÷ ÷ ó ô(	ˆIô 	ô	�ô 	òòOò$ò0ô<!�ô <!ðD —
’
˜<Ó(€Ø—J’J˜zÓ*Ð Ø�ZŠZð'ð ‡J�Jó	€
ò ôF!ô2~�ô ~÷BWñ Wð| 
€ô
*Hôb5?ôx%HôX-
ô`$ð* ˆzÓÙˆ�!Óð r    