ó <¿CVc@sÂdZddlmZmZddlmZmZddlmZddl m Z ddl m Z m Z mZmZmZmZmZmZmZmZmZmZmZmZddlmZmZddlmZd efd „ƒYZ d „Z!d efd „ƒYZ"defd„ƒYZ#de$fd„ƒYZ%defd„ƒYZ&ede'fd„ƒYƒZ(d„Z)d„Z*d„Z+d„Z,d„Z-d„Z.d„Z/e0dkr¾e/ƒndS(uÆ 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. iÿÿÿÿ(tprint_functiontunicode_literals(tProver9tProver9Command(t defaultdict(treduce(tVariableExpressiontEqualityExpressiontApplicationExpressiont ExpressiontAbstractVariableExpressiont AllExpressiontBooleanExpressiontNegatedExpressiontExistsExpressiontVariablet ImpExpressiont AndExpressiontunique_variabletoperator(tProvertProverCommandDecorator(tpython_2_unicode_compatibletProverParseErrorcBseZRS((t__name__t __module__(((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyRscCsC|dkr|}n|| g}ttjd„|DƒtƒƒS(Ncss|]}|jƒVqdS(N(t constants(t.0ta((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pys %s(tNoneRRtor_tset(tgoalt assumptionstall_expressions((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyt get_domain s  tClosedDomainProvercBs)eZdZd„Zd„Zd„ZRS(u] This is a prover decorator that adds domain closure assumptions before proving. cCscg|jjƒD] }|^q}|jjƒ}t||ƒ}g|D]}|j||ƒ^qGS(N(t_commandR!R R#treplace_quants(tselfRR!R tdomaintex((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyR!,s"cCs7|jjƒ}t||jjƒƒ}|j||ƒS(N(R%R R#R!R&(R'R R(((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyR 2scCsRt|tƒrug|D]$}|jj|jt|ƒƒ^q}g|D]}|j||ƒ^qG}td„|ƒSt|tƒr²|j |j|j |ƒ|j|j |ƒƒSt|t ƒrÕ|j|j|ƒ St|t ƒrJg|D]$}|jj|jt|ƒƒ^që}g|D]}|j||ƒ^q}td„|ƒS|SdS(uÞ 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`` cSs||@S(N((txty((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pytFscSs||BS(N((R*R+((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyR,PsN(t isinstanceR ttermtreplacetvariableRR&RR t __class__tfirsttsecondR R(R'R)R(tdt conjunctstct disjuncts((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyR&7s .%.%(RRt__doc__R!R R&(((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyR$'s  tUniqueNamesProvercBseZdZd„ZRS(u[ This is a prover decorator that adds unique names assumptions before proving. c Cs+|jjƒ}tt|jjƒ|ƒƒ}tƒ}xI|D]A}t|tƒr=|jj }|j j }||j |ƒq=q=Wg}x˜t |ƒD]Š\}}x{||dD]k} | ||kr°tt |ƒt | ƒƒ} tƒj| |ƒr ||j | ƒq|j| ƒq°q°Wq•W||S(u¦ - Domain = union([e.free()|e.constants() for e in all_expressions]) - if "d1 = d2" cannot be proven from the premises, then add "d1 != d2" i(R%R!tlistR#R t SetHolderR-RR2R0R3taddt enumerateRRtprovetappend( R'R!R(teq_setsRtavtbvtnew_assumptionstitbtnewEqEx((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyR!Ys$     (RRR8R!(((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyR9TsR;cBseZdZd„ZRS(u& A list of sets of Variables. cCsVt|tƒst‚x|D]}||kr|SqWt|gƒ}|j|ƒ|S(uV :param item: ``Variable`` :return: the set containing 'item' (R-RtAssertionErrorRR?(R'titemtstnew((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyt __getitem__€s   (RRR8RK(((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyR;|stClosedWorldProvercBs;eZdZd„Zd„Zd„Zd„Zd„ZRS(u¡ 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) cCsÔ|jjƒ}|j|ƒ}g}x¥|D]}||}|j|ƒ}g|D]}t|ƒ^qQ}g} xf|jD][} g} x3t|| ƒD]"\} } | jt| | ƒƒq•W| jt d„| ƒƒqyWx_|j D]T}i}x+t||dƒD]\} } | || ßs(ttupletranget signature_len(R'RV((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyRNÚscCs-|}x |D]}|t|ƒƒ}q W|S(u† Return an application expression with 'predicate' as the predicate and 'signature' as the list of arguments. (R(R't predicatet signatureR`RX((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyRSás cCs1ttƒ}x|D]}|j||ƒqW|S(uÏ Create a dictionary of predicates from the assumptions. :param assumptions: a list of ``Expression``s :return: dict mapping ``AbstractVariableExpression`` to ``PredHolder`` (Rt PredHoldert_map_predicates(R'R!RTR((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyRMës  c CsØt|tƒrM|jƒ\}}t|tƒrÔ||jt|ƒƒqÔn‡t|tƒr…|j|j|ƒ|j|j |ƒnOt|t ƒrÔ|j g}|j }x,t|t ƒr×|j |j ƒ|j }q¬Wt|tƒrÔt|jtƒrÑt|j tƒrÑ|jjƒ\}}|j jƒ\} } t|tƒrÎt| tƒrÎ|g|D]} | j ^q]krÎ|g| D]} | j ^qkrÎ|| jt|ƒ|jfƒ||j|ƒqÎqÑqÔndS(N(R-RtuncurryR t append_sigRdRRjR2R3R R0R.R?Rt append_proptvalidate_sig_len( R't expressiontpredDicttfunctargsRZR.tfunc1targs1tfunc2targs2RX((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyRj÷s0   "" (RRR8R!RNRSRMRj(((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyRLŽs  -  RicBsDeZdZd„Zd„Zd„Zd„Zd„Zd„ZRS(uŸ 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'. cCsg|_g|_d|_dS(N(RORQRRf(R'((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyt__init__"s  cCs!|j|ƒ|jj|ƒdS(N(RnROR?(R'RW((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyRl's cCs%|j|dƒ|jj|ƒdS(Ni(RnRQR?(R'tnew_prop((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyRm+scCsI|jdkr!t|ƒ|_n$|jt|ƒkrEtdƒ‚ndS(NuSignature lengths do not match(RfRtlent Exception(R'RW((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyRn/scCsd|j|j|jfS(Nu (%s,%s,%s)(RORQRf(R'((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyt__str__5scCsd|S(Nu%s((R'((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyt__repr__9s( RRR8RwRlRmRnR{R|(((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyRis     c Cs–tj}|dƒ}|dƒ}|dƒ}t|||gƒ}t|jƒƒt|ƒ}tdƒx!|jƒD]}td|ƒquWtd|jƒƒt|jƒƒ|dƒ}|dƒ}|dƒ}|dƒ}t||||gƒ}t|jƒƒt|ƒ}tdƒx!|jƒD]}td|ƒq*Wtd|jƒƒt|jƒƒ|dƒ}|dƒ}|dƒ}|dƒ}t||||gƒ}t|jƒƒt|ƒ}tdƒx!|jƒD]}td|ƒqßWtd|jƒƒt|jƒƒ|dƒ}|dƒ}|d ƒ}t|||gƒ}t|jƒƒt|ƒ}tdƒx!|jƒD]}td|ƒq…Wtd|jƒƒt|jƒƒ|d ƒ}|d ƒ}|d ƒ}|d ƒ}|dƒ} |dƒ}t|||||| gƒ}t|jƒƒt|ƒ}tdƒx!|jƒD]}td|ƒqXWtd|jƒƒt|jƒƒdS(Nuexists x.walk(x)u man(Socrates)uwalk(Socrates)u assumptions:u ugoal:u -walk(Bill)u walk(Bill)u all x.walk(x)u girl(mary)u dog(rover)uall x.(girl(x) -> -dog(x))uall x.(dog(x) -> -girl(x))uchase(mary, rover)u1exists y.(dog(y) & all x.(girl(x) -> chase(x,y)))(R t fromstringRtprintR>R$R!R ( tlexprtp1tp2R6tprovertcdpRtp3tp4tp5((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pytclosed_domain_demo<sz                               cCshtj}|dƒ}|dƒ}|dƒ}t|||gƒ}t|jƒƒt|ƒ}tdƒx!|jƒD]}td|ƒquWtd|jƒƒt|jƒƒ|dƒ}|dƒ}|d ƒ}|d ƒ}t||||gƒ}t|jƒƒt|ƒ}tdƒx!|jƒD]}td|ƒq*Wtd|jƒƒt|jƒƒdS( Nu man(Socrates)u man(Bill)uexists x.exists y.(x != y)u assumptions:u ugoal:u!all x.(walk(x) -> (x = Socrates))uBill = Williamu Bill = Billyu-walk(William)(R R}RR~R>R9R!R (RR€RR6R‚tunpRR„((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pytunique_names_demo{s0            c Cs;tj}|dƒ}|dƒ}|dƒ}t|||gƒ}t|jƒƒt|ƒ}tdƒx!|jƒD]}td|ƒquWtd|jƒƒt|jƒƒ|dƒ}|dƒ}|d ƒ}|d ƒ}|d ƒ}t|||||gƒ}t|jƒƒt|ƒ}tdƒx!|jƒD]}td|ƒq9Wtd|jƒƒt|jƒƒ|d ƒ}|d ƒ}|dƒ}|dƒ}|dƒ}t|||||gƒ}t|jƒƒt|ƒ}tdƒx!|jƒD]}td|ƒqýWtd|jƒƒt|jƒƒdS(Nuwalk(Socrates)u(Socrates != Bill)u -walk(Bill)u assumptions:u ugoal:usee(Socrates, John)usee(John, Mary)u(Socrates != John)u(John != Mary)u-see(Socrates, Mary)uall x.(ostrich(x) -> bird(x))u bird(Tweety)u -ostrich(Sam)u Sam != Tweetyu -bird(Sam)(R R}RR~R>RLR!R ( RR€RR6R‚tcwpRR„R…((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pytclosed_world_demo•sL                    cCsŸtj}|dƒ}|dƒ}|dƒ}t|||gƒ}t|jƒƒttt|ƒƒƒ}x|jƒD]}t|ƒqwWt|jƒƒdS(Nusee(Socrates, John)usee(John, Mary)u-see(Socrates, Mary)( R R}RR~R>R$R9RLR!(RR€RR6R‚tcommandR((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pytcombination_prover_demo½s    cCs†tj}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ƒƒtd|ƒ}tt|ƒƒ}x|jƒD]}t|ƒqGWt d|ƒt d|ƒt d|ƒdS(Nu'all x.(elephant(x) -> animal(x))u'all x.(bird(x) -> animal(x))u%all x.(dove(x) -> bird(x))u%all x.(ostrich(x) -> bird(x))u(all x.(flying_ostrich(x) -> ostrich(x))u)all x.((animal(x) & -Ab1(x)) -> -fly(x))u(all x.((bird(x) & -Ab2(x)) -> fly(x))u)all x.((ostrich(x) & -Ab3(x)) -> -fly(x))u#all x.(bird(x) -> Ab1(x))u#all x.(ostrich(x) -> Ab2(x))u#all x.(flying_ostrich(x) -> Ab3(x))u elephant(E)udove(D)u ostrich(O)u-fly(E)ufly(D)u-fly(O)( R R}R?RRR9RLR!R~t print_proof(RtpremisesR‚RŒR((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pytdefault_reasoning_demoËs.   cCsPtj}t||ƒ|ƒ}tt|ƒƒ}t||jƒ|jƒƒdS(N(R R}RR9RLR~R>(R RRR‚RŒ((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyRŽïs cCs'tƒtƒtƒtƒtƒdS(N(R‡R‰R‹RR(((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pytdemoõs u__main__N(1R8t __future__RRtnltk.inference.prover9RRt collectionsRt functoolsRtnltk.sem.logicRRRR R R R R RRRRRRtnltk.inference.apiRRt nltk.compatRRzRR#R$R9R:R;RLtobjectRiR‡R‰R‹RRRŽR‘R(((sm/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/nonmonotonic.pyt s0^ -(„) ?  (  $