MathGroup Archive 2011

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

Search the Archive

Re: Metastable expressions in Mathematica

  • To: mathgroup at
  • Subject: [mg119637] Re: Metastable expressions in Mathematica
  • From: Leonid Shifrin <lshifr at>
  • Date: Wed, 15 Jun 2011 07:21:18 -0400 (EDT)
  • References: <>

Hi David,

This is a known effect. There is a special command Update, used in such
cases to force Mathematica to propagate changes like the one you discuss.
For the case at hand:

In[86]:= ClearAll[f];
test = g[f[a]]

Out[87]= g[f[a]]

In[88]:= switch = False;
f[x_] := x^2 /; switch

In[90]:= test

Out[90]= g[f[a]]

In[91]:= switch = True;

In[92]:= test

Out[92]= g[f[a]]

In[93]:= Update[f];

Out[94]= g[a^2]

I have an impression that switches in conditions are a major source of such
situations (at least, I was bitten by this more than once and every time in
this setting). My guess is that the reason may be that patterns and
definitions are optimized internally for a faster dispatch, and not
re-evaluating such conditional switches may be a part of the optimization,
as you suggested.


On Tue, Jun 14, 2011 at 2:14 PM, David Bailey <dave at>wrote:

> Everyone knows that expressions in Mathematica get automatically
> evaluated as far as is possible. Furthermore, most people realise that
> Mathematica must have a way to track changes to the definitions of
> symbols, so as to avoid excessive evaluation.
> Here is the typical case:
> In[672]:= Clear[f]
> In[673]:= test = g[f[a]]
> Out[673]= g[f[a]]
> 'test' contains an expression containing an unevaluated function call to f
> In[674]:= test
> Out[674]= g[f[a]]
> Now we give f a definition, and confirm that Mathematica 'knows' the
> expression held by 'test' needs to be reevaluated:
> In[675]:= f[x_] := x^2;
> In[676]:= test
> Out[676]= g[a^2]
> So far as expected, but now we define f in a way that allows it to be
> switched on and off without actually changing its definition:
> In[677]:= Clear[f]
> In[679]:= switch = False;
> In[680]:= f[x_] := x^2 /; switch
> In[681]:= test = g[f[a]]
> Out[681]= g[f[a]]
> In[682]:= switch = True;
> Here we see that Mathematica fails to notice that the expression can be
> further evaluated - the expression in 'test' is metastable.
> In[683]:= test
> Out[683]= g[f[a]]
> Some processes obviously cause complete evaluation:
> In[684]:= Uncompress[Compress[test]]
> Out[684]= g[a^2]
> Others, rather surprisingly, do not!
> (Dialog) In[687]:= test /. f -> f
> (Dialog) Out[687]= g[f[a]]
> I don't really consider metastable expression to be a bug - more a
> curiosity - and it would be undesirable to slow Mathematica processing
> to try to fix this.
> However, metastable expressions, do give a window into the methods
> Mathematica uses to minimise the reevaluation of expressions. For
> example, it might be interesting to repeat the above 10000 times with
> different symbols, to determine if Mathematica is always consistent in
> this regard.
> I have never seen this effect discussed, so I would be interested in
> links to previous discussions, if any.
> David Bailey

  • Prev by Date: Re: Seaching in Pi a sequence. Looking for a faster method
  • Next by Date: remote kernel problems (LinkOpen::linke: MathLink linkname missing or malformed..)
  • Previous by thread: Metastable expressions in Mathematica
  • Next by thread: Re: Metastable expressions in Mathematica