Ë
    çÍ:jµH  ã                   óL  — d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	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  G d„ de«      Zd	„ Z G d
„ de«      Z G d„ de«      Z G d„ de«      Z  G d„ de«      Z! G d„ d«      Z"d„ Z#d„ Z$d„ Z%d„ Z&d„ Z'd„ Z(d„ Z)e*dk(  r e)«        yy)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                   ó   — e Zd Zy)ÚProverParseErrorN)Ú__name__Ú
__module__Ú__qualname__© ó    úp/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/nltk/inference/nonmonotonic.pyr   r   &   s   „ Ør   r   c                 ón   — | €|}n||  gz   }t        t        j                  d„ |D «       t        «       «      S )Nc              3   ó<   K  — | ]  }|j                  «       –— Œ y ­w©N)Ú	constants)Ú.0Úas     r   ú	<genexpr>zget_domain.<locals>.<genexpr>/   s   è ø€ Ò H°1 §¡§Ñ Hùs   ‚)r   r   Úor_Úset)ÚgoalÚassumptionsÚall_expressionss      r   Ú
get_domainr+   *   s5   € Ø€|Ø%‰à%¨$¨¨Ñ/ˆÜ”(—,‘,Ñ H¸Ô HÌ#Ë%ÓPÐPr   c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)ÚClosedDomainProverz]
    This is a prover decorator that adds domain closure assumptions before
    proving.
    c                 óð   — | j                   j                  «       D �cg c]  }|‘Œ }}| j                   j                  «       }t        ||«      }|D �cg c]  }| j	                  ||«      ‘Œ c}S c c}w c c}w r!   )Ú_commandr)   r(   r+   Úreplace_quants)Úselfr$   r)   r(   ÚdomainÚexs         r   r)   zClosedDomainProver.assumptions8   si   € Ø"&§-¡-×";Ñ";Ó"=Ö>˜Q’qÐ>ˆÐ>Ø�}‰}×!Ñ!Ó#ˆÜ˜D +Ó.ˆØ:EÖF°B�×#Ñ# B¨Õ/ÒFÐFùò ?ùò Gs   �	A.ÁA3c                 ó¢   — | j                   j                  «       }t        || j                   j                  «       «      }| j	                  ||«      S r!   )r/   r(   r+   r)   r0   )r1   r(   r2   s      r   r(   zClosedDomainProver.goal>   s@   € Ø�}‰}×!Ñ!Ó#ˆÜ˜D $§-¡-×";Ñ";Ó"=Ó>ˆØ×"Ñ" 4¨Ó0Ð0r   c           	      ó  — t        |t        «      rh|D �cg c]1  }|j                  j                  |j                  t        |«      «      ‘Œ3 }}|D �cg c]  }| j                  ||«      ‘Œ }}t        d„ |«      S t        |t        «      rF|j                  | j                  |j                  |«      | j                  |j                  |«      «      S t        |t        «      r| j                  |j                  |«       S t        |t        «      rh|D �cg c]1  }|j                  j                  |j                  t        |«      «      ‘Œ3 }}|D �cg c]  }| j                  ||«      ‘Œ }}t        d„ |«      S |S c c}w c c}w c c}w c c}w )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                 ó   — | |z  S r!   r   ©ÚxÚys     r   ú<lambda>z3ClosedDomainProver.replace_quants.<locals>.<lambda>U   ó
   €  q¨1¡u€ r   c                 ó   — | |z  S r!   r   r7   s     r   r:   z3ClosedDomainProver.replace_quants.<locals>.<lambda>b   r;   r   )Ú
