Re: Why does the order of down values come back?

*To*: mathgroup at smc.vnet.net*Subject*: [mg124898] Re: Why does the order of down values come back?*From*: A Retey <awnl at gmx-topmail.de>*Date*: Sat, 11 Feb 2012 06:37:15 -0500 (EST)*Delivered-to*: l-mathgroup@mail-archive0.wolfram.com*References*: <jgo0e9$a2k$1@smc.vnet.net> <jgqpna$n12$1@smc.vnet.net>

Hi, >> In[]:= f[0] := 0;f[1] := 1;f[n_] := f[n - 1] + f[n - 2] >> >> In[]:= DownValues[f] >> Out[]:= {HoldPattern[f[0]] :> 0, HoldPattern[f[1]] :> 1, >> HoldPattern[f[n_]] :> f[n - 1] + f[n - 2]} >> >> In[]:= DownValues[f] = Reverse[DownValues[f]] >> Out[]:= {HoldPattern[f[n_]] :> f[n - 1] + f[n - 2], HoldPattern[f[1]] :> >> 1, HoldPattern[f[0]] :> 0} >> >> In[]:= DownValues[f] >> Out[]:= {HoldPattern[f[0]] :> 0, HoldPattern[f[1]] :> 1, >> HoldPattern[f[n_]] :> f[n - 1] + f[n - 2]} >> >> ==================================================== >> My question is: >> >> Why does the order of down values comes back after reordering? >> >> Thanks. >> > > Because DownValues sorts its output by default. The actual downvalues are > not, however, sorted; the order is as you set them. To see their actual > order, use the (undocumented) option: > > DownValues[f, Sort -> False] > I'm sure that you (Oleksandr) are aware of it, but I doubt the OP is: there are actually two sorting activities involved: 1) whenever you add to or change the DownValues, they will be sorted so that more specific patterns will be tried before more general ones. I don't think there is any way to circumvent this, which probably is because the pattern matcher does somehow rely on it. 2) when using DownValues to show what's there, the patterns are by default not shown as stored, but are again sorted. This can be avoided by using the Sort option. I guess this is supposed to make it easier to compare lists of DownValues which would behave identically when used by the pattern matcher. AFAIK this sorting will preserve the specific before general rule. In consequence, for your example f[0] := 0;f[1] := 1;f[n_] := f[n - 1] + f[n - 2] DownValues[f] = Reverse[DownValues[f]] DownValues[f, Sort -> False] will still list the most general pattern as last entry, despite the Reverse. In cases where it's not possible to decide about which pattern is more specific, it is the order in which you evaluate your definitions that defines the order in which they are tried (and listed by DownValues), compare e.g.: ClearAll[g] g[x_, 1] := 1 g[1, y_] := 2 g[1,1] ClearAll[g] g[1, y_] := 2 g[x_, 1] := 1 g[1,1] hth, albert