Re: algebraic substitution rules
- To: mathgroup at smc.vnet.net
- Subject: [mg30737] Re: [mg30716] algebraic substitution rules
- From: Andrzej Kozlowski <andrzej at tuins.ac.jp>
- Date: Sun, 9 Sep 2001 03:26:26 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
It is obvious why the first case works, so I shall only explain why the
second does not. First, a kind of digression. Actually the rule that you
used is in any case probably not the one you meant. In fact it is
equivalent to:
1+x^2+x^3+x^4 /. {x^2->1+x ,x^3->x(1+x) ,x^4->(1+x)^2,a_->a}
The reason for this is that you are using Rule rather than
RuleDelayed (:>) so a_->Expand[a] simply evaluates to a_->a. Presumably
you meant to use :>. There are cases where that would make a difference.
For example compare:
In[1]:=
(1+x)^3/.a_->Expand[a]
Out[1]=
3
(1 + x)
In[2]:=
(1+x)^3/.a_:>Expand[a]
Out[2]=
2 3
1 + 3 x + 3 x + x
But in fact yours is not one of them and the difference between :>
and -> plays no role here.
To see what goes wrong let's look at two examples, similar to yours.
Compare:
In[3]:=
f[x] /. {x -> a, z_ -> z}
Out[3]=
f[x]
with:
In[4]:=
f[x] /. {f[x] -> a, z_ -> z}
Out[4]=
a
Why does the first case fail while the second does not?
In cases like this you first look at the FullForm of your expression:
In[5]:=
FullForm[Hold[f[x] /. {f[x] -> a, z_ -> z}]]
Out[5]//FullForm=
Hold[ReplaceAll[f[x],List[Rule[f[x],a],Rule[Pattern[z,Blank[]],z]]]]
Next you read the documentation for ReplaceAll. The relevant passage is:
ReplaceAll looks at each part of expr, tries all the rules on it, and
then goes on to the next part of expr. The first rule that applies to a
particular part is used; no further rules are tried on that part, or on
any of its subparts.
So now everything is clear. The rule z_->z matches everything. When
f[x] /. {x -> a, z_ -> z}
was evaluated the Pattern Matcher first tried to match f[x] using the
rule x->a and failed. Then it tried to match it using z_->z and
succeeded. At this point it finished its job since as the documantation
tells you "no further rules are tried on that part, or on any of its
subparts. "
In the second case f[x] /. {f[x] -> a, z_ -> z} f[x] was matched using
f[x]->a and that was that. The same thing happened of course in your
original case.
Andrzej Kozlowski
Toyama International University
JAPAN
http://platon.c.u-tokyo.ac.jp/andrzej/
On Saturday, September 8, 2001, at 03:55 PM, Cattiaux Isabelle wrote:
>
> Hi,
>
> Could someone tell me why the first substitution rule
> works and the second doesn't
>
> In[1]:==
> 1+x^2+x^3+x^4 /. {x^2->1+x ,x^3->x(1+x) ,x^4->(1+x)^2}
>
> Out[1]==
> 2 + x + x(1 + x)+ (1 + x)^2
>
> In[78]:==
> 1+x^2+x^3+x^4 /. {x^2->1+x ,x^3->x(1+x) ,x^4->(1+x)^2,a_->Expand[a]}
>
> Out[78]==
> 1 + x^2 + x^3 + x^4
>
> --
> Isabelle Cattiaux-Huillard
> Universite de Valenciennes
>
>