MathGroup Archive 2008

[Date Index] [Thread Index] [Author Index]

Search the Archive

Question about OneIdentity

  • To: mathgroup at
  • Subject: [mg88198] Question about OneIdentity
  • From: Szabolcs Horvát <szhorvat at>
  • Date: Mon, 28 Apr 2008 04:38:08 -0400 (EDT)
  • Organization: University of Bergen

(Scroll down for the actual question)

I never really understood Flat and OneIdentity, and unfortunately 
documentation about them is scarce.

 From the docs:

OneIdentity is an attribute that can be assigned to a symbol f to 
indicate that f[x], f[f[x]], etc. are all equivalent to x for the 
purpose of pattern matching.

OneIdentity has an effect only if f has attribute Flat.

** Some comments:

There is also an example, listing the Attributes of Times and showing 
that Times[a] evaluates to a.  However, this is misleading because this 
behaviour cannot be caused by Times's attributes:

In[1]:= Attributes[f] = Attributes[Times]
Out[1]= {Flat, Listable, NumericFunction,
          OneIdentity, Orderless, Protected}

In[2]:= f[a]
Out[2]= f[a]

If we assign the same attributes to f, f[a] will not evaluate to a.  Was 
the technical writer also confused, or is the example supposed to 
illustrate something different than what I understood?

** And now the actual question:

According to the text in the docs (f[x] is considered equivalent to x in 
pattern matching) I would expect

MatchQ[1, f[1]]

to give True after evaluating SetAttributes[f, {Flat, OneIdentity}]. 
But it gives False.

** The application:

This came up in the following application:

fun[HoldPattern@Plus[terms__]] := doSomething[{terms}]

This function should handle a single term, too.  Of course, there are 
workarounds, but I couldn't come up with anything as simple as the 
pattern above (which unfortunately does not work).

  • Prev by Date: Re: Change integral variables
  • Next by Date: Notebook[]
  • Previous by thread: Re: financial chart with volumes (CORRECTION)
  • Next by thread: Re: Question about OneIdentity