ó
    ´OÂfµH  ã                   óN  • S r SSKJr  SSKJr  SSKJrJr  SSKJ	r	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   " S S\5      rS	 r " S
 S\5      r " S S\5      r " S S\5      r  " S S\5      r! " S S5      r"S r#S r$S r%S r&S r'S r(S r)\*S:X  a  \)" 5         gg)zÆ
A module to perform nonmonotonic reasoning.  The ideas and demonstrations in
this module are based on "Logical Foundations of Artificial Intelligence" by
Michael R. Genesereth and Nils J. Nilsson.
é    )Údefaultdict)Úreduce)ÚProverÚProverCommandDecorator)ÚProver9ÚProver9Command)ÚAbstractVariableExpressionÚAllExpressionÚAndExpressionÚApplicationExpressionÚBooleanExpressionÚEqualityExpressionÚExistsExpressionÚ
ExpressionÚImpExpressionÚNegatedExpressionÚVariableÚVariableExpressionÚoperatorÚunique_variablec                   ó   • \ rS rSrSrg)ÚProverParseErroré&   © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__static_attributes__r   ó    Ú=/usr/lib/python3/dist-packages/nltk/inference/nonmonotonic.pyr   r   &   s   † Úr    r   c                 ón   • U c  UnOX* /-   n[        [        R                  S U 5       [        5       5      $ )Nc              3   ó@   #   • U  H  oR                  5       v •  M     g 7f©N)Ú	constants)Ú.0Úas     r!   Ú	<genexpr>Úget_domain.<locals>.<genexpr>/   s   é € Ð Hº°1§¡§ ºùs   ‚)r   r   Úor_Úset)ÚgoalÚassumptionsÚall_expressionss      r!   Ú
get_domainr/   *   s3   € Ø�|Ø%‰à%¨¨Ñ/ˆÜ”(—,‘,Ñ H¹Ó HÌ#Ë%ÓPÐPr    c                   ó*   • \ rS rSrSrS rS rS rSrg)ÚClosedDomainProveré2   zQ
This is a prover decorator that adds domain closure assumptions before
proving.
c                 óô   • U R                   R                  5        Vs/ s H  oPM     nnU R                   R                  5       n[        X25      nU Vs/ s H  oPR	                  XT5      PM     sn$ s  snf s  snf r$   )Ú_commandr-   r,   r/   Úreplace_quants)Úselfr'   r-   r,   ÚdomainÚexs         r!   r-   ÚClosedDomainProver.assumptions8   sj   € Ø"&§-¡-×";Ñ";Ô"=Ó>Ò"=˜Q’qÑ"=ˆÐ>Ø�}‰}×!Ñ!Ó#ˆÜ˜DÓ.ˆÙ:EÓFº+°B×#Ñ# BÖ/¹+ÑFÐFùò ?ùò Gs   �A0ÁA5c                 óž   • U R                   R                  5       n[        XR                   R                  5       5      nU R	                  X5      $ r$   )r4   r,   r/   r-   r5   )r6   r,   r7   s      r!   r,   ÚClosedDomainProver.goal>   s<   € Ø�}‰}×!Ñ!Ó#ˆÜ˜D§-¡-×";Ñ";Ó"=Ó>ˆØ×"Ñ" 4Ó0Ð0r    c           	      óH  • [        U[        5      (       ak  U Vs/ s H1  o1R                  R                  UR                  [        U5      5      PM3     nnU Vs/ s H  oPR                  XR5      PM     nn[        S U5      $ [        U[        5      (       aF  UR                  U R                  UR                  U5      U R                  UR                  U5      5      $ [        U[        5      (       a  U R                  UR                  U5      * $ [        U[        5      (       ak  U Vs/ s H1  o1R                  R                  UR                  [        U5      5      PM3     nnU Vs/ s H  o0R                  X25      PM     nn[        S U5      $ U$ s  snf s  snf s  snf s  snf )a”  
Apply the closed domain assumption to the expression

- Domain = union([e.free()|e.constants() for e in all_expressions])
- translate "exists x.P" to "(z=d1 | z=d2 | ... ) & P.replace(x,z)" OR
            "P.replace(x, d1) | P.replace(x, d2) | ..."
- translate "all x.P" to "P.replace(x, d1) & P.replace(x, d2) & ..."

:param ex: ``Expression``
:param domain: set of {Variable}s
:return: ``Expression``
c                 ó
   • X-  $ r$   r   ©ÚxÚys     r!   Ú<lambda>Ú3ClosedDomainProver.replace_quants.<locals>.<lambda>U   ó   €  q¢ur    c                 ó
   • X-  $ r$   r   r>   s     r!   rA   rB   b   rC   r    )Ú
isinstancer
   ÚtermÚreplaceÚvariabler   r5   r   r   Ú	__class__ÚfirstÚsecondr   r   )r6   r8   r7   ÚdÚ	conjunctsÚcÚ	disjunctss          r!   r5   Ú!ClosedDomainProver.replace_quantsC   so  € ô �bœ-×(Ñ(áMSóÚMSÈ—‘—‘ §¡Ô-?ÀÓ-BÖCÉVð ð ñ BKÓKÂ¸A×,Ñ,¨QÖ7ÁˆIÐKÜÑ,¨iÓ8Ð8Ü˜Ô-×.Ñ.Ø—<‘<Ø×#Ñ# B§H¡H¨fÓ5Ø×#Ñ# B§I¡I¨vÓ6óð ô ˜Ô-×.Ñ.Ø×'Ñ'¨¯©°Ó8Ð8Ð8Ü˜Ô,×-Ñ-áMSóÚMSÈ—‘—‘ §¡Ô-?ÀÓ-BÖCÉVð ð ñ BKÓKÂ¸A×,Ñ,¨QÖ7ÁˆIÐKÜÑ,¨iÓ8Ð8àˆIùò'ùò Lùòùò Ls   š8FÁFÄ'8FÅ%Fr   N)	r   r   r   r   Ú__doc__r-   r,   r5   r   r   r    r!   r1   r1   2   s   † ñò
Gò1õ
!r    r1   c                   ó   • \ rS rSrSrS rSrg)ÚUniqueNamesProverég   zO
This is a prover decorator that adds unique names assumptions before
proving.
c                 óŒ  • U R                   R                  5       n[        [        U R                   R	                  5       U5      5      n[        5       nU HY  n[        U[        5      (       d  M  UR                  R                  nUR                  R                  nX5   R                  U5        M[     / n[        U5       H€  u  p„X(S-   S  Hp  n	X“U   ;  d  M  [        [        U5      [        U	5      5      n
[        5       R                  X¡5      (       a  X4   R                  U	5        M^  UR!                  U
* 5        Mr     M‚     X-   $ )zŒ
- Domain = union([e.free()|e.constants() for e in all_expressions])
- if "d1 = d2" cannot be proven from the premises, then add "d1 != d2"
é   N)r4   r-   Úlistr/   r,   Ú	SetHolderrE   r   rJ   rH   rK   ÚaddÚ	enumerater   r   ÚproveÚappend)r6   r-   r7   Úeq_setsr'   ÚavÚbvÚnew_assumptionsÚiÚbÚnewEqExs              r!   r-   ÚUniqueNamesProver.assumptionsm   s  € ð
 —m‘m×/Ñ/Ó1ˆä”j §¡×!3Ñ!3Ó!5°{ÓCÓDˆô “+ˆÛˆAÜ˜!Ô/×0Ó0Ø—W‘W×%Ñ%�Ø—X‘X×&Ñ&�à‘—‘ Ö#ñ ð ˆÜ˜fÖ%‰DˆAØ ™E˜G“_�à A™JÕ&Ü0Ü*¨1Ó-Ô/AÀ!Ó/Dó�Gô “y—‘ w×<Ñ<ð  ™
Ÿ™ qÖ)ð (×.Ñ.°¨xÖ8ó %ñ &ð Ñ,Ð,r    r   N)r   r   r   r   rQ   r-   r   r   r    r!   rS   rS   g   s   † ñõ
"-r    rS   c                   ó   • \ rS rSrSrS rSrg)rX   é’   z
A list of sets of Variables.
c                 ó€   • [        U[        5      (       d   eU  H  nX;   d  M
  Us  $    U1nU R                  U5        U$ )z>
:param item: ``Variable``
:return: the set containing 'item'
)rE   r   r\   )r6   ÚitemÚsÚnews       r!   Ú__getitem__ÚSetHolder.__getitem__—   sE   € ô
 ˜$¤×)Ñ)Ð)Ð)ÛˆAØ�yØ’ñ ð ˆfˆØ�‰�CÔØˆ
r    r   N)r   r   r   r   rQ   rk   r   r   r    r!   rX   rX   ’   s   † ñõr    rX   c                   ó6   • \ rS rSrSrS rS rS rS rS r	Sr
g	)
ÚClosedWorldProveré¦   a=  
This is a prover decorator that completes predicates before proving.

If the assumptions contain "P(A)", then "all x.(P(x) -> (x=A))" is the completion of "P".
If the assumptions contain "all x.(ostrich(x) -> bird(x))", then "all x.(bird(x) -> ostrich(x))" is the completion of "bird".
If the assumptions don't contain anything that are "P", then "all x.-P(x)" is the completion of "P".

walk(Socrates)
Socrates != Bill
+ all x.(walk(x) -> (x=Socrates))
----------------
-walk(Bill)

see(Socrates, John)
see(John, Mary)
Socrates != John
John != Mary
+ all x.all y.(see(x,y) -> ((x=Socrates & y=John) | (x=John & y=Mary)))
----------------
-see(Socrates, Mary)

all x.(ostrich(x) -> bird(x))
bird(Tweety)
-ostrich(Sam)
Sam != Tweety
+ all x.(bird(x) -> (ostrich(x) | x=Tweety))
+ all x.-ostrich(x)
-------------------
-bird(Sam)
c           	      ó<  • U R                   R                  5       nU R                  U5      n/ nU GH`  nX$   nU R                  U5      nU Vs/ s H  n[	        U5      PM     nn/ n	UR
                   HO  n
/ n[        XŠ5       H  u  pÍUR                  [        XÍ5      5        M!     U	R                  [        S U5      5        MQ     UR                   HC  n0 n[        XŽS   5       H	  u  pÍXÏU'   M     U	R                  US   R                  U5      5        ME     U	(       a+  U R                  XF5      n[        S U	5      n[        UU5      nO[        U R                  XF5      5      nUS S S2    H  n[        UU5      nM     UR                  U5        GMc     X-   $ s  snf )Nc                 ó
   • X-  $ r$   r   r>   s     r!   rA   Ú/ClosedWorldProver.assumptions.<locals>.<lambda>Ø   s   € °Q²Ur    r   rV   c                 ó
   • X-  $ r$   r   r>   s     r!   rA   rr   æ   s   € °²r    éÿÿÿÿ)r4   r-   Ú_make_predicate_dictÚ_make_unique_signaturer   Ú
signaturesÚzipr\   r   r   Ú
propertiesÚsubstitute_bindingsÚ_make_antecedentr   r   r
   )r6   r-   Ú
predicatesr`   ÚpÚ
predHolderÚnew_sigÚvÚnew_sig_exsrO   ÚsigÚequality_exsÚv1Úv2ÚpropÚbindingsÚ
antecedentÚ
consequentÚaccumÚnew_sig_vars                       r!   r-   ÚClosedWorldProver.assumptionsÆ   s’  € Ø—m‘m×/Ñ/Ó1ˆà×.Ñ.¨{Ó;ˆ
àˆÜˆAØ#™ˆJØ×1Ñ1°*Ó=ˆGÙ:AÓBº'°QÔ-¨aÖ0¹'ˆKÐBàˆIð "×,Ô,�Ø!�Ü! +Ö3‘F�BØ ×'Ñ'Ô(:¸2Ó(BÖCñ 4à× Ñ ¤Ñ(:¸LÓ!IÖJñ	 -ð #×-Ô-�à�Ü! +°A©wÖ7‘F�BØ#%˜R“Lñ 8à× Ñ   a¡×!<Ñ!<¸XÓ!FÖGñ .ö à!×2Ñ2°1Ó>�
Ü#Ñ$6¸	ÓB�
Ü% j°*Ó=‘ô *¨$×*?Ñ*?ÀÓ*KÓL�ð  '¡t¨ tœ}�Ü% k°5Ó9’ñ  -à×"Ñ" 5×)ñG ðJ Ñ,Ð,ùòE Cs   ÁFc                 óL   • [        S [        UR                  5       5       5      $ )z€
This method figures out how many arguments the predicate takes and
returns a tuple containing that number of unique variables.
c              3   ó6   #   • U  H  n[        5       v •  M     g 7fr$   )r   )r&   ra   s     r!   r(   Ú;ClosedWorldProver._make_unique_signature.<locals>.<genexpr>ø   s   é € ÐPÒ0O¨1”_×&Ð&Ò0Oùs   ‚)ÚtupleÚrangeÚsignature_len)r6   r~   s     r!   rv   Ú(ClosedWorldProver._make_unique_signatureó   s    € ô
 ÑP´°j×6NÑ6NÔ0OÓPÓPÐPr    c                 ó>   • UnU H  nU" [        U5      5      nM     U$ )zn
Return an application expression with 'predicate' as the predicate
and 'signature' as the list of arguments.
)r   )r6   Ú	predicateÚ	signaturerˆ   r€   s        r!   r{   Ú"ClosedWorldProver._make_antecedentú   s)   € ð
 ˆ
ÛˆAÙ#Ô$6°qÓ$9Ó:ŠJñ àÐr    c                 óX   • [        [        5      nU H  nU R                  X25        M     U$ )z¯
Create a dictionary of predicates from the assumptions.

:param assumptions: a list of ``Expression``s
:return: dict mapping ``AbstractVariableExpression`` to ``PredHolder``
)r   Ú
PredHolderÚ_map_predicates)r6   r-   r|   r'   s       r!   ru   Ú&ClosedWorldProver._make_predicate_dict  s,   € ô !¤Ó,ˆ
ÛˆAØ× Ñ  Ö/ñ àÐr    c                 óÜ  • [        U[        5      (       aE  UR                  5       u  p4[        U[        5      (       a  X#   R	                  [        U5      5        g g [        U[        5      (       a9  U R                  UR                  U5        U R                  UR                  U5        g [        U[        5      (       Ga¤  UR                  /nUR                  n[        U[        5      (       a>  UR                  UR                  5        UR                  n[        U[        5      (       a  M>  [        U[        5      (       Ga!  [        UR                  [        5      (       Ga   [        UR                  [        5      (       aà  UR                  R                  5       u  pxUR                  R                  5       u  pš[        U[        5      (       a’  [        U	[        5      (       a|  XX Vs/ s H  o»R                  PM     sn:X  a\  XZ Vs/ s H  o»R                  PM     sn:X  a<  X)   R                  [        U5      UR                  45        X'   R!                  U5        g g g g g g g g g s  snf s  snf r$   )rE   r   Úuncurryr	   Ú
append_sigr�   r   rš   rJ   rK   r
   rH   rF   r\   r   Úappend_propÚvalidate_sig_len)r6   Ú
expressionÚpredDictÚfuncÚargsr‚   rF   Úfunc1Úargs1Úfunc2Úargs2r€   s               r!   rš   Ú!ClosedWorldProver._map_predicates  sè  € Ü�jÔ"7×8Ñ8Ø#×+Ñ+Ó-‰JˆDÜ˜$Ô :×;Ñ;Ø‘×)Ñ)¬%°«+Õ6ð <ä˜
¤M×2Ñ2Ø× Ñ  ×!1Ñ!1°8Ô<Ø× Ñ  ×!2Ñ!2°HÕ=Ü˜
¤M×2Ò2à×&Ñ&Ð'ˆCØ—?‘?ˆDÜ˜T¤=×1Ñ1Ø—
‘
˜4Ÿ=™=Ô)Ø—y‘y�ô ˜T¤=×1Ó1ô ˜$¤×.Ò.Ü˜dŸj™jÔ*?×@Ò@ÄZØ—K‘KÔ!6÷Fñ Fð $(§:¡:×#5Ñ#5Ó#7‘L�EØ#'§;¡;×#6Ñ#6Ó#8‘L�Eä" 5Ô*D×EÑEÜ& uÔ.H×IÑIØ¸Ó#>º°1§J¤J¹Ñ#>Ó>Ø¸Ó#>º°1§J¤J¹Ñ#>Ó>à ™×3Ñ3´U¸3³ZÀÇÁÐ4LÔMØ ™×8Ñ8¸Õ=ð ?ð ?ð Jð FðFÐ@ð /ð 3ùò  $?ùÚ#>s   Ç&I$ÈI)r   N)r   r   r   r   rQ   r-   rv   r{   ru   rš   r   r   r    r!   rn   rn   ¦   s"   † ñò>+-òZQòò
õ>r    rn   c                   ó<   • \ rS rSrSrS rS rS rS rS r	S r
S	rg
)r™   i/  as  
This class will be used by a dictionary that will store information
about predicates to be used by the ``ClosedWorldProver``.

The 'signatures' property is a list of tuples defining signatures for
which the predicate is true.  For instance, 'see(john, mary)' would be
result in the signature '(john,mary)' for 'see'.

The second element of the pair is a list of pairs such that the first
element of the pair is a tuple of variables and the second element is an
expression of those variables that makes the predicate true.  For instance,
'all x.all y.(see(x,y) -> know(x,y))' would result in "((x,y),('see(x,y)'))"
for 'know'.
c                 ó.   • / U l         / U l        S U l        g r$   ©rw   ry   r’   ©r6   s    r!   Ú__init__ÚPredHolder.__init__?  s   € ØˆŒØˆŒØ!ˆÕr    c                 ó\   • U R                  U5        U R                  R                  U5        g r$   )r    rw   r\   ©r6   r   s     r!   rž   ÚPredHolder.append_sigD  s"   € Ø×Ñ˜gÔ&Ø�‰×Ñ˜wÕ'r    c                 ób   • U R                  US   5        U R                  R                  U5        g )Nr   )r    ry   r\   )r6   Únew_props     r!   rŸ   ÚPredHolder.append_propH  s&   € Ø×Ñ˜h q™kÔ*Ø�‰×Ñ˜xÕ(r    c                 óˆ   • U R                   c  [        U5      U l         g U R                   [        U5      :w  a  [        S5      eg )NzSignature lengths do not match)r’   ÚlenÚ	Exceptionr±   s     r!   r    ÚPredHolder.validate_sig_lenL  s=   € Ø×ÑÑ%Ü!$ W£ˆDÕØ×Ñ¤3 w£<Ó/ÜÐ<Ó=Ð=ð 0r    c                 óV   • SU R                    SU R                   SU R                   S3$ )NÚ(Ú,Ú)r¬   r­   s    r!   Ú__str__ÚPredHolder.__str__R  s.   € Ø�4—?‘?Ð# 1 T§_¡_Ð$5°Q°t×7IÑ7IÐ6JÈ!ÐLÐLr    c                 ó   • SU -  $ )Nz%sr   r­   s    r!   Ú__repr__ÚPredHolder.__repr__U  s   € Ø�d‰{Ðr    )ry   r’   rw   N)r   r   r   r   rQ   r®   rž   rŸ   r    r¾   rÁ   r   r   r    r!   r™   r™   /  s&   † ñò"ò
(ò)ò>òMõr    r™   c                  ó  • [         R                  n U " S5      nU " S5      nU " S5      n[        X1U/5      n[        UR	                  5       5        [        U5      n[        S5        UR                  5        H  n[        SU5        M     [        SUR                  5       5        [        UR	                  5       5        U " S5      nU " S5      nU " S5      nU " S5      n[        X1X'/5      n[        UR	                  5       5        [        U5      n[        S5        UR                  5        H  n[        SU5        M     [        SUR                  5       5        [        UR	                  5       5        U " S5      nU " S5      nU " S5      nU " S5      n[        X1X'/5      n[        UR	                  5       5        [        U5      n[        S5        UR                  5        H  n[        SU5        M     [        SUR                  5       5        [        UR	                  5       5        U " S5      nU " S5      nU " S	5      n[        X1U/5      n[        UR	                  5       5        [        U5      n[        S5        UR                  5        H  n[        SU5        M     [        SUR                  5       5        [        UR	                  5       5        U " S
5      nU " S5      nU " S5      nU " S5      nU " S5      n	U " S5      n[        X1X'X‰/5      n[        UR	                  5       5        [        U5      n[        S5        UR                  5        H  n[        SU5        M     [        SUR                  5       5        [        UR	                  5       5        g )Nzexists x.walk(x)úman(Socrates)úwalk(Socrates)úassumptions:ú   úgoal:ú-walk(Bill)z
walk(Bill)zall x.walk(x)z
girl(mary)z
dog(rover)zall x.(girl(x) -> -dog(x))zall x.(dog(x) -> -girl(x))zchase(mary, rover)z1exists y.(dog(y) & all x.(girl(x) -> chase(x,y))))r   Ú
fromstringr   Úprintr[   r1   r-   r,   )
ÚlexprÚp1Úp2rN   ÚproverÚcdpr'   Úp3Úp4Úp5s
             r!   Úclosed_domain_demorÔ   Y  så  € Ü×!Ñ!€Eá	Ð"Ó	#€BÙ	ÐÓ	 €BÙÐÓ €AÜ˜A B˜xÓ(€FÜ	ˆ&�,‰,‹.ÔÜ
˜VÓ
$€CÜ	ˆ.ÔØ�_‰_ÖˆÜˆe�QŽñ ä	ˆ'�3—8‘8“:ÔÜ	ˆ#�)‰)‹+Ôá	Ð"Ó	#€BÙ	ÐÓ	 €BÙ	ˆ~Ó	€BÙÐÓ €AÜ˜A B˜|Ó,€FÜ	ˆ&�,‰,‹.ÔÜ
˜VÓ
$€CÜ	ˆ.ÔØ�_‰_ÖˆÜˆe�QŽñ ä	ˆ'�3—8‘8“:ÔÜ	ˆ#�)‰)‹+Ôá	Ð"Ó	#€BÙ	ÐÓ	 €BÙ	ˆ~Ó	€BÙÐÓ €AÜ˜A B˜|Ó,€FÜ	ˆ&�,‰,‹.ÔÜ
˜VÓ
$€CÜ	ˆ.ÔØ�_‰_ÖˆÜˆe�QŽñ ä	ˆ'�3—8‘8“:ÔÜ	ˆ#�)‰)‹+Ôá	Ð Ó	!€BÙ	ˆ}Ó	€BÙÐÓ€AÜ˜A B˜xÓ(€FÜ	ˆ&�,‰,‹.ÔÜ
˜VÓ
$€CÜ	ˆ.ÔØ�_‰_ÖˆÜˆe�QŽñ ä	ˆ'�3—8‘8“:ÔÜ	ˆ#�)‰)‹+Ôá	ˆ}Ó	€BÙ	ˆ}Ó	€BÙ	Ð,Ó	-€BÙ	Ð,Ó	-€BÙ	Ð$Ó	%€BÙÐBÓC€AÜ˜A B¨BÐ3Ó4€FÜ	ˆ&�,‰,‹.ÔÜ
˜VÓ
$€CÜ	ˆ.ÔØ�_‰_ÖˆÜˆe�QŽñ ä	ˆ'�3—8‘8“:ÔÜ	ˆ#�)‰)‹+Õr    c                  óÜ  • [         R                  n U " S5      nU " S5      nU " S5      n[        X1U/5      n[        UR	                  5       5        [        U5      n[        S5        UR                  5        H  n[        SU5        M     [        SUR                  5       5        [        UR	                  5       5        U " S5      nU " S5      nU " S	5      nU " S
5      n[        X1X'/5      n[        UR	                  5       5        [        U5      n[        S5        UR                  5        H  n[        SU5        M     [        SUR                  5       5        [        UR	                  5       5        g )NrÄ   z	man(Bill)zexists x.exists y.(x != y)rÆ   rÇ   rÈ   z!all x.(walk(x) -> (x = Socrates))zBill = WilliamzBill = Billyz-walk(William))r   rÊ   r   rË   r[   rS   r-   r,   )rÌ   rÍ   rÎ   rN   rÏ   Úunpr'   rÑ   s           r!   Úunique_names_demor×   ž  s$  € Ü×!Ñ!€Eá	ÐÓ	 €BÙ	ˆ|Ó	€BÙÐ+Ó,€AÜ˜A B˜xÓ(€FÜ	ˆ&�,‰,‹.ÔÜ
˜FÓ
#€CÜ	ˆ.ÔØ�_‰_ÖˆÜˆe�QŽñ ä	ˆ'�3—8‘8“:ÔÜ	ˆ#�)‰)‹+Ôá	Ð3Ó	4€BÙ	Ð Ó	!€BÙ	ˆÓ	€BÙÐÓ €AÜ˜A B˜|Ó,€FÜ	ˆ&�,‰,‹.ÔÜ
˜FÓ
#€CÜ	ˆ.ÔØ�_‰_ÖˆÜˆe�QŽñ ä	ˆ'�3—8‘8“:ÔÜ	ˆ#�)‰)‹+Õr    c                  ód  • [         R                  n U " S5      nU " S5      nU " S5      n[        X1U/5      n[        UR	                  5       5        [        U5      n[        S5        UR                  5        H  n[        SU5        M     [        SUR                  5       5        [        UR	                  5       5        U " S5      nU " S5      nU " S	5      nU " S
5      nU " S5      n[        X1X'U/5      n[        UR	                  5       5        [        U5      n[        S5        UR                  5        H  n[        SU5        M     [        SUR                  5       5        [        UR	                  5       5        U " S5      nU " S5      nU " S5      nU " S5      nU " S5      n[        X1X'U/5      n[        UR	                  5       5        [        U5      n[        S5        UR                  5        H  n[        SU5        M     [        SUR                  5       5        [        UR	                  5       5        g )NrÅ   z(Socrates != Bill)rÉ   rÆ   rÇ   rÈ   úsee(Socrates, John)úsee(John, Mary)z(Socrates != John)z(John != Mary)ú-see(Socrates, Mary)zall x.(ostrich(x) -> bird(x))zbird(Tweety)z-ostrich(Sam)zSam != Tweetyz
-bird(Sam))r   rÊ   r   rË   r[   rn   r-   r,   )	rÌ   rÍ   rÎ   rN   rÏ   Úcwpr'   rÑ   rÒ   s	            r!   Úclosed_world_demorÝ   »  sÑ  € Ü×!Ñ!€Eá	Ð Ó	!€BÙ	Ð$Ó	%€BÙˆnÓ€AÜ˜A B˜xÓ(€FÜ	ˆ&�,‰,‹.ÔÜ
˜FÓ
#€CÜ	ˆ.ÔØ�_‰_ÖˆÜˆe�QŽñ ä	ˆ'�3—8‘8“:ÔÜ	ˆ#�)‰)‹+Ôá	Ð%Ó	&€BÙ	Ð!Ó	"€BÙ	Ð$Ó	%€BÙ	Ð Ó	!€BÙÐ%Ó&€AÜ˜A B¨BÐ/Ó0€FÜ	ˆ&�,‰,‹.ÔÜ
˜FÓ
#€CÜ	ˆ.ÔØ�_‰_ÖˆÜˆe�QŽñ ä	ˆ'�3—8‘8“:ÔÜ	ˆ#�)‰)‹+Ôá	Ð/Ó	0€BÙ	ˆÓ	€BÙ	ÐÓ	 €BÙ	ÐÓ	 €BÙˆmÓ€AÜ˜A B¨BÐ/Ó0€FÜ	ˆ&�,‰,‹.ÔÜ
˜FÓ
#€CÜ	ˆ.ÔØ�_‰_ÖˆÜˆe�QŽñ ä	ˆ'�3—8‘8“:ÔÜ	ˆ#�)‰)‹+Õr    c                  óP  • [         R                  n U " S5      nU " S5      nU " S5      n[        X1U/5      n[        UR	                  5       5        [        [        [        U5      5      5      nUR                  5        H  n[        U5        M     [        UR	                  5       5        g )NrÙ   rÚ   rÛ   )	r   rÊ   r   rË   r[   r1   rS   rn   r-   )rÌ   rÍ   rÎ   rN   rÏ   Úcommandr'   s          r!   Úcombination_prover_demorà   ç  sˆ   € Ü×!Ñ!€Eá	Ð%Ó	&€BÙ	Ð!Ó	"€BÙÐ%Ó&€AÜ˜A B˜xÓ(€FÜ	ˆ&�,‰,‹.ÔÜ Ô!2Ô3DÀVÓ3LÓ!MÓN€GØ× Ñ Ö"ˆÜˆaŽñ #ä	ˆ'�-‰-‹/Õr    c                  óx  • [         R                  n / nUR                  U " S5      5        UR                  U " S5      5        UR                  U " S5      5        UR                  U " S5      5        UR                  U " S5      5        UR                  U " S5      5        UR                  U " S5      5        UR                  U " S5      5        UR                  U " S	5      5        UR                  U " S
5      5        UR                  U " S5      5        UR                  U " S5      5        UR                  U " S5      5        UR                  U " S5      5        [        S U5      n[	        [        U5      5      nUR                  5        H  n[        U5        M     [        SU5        [        SU5        [        SU5        g )Nz'all x.(elephant(x)        -> animal(x))z'all x.(bird(x)            -> animal(x))z%all x.(dove(x)            -> bird(x))z%all x.(ostrich(x)         -> bird(x))z(all x.(flying_ostrich(x)  -> ostrich(x))z)all x.((animal(x)  & -Ab1(x)) -> -fly(x))z(all x.((bird(x)    & -Ab2(x)) -> fly(x))z)all x.((ostrich(x) & -Ab3(x)) -> -fly(x))z#all x.(bird(x)           -> Ab1(x))z#all x.(ostrich(x)        -> Ab2(x))z#all x.(flying_ostrich(x) -> Ab3(x))zelephant(E)zdove(D)z
ostrich(O)z-fly(E)zfly(D)z-fly(O))	r   rÊ   r\   r   rS   rn   r-   rË   Úprint_proof)rÌ   ÚpremisesrÏ   rß   r'   s        r!   Údefault_reasoning_demorä   õ  sx  € Ü×!Ñ!€Eà€Hð ‡O�O‘EÐDÓEÔFØ‡O�O‘EÐDÓEÔFØ‡O�O‘EÐBÓCÔDØ‡O�O‘EÐBÓCÔDØ‡O�O‘EÐEÓFÔGð ‡O�OÙÐ:Ó;ôð ‡O�OÙÐ9Ó:ôð ‡O�OÙÐ:Ó;ôð
 ‡O�O‘EÐ@ÓAÔBØ‡O�O‘EÐ@ÓAÔBØ‡O�O‘EÐ@ÓAÔBð ‡O�O‘E˜.Ó)Ô*Ø‡O�O‘E˜*Ó%Ô&Ø‡O�O‘E˜-Ó(Ô)ô ˜D (Ó+€FÜÔ 1°&Ó 9Ó:€GØ× Ñ Ö"ˆÜˆaŽñ #ô �	˜8Ô$Ü�˜(Ô#Ü�	˜8Õ$r    c                 óÀ   • [         R                  n[        U" U 5      U5      n[        [	        U5      5      n[        XR                  5       UR                  5       5        g r$   )r   rÊ   r   rS   rn   rË   r[   )r,   rã   rÌ   rÏ   rß   s        r!   râ   râ   !  sC   € Ü×!Ñ!€EÜ™E $›K¨Ó2€FÜÔ 1°&Ó 9Ó:€GÜ	ˆ$—‘“ §¡£Õ0r    c                  óh   • [        5         [        5         [        5         [        5         [	        5         g r$   )rÔ   r×   rÝ   rà   rä   r   r    r!   Údemorç   (  s    € ÜÔÜÔÜÔÜÔÜÕr    Ú__main__N)+rQ   Úcollectionsr   Ú	functoolsr   Únltk.inference.apir   r   Únltk.inference.prover9r   r   Únltk.sem.logicr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r¸   r   r/   r1   rS   rW   rX   rn   r™   rÔ   r×   rÝ   rà   rä   râ   rç   r   r   r    r!   Ú<module>rî      s¼   ðñõ $Ý ç =ß :÷÷ ÷ ÷ ô$	�yô 	òQô2Ð/ô 2ôj(-Ð.ô (-ôV�ô ô(F>Ð.ô F>÷R'ñ 'òTBòJò:)òXò)%òX1òð ˆzÓÙ…Fð r    