Re: precedence for ReplaceAll?
- To: mathgroup at smc.vnet.net
- Subject: [mg110559] Re: precedence for ReplaceAll?
- From: Szabolcs Horvát <szhorvat at gmail.com>
- Date: Fri, 25 Jun 2010 07:28:31 -0400 (EDT)
- References: <hvv4ti$fc$1@smc.vnet.net>
[note: message sent to comp.soft-sys.math.mathematica as well]
On 2010.06.24. 10:27, Matthias Fripp wrote:
> I am having trouble using ReplaceAll to replace symbols that already
> have a delayed assignment.
>
> e.g., this input:
>
> In[287]:=
> a := A c
> b := B c
> a /. {a -> x, b -> y}
> b /. {a -> x, b -> y}
> a + b /. {a -> x, b -> y}
> a * b /. {a -> x, b -> y}
>
> gives this output:
>
> Out[289]= x
>
> Out[290]= y
>
> Out[291]= x + y
>
> Out[292]= A B c^2
>
> All of this works as expected except for the final term. I would have
> expected to get the result "x y". Is there any way to force
> Mathematica to produce that result?
>
> If on the other hand the original assignment is a := A + c and b := B
> + c, I get an unexpected output for the sum, but the expected output
> (x y) for the product. If I insert d instead of one of the c's, I get
> various other (unpredictable) kinds of result.
>
> My first guess is that Mathematica is doing a sort of "double
> ReplaceAll", where it first tries the pattern given in the delayed
> assignment, and any symbols matched by that are not tested against the
> explicit ReplaceAll. But that doesn't explain why the sum works and
> not the product. Am I thinking about this the wrong way?
>
I get the impression from your message that you believed that when
evaluating a /. {a -> x, b -> y}, 'a' gets replaced by 'x'. This is
not the case. First the 'a' on the lhs of /. is evaluated to A c, then
the 'a' on the rhs is evaluated to A c (and 'b' is evaluated too, of
course). At this point the evaluator has the expression A c /. { A c ->
x, B c -> y }, and replaces A c by x. This is all easy to see by using
the Trace function:
In[41]:= Trace[a/.a->x]
Out[41]= {{a,A c},{{a,A c},A c->x,A c->x},A c/.A c->x,x}
What happens with the last expression is this:
In[42]:= Trace[a b/.{a->x,b->y}]
Out[42]= {{{a,A c},{b,B c},(A c) (B c),A c B c,A B c c,A B c^2},{{{a,A
c},A c->x,A c->x},{{b,B c},B c->y,B c->y},{A c->x,B c->y}},A B c^2/.{A
c->x,B c->y},A B c^2}
I.e. the ReplaceAll expression evaluates to A B c^2 /. {A c->x,B c->y},
and no replacement can be done, as A c or B c do not appear *formally*
in the expression A B c^2.
What you are looking for is achieved by
Unevaluated[a b] /. {HoldPattern[a] -> x, HoldPattern[b] -> y}
Hope this helps,
Szabolcs