Re: Matching with a "Flat" function
- To: mathgroup at smc.vnet.net
- Subject: [mg70922] Re: [mg70857] Matching with a "Flat" function
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Wed, 1 Nov 2006 03:56:22 -0500 (EST)
- References: <200610301032.FAA13291@smc.vnet.net>
On 30 Oct 2006, at 19:32, Szabolcs wrote:
>
> Could someone explain this behaviour to me? I'd expect f[_Integer] to
> match f[2] even after I set attribute Flat on f.
>
> Szabolcs
>
> In[1]:= MatchQ[f[2],f[_]]
>
> Out[1]= True
>
> In[2]:= MatchQ[f[2],f[_Integer]]
>
> Out[2]= True
>
> In[3]:= SetAttributes[f,Flat]
>
> In[4]:= MatchQ[f[2],f[_]]
>
> Out[4]= True
>
> In[5]:= MatchQ[f[2],f[_Integer]]
>
> Out[5]= False
>
This is because of something many years ago Allan Hayes called f-
grouping:if f has the Flat attribute, f[2] is converted to f[f[2]]
before the match is attempted, and then, of course, it does not match
f[_Integer]. In order for this not to happen you need to give f also
the attribute OneIdentity.
SetAttributes[f, {Flat, OneIdentity}]
MatchQ[f[2], f[_Integer]]
True
Note also that even without OneIdentity attribute, the following will
match:
ClearAttributes[f,OneIdentity]
MatchQ[f[g[2]], f[g[_Integer]]]
True
The presence of g prevents f-grouping just as the attribute
OneIdentity does. A full explanation of this behaviour is complicated
and has already been done on this about 6 years ago. If you are
interested search for posts by Allan Hayes and Hartmut Wolf.
Andrzej Kozlowski