Re: Re: Puzzle

*To*: mathgroup at smc.vnet.net*Subject*: [mg2432] Re: [mg2419] Re: [mg2258] Puzzle*From*: Allan Hayes <hay at haystack.demon.co.uk>*Date*: Wed, 8 Nov 1995 23:42:14 -0500

Patrick Jemmer <paddy at sun4.bham.ac.uk> >Subject: [mg2419] Re: [mg2258] Puzzle Asks about the following lst={6, 44, 30, 15, 24, 12, 33, 23, 18}; chk={a___, b_, c___, d_, e___, f_, g___, h_, i___}; cnd= b + d + f + h == 100; sln={b,d,f,h}; lst/.chk/;cnd->sln Condition::obscf: Warning: Obsolete use of Condition (chk /; cnd) evaluated to Fail. {6, 44, 30, 15, 24, 12, 33, 23, 18} (instead of {44, 15, 23, 18}) Patrick: Here is a version that works. lst/.Evaluate[chk]/;Evaluate[cnd]->sln {44, 15, 23, 18} Explanation: Consider the full form, HoldForm[FullForm[lst/.chk/;cnd->sln]]//Print ReplaceAll[lst, Rule[Condition[chk, cnd], sln]] Condition has attribute HoldAll; so in evaluating ReplaceAll[lst, Rule[Condition[chk, cnd], sln]], the literal Condition[chk, cnd] is looked at before chk and cnd are evaluated. Since chk is not a pattern Condition[chk,cnd] is replaced by Fail ( had cnd been True it would have evaluated to chk). This results in ReplaceAll[...] returning lst. However, it is not sufficient to evaluate only chk: for ReplaceAll[lst, Rule[Condition[Evaluate[chk], cnd], sln]] becomes ReplaceAll[lst, Rule[ Condition[ {a___,b_,c___,d_,e___,f_,g___,h_,i___}, cnd ], sln ] ] But then, when ReplaceAll looks at a match for {a___, b_, c___, d_, e___, f_, g___, h_, i___}, literal cnd has no variables a,b,c,d,e,f,g,h,i to receive the matches and so cnd remains just cnd and evaluates to b + d + f + h == 100, which is never True. Consequently no replacement is ever made and lst is returned unchanged. Thus, lst/.Evaluate[chk]/;cnd->sln {6, 44, 30, 15, 24, 12, 33, 23, 18} The evaluation can be followed using Trace or TracePrint. Allan Hayes, hay at haystack.demon.co.uk