Re: ClearAll[f]; f[x_] := x^2; f[y_] :=y^4; (*What is:*) f[2]

*To*: mathgroup at smc.vnet.net*Subject*: [mg84386] Re: ClearAll[f]; f[x_] := x^2; f[y_] :=y^4; (*What is:*) f[2]*From*: Szabolcs Horvát <szhorvat at gmail.com>*Date*: Thu, 20 Dec 2007 16:51:35 -0500 (EST)*References*: <fkcueh$5d9$1@smc.vnet.net>

cebailey wrote: > ClearAll[f]; f[x_] := x^2; f[y_] :=y^4; (*What is:*) f[2] > > Evaluating this line in Mathematica 5.2 or Mathematica 6 returns 16. This makes sense, because the second definition replaces the first, as we can see when ?f returns: > Global`f > f[y_]:=y^4 > > But in _A_Physicist's_Guide_to_Mathematica_ on p.314, Patrick Tam shows an example like this returning the other answer, 4, defined in the first definition. He then demonstrates that ?f returns: > Global`f > f[x_] := x^2 > f[y_]:= y^4 > He says his book was developed with Mathematica 2.2 and a prerelease of Mathematica 3 and is compatible with both. > > He goes on to explain: > "Contrary to expectation, Mathematica used the first definition. The ? operator reveals that Mathematica stores both definitions in the global rule base, giving higher priority to the first definition. (This problem cannot, perhaps, be called a bug because developers of Mathematica are well aware of this design flaw, which is quite difficult to mend....)" > > What is he talking about? Did Mathematica 2.2 and 3 treat this differently? If earlier versions worked in this surprising way, there must have been a reason - what was it? Was it changed to prevent surprises like this example? Did changing it create other unfortunate consequences? Was Tam just wrong? Or do I misunderstand? > I haven't used any Mathematica versions before 4.0, but it seems that Mathematica just wasn't smart enough to figure out that the patterns f[x_] and f[y_] are really the same. You can still fool it into thinking that equivalent patterns are different, for example try g[x_?Positive] := x^2 g[x_ /; Positive[x]] := x^2 Here, both definitions will be stored. As explained in the documentation, when several definitions are attached to a symbol, Mathematica tries to figure out which one is "more specific" than the others, and use that first when evaluating expressions. (For example, f[0] = 1 is more specific than f[x_] := f[x-1]*x, because it matches "less frequently".) But there is no precise definition of what "more specific" or "more general" is. When the system cannot decide about this, it simply uses the definitions in the order they were given. Even in this ordering of definitions, there are differences between Mathematica versions. -- Szabolcs