       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+x)^3/.a_->Expand[a]

Out=
3
(1 + x)

In:=
(1+x)^3/.a_:>Expand[a]

Out=
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:=
f[x] /. {x -> a, z_ -> z}

Out=
f[x]

with:

In:=
f[x] /. {f[x] -> a, z_ -> z}

Out=
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:=
FullForm[Hold[f[x] /. {f[x] -> a, z_ -> z}]]

Out//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+x^2+x^3+x^4 /. {x^2->1+x ,x^3->x(1+x) ,x^4->(1+x)^2}
>
> Out==
> 2 + x + x(1 + x)+ (1 + x)^2
>
> In:==
> 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==
> 1 + x^2 + x^3 + x^4
>
> --
> Isabelle Cattiaux-Huillard
> Universite de Valenciennes
>
>

```

• Prev by Date: Re: algebraic substitution rules
• Next by Date: Re: Seeking Mathematica's faults
• Previous by thread: Re: algebraic substitution rules
• Next by thread: Re: Substitutions[rookie]