isinstancer
   ÚtermÚreplaceÚvariabler   r0   r   r   Ú	__class__ÚfirstÚsecondr   r   )r1   r3   r2   ÚdÚ	conjunctsÚcÚ	disjunctss          r   r0   z!ClosedDomainProver.replace_quantsC   si  € ô �bœ-Ô(àMSöØHI�—‘—‘ §¡Ô-?ÀÓ-BÕCðˆIð ð BKÖK¸A˜×,Ñ,¨Q°Õ7ÐKˆIÐKÜÑ,¨iÓ8Ð8Ü˜Ô-Ô.Ø—<‘<Ø×#Ñ# B§H¡H¨fÓ5Ø×#Ñ# B§I¡I¨vÓ6óð ô ˜Ô-Ô.Ø×'Ñ'¨¯©°Ó8Ð8Ð8Ü˜Ô,Ô-àMSöØHI�—‘—‘ §¡Ô-?ÀÓ-BÕCðˆIð ð BKÖK¸A˜×,Ñ,¨Q°Õ7ÐKˆIÐKÜÑ,¨iÓ8Ð8àˆIùò'ùò Lùòùò Ls   •6E6ÁE;Ä6F ÅFN)r   r   r   Ú__doc__r)   r(   r0   r   r   r   r-   r-   2   s   „ ñò
Gò1ó
!r   r-   c                   ó   — e Zd ZdZd„ Zy)ÚUniqueNamesProverz[
    This is a prover decorator that adds unique names assumptions before
    proving.
    c                 óp  — | j                   j                  «       }t        t        | j                   j	                  «       |«      «      }t        «       }|D ]S  }t        |t        «      sŒ|j                  j                  }|j                  j                  }||   j                  |«       ŒU g }t        |«      D ]y  \  }}||dz   d D ]i  }	|	||   vsŒt        t        |«      t        |	«      «      }
t        «       j                  |
|«      r||   j                  |	«       ŒX|j!                  |
 «       Œk Œ{ ||z   S )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)r/   r)   Úlistr+   r(   Ú	SetHolderr=   r   rB   r@   rC   ÚaddÚ	enumerater   r   ÚproveÚappend)r1   r)   r2   Úeq_setsr$   ÚavÚbvÚnew_assumptionsÚiÚbÚnewEqExs              r   r)   zUniqueNamesProver.assumptionsm   s&  € ð
 —m‘m×/Ñ/Ó1ˆä”j §¡×!3Ñ!3Ó!5°{ÓCÓDˆô “+ˆØò 	$ˆAÜ˜!Ô/Õ0Ø—W‘W×%Ñ%�Ø—X‘X×&Ñ&�à˜‘—‘ Õ#ð	$ð ˆÜ˜fÓ%ò 	9‰DˆAˆqØ˜A ™E˜G�_ò 9�à˜G A™JÒ&Ü0Ü*¨1Ó-Ô/AÀ!Ó/Dó�Gô “y—‘ w°Ô<ð   ™
Ÿ™ qÕ)ð (×.Ñ.°¨xÕ8ñ9ð	9ð ˜_Ñ,Ð,r   N)r   r   r   rH   r)   r   r   r   rJ   rJ   g   s   „ ñó
"-r   rJ   c                   ó   — e Zd ZdZd„ Zy)rN   z&
    A list of sets of Variables.
    c                 óp   — t        |t        «      sJ ‚| D ]
  }||v sŒ|c S  |h}| j                  |«       |S )zV
        :param item: ``Variable``
        :return: the set containing 'item'
        )r=   r   rR   )r1   ÚitemÚsÚnews       r   Ú__getitem__zSetHolder.__getitem__—   sI   € ô
 ˜$¤Ô)Ð)Ð)Øò 	ˆAØ�qŠyØ’ð	ð ˆfˆØ�‰�CÔØˆ
r   N)r   r   r   rH   r_   r   r   r   rN   rN   ’   s   „ ñór   rN   c                   ó.   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚClosedWorldProvera¡  
    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           	      ó(  — | j                   j                  «       }| j                  |«      }g }|D �]V  }||   }| j                  |«      }|D �cg c]  }t	        |«      ‘Œ }}g }	|j
                  D ]O  }
g }t        ||
«      D ]   \  }}|j                  t        ||«      «       Œ" |	j                  t        d„ |«      «       ŒQ |j                  D ]C  }i }t        ||d   «      D ]
  \  }}|||<   Œ |	j                  |d   j                  |«      «       ŒE |	r,| j                  ||«      }t        d„ |	«      }t        ||«      }nt        | j                  ||«      «      }|d d d…   D ]  }t        ||«      }Œ |j                  |«       �ŒY ||z   S c c}w )Nc                 ó   — | |z  S r!   r   r7   s     r   r:   z/ClosedWorldProver.assumptions.<locals>.<lambda>Ø   s
   € °Q¸±U€ r   r   rL   c                 ó   — | |z  S r!   r   r7   s     r   r:   z/ClosedWorldProver.assumptions.<locals>.<lambda>æ   s
   € °°Q±€ r   éÿÿÿÿ)r/   r)   Ú_make_predicate_dictÚ_make_unique_signaturer   Ú
