MathGroup Archive 2003

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

Search the Archive

Re: Pattern Matching Problem

  • To: mathgroup at smc.vnet.net
  • Subject: [mg43410] Re: [mg43377] Pattern Matching Problem
  • From: "Mihajlo Vanevic" <mvane at EUnet.yu>
  • Date: Fri, 29 Aug 2003 07:16:15 -0400 (EDT)
  • Sender: owner-wri-mathgroup at wolfram.com

Hi all,

this is not actually the answer to Ted's question, but instead the way to extract
"like" groups of elements from the list. 

pickPattern[list_,pat_] picks elements from the list that matches pattern pat,
and splits them into "like" groups where "like" means that the elements have 
matched the same *named* subpatterns.

The third argument, if supplied, explicitly lists pattern names that should match
the same entity.


Clear[pickPattern];
pickPattern[expr_, pat_, isti_:{}] :=
  Module[{i, j, k, p, q, localpat, isti1},
    localpat = pat;
    isti1 = isti;
    q = If[isti == {}, 
        Cases[localpat, x_Pattern :> First[x], {0, \[Infinity]}, 
          Heads -> True], isti1];
    k[localpat] := Evaluate[Sequence @@ q];
    i[f : localpat] := (p = k[f]; j[p] = {j[p], f});
    j[n__] := Sequence[];
    i /@ expr;
    Flatten /@ Union[j[k[#]] & /@ expr]
    ];


Tests:

expr = {a, b, c, x, y, f[1, 1], f[w, 2], f[w, 3], f[x, 2], f[x, 3], f[y, 2], 
      f[z, 2], g[w, 2], g[w, 3], h[1, 1], j[1, 1]};


In[]:=
pickPattern[expr, _[_, a_]]
Out[]=
{{f[1, 1], h[1, 1], j[1, 1]}, {f[w, 3], f[x, 3], g[w, 3]}, {f[w, 2], f[x, 2], 
    f[y, 2], f[z, 2], g[w, 2]}}

In[]:=
pickPattern[expr, a_[_, b_]]
Out[]=
{{f[1, 1]}, {g[w, 2]}, {g[w, 3]}, {h[1, 1]}, {j[1, 1]}, {f[w, 3], 
    f[x, 3]}, {f[w, 2], f[x, 2], f[y, 2], f[z, 2]}}

In[]:=
pickPattern[expr, b_[_, a_], {b}]
Out[]=
{{h[1, 1]}, {j[1, 1]}, {g[w, 2], g[w, 3]}, {f[1, 1], f[w, 2], f[w, 3], 
    f[x, 2], f[x, 3], f[y, 2], f[z, 2]}}

In[]:=
pickPattern[expr, _[a_, b_]]
Out[]=
{{f[x, 2]}, {f[x, 3]}, {f[y, 2]}, {f[z, 2]}, {f[w, 2], g[w, 2]}, {f[w, 3], 
    g[w, 3]}, {f[1, 1], h[1, 1], j[1, 1]}}


In[]:=
pickPattern[expr, _[a_, b_] /; a =!= b]
Out[]=
{{f[x, 2]}, {f[x, 3]}, {f[y, 2]}, {f[z, 2]}, {f[w, 2], g[w, 2]}, {f[w, 3], 
    g[w, 3]}}

In[]:=
pickPattern[2expr, _.*t_[a_, b_] /; (a =!= b && t =!= Times), {a}]
Out[]=
{{2 f[y, 2]}, {2 f[z, 2]}, {2 f[x, 2], 2 f[x, 3]}, {2 f[w, 2], 2 f[w, 3], 
    2 g[w, 2], 2 g[w, 3]}}

In[]:=
pickPattern[2expr, _.*(f | g | h)[a_, b_] /; a =!= b]
Out[]=
{{2 f[x, 2]}, {2 f[x, 3]}, {2 f[y, 2]}, {2 f[z, 2]}, {2 f[w, 2], 
    2 g[w, 2]}, {2 f[w, 3], 2 g[w, 3]}}

In[]:=
pickPattern[2expr, _.*(f | g | h)[a_, b_], {a}]
Out[]=
{{2 f[y, 2]}, {2 f[z, 2]}, {2 f[1, 1], 2 h[1, 1]}, {2 f[x, 2], 
    2 f[x, 3]}, {2 f[w, 2], 2 f[w, 3], 2 g[w, 2], 2 g[w, 3]}}



Regards,				 
         Mihajlo Vanevic
         mvane at EUnet.yu
         2003-08-28

**************************************************************
*    At 2003-08-27, 04:05:00 
*        Ersek, Ted R, ErsekTR at navair.navy.mil  wrote:
**************************************************************
>Consider the following:
>
>In[1]:=
>  ClearAll[f,a,b,c,w,x,y,z];
>  expr=a+b+c+f[w,2]+f[w,3]+x+f[x,2]+f[x,3]+y+f[y,2]+f[z,2];
>
>  
>Can somebody suggest a general way to seperate the terms above into like
>groups. By "like" I mean having the same second argument for (f).  So for
>this example I want to get 
>
>{a+b+c+x+y,  f[w,2]+f[x,2]+f[y,2]+f[z,2],   f[w,3]+f[x,3]}
>
>The pattern matcher should be able to do this because Plus has attributes
>Flat and Orderless.  However I can't find a way to make it happen.
>
>-------------------
>Thanks,
>   Ted Ersek
**************************************************************





  • Prev by Date: Re: Creating Nested GridBoxes
  • Next by Date: Re: Two Argument ArcTan Function
  • Previous by thread: Re: Pattern Matching Problem
  • Next by thread: Mathematica refuses to evaluate?