Re: Flat, OneIdentity attributes
- To: mathgroup at smc.vnet.net
- Subject: [mg21614] Re: [mg21600] Flat, OneIdentity attributes
- From: Andrzej Kozlowski <andrzej at tuins.ac.jp>
- Date: Tue, 18 Jan 2000 02:35:06 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
If f is a function without any attributes we have: In[1]:= ClearAll[f] In[2]:= MatchQ[f[2], f[x_Integer]] Out[2]= True If you give f the attribute Flat this is no longer true: In[3]:= SetAttributes[f, Flat] In[4]:= MatchQ[f[2], f[x_Integer]] Out[4]= False but what is true instead (in fact always) is: In[5]:= MatchQ[f[2], f[x__Integer]] Out[5]= True Note however that even in this case (with the Flat attribute present) you get In[6]:= MatchQ[f[2], f[x_]] Out[6]= True The reason why this works is that f[2] is re-written as f[f[2]] which matches f[x_] but not f[x_Integer], thus In[7]:= MatchQ[f[f[2]], f[2]] Out[7]= True In[8]:= MatchQ[f[2], f[f[2]]] Out[8]= True The presence of the OneIdentity attribute however means that again the single argument match is used: In[9]:= SetAttributes[f, OneIdentity] In[10]:= MatchQ[f[2], f[x_Integer]] Out[10]= True In fact when f has the Flat and the OneIdentity attributes you also get matches like In[11]:= MatchQ[f[f[f[f[2]]]], f[x_Integer]] Out[10]= True which do not work with only Flat attribute present. Andrzej Kozlowski Toyama International University Toyama, Japan http://sigma.tuins.ac.jp/ > From: "Ersek, Ted R" <ErsekTR at navair.navy.mil> To: mathgroup at smc.vnet.net > Date: Sun, 16 Jan 2000 22:43:47 -0500 (EST) > To: mathgroup at smc.vnet.net > Subject: [mg21614] [mg21600] Flat, OneIdentity attributes > > ClearAll[f] > Attributes[f]={Flat,OneIdentity}; > f[2]/.f[n_Integer]:>n+10 > > Out[9]= > 12 > > -------------------------------- > For reasons I can't understand the rule isn't used in the next example. Can > anyone explain why? > > In[10]:= > ClearAll[f] > Attributes[f]={Flat}; > f[2]/.f[n_Integer]:>n+10 > > Out[12]= > f[2] > > --------------------------------------------- > Regards, > Ted Ersek