MathGroup Archive 2005

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

Search the Archive

Re: Pattern matching in functions

  • To: mathgroup at
  • Subject: [mg54491] Re: [mg54379] Pattern matching in functions
  • From: "Wolf, Hartmut" <Hartmut.Wolf at>
  • Date: Tue, 22 Feb 2005 04:22:51 -0500 (EST)
  • Sender: owner-wri-mathgroup at

>-----Original Message-----
>From: Maximilian Ulbrich [mailto:mulbrich at] 
To: mathgroup at
>Sent: Saturday, February 19, 2005 8:33 AM
>To: mathgroup at
>Subject: [mg54491] [mg54379] Pattern matching in functions
>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}]


to easier understand what happend, first remove the transformation from
your pattern:

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:

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:

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

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

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

  • Prev by Date: Re: The two dices
  • Next by Date: Re: The two dices
  • Previous by thread: Re: Pattern matching in functions
  • Next by thread: Mathematica 5.0 on Mandrake and Numlock