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

*To*: mathgroup at smc.vnet.net*Subject*: [mg84397] Re: ClearAll[f]; f[x_] := x^2; f[y_] :=y^4; (*What is:*) f[2]*From*: Albert Retey <awnl at arcor.net>*Date*: Fri, 21 Dec 2007 03:22:25 -0500 (EST)*References*: <fkcueh$5d9$1@smc.vnet.net>

Hi, > 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 think the statement is still true. Usually mathematica orders the definitions so that more specific definitions are tested before more general ones. When there is a real ambiguity concerning which pattern is more specific the definitions are tested in the order they were entered. For this very simple case (where just the name of the pattern is different) it is not really an ambiguity and thus obviously can and has been overcome in newer versions. Look at the following for an example which shows that the behavior still exists for ambiguities which can not be resolved as easy as the above: ClearAll[f] f[y_?NumericQ]:=y^4 f[x_?IntegerQ]:=x^2 ??f f[2.] f[2] Note that for an integer both definitions match and the one which is entered first will win which you can check by changing the order of the two definitions. While in this case in principle it could be argued that the IntegerQ test is more specific than the NumericQ test, this would be much harder to detect and there is no way for mathematica to decide which of two such definitions is more specific if you would replace IntegerQ and NumericQ with two user defined functions. hth, albert