signaturesÚziprR   r   r   Ú
propertiesÚsubstitute_bindingsÚ_make_antecedentr   r   r
   )r1   r)   Ú
predicatesrV   ÚpÚ
predHolderÚnew_sigÚvÚnew_sig_exsrG   ÚsigÚequality_exsÚv1Úv2ÚpropÚbindingsÚ
antecedentÚ
consequentÚaccumÚnew_sig_vars                       r   r)   zClosedWorldProver.assumptionsÆ   sÉ  € Ø—m‘m×/Ñ/Ó1ˆà×.Ñ.¨{Ó;ˆ
àˆØó #	*ˆAØ# A™ˆJØ×1Ñ1°*Ó=ˆGØ:AÖB°QÔ-¨aÕ0ÐBˆKÐBàˆIð "×,Ñ,ò K�Ø!�Ü! +¨sÓ3ò D‘F�B˜Ø ×'Ñ'Ô(:¸2¸rÓ(BÕCðDà× Ñ ¤Ñ(:¸LÓ!IÕJð	Kð #×-Ñ-ò H�à�Ü! +¨t°A©wÓ7ò &‘F�B˜Ø#%�H˜R’Lð&à× Ñ   a¡×!<Ñ!<¸XÓ!FÕGðHñ à!×2Ñ2°1°gÓ>�
Ü#Ñ$6¸	ÓB�
Ü% j°*Ó=‘ô *¨$×*?Ñ*?ÀÀ7Ó*KÓL�ð  '¡t¨ t™}ò :�Ü% k°5Ó9‘ð:à×"Ñ" 5Ö)ðG#	*ðJ ˜_Ñ,Ð,ùòE Cs   ÁFc                 óL   — t        d„ t        |j                  «      D «       «      S )z˜
        This method figures out how many arguments the predicate takes and
        returns a tuple containing that number of unique variables.
        c              3   ó0   K  — | ]  }t        «       –— Œ y ­wr!   )r   )r#   rW   s     r   r%   z;ClosedWorldProver._make_unique_signature.<locals>.<genexpr>ø   s   è ø€ ÒP¨1”_×&ÑPùs   ‚)ÚtupleÚrangeÚsignature_len)r1   ro   s     r   rg   z(ClosedWorldProver._make_unique_signatureó   s    € ô
 ÑP´°j×6NÑ6NÓ0OÔPÓPÐPr   c                 ó:   — |}|D ]  } |t        |«      «      }Œ |S )z†
        Return an application expression with 'predicate' as the predicate
        and 'signature' as the list of arguments.
        )r   )r1   Ú	predicateÚ	signaturery   rq   s        r   rl   z"ClosedWorldProver._make_antecedentú   s.   € ð
 ˆ
Øò 	;ˆAÙ#Ô$6°qÓ$9Ó:‰Jð	;àÐr   c                 óV   — t        t        «      }|D ]  }| j                  ||«       Œ |S )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)r1   r)   rm   r$   s       r   rf   z&ClosedWorldProver._make_predicate_dict  s3   € ô !¤Ó,ˆ
Øò 	0ˆAØ× Ñ   JÕ/ð	0àÐr   c                 ón  — t        |t        «      rB|j                  «       \  }}t        |t        «      r||   j	                  t        |«      «       y y t        |t        «      r9| j                  |j                  |«       | j                  |j                  |«       y t        |t        «      �r|j                  g}|j                  }t        |t        «      r8|j                  |j                  «       |j                  }t        |t        «      rŒ8t        |t        «      �rt        |j                  t        «      rñt        |j                  t        «      rÖ|j                  j                  «       \  }}|j                  j                  «       \  }	}
t        |t        «      r‹t        |	t        «      rz||D �cg c]  }|j                  ‘Œ c}k(  r\||
D �cg c]  }|j                  ‘Œ c}k(  r>||	   j                  t        |«      |j                  f«       ||   j!                  |«       y y y y y y y y y c c}w c c}w r!   )r=   r   Úuncurryr	   Ú
append_sigr   r   r‡   rB   rC   r
   r@   r>   rR   r   Úappend_propÚvalidate_sig_len)r1   Ú
