JL iddlZddlmZddlmZddlmZmZmZm Z m Z m Z m Z m Z mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZddlm Z GddeZ!Gdd eZ"Gd d Z#Gd d e#eZ$dZ%Gdde#eZ&Gdde&eZ'Gdde&eZ(Gdde'eZ)Gdde&e Z*Gdde#eZ+Gdde#eZ,Gdde#eZ-Gdd e#e Z.Gd!d"e.e Z/Gd#d$e/eZ0Gd%d&e.eZ1Gd'd(e/Z2Gd)d*e#e Z3d+Z4Gd,d-e5e#eZ6Gd.d/e7Z8gfd0Z9Gd1d2Z:d3Z;d4Z ? ll1o$**Q-93J3J"J Y445 r3c|j|}|jd|jtj}t ||S)Nr&)make_VariableExpressionr\rsr r.DrtProposition)rJrQr_variabledrss r4r]zDrtParser.handle_propsA//4 S!**9??;h,,r3ct||S)zlThis method serves as a hook for other logic parsers that have different equality expression classesDrtEqualityExpressionrJfirstseconds r4make_EqualityExpressionz!DrtParser.make_EqualityExpressions%UF33r3c|tjk(rdS|tjvrtS|tjvrd}|Sy)zbThis method serves as a hook for other logic parsers that have different boolean operatorsct||dSrPDrtConcatenationr}r~s r4z9DrtParser.get_BooleanExpression_factory..s)9%)Nr3ct|tr!t|j|j|St|tr!t |j |j |StdNz'Antecedent of implication must be a DRS) isinstancer!rlrmrr}r~ Exceptionrs r4make_imp_expressionzDDrtParser.get_BooleanExpression_factory..make_imp_expressionsQeS)uzz5;;??e%56+EKKvNN IJJr3N)r r*rGDrtOrExpressionrH)rJrQrs r4get_BooleanExpression_factoryz'DrtParser.get_BooleanExpression_factorysK )$$ $N N I%% %" " I&& & K' &r3c|||SrPr2)rJfactoryr}r~s r4make_BooleanExpressionz DrtParser.make_BooleanExpressionsuf%%r3ct||SrPDrtApplicationExpression)rJfunctionarguments r4make_ApplicationExpressionz$DrtParser.make_ApplicationExpressions'(;;r3c*tt|SrP)DrtVariableExpressionr)rJnames r4ruz!DrtParser.make_VariableExpressions$Xd^44r3ct||SrP)DrtLambdaExpression)rJ variablesterms r4make_LambdaExpressionzDrtParser.make_LambdaExpressions"9d33r3N)r'r(r)__doc__rArNrRr`rerYrhrjr]rrrrrurr2r3r4r6r6:sP.  !+:20 &  - 4 (&<54r3r6ceZdZdZeZedZdZdZ dZ dZ dZ dd Z ed Zdd Zd Zdd ZdZdZdZdZdZdZdZdZy) DrtExpressionz_ This is the base abstract DRT Expression from which every DRT Expression extends. c8|jj|SrP) _drt_parserparse)clsss r4 fromstringzDrtExpression.fromstrings$$Q''r3ct||SrPrrJothers r4applytozDrtExpression.applytos'e44r3ct|SrPrbrMs r4__neg__zDrtExpression.__neg__s #D))r3ctSrP)NotImplementedrs r4__and__zDrtExpression.__and__sr3c>t|tsJt||SrP)rrrrs r4__or__zDrtExpression.__or__s%///tU++r3ct|tsJt|tr!t|j|j|St|t r!t |j |j|Stdr) rrr!rlrmrr}r~rrs r4__gt__zDrtExpression.__gt__sa%/// dC tyy$**e4 4 d, -#DJJ UC CABBr3Nct|tsJ|jj}|jj}|j ||S)a< Check for logical equivalence. Pass the expression (self <-> other) to the theorem prover. If the prover says it is valid, then the self and other are equal. :param other: an ``DrtExpression`` to check equality against :param prover: a ``nltk.inference.api.Prover`` )rrsimplifyfolequiv)rJrproverf1f2s r4rzDrtExpression.equivsN%/// ]]_ " ^^  ! ! #xxF##r3cFtd|jjz)Nz#'%s' object has no attribute 'type')AttributeError __class__r'rMs r4typezDrtExpression.types! 1DNN4K4K K  r3ctrPNotImplementedError)rJ signatures r4 typecheckzDrtExpression.typechecks !##r3ct||dSrPrrs r4__add__zDrtExpression.__add__seT22r3ct)z Return the set of discourse referents in this DRS. :param recursive: bool Also find discourse referents in subterms? :return: list of ``Variable`` objects rrJ recursives r4get_refszDrtExpression.get_refss "##r3ct|txrit|jtxrM|jjj t jk(xrt|jtS)zIs self of the form "PRO(x)"?) rrrDrtAbstractVariableExpressionrwrr r+rDrtIndividualVariableExpressionrMs r4is_pronoun_functionz!DrtExpression.is_pronoun_functionsd t5 6 K4==*GH K &&++y/@/@@ K4==*IJ  r3ct||SrPrzr|s r4rz%DrtExpression.make_EqualityExpression s$UF33r3ct|SrP)r)rJrws r4ruz%DrtExpression.make_VariableExpression s $X..r3ct|SrP)resolve_anaphorarMs r4rzDrtExpression.resolve_anaphoras %%r3c<|jd|jS)Nc"|jSrP)eliminate_equality)es r4rz2DrtExpression.eliminate_equality..sq/C/C/Er3)visit_structuredrrMs r4rz DrtExpression.eliminate_equalitys$$%Et~~VVr3c@dj|jS)zG Draw the DRS :return: the pretty print string  )join_prettyrMs r4 pretty_formatzDrtExpression.pretty_formats yy((r3c6t|jyrP)printrrMs r4 pretty_printzDrtExpression.pretty_prints d  "#r3c6t|jyrP) DrsDrawerdrawrMs r4rzDrtExpression.draws$r3rPF)r'r(r)rr6r classmethodrrrrrrrpropertyrrrrrrrurrrrrr2r3r4rrs +K((5*,C $  $3$ 4/&W)$r3rc|eZdZdZddZddZdZddZdZdZ d Z d Z d Z d Z d ZdZej"ZdZy)r!z%A Discourse Representation Structure.Nc.||_||_||_y)z :param refs: list of ``DrtIndividualVariableExpression`` for the discourse referents :param conds: list of ``Expression`` for the conditions N)rlrm consequent)rJrlrmrs r4rAz DRS.__init__&s   $r3c F||jvr|s|S|jj|}|jr|jj||d|}nd}t |jd||j gz|j|dzdz|j Dcgc]}|j||d|c}|S|rt|j|jzD]}t|} t| } |jj|}|jr|jj|| d|}nd}t |jd|| gz|j|dzdz|j Dcgc]}|j|| d|c}|}|jr|jj||||}nd}t |j|j Dcgc]}|j||||c}|Scc}wcc}wcc}w)_Replace all instances of variable v with expression E in self, where v is free in self.TNr8) rlindexrreplacer!rwrmsetfreerr) rJrwrd replace_bound alpha_convertircondrefnewvarnewvarexs r4rz DRS.replace0s tyy   IIOOH-??!%!8!8 *dM"J"&JIIbqMZ%8%8$99DIIa!egJOO,==C,S1F4VK|]}|jdywTN)r).0rs r4 zDRS.get_refs..ys#IAJJt$4#IsT)rllistr from_iterablermrextendr)rJr conds_refss r4rz DRS.get_refsush T###Idjj#II&J!!$//":":4"@A 99 r3ctt||j}|jr!|j ||j||Sz:see: Expression.visit())rmaprmrrp)rJr combinatorpartss r4visitz DRS.visits>S4::./ ?? LL$//2 3%  r3c |jr||jnd}||jtt||j|S)#:see: Expression.visit_structured()N)rrlrrrm)rJrrrs r4rzDRS.visit_structureds;26//Xdoo.t $))T#h *C%DjQQr3c4|}d}|t|jkrD|j|}t|trt|jt rt|j t rttt|j|j jhz |jd||j|dzdz|j}|j j|jjk7r4|j|j j|jdd}d}|dz}|dz }|t|jkrDg}|jD]h}|j}|j}t|tr%|js|js |jsX|j!|j|jr|jjnd}t|j||S)Nrr8F)lenrmrr r}rr~r!rrrlrwrrrrrp)rJrxrrrmnew_cond new_cond_simprs r4rzDRS.eliminate_equalitys #cii. 99Q*>)??@IIbqMCIIa!eg$66NN ;;''4::+>+>>++dkk&:&:DJJuUCAQ FA!#cii. $II 'D..0H$--/M}c2 %% && ++ X& '=@NNS^^668PT 388UJ//r3c|jrd}|jr6tt|jDcgc]}|j c}}|r%t ||jj }n|jj }|j dddD]}t||}|S|js tdtt|jDcgc]}|j c}}tt|j|j dddD]}t||}|Scc}wcc}w)Nz-Cannot convert DRS with no conditions to FOL.) rrmrrrrrlrrrr_order_ref_stringsr)rJaccumrrs r4rzDRS.fols ??Ezz} .K1quuw.KL%eT__-@-@-BC++-yy2 2%c51 2L:: OPP=DJJ*Gq1557*GHE8T%<%.s r3z __z_ z| z |z|--z-|z|_z_|)rrrlrmfilterrmaxrrrljustrDrtBinaryExpression_assemble_prettyr IMP)rJ refs_liner cond_line cond_lineslengthlinerxs r4rz DRS._prettysqHHT44TYY?@ IM @D*DLLN; "      c)n%Sj-A(BBCsV|#d*yv..5sV|#d*  =GGDtdjj((4/G  H cFl"T)*  +  ??&77Y]]DOO$;$;$=  ' Hs"E !EEc|Dcgc]}d|z }}g}g}g}g}|D]j}t|r|j| t|r|j|=t|r|j|Z|j|lt |t |dzt |dzt |dzScc}w)N%scFt|dddgt|dddk(S)Nr9rrintrvs r4rz(DRS._order_ref_strings..s(sAabE2;s1QR5zQ3O/Pr3)keyc P|dt|dddgt|dddk(fSNrr8rr)r+s r4rz(DRS._order_ref_strings..s2qtS!AB%S12ZST_9U5V.Wr3c P|dt|dddgt|dddk(fSr/r)r+s r4rz(DRS._order_ref_strings..s2adC12 C!"JRSO8T4U-Vr3)rrprrsorted) rJrlrstringsind_vars func_vars event_vars other_varsrs r4rzDRS._order_ref_stringss)-.#4#:..    %A|"A  #Q!!!$!!!$ % : Z%PQ RY$WX YX#VW X /s Cct|trt|jt|jk(r|}t |j|jD])\}}|j |}|j ||d}+|j|jk(r[t|jt|jk(r0t |j|jD] \}}||k(r yyyz}Defines equality modulo alphabetic variance. If we are comparing \x.M and \y.N, then check equality of M and N[x/y].TF) rr!rrlziprurrrm)rJrconverted_otherr1r2varexc1c2s r4__eq__z DRS.__eq__s eS !499~UZZ0"'!$))_-A-ABOFB 88.s9ddTk9rr') formatrrrlrmrr rVr rkrJrxs r4__str__z DRS.__str__s"" HHT,,TYY7 8 II9djj9 9  ??--   ( ) // "  r3rPFTr)r'r(r)rrArrrr rrrrrr@rBr__hash__rLr2r3r4r!r!#sV/%<|+ !R "0H04 ,$!""Hr3r!ct|jr t|St|jr t |St |jr t |St|S)z This is a factory method that instantiates and returns a subtype of ``DrtAbstractVariableExpression`` appropriate for the given variable. )rrrrDrtFunctionVariableExpressionrDrtEventVariableExpressionDrtConstantExpression)rws r4rr"sT .x88 HMM ",X66 X]] #)(33$X..r3c&eZdZdZddZdZdZy)rc|SrPr2rMs r4rz!DrtAbstractVariableExpression.fol2 r3cgSrr2rs r4rz&DrtAbstractVariableExpression.get_refs5s r3c4d|z}dt|z}||||gSNr'rrrJrblanks r4rz%DrtAbstractVariableExpression._pretty9s' 4Kc!f ua''r3c|SrPr2rMs r4rz0DrtAbstractVariableExpression.eliminate_equality>rUr3Nr)r'r(r)rrrrr2r3r4rr1s( r3rc eZdZy)rNr'r(r)r2r3r4rrB r3rc eZdZy)rPNr_r2r3r4rPrPHr`r3rPc eZdZy)rQNr_r2r3r4rQrQNr`r3rQc eZdZy)rRNr_r2r3r4rRrRTr3rRcjeZdZdZd dZdZddZdZdZe jZ dZ dZ d Z d Zd Zy )rvc ||_||_yrPrwrx)rJrwrxs r4rAzDrtProposition.__init__Ys  r3c |j|k(rIt|tsJdt|j|jj ||||St|j|jj ||||S)Nz4Can only replace a proposition label with a variable)rwrrrvrxr)rJrwrdrrs r4rzDrtProposition.replace]s ==H $9 FE F"##  :}mT  "   :}mT r3c^t|j|jjSrP)rvrwrxrrMs r4rz!DrtProposition.eliminate_equalityls dmmTXX-H-H-JKKr3c@|r|jjdSgSNT)rxrrs r4rzDrtProposition.get_refsos*3txx  &;;r3c|j|jk(xr4|j|jk(xr|j|jk(SrP)rrwrxrs r4r@zDrtProposition.__eq__rsA NNeoo - & / &EII% r3c||k( SrPr2rs r4rBzDrtProposition.__ne__yrCr3c6|jjSrP)rxrrMs r4rzDrtProposition.fol~sxx||~r3c>|jj}dtd|jzz}|ddDcgc] }|dz|z c}|ddDcgc]}d|jzdz|zc}z|ddDcgc] }|dz|z c}zScc}wcc}wcc}w)Nrr'r8r9r&)rxrrrw)rJdrs_sr\r%s r4rzDrtProposition._prettys  "c$.//,1"1I 6DUS[4  6=B1QZHTtdmm#c)D0H I.3ABi8dus{T!8 9 6H8sBB<Bc4|||jgSr)rxrJrrs r4r zDrtProposition.visits8DHH-.//r3cH||j||jS)r rgrrs r4rzDrtProposition.visit_structureds$--$(();<.s:1dQh:rIr8rzr9z \ r:z /\ ) rwrrrprr DOTrr)rJrr var_stringr{r\r%s r4rzDrtLambdaExpression._prettys%]]O yynn.   T]] +99Dnn.XX: ::Y]]J \\^ c*o%/9"1~ >tVe^d " >2BG@sD"D'4D,D1cr|r)|jg|jjdzS|jgSrT)rwrrrs r4rzDrtLambdaExpression.get_refss7;DT]]Odii006 6 JN-- r3Nr)r'r(r)rrrrr2r3r4rrs @  r3rc0eZdZddZdZedZdZy)rcx|r7|jjd|jjdzSgSr)r}rr~rs r4rzDrtBinaryExpression.get_refss;GPDJJ   % (<(>< AN)r'r(r)rrr2r3r4rrs A?r3rceZdZdZy)r{czt|jj|jjSrP)r r}rr~rMs r4rzDrtEqualityExpression.fols%!$**.."2DKKOO4EFFr3N)r'r(r)rr2r3r4r{r{sGr3r{ceZdZdZddZddZdZdZddZdZ d Z d Z e jZ d Zd Zd ZdZdZdZy)rzDRS of the form '(DRS + DRS)'Nc@tj|||||_yrP)rrAr)rJr}r~rs r4rAzDrtConcatenation.__init__ s%%dE6:$r3c|j}|j}|j}||jvrB|r|j ||||}|j ||||}|r|j ||||}n|rt |jd|j zD]U}tt|} |j || d|}|j || d|}|sB|j || d|}W|j ||||}|j ||||}|r|j ||||}|j|||S)rT) r}r~rrrrrrrr) rJrwrdrrr}r~rrr,s r4rzDrtConcatenation.replaces[ __  t}} & j- j-!+!3!3 *m]"Jt}}T23joo6GGUC-oc.BCA!MM#q$ FE#^^CD-HF!%/%7%7Qm%T UMM(J }UE^^Hj-WF'//j- ~~eVZ88r3cf|j}t|trJ|jSrP)rrrrrKs r4rz#DrtConcatenation.eliminate_equality6s-mmoc#3444%%''r3cX|jj}|jj}|jr|jjnd}t |t rt |t rt |jdt |jdzD])}tt|}|j||d}+t |j|jz|j|jz|S|j|||Srk)r}rr~rrr!rrrrrrlrmr)rJr}r~rrrs r4rzDrtConcatenation.simplify<s ##%%%'37??T__--/ eS !j&=5>>$/03vt7L3MM ;.s/CDVT: ; uzzFKK/v||1KZX X>>%<  ??a!4!4!67Ar3cFtj|j|j|j |j|j }|j r=tj|tj|j j}|SrP) rrrr}rr~rr r rrKs r4rzDrtConcatenation._prettyssw!22   tzz * JJL   t{{ +  ??%66Y]]DOO$;$;$=C r3ct|tr!|jDcgc]}|dd c}Stj ||Scc}wr)rrrrrrs r4rzDrtConcatenation._pretty_subexsB e- .+0==?;4D2J; ;#11$>>WX x 3Xdkk5JKL Lr3c|j|j}|j|j}tj|zdz|j zdz|ztj z}|jrKtj|zdztjzdzd|jzztj zS|S)Nrr') _str_subexr}r~rrVrrkrr r )rJr}r~rxs r4rLzDrtConcatenation.__str__s +-kkE!C'$**,6 MM " "4 (4==+A+A$+G G  r3c |j\}}|j}|Dcgc]}|j}}ttt|g|z}t ||}|Dcgc]}t ||}}t t|t t|}|ddD cgc]\} } | dzdj| zdz!c} } |ddD cgc]\} } | dzdj| zdz!c} } z|ddD cgc]\} } | dzdj| zdz!c} } zScc}wcc}wcc} } wcc} } wcc} } w)Nr9rr:rrEru) uncurryrrrrrrr9r) rJrargsfunction_linesarg args_linesr arg_linesfunc_args_lines func_line args_lines r4rz DrtApplicationExpression._prettysi$!))+/34ckkm4 4C.!1J!>?@ (CMWX oi;X Xs>4Z8H3IJK-/$E$E $ENrr|r2r3r4rrsO  r3rcNdt|dzg}|||t|z zzS)NrrrZ)linesrpad_lines r4rrs0c%(m#$H 8y3u:56 66r3c&eZdZdZddZdZdZy)PossibleAntecedentsct|S)zSet of free variables.)rrMs r4rzPossibleAntecedents.frees 4yr3cxt}|D]*}||k(r|j||j|,|S)r)rrp)rJrwrdrrresultitems r4rzPossibleAntecedents.replacesB%& "Dx J' D!  "  r3c2d|z}dt|z}|||gSrYrZr[s r4rzPossibleAntecedents._prettys% 4Kc!f ua  r3c>ddjd|DzdzS)Nr$rEc3&K|] }d|z ywrHr2)rits r4rz.PossibleAntecedents.__str__..s7BdRi7rIr%)rrMs r4rLzPossibleAntecedents.__str__s!SXX7$777#==r3NrM)r'r(r)rrrrLr2r3r4rrs ! >r3rc eZdZy)AnaphoraResolutionExceptionNr_r2r3r4rrrdr3rct|tr|jrt}|D]m}|j D]X}|j |}|j |jj k(s8||jk(rH|j|Zot|dk(r|d}n|}|j|j|St|j||gz}t|j||gz}|j ||St|trg} |jD]} t| ||gz} t| tr|t| j tr$| j } | j"| _| | _t| j"tr$| j"st%d| j z| j| |j&rt|j&||gz} nd} |j |j(| | St|t*r|St|t,r)|j t|j.||gzSt|t0rl|j&rt|j&||gz} nd} |j t|j ||gzt|j"||gz| St|t2rB|j t|j ||gzt|j"||gzSt|t4r4|j |j6t|j.||gzSy)Nr8rz+Variable '%s' does not resolve to anything.)rr rrrrurrrprrrrr!rmr r}r~rrrlrrrrr rrw)rdtrailpossible_antecedentsancestorrrefex resolution r_function r_argumentr_condsrr_condtemprs r4rrsL*34  ) ) +#6#8 ! ;#,,. ;C&>>sCE **=*=*G*GG!4!44,33E: ; ;'(A-1!4 1 55j6I6I:V V)**=*=u |?STJ)**=*=u |?STJ'' J? ? J $$$ #D%dEZL,@AF&"45fll,?@!< KKMFK  r3cL|jjjdS)z Get the height of a line of text linespace)rrmetricsrMs r4_get_text_heightzDrsDrawer._get_text_heighths{{'' 44r3c|j|j|j|||jr%t s|jj y|j |j||S)z Draw the DRSN)_handlerx _draw_commandrrmainloopr)rJrKys r4rzDrsDrawer.drawlsP TXXt111a8 ;;wy KK ";;txxA. .r3c>|j||j||S)a! Return the bottom-rightmost point without actually drawing the item :param expression: the item to visit :param x: the top of the current drawing area :param y: the left side of the current drawing area :return: the bottom-rightmost point )r_visit_command)rJrdrKrs r4rzDrsDrawer._visitus||J(;(;QBBr3ct|tr5|jj||d|jj|ntt|t rd|\}}|jj ||||||jz|jdzz}|jj|||||j|||S)a Draw the given item at the given location :param item: the item to draw :param x: the top of the current drawing area :param y: the left side of the current drawing area :return: the bottom-rightmost point nw)anchorrtextr9) rstrr create_textrtuplecreate_rectanglerBUFFER create_liner)rJrrKrrr horiz_line_ys r4rzDrsDrawer._draw_commands dC KK # #AqDKK.s>D1H>rIz r9)r rlrrmrrr) rJrdrrKrleftrrl max_rightrrs r4rzDrsDrawer._handle_DRSs4;;T[[ ??88>joo>>DD%dD&9F$++/!   "(( &"&,,tWdF"K 51 $++% & d++- ; ;F T[[  6*Aq11r3c (|j\}}t|ts|j}|jg}|j |||d}t |g|Dcgc]}|j |||dc}z} | |z } |j|| |j} |j|||| d} |j|| |j} |tj| | d} t|D]i\}}|j|| |j}|j||| |d} |dzt|ksL|tjdz| | d} k|tj | | d} | | fScc}w)Nr8rr)rrrrrrrrrrrr rV enumeraterrirk)rJrdrrKrrrfunction_bottomr max_bottom line_heightfunction_drawing_toprcentred_string_toprarg_drawing_tops r4rz'DrsDrawer._handle_ApplicationExpressions#++-$($AB!**H''(D++h15a8  d KsS!Q!7!: K K !1n  $55 {H44  Xw3GHK"33 {D113  /AB1E o UFAs"44; 3 3OLLguoFqIE1us4y  # 5u>PQRST U 0BCAFz""?!LsF c 2tjd|jzztjz}|j |||d}|j |j |||\}}||||j|||z |j||fS)Nr'r) r LAMBDArwrrrrrr)rJrdrrKrrrrs r4rz"DrsDrawer._handle_LambdaExpression)s$$tj.A.A'AAIMMQ ##Iq!4Q7,,zJ  q$00FQJ@U@U@WX vr3c |j|jddd}|j|jddd}t||}|j |||j }|t j||d} |jj}|j|j|| |j |||\} } |d|jz| |d} |jj}|j|j|| |j |||\} } |t j| |d} | t| | fS)Nrr8z %s ) rr}r~rrrr rVrrrrk) rJrdrrKr first_height second_heightr'r)r first_bottom second_bottoms r4rz"DrsDrawer._handle_BinaryExpression8sd{{:#3#3Q:1=  J$5$5q!qA"''77 $       " "1k< @ !  !1!1!33U ([],[runs(x)]))z([x],[PRO(x), sees(John,x)]) ([x],[man(x), -([],[walks(x)])])*([],[(([x],[man(x)]) -> ([],[walks(x)]))])z2====================Test fol()====================z\====================Test alpha conversion and lambda expression equality====================z\x.([],[P(x)])zz?====================Test resolve_anaphora()====================z,([x,y,z],[dog(x), cat(y), walks(z), PRO(z)])z3([],[(([x],[dog(x)]) -> ([y],[walks(y), PRO(y)]))])z(([x,y],[]) + ([],[PRO(x)]))z;====================Test pretty_print()====================([],[])z@([],[([x],[big(x), dog(x)]) -> ([],[bark(x)]) -([x],[walk(x)])])z'([x,y],[x=y]) + ([z],[dog(z), walk(z)])z4([],[([x],[]) | ([y],[]) | ([z],[dog(z), walk(z)])])z0\P.\Q.(([x],[]) + P(x) + Q(x))(\x.([],[dog(x)])))rrrrrrrr)dexpre1e2s r4demorAns ,-  $ $E %& '( %+ ,- %) *+ %+ ,- %7 89 %6 78 %/ 01 %3 45 %= >? ,- %& ' + + -. VW  !B "I  (3- (B "I "(O 9: 5!PQ RS UVW 5!@A BC 56 *""$ Kln 45BBD ABOOQ =>KKMr3c ddlm}gd}|D]'}tj |}|j )y#t$r}tdd}~wwxYw)Nr)rz,tkinter is required, but it's not available.) rKr=z([x],[])z([x],[man(x)])r8r9z\x.([],[man(x), walks(x)])z\x y.([],[sees(x,y)])z)([],[(([],[walks(x)]) + ([],[runs(x)]))])r:r;)rr ImportError ValueErrorrrr)rr expressionsds r4 test_drawrGs\I K  $ $Q ' # IGHHIs9 A A  A__main__)>r functoolsr itertoolsrnltk.sem.logicrrrrr r r r r rrrrrrrrrrrrrrrr nltk.utilrr r6rr!rrrrPrQrRrvrcrrrrr{rrrrrrrrrrArGr'r2r3r4rMs6 + +4 4DddN|-|~ /M3M" !#?  !#=  #%<  9;M ;4]J;4| =*; $" -)9" J%-)9%P .0A ?*L?G/1CG Y+Yx! }.C! H7 >$ z>2 ) (*P fn5n5b %NP2 zFr3