Re: Pattern matching in functions
- To: mathgroup at smc.vnet.net
- Subject: [mg54491] Re: [mg54379] Pattern matching in functions
- From: "Wolf, Hartmut" <Hartmut.Wolf at t-systems.com>
- Date: Tue, 22 Feb 2005 04:22:51 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
>-----Original Message----- >From: Maximilian Ulbrich [mailto:mulbrich at berkeley.edu] To: mathgroup at smc.vnet.net >Sent: Saturday, February 19, 2005 8:33 AM >To: mathgroup at smc.vnet.net >Subject: [mg54491] [mg54379] Pattern matching in functions > >Hi, > >I would like to find subexpressions using Cases. >In the following case, I expected to find a[b] and a[c] and therefore >get {b,c} as the result. However, I get {l,l}. >What happens and how can I solve this? > >Cases[l^4*a[b][l] + l*a[c][l], x_a[y_] -> y, {0, Infinity}] > >Thanks, >Max > > Max, to easier understand what happend, first remove the transformation from your pattern: In[11]:= Cases[l^4*a[b][l] + l*a[c][l], x_a[y_], {0, Infinity}] Out[11]= {a[b][l], a[c][l]} so e.g. x_a matches to a[b], y_ to 1, and you'll finally get {1, 1} after the transformation. x_a can only match to an expression with head a, such the only subexpressions that might match to x are a[b] and a[c]. Now if we release that condition (which you obviously haven't meant), we still don't get the right matches: In[12]:= Cases[l^4*a[b][l] + l*a[c][l], x_[y_], {0, Infinity}] Out[12]= {a[b][l], a[c][l]} Why not? a[b] e.g. is the head of the expression a[b][1], but Cases has the option In[16]:= Options[Cases] Out[16]= {Heads -> False} such the pattern x_ is not tried to match *within* a head. It's easy to change the option: In[13]:= Cases[l^4*a[b][l] + l*a[c][l], x_[y_], {0, Infinity}, Heads -> True] Out[13]= {a[b], a[b][l], a[c], a[c][l]} So now we get all matches, those you desired and those you didn't. If you only want matches to a[b], a[c] then your pattern should be more specific: In[17]:= Cases[l^4*a[b][l] + l*a[c][l], a[y_], {0, Infinity}, Heads -> True] Out[17]= {a[b], a[c]} Now, of course, if you leave out here Heads -> True, then you'll get no matches: In[18]:= Cases[l^4*a[b][l] + l*a[c][l], a[y_], {0, Infinity}] Out[18]= {} I guess that was your problem in first place. -- Hartmut Wolf