ó <¿CVc@s$dZddlmZmZddlZddlmZddlmZddl m Z ddl m Z m Z mZmZmZmZmZmZmZmZmZmZddlmZmZdd lmZd efd „ƒYZd efd „ƒYZdefd„ƒYZede fd„ƒYƒZ!d„Z"d„Z#ddd„Z%d„Z&d„Z'd„Z(d„Z)ede*fd„ƒYƒZ+dd„Z,d„Z-defd„ƒYZ.defd „ƒYZ/d!e*fd"„ƒYZ0d#„Z1d$„Z2d%„Z3d&„Z4e5d'kr e4ƒndS((u; Module for a resolution-based First Order theorem prover. iÿÿÿÿ(tprint_functiontunicode_literalsN(t defaultdict(treduce(t skolemize( tVariableExpressiontEqualityExpressiontApplicationExpressiont ExpressiontNegatedExpressiontVariablet AndExpressiontunique_variablet OrExpressiont is_indvartIndividualVariableExpressionR(tProvertBaseProverCommand(tpython_2_unicode_compatibletProverParseErrorcBseZRS((t__name__t __module__(((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyRstResolutionProvercBs/eZdZeZdded„Zd„ZRS(uANSWERcCs÷|sg}nd}y|g}|r;|jt| ƒƒnx!|D]}|jt|ƒƒqBW|j|ƒ\}}|rttj|ƒƒnWnYtk rì}|jrÐt |ƒj dƒrÐt }g}qí|rãt|ƒqí|‚nX||fS(uÜ :param goal: Input expression to prove :type goal: sem.Expression :param assumptions: Input expressions to use as assumptions in the proof :type assumptions: list(sem.Expression) u maximum recursion depth exceededN( tNonetextendtclausifyt_attempt_prooftprinttResolutionProverCommandt_decorate_clausest RuntimeErrort _assume_falsetstrt startswithtFalse(tselftgoalt assumptionstverbosetresulttclausestate((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyt_prove"s(     cCsGttƒ}d}x(|t|ƒkr<||jƒs/||rV||dd}n |d}xÌ|t|ƒkr+||kr|r||jƒ r||j|ƒ||j||ƒ}|rxH|D]@}|d|df|_|j|ƒt|ƒsÍt|fSqÍWd}Pqn|d7}qcWn|d7}qWt|fS(Niiÿÿÿÿi( Rtlisttlent is_tautologytappendtunifyt_parentstTrueR"(R#R(ttriedtitjt newclausest newclause((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyRAs,   #   N( RRt ANSWER_KEYR2RRR"R+R(((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyRsRcBsAeZdddd„Zed„Zed„Zed„ƒZRS(cCsP|dk r$t|tƒs-t‚n tƒ}tj||||ƒd|_dS(ué :param goal: Input expression to prove :type goal: sem.Expression :param assumptions: Input expressions to use as assumptions in the proof. :type assumptions: list(sem.Expression) N(Rt isinstanceRtAssertionErrorRt__init__t_clauses(R#R$R%tprover((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyR;bs   cCsa|jdkrZ|jj|jƒ|jƒ|ƒ\|_}||_tj|ƒ|_ n|jS(uh Perform the actual proof. Store the result to prevent unnecessary re-proving. N( t_resultRt_proverR+R$R%R<RRt_proof(R#R&R(((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pytprovers  cCs˜|j|ƒtƒ}tttjƒƒ}xf|jD][}xR|D]J}t|tƒrB|j |krBt|j t ƒ rB|j |j ƒqBqBWq5W|S(N( RAtsetRR RR8R<R9RtfunctiontargumentRtadd(R#R&tanswerst answer_extclausetterm((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyt find_answerss   c Cs"d}tg|D]}tt|ƒƒ^qƒ}ttt|ƒƒƒ}xÒtt|ƒƒD]¾}d}d}||jƒr‡d}n||jrªt||jƒ}nd|tt||ƒƒd|}d|tt|dƒƒt|dƒ}|d|||||f7}q\W|S(u, Decorate the proof output. uuAu Tautologyu iu[%s] %s %s %s (tmaxR-R trangeR.R1( R(toutRHtmax_clause_lent max_seq_lenR4tparentsttauttseq((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyRŒs+  &,"N( RRRR;R"RARJt staticmethodR(((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyRas tClausecBs‰eZd„Zd d d ed„Zd„Zd„Zd„Zd„Z d„Z d„Z d„Z d „Z d „Zd „Zd „ZRS(cCs&tj||ƒd|_d|_dS(N(R,R;Rt _is_tautologyR1(R#tdata((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyR;¢s c CsW|dkrtƒ}n|dkr3ggf}n|dkrNggf}nt|tƒrlt|ƒ}nt|||||t|ƒ}g}x}t|ƒD]o\}} ||krxTt|ƒD]C\} } || krÂ| |krÂ| j| ƒrÂ|j | ƒqÂqÂWqqWg} x:t t |ƒƒD]&}||kr)| j ||ƒq)q)W| S(uÔ Attempt to unify this Clause with the other, returning a list of resulting, unified, Clauses. :param other: ``Clause`` with which to unify :param bindings: ``BindingDict`` containing bindings that should be used during the unification :param used: tuple of two lists of atoms. The first lists the atoms from 'self' that were successfully unified with atoms from 'other'. The second lists the atoms from 'other' that were successfully unified with atoms from 'self'. :param skipped: tuple of two ``Clause`` objects. The first is a list of all the atoms from the 'self' Clause that have not been unified with anything on the path. The second is same thing for the 'other' Clause. :param debug: bool indicating whether debug statements should print :return: list containing all the resulting ``Clause`` objects that could be obtained by unification N( Rt BindingDictR9tboolt DebugObjectt_iterate_firstt_complete_unify_patht enumeratetsubsumesR/RLR-( R#tothertbindingstusedtskippedtdebugR6tsubsumedR4tc1R5tc2R'((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyR0§s(    ' cCs%x|D]}||krtSqWtS(u„ Return True iff every term in 'self' is a term in 'other'. :param other: ``Clause`` :return: bool (R"R2(R#R^R)((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyt isSubsetOfÐs  c Cs¨g}x>|D]6}t|tƒr5|j|jƒq |j| ƒq Wt|ƒ}tƒ}ggf}ggf}ttƒ}tt |||||t |ƒƒdkS(uì Return True iff 'self' subsumes 'other', this is, if there is a substitution such that every term in 'self' can be unified with a term in 'other'. :param other: ``Clause`` :return: bool i( R9R R/RIRTRWRYR"R-RZt_subsumes_finalize( R#R^t negatedothertatomtnegatedotherClauseR_R`RaRb((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyR]Üs       cCsttj|||ƒƒS(N(RTR,t __getslice__(R#tstarttend((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyRk÷scCs)tg|D]}||kr |^q ƒS(N(RT(R#R^R)((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyt__sub__úscCsttj||ƒƒS(N(RTR,t__add__(R#R^((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyRoýscCså|jdk r|jSx¿t|ƒD]±\}}t|tƒs#t|ƒd}xƒ||krÐ||}t|tƒr•|j|krÃt|_tSn.t|tƒrÃ||jkrÃt|_tSn|d8}qQWq#q#Wt |_t S(u› Self is a tautology if it contains ground terms P and -P. The ground term, P, must be an exact match, ie, not using unification. iN( RURR\R9RR-R RIR2R"(R#R4R)R5tb((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyR.s$    cCsttjd„|DƒƒS(Ncss%|]}|jƒ|jƒBVqdS(N(tfreet constants(t.0Ri((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pys s(Rtoperatortor_(R#((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyRqscCs)tg|D]}|j||ƒ^q ƒS(u½ Replace every instance of variable with expression across every atom in the clause :param variable: ``Variable`` :param expression: ``Expression`` (RTtreplace(R#tvariablet expressionRi((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyRvscCs&tg|D]}|j|ƒ^q ƒS(u¾ Replace every binding :param bindings: A list of tuples mapping Variable Expressions to the Expressions to which they are bound :return: ``Clause`` (RTtsubstitute_bindings(R#R_Ri((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyRy%scCsddjd„|DƒƒdS(Nu{u, css|]}d|VqdS(u%sN((Rstitem((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pys 0su}(tjoin(R#((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyt__str__/scCsd|S(Nu%s((R#((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyt__repr__2sN(RRR;RR"R0RfR]RkRnRoR.RqRvRyR|R}(((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyRT s )       c Cs^|jd|||fƒt|ƒ s4t|ƒ rM|||||||ƒSt|||||||dƒ}|d|dg|df}|t|d||||||dƒ7}yŠt|d|d||ƒ\} } } |d|d| d} |d|d| d} |t| | | | ggf||dƒ7}Wntk rUnX|SdS(uF This method facilitates movement through the terms of 'self' uunify(%s,%s) %siiN(tlineR-t_iterate_secondRZt _unify_termstBindingException(tfirsttsecondR_R`Ratfinalize_methodRbR't newskippedt newbindingstnewusedtunusedtnewfirstt newsecond((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyRZ5s"*&0 c Cs8|jd|||fƒt|ƒ s4t|ƒ rM|||||||ƒS|d|d|dgf}t||d|||||dƒ}yŠt|d|d||ƒ\} } } |d|d| d} |d|d| d} |t| | | | ggf||dƒ7}Wntk r/nX|SdS(uG This method facilitates movement through the terms of 'other' uunify(%s,%s) %siiN(R~R-RR€R(R‚RƒR_R`RaR„RbR…R'R†R‡RˆR‰RŠ((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyRRs&&0 cCsøt|tƒst‚t|tƒs*t‚|dkrBtƒ}n|dkr]ggf}nt|tƒrÁt|tƒrÁt|j||ƒ}|d|g|d|gf}ggf}n*t|tƒr%t|tƒr%t||j|ƒ}|d|g|d|gf}ggf}nÆt|t ƒrt|j j |j fgƒ}|d|g|df}g|gf}nlt|t ƒrÙt|j j |j fgƒ}|d|d|gf}|ggf}nt ||fƒ‚|||fS(uÑ This method attempts to unify two terms. Two expressions are unifiable if there exists a substitution function S such that S(a) == S(-b). :param a: ``Expression`` :param b: ``Expression`` :param bindings: ``BindingDict`` a starting set of bindings with which the unification must be consistent :return: ``BindingDict`` A dictionary of the bindings required to unify :raise ``BindingException``: If the terms cannot be unified iiN(R9RR:RRWR Rtmost_general_unificationRIRR‚RwRƒR(R)RpR_R`R†R‡Rˆ((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyR€ls0   ""cCsj|ds|drUt|d|d||ƒ}|jd|ƒ|j|ƒgS|jdƒgSdS(Niiu -> New Clause: %su -> End(RTR~Ry(R‚RƒR_R`RaRbR7((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyR[—s   cCs-t|dƒ r%t|ƒ r%tgSgSdS(Ni(R-R2(R‚RƒR_R`RaRb((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyRg scCs~g}xqtt|ƒƒD]]}xG|jƒD]9}t|jƒr,ttƒƒ}|j||ƒ}q,q,W|j|ƒqW|S(uC Skolemize, clausify, and standardize the variables apart. ( t _clausifyRRqRtnameRR RvR/(Rxt clause_listRHRqtnewvar((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyR«scCs:t|tƒr)t|jƒt|jƒSt|tƒr™t|jƒ}t|jƒ}t|ƒdksnt‚t|ƒdks†t‚|d|dgSt|tƒr¸t |gƒgSt|t ƒr×t |gƒgSt|t ƒr-t|j t ƒrt |gƒgSt|j tƒr-t |gƒgSnt ƒ‚dS(u; :param expression: a skolemized expression in CNF iiN(R9R RŒR‚RƒR R-R:RRTRR RIR(RxR‚Rƒ((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyRŒ¸s$RWcBsSeZdd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z RS( cCs7i|_|r3x!|D]\}}|||'su{u}(R{tsortedRtkeys(R#tdata_str((R#sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyR|&s.cCsd|S(Nu%s((R#((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyR}*sN( RRRR;R—R™RšRoRœR|R}(((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyRWÐs %    cCsÆ|dkrtƒ}n||kr(|St|tƒrGt|||ƒSt|tƒrft|||ƒSt|tƒr°t|tƒr°t|j|j|ƒt|j|j|ƒSt ||fƒ‚dS(uh Find the most general unification of the two given expressions :param a: ``Expression`` :param b: ``Expression`` :param bindings: ``BindingDict`` a starting set of bindings with which the unification must be consistent :return: a list of bindings :raise BindingException: if the Expressions cannot be unified N( RRWR9Rt_mgu_varRR‹RCRDR(R)RpR_((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyR‹.s   cCsR|j|jƒ|jƒBkr4t||fƒ‚nt|j|fgƒ|SdS(N(RwRqRrRRW(tvarRxR_((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyR HsRcBseZd„ZRS(cCs:t|tƒr&tj|d|ƒntj||ƒdS(Nu'%s' cannot be bound to '%s'(R9ttuplet ExceptionR;(R#targ((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyR;Ps(RRR;(((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyROstUnificationExceptioncBseZd„ZRS(cCstj|d||fƒdS(Nu'%s' cannot unify with '%s'(R£R;(R#R)Rp((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyR;Ws(RRR;(((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyR¥VsRYcBs)eZedd„Zd„Zd„ZRS(icCs||_||_dS(N(tenabledtindent(R#R¦R§((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyR;\s cCst|j|j|ƒS(N(RYR¦R§(R#R4((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyRo`scCs%|jr!td|j|ƒndS(Nu (R¦RR§(R#R~((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyR~cs (RRR2R;RoR~(((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyRY[s c Cstdƒtdƒtdƒtdƒtdƒtdƒtdƒtdƒtdƒtdƒtdƒtdƒtd ƒtd ƒtjd ƒ}tjd ƒ}tjd ƒ}td|||tƒj|||gƒfƒtjdƒ}tjdƒ}tjdƒ}td|||tƒj|||gƒfƒtjdƒ}tjdƒ}td||tƒj||gƒfƒdS(Numan(x)u(man(x) -> man(x))u(man(x) -> --man(x))u-(man(x) and -man(x))u(man(x) or -man(x))u(man(x) iff man(x))u-(man(x) iff -man(x))u all x.man(x)u--all x.some y.F(x,y) & some x.all y.(-F(x,y))usome x.all y.sees(x,y)uall x.(man(x) -> mortal(x))u man(Socrates)umortal(Socrates)u%s, %s |- %s: %suall x.(man(x) -> walks(x))u man(John)usome y.walks(y)u5some e1.some e2.(believe(e1,john,e2) & walk(e2,mary))usome e0.walk(e0,mary)u %s |- %s: %s(tresolution_testRt fromstringRRRA(tp1tp2tctp((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyttestResolutionProverhs2              //cCs9tj|ƒ}tƒj|ƒ}td||fƒdS(Nu |- %s: %s(RR©RRAR(R*tftt((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyR¨†scCsƒtj}tt|dƒƒƒtt|dƒƒƒtt|dƒƒƒtt|dƒƒƒtt|dƒƒƒtt|dƒƒƒtt|dƒƒƒtt|dƒƒƒtt|d ƒƒƒtt|d ƒƒƒtt|d ƒƒƒtt|d ƒƒƒtt|d ƒƒƒtt|dƒƒƒtt|dƒƒƒtt|dƒƒƒtt|dƒƒƒdS(Nu P(x) | Q(x)u(P(x) & Q(x)) | R(x)uP(x) | (Q(x) & R(x))u(P(x) & Q(x)) | (R(x) & S(x))uP(x) | Q(x) | R(x)uP(x) | (Q(x) & R(x)) | S(x)uexists x.P(x) | Q(x)u-(-P(x) & Q(x))u P(x) <-> Q(x)u-(P(x) <-> Q(x))u -(all x.P(x))u-(some x.P(x))u some x.P(x)usome x.all y.P(x,y)uall y.some x.P(x,y)uall z.all y.some x.P(x,y,z)u1all x.(all y.P(x,y) -> -all y.(Q(x,y) -> R(x,y)))(RR©RR(tlexpr((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyt test_clausify‹s$ cCsKtƒtƒtƒtƒtjdƒ}tt||gƒjƒƒdS(Numan(x)(R²RR®RR©RRA(R­((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pytdemo¥s u__main__(6t__doc__t __future__RRRtt collectionsRt functoolsRtnltk.semRtnltk.sem.logicRRRRR R R R R RRtnltk.inference.apiRRt nltk.compatRR£RRRR,RTRZRRR€R[RgRRŒtobjectRWR‹R RR¥RYR®R¨R²R³R(((sk/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/inference/resolution.pyt sB RC?”  + ]