Defining a flat, orderless, one-identical function?
- To: mathgroup at smc.vnet.net
- Subject: [mg28046] Defining a flat, orderless, one-identical function?
- From: Ralph Benzinger <mma-l at endlos.net>
- Date: Thu, 29 Mar 2001 03:24:12 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
Hello: I've been trying to define a flat, orderless, one-identical function `max', i.e. I want the following equivalences to hold: (1) max[a, max[b, c]] == max[a, b, c] (2) max[a, b] == max[b, a] (3) max[a] == a The built-in Plus[] function has exactly these properties. My original definition was In[1]:= ClearAll[max] SetAttributes[max, {Flat, OneIdentity, Orderless, NumericFunction}] max[a_?NumericQ, b_?NumericQ] := Max[a, b] max[a_ b_, a_ c_] := a max[b, c] That works fine except for one-identity: In[5]:= max[x] Out[5]= max[x] For some reason I cannot quite fathom, the developers of Mathematica decided to heed the OneIdentity attribute only in pattern matching but not during evaluation. Anyway, to fix this, I naively added the missing rule In[7]:= max[a_] := a This works for max[x], but suddenly we have other problems: In[12]:= max[x, x] $RecursionLimit::"reclim": "Recursion depth of 256 exceeded." General::"stop": "Further output of $RecursionLimit::reclim will be suppressed during this calculation." Out[12]= Hold[max[x, x]] Apparently, the OneIdentity pattern matching gets in the way. While I'm not sure about the exact matching/evaluation sequence (Trace[] won't tell you), I assume that max[x,x] matches max[max[x],max[x]] which eventually reduces to back to max[x,x]. So let's try without OneIdentity: In[13]:= ClearAll[max] SetAttributes[max, {Flat, Orderless}] max[a_?NumericQ, b_?NumericQ] := Max[a, b] max[a_ b_, a_ c_] := a max[b, c] max[a_] := a Alas, no use: In[18]:= max[x] $IterationLimit::"itlim": "Iteration limit of 4096 exceeded." General::"stop": "Further output of $IterationLimit::itlim will be suppressed during this calculation. Out[18]= Hold[max[x]] Note, however, that we now have a different kind of infinite loop. Does any of the Mathematica experts out there know how to define a one-identical function properly? Plus[] can do it, so there must be a way. I'm surprised that something so fundamental should be so hard to define. Regards, Ralph -- Ralph Benzinger "This is my theory, it is mine, I own it, Cornell University and what it is, too." -- Ann Elk (Mrs.)