MathGroup Archive 1998

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

Search the Archive

Re: Pattern matching more than once



hi,


maybe the following rule would do what you want, even if there are
*more* than three common elements:

myrule={a___,list1:{pre1___,x_,post1___},
       list2:{pre2___,x_,post2___},b___} ->
       {z[{a,{pre1,y[x],post1},list2,b}] ,
        z[{{pre1,y[x],post2},{pre2,x,post1}}]};

postop[it_]:=  Flatten[k= (it/. z:>Sequence /.y:>Identity) ,Depth[k]-3]

//. is ReplaceRepeated,
//  is postfix-Operation.


{{a,b,c},{d,b,f}}//.rule // postop
Out[ ]=
{{a, b, c}, {d, b, f}, {a, b, f}, {d, b, c}}

{{a,b,c,d,e},{f,b,g,d,h}}//.rule //postop Out[]=
{{a, b, c, d, e}, {f, b, g, d, h}, {a, b, c, d, h}, {f, b, g, d, e}, 
 {a, b, g, d, h}, {f, b, c, d, e}, {a, b, g, d, e}, {f, b, c, d, h}}


{{a,b,c,d,e,u,v},{f,b,g,d,h,u,x}}//.rule //postop Out[]=
{{a, b, c, d, e, u, v}, {f, b, g, d, h, u, x}, {a, b, c, d, e, u, x}, 
  {f, b, g, d, h, u, v}, {a, b, c, d, h, u, x}, {f, b, g, d, e, u, v}, 
  {a, b, c, d, h, u, v}, {f, b, g, d, e, u, x}, {a, b, g, d, h, u, x}, 
  {f, b, c, d, e, u, v}, {a, b, g, d, h, u, v}, {f, b, c, d, e, u, x}, 
  {a, b, g, d, e, u, v}, {f, b, c, d, h, u, x}, {a, b, g, d, e, u, x}, 
  {f, b, c, d, h, u, v}}

wouter.








At 03:40 17.04.98 -0400, you wrote:
>I have been stuck with the following problem for about 10 days.  I can't
>think of an elegant solution.
>
>Input: Two lists, from some universal set Output: Many "spliced" lists
>obtained from the input.
>
>e.g.	{{a,b,c},{d,e,f}} --> {{a,b,c},{d,e,f}} (no common element)
>
>	{{a,b,c},{d,b,f}} --> {{a,b,c},{d,b,f},{a,b,f},{d,b,c}}
>
>	{{a,b,c,d,e},{f,b,g,d,h}} -->
>			{{a,b,c,d,e},{a,b,c,d,h},{a,b,g,d,e},{a,b,g,d,h},
>			 {f,b,c,d,e},{f,b,c,d,h},{f,b,g,d,e},{f,b,g,d,h}}
>
>I will regard the input as list of chains (totally ordered set) coming
>from a partially ordered set, and I would like to extend these chains
>as much as possible.  If there is at most one common element in the
>inputs, the following will do:
>
>extendList[{list1:{pre1___,x_,post1___},list2:{pre2___,x_,post2___}}]:=
>	{list1,list2,{pre1,x,post2},{pre2,x,post1}};
>
>The problem is that when the lists have more than one common element,
>the second common element will not be considered at all.  I suppose I
>could just write, for instance,
>
>extendList2[{list1:{pre1___,x_,mid1___,y_,post1___},
>	list2:{pre2___,x_,mid2___,y_,post2___}}]:=
>	Union[
>		{list1,{pre1,x,mid1,y,post2},{pre1,x,mid2,y,post1},
>		 {pre1,x,mid2,y,post2},list2,{pre2,x,mid1,y,post1},
>		 {pre2,x,mid1,y,post2},{pre2,x,mid2,y,post1}}]; But this is very ugly.
>
>I suppose I could write some For[] loop through
>Intersection[list1,list2], but I would rather avoid it if I could.
>
>Any help would be appreciated.
>
>-- 
>ASARI Hirotsugu                 //   http://www.math.uiuc.edu/~asari/
>finger://math.uiuc.edu/asari   //    ph://ns.uiuc.edu/asari
>	"We are what we pretend to be, so we must be careful
>		about what we pretend to be."	--Kurt Vonnegut
>
>

NV Vandemoortele Coordination Center Oils & Fats Applied Research
Prins Albertlaan 79
Postbus 40
B-8870 Izegem (Belgium)
Tel: +/32/51/33 21 11
Fax: +/32/51/33 21 75
vdmcc@vandemoortele.be




  • Prev by Date: Precision help needed *ASAP* - Thanks
  • Next by Date: RE: calculation
  • Prev by thread: Pattern matching more than once
  • Next by thread: Re: Pattern matching more than once