Re: ReplaceAll feature
- To: mathgroup at yoda.physics.unc.edu
- Subject: Re: ReplaceAll feature
- From: withoff
- Date: Thu, 8 Oct 92 10:21:05 CDT
> In the following, why is Out[1] different from Out[2] and Out[3]: > > Mathematica 2.0 for SGI Iris > Copyright 1988-91 Wolfram Research, Inc. > -- Terminal graphics initialized -- > > In[1]:= (a+b+c+d)/.{a+b->x,c+d->y} > > Out[1]= c + d + x > > In[2]:= (a+b+c+d)/.a+b->x/.c+d->y > > Out[2]= x + y > > In[3]:= (a+b+c+d)//.{a+b->x,c+d->y} > > Out[3]= x + y > > I guess it has something to do with Flat. This is not a big problem, but IF > it can be easily fixed, it should be fixed. But maybe there are some "deep" > reasons why it behaves like this ? > ------------------------------------------------------------------- > Pekka Janhunen tel (+358) 0 1929 535 > Finnish Meterological Institute fax (+358) 0 1929 539 > Geophysics Department tlx 124436 EFKL SF > P.O.BOX 503, SF-00101 Helsinki > FINLAND > Internet : Pekka.Janhunen at fmi.fi > SPAN & NSI : 22104::pouta::Pekka.Janhunen > EARN/Bitnet : Pekka.Janhunen%fmi.fi at fingate > x.400 : /C=fi/ADMD=Mailnet/PRMD=IL/SUR=Janhunen/GIV=Pekka/ > ------------------------------------------------------------------- Yes, this does have something to do with Flat. ReplaceAll[e, rules] (or e /. rules) stops making replacements in a particular subexpression as soon as a replacement causes the subexpression to change. ReplaceAll starts here with the entire expression, a+b+c+d, and applies the first rule, a+b->x. Since Plus has attribute Flat, the pattern matcher looks for combinations of terms in the sum that match the pattern a+b. When a match is found, application of the rule causes the expression to change, so ReplaceAll stops without ever looking at the second rule: In[10]:= a+b+c+d /. {a+b->x, c+d->y} Out[10]= c + d + x If there are no matches with the entire expression for either rule, ReplaceAll starts looking at subexpressions. In the example below, the first rule (a+b->x) matches the first subexpression (a+b), and no further rules are applied to that subexpression. The second rule (c+d->y) is applied in the same manner to the second subexpression: In[11]:= {a+b, c+d} /. {a+b->x, c+d->y} Out[11]= {x, y} If Replace all is nested, as in ReplaceAll[ReplaceAll[e, r1], r2] (or e /. r1 /. r2), the inner evaluation, ReplaceAll[e, r1], applies the first rule, and the outer evaluation applies the second. Dave Withoff withoff at wri.com