expressionÚpredDictÚfuncÚargsrs   r>   Úfunc1Úargs1Úfunc2Úargs2rq   s               r   r‡   z!ClosedWorldProver._map_predicates  sÌ  € Ü�jÔ"7Ô8Ø#×+Ñ+Ó-‰JˆD�$Ü˜$Ô :Ô;Ø˜‘×)Ñ)¬%°«+Õ6ð <ä˜
¤MÔ2Ø× Ñ  ×!1Ñ!1°8Ô<Ø× Ñ  ×!2Ñ!2°HÕ=Ü˜
¤MÕ2à×&Ñ&Ð'ˆCØ—?‘?ˆDÜ˜T¤=Ô1Ø—
‘
˜4Ÿ=™=Ô)Ø—y‘y�ô ˜T¤=Õ1ô ˜$¤Õ.Ü˜dŸj™jÔ*?Ô@ÄZØ—K‘KÔ!6ôFð $(§:¡:×#5Ñ#5Ó#7‘L�E˜5Ø#'§;¡;×#6Ñ#6Ó#8‘L�E˜5ä" 5Ô*DÔEÜ& uÔ.HÔIØ¸Ö#>°1 A§J£JÒ#>Ò>Ø¸Ö#>°1 A§J£JÒ#>Ò>à  ™×3Ñ3´U¸3³ZÀÇÁÐ4LÔMØ  ™×8Ñ8¸Õ=ð ?ð ?ð Jð FðFÐ@ð /ð 3ùò  $?ùÚ#>s   Æ2H-ÇH2N)	r   r   r   rH   r)   rg   rl   rf   r‡   r   r   r   ra   ra   ¦   s"   „ ñò>+-òZQòò
ó>r   ra   c                   ó4   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	y)	r†   aŸ  
    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                 ó.   — g | _         g | _        d | _        y r!   ©rh   rj   r�   ©r1   s    r   Ú__init__zPredHolder.__init__?  s   € ØˆŒØˆŒØ!ˆÕr   c                 ó\   — | j                  |«       | j                  j                  |«       y r!   )rŒ   rh   rR   ©r1   rp   s     r   rŠ   zPredHolder.append_sigD  s"   € Ø×Ñ˜gÔ&Ø�‰×Ñ˜wÕ'r   c                 ób   — | j                  |d   «       | j                  j                  |«       y )Nr   )rŒ   rj   rR   )r1   Únew_props     r   r‹   zPredHolder.append_propH  s&   € Ø×Ñ˜h q™kÔ*Ø�‰×Ñ˜xÕ(r   c                 ó„   — | j                   €t        |«      | _         y | j                   t        |«      k7  rt        d«      ‚y )NzSignature lengths do not match)r�   ÚlenÚ	Exceptionr›   s     r   rŒ   zPredHolder.validate_sig_lenL  s=   € Ø×ÑÐ%Ü!$ W£ˆDÕØ×Ñ¤3 w£<Ò/ÜÐ<Ó=Ð=ð 0r   c                 óV   — d| j                   › d| j                  › d| j                  › d�S )Nú(ú,ú)r—   r˜   s    r   Ú__str__zPredHolder.__str__R  s.   € Ø�4—?‘?Ð# 1 T§_¡_Ð$5°Q°t×7IÑ7IÐ6JÈ!ÐLÐLr   c                 ó   — d| z  S )Nz%sr   r˜   s    r   Ú__repr__zPredHolder.__repr__U  s   € Ø�d‰{Ðr   N)
