Re: Metastable expressions in Mathematica
- To: mathgroup at smc.vnet.net
- Subject: [mg119637] Re: Metastable expressions in Mathematica
- From: Leonid Shifrin <lshifr at gmail.com>
- Date: Wed, 15 Jun 2011 07:21:18 -0400 (EDT)
- References: <201106141014.GAA06248@smc.vnet.net>
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]; test 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. Regards, Leonid On Tue, Jun 14, 2011 at 2:14 PM, David Bailey <dave at removedbailey.co.uk>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 > http://www.dbaileyconsultancy.co.uk > >
- References:
- Metastable expressions in Mathematica
- From: David Bailey <dave@removedbailey.co.uk>
- Metastable expressions in Mathematica