MathGroup Archive 2010

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: ReplaceAll and ReplaceRepeated Strange Behavior

  • To: mathgroup at
  • Subject: [mg111486] Re: ReplaceAll and ReplaceRepeated Strange Behavior
  • From: Leonid Shifrin <lshifr at>
  • Date: Tue, 3 Aug 2010 06:36:18 -0400 (EDT)

Hi Brian,

FullForm will reveal that some auto-evaluations are happening after you
your eff, during Mathematica's evaluation process. As a result, one of the
dm*Pi gets rewritten into a different form
and does not match your pattern any more:


The simplest way to get what you want that I can think of is something like
the following:

Unevaluated[(L*(-L*mu + dm*Pi*Cos[b]))/(dm*
      Pi*(dm*Pi*mu + L*Cos[b]))] //. {dm*Pi ->
    L/Tan[a]} // FullSimplify

Out[26]= (Cos[b] - mu Tan[a])/(Cos[b] + mu Cot[a])

By using Unevaluated I postpone evaluation until your rules have been
and then the auto-evaluation does not happen. Alternatively, you may want
construct a more complicated pattern, but that seems considerably harder to
get right.

If you still want to keep your expression in a variable, I suggest to use
following trick:

eff := (L*(-L*mu + dm*Pi*Cos[b]))/(dm*Pi*(dm*Pi*mu + L*Cos[b]));

Here, delayed assignment is used. Then:

In[32]:= FullSimplify@ReleaseHold

Out[32]= (Cos[b]-mu Tan[a])/(Cos[b]+mu Cot[a])

This trick can generalize to more complex expressions involving any number
variables like <eff>, like this for example:

In[42]:= Clear[f];

In[41]:= FullSimplify@ReleaseHold
Out[41]= (mu^2 Sec[a]^2)/(mu Cos[a]+Cos[b] Sin[a])^2

Basically, these are the first steps for creating a custom evaluator, which
does not
evaluate expressions all the way, but only uses those rules you want. It
kind of interpolates
between purely local rule application and the full global Mathematica
evaluation, and adds
the convenience of globally defined variables and functions to the level of
control you have
with local rule application. I find this quite useful at times.

Hope this helps.


On Mon, Aug 2, 2010 at 3:04 PM, blamm64 <blamm64 at> wrote:

> Given the expression:
> eff = (L*(-L*mu+dm*Pi*Cos[b]))/(dm*Pi*(dm*Pi*mu+L*Cos[b]))
> After this I enter
> eff /. {dm*Pi -> L/Tan[a]}
> and get a result that does not, for a reason I cannot fathom and
> believe to be a bug, replace one instance of dm*Pi. The result of the
> evaluation yields
> L*(-L*mu+L*Cos[b]*Cot[a])/(dm*Pi*(L*Cos[b]+L*mu*Cot[a]))
> Precisely the same result occurs with eff //.{dm*Pi->L/Tan[a]}
> Why is the one remaining dm*Pi not replaced with L/Tan[a]?
> In fact, when define manually define eff1 as
> eff1 = (L*(-L*mu + L*Cos[b]*Cot[b]))/(dm*Pi*(L*Cos[b]+L*mu*Cot[a]))
> which is as you can see the result of the first ReplaceAll execution,
> and then enter
> eff1 /. {dm*Pi->L/Tan[a]}
> Mathematica returns eff1 unaltered!
> Now, I say this is a bug, so of course I'm probably missing something
> and it isn't a bug.  I have to jump through syntactic hoops to get the
> 'right' answer:
> FullSimplify[eff /.{dm*Pi->L/Tan[a]}]/.{dm*Pi->L/Tan[a]}//FullSimplify
> and FullSimplify[eff /. {dm*Pi->L/Tan[a]} does no good either.
> It is not at all obvious to me what I might be missing with such an
> apparently simple replacement.
> By the way, how do you guys copy input or output from Mathematica
> notebook into this usergroup window?  I had to do all this by hand,
> copy it from here into a notebook, and execute the notebook cells just
> to make sure I was getting it correct.  I ran across this originally
> when I was constructing a simple notebook for doing some Acme power
> screw calculations.
> -Brian Lamm
> (Windows XP x64 Version 2003 SP2, Mathematica 7.0.1)

  • Prev by Date: Re: Bare Bones Backup Button
  • Next by Date: Re: Brillouin function for a Ferromagnet
  • Previous by thread: Re: ReplaceAll and ReplaceRepeated Strange Behavior
  • Next by thread: Re: ReplaceAll and ReplaceRepeated Strange Behavior