r   r   r   rH   r™   rŠ   r‹   rŒ   r¥   r§   r   r   r   r†   r†   /  s&   „ ñò"ò
(ò)ò>òMór   r†   c                  ó  — t         j                  }  | d«      } | d«      } | d«      }t        |||g«      }t        |j	                  «       «       t        |«      }t        d«       |j                  «       D ]  }t        d|«       Œ t        d|j                  «       «       t        |j	                  «       «        | d«      } | d«      } | d«      } | d«      }t        ||||g«      }t        |j	                  «       «       t        |«      }t        d«       |j                  «       D ]  }t        d|«       Œ t        d|j                  «       «       t        |j	                  «       «        | d«      } | d«      } | d«      } | d«      }t        ||||g«      }t        |j	                  «       «       t        |«      }t        d«       |j                  «       D ]  }t        d|«       Œ t        d|j                  «       «       t        |j	                  «       «        | d«      } | d«      } | d	«      }t        |||g«      }t        |j	                  «       «       t        |«      }t        d«       |j                  «       D ]  }t        d|«       Œ t        d|j                  «       «       t        |j	                  «       «        | d
«      } | d«      } | d«      } | d«      } | d«      }	 | d«      }t        ||||||	g«      }t        |j	                  «       «       t        |«      }t        d«       |j                  «       D ]  }t        d|«       Œ t        d|j                  «       «       t        |j	                  «       «       y )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   ÚprintrQ   r-   r)   r(   )
ÚlexprÚp1Úp2rF   Ú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                  óÚ  — t         j                  }  | d«      } | d«      } | d«      }t        |||g«      }t        |j	                  «       «       t        |«      }t        d«       |j                  «       D ]  }t        d|«       Œ t        d|j                  «       «       t        |j	                  «       «        | d«      } | d«      } | d	«      } | d
«      }t        ||||g«      }t        |j	                  «       «       t        |«      }t        d«       |j                  «       D ]  }t        d|«       Œ t        d|j                  «       «       t        |j	                  «       «       y )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°   rQ   rJ   r)   r(   )r±   r²   r³   rF   r´   Úunpr$   r¶   s           r   Úunique_names_demor¼   ž  s4  € Ü×!Ñ!€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                  ób  — t         j                  }  | d«      } | d«      } | d«      }t        |||g«      }t        |j	                  «       «       t        |«      }t        d«       |j                  «       D ]  }t        d|«       Œ t        d|j                  «       «       t        |j	                  «       «        | d«      } | d«      } | d	«      } | d
«      } | d«      }t        |||||g«      }t        |j	                  «       «       t        |«      }t        d«       |j                  «       D ]  }t        d|«       Œ t        d|j                  «       «       t        |j	                  «       «        | d«      } | d«      } | d«      } | d«      } | d«      }t        |||||g«      }t        |j	                  «       «       t        |«      }t        d«       |j                  «       D ]  }t        d|«       Œ t        d|j                  «       «       t        |j	                  «       «       y )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°   rQ   ra   r)   r(   )	r±   r²   r³   rF   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                  óN  — t         j                  }  | d«      } | d«      } | d«      }t        |||g«      }t        |j	                  «       «       t        t        t        |«      «      «      }|j                  «       D ]  }t        |«       Œ t        |j	                  «       «       y )Nr¾   r¿   rÀ   )	r   r¯   r   r°   rQ   r-   rJ   ra   r)   )r±   r²   r³   rF   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                  ót  — t         j                  } g }|j                   | d«      «       |j                   | d«      «       |j                   | d«      «       |j                   | d«      «       |j                   | d«      «       |j                   | d«      «       |j                   | d«      «       |j                   | d«      «       |j                   | d	«      «       |j                   | d
«      «       |j                   | d«      «       |j                   | d«      «       |j                   | d«      «       |j                   | d«      «       t        d |«      }t	        t        |«      «      }|j                  «       D ]  }t        |«       Œ t        d|«       t        d|«       t        d|«       y )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¯   rR   r   rJ   ra   r)   r°   Úprint_proof)r±   Úpremisesr´   rÄ   r$   s        r   Údefault_reasoning_demorÉ   õ  s}  € Ü×!Ñ!€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                 óÂ   — t         j                  }t         || «      |«      }t        t	        |«      «      }t        | |j                  «       |j                  «       «       y r!   )r   r¯   r   rJ   ra   r°   rQ   )r(   rÈ   r±   r´   rÄ   s        r   rÇ   rÇ   !  sE   € Ü×!Ñ!€EÜ™E $›K¨Ó2€FÜÔ 1°&Ó 9Ó:€GÜ	ˆ$�—‘“ §¡£Õ0r   c                  óh   — t        «        t        «        t        «        t        «        t	        «        y r!   )r¹   r¼   rÂ   rÅ   rÉ   r   r   r   ÚdemorÌ   (  s    € ÜÔÜÔÜÔÜÔÜÕr   Ú__main__N)+rH   Ú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+   r-   rJ   rM   rN   ra   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   