Re: pattern matching

*To*: mathgroup at smc.vnet.net*Subject*: [mg7026] Re: [mg6967] pattern matching*From*: Rick Muirhead <muirhead at dirac.phys.washington.edu>*Date*: Fri, 2 May 1997 21:30:52 -0400 (EDT)*Sender*: owner-wri-mathgroup at wolfram.com

On Wed, 30 Apr 1997, Marc Mazzariol wrote: > Hello, > > I'm using mathematica 2.2 (Unix), and i'm trying to do pattern > matching with repeated patterns. > > This example produce the result i want : > > In : {a,a,a,b} /. {a...,b} -> Hello > Out : Hello > > But this one don't : > > In : {b} /. {a...,b} -> Hello > Out : {b} > > I was hopping : Out : Hello > > Why doesn't work it ??? > > -- > +--------------------------------------------------------+ > | - No brain, no headache - | > +--------------------------------------------------------+ > | Marc Mazzariol | > | Swiss Federal Institute of Technology (EPFL) | > | Peripheral Systems Laboratory (LSP) | > | CH-1015 Lausanne, Switzerland | > | Tel: +41 21 693 3944 | > | Fax: +41 21 693 6680 | > | E-mail: Marc.Mazzariol at di.epfl.ch | > +--------------------------------------------------------+ > Greetings Marc, In general, I get some insight, however tiny, on how the patterns do or do not match by playing with MatchQ. In your case, we find In[1]:= MatchQ[ {b}, {a...,b}] Out[1]:= False whereas: In[2]:= MatchQ[{a,a,a,a,a,a,b},{a...,b}] Out[2]:= True Similarly, your pattern won't recognize {b,a,a,a,a,a} Something that does work, though I suspect there are more elegant solutions, would be In[3]:= {a,a,a,a,a,a,b} /.{a...,b} | {b}->Hello Out[3]:= Hello In[4]:= {b}/.{a...,b} | {b}->Hello Out[4]:= Hello The | sign is Mma's pattern alternative sign ... I think of it as an OR within patterns. Off the subject .... if your purpose is to determine if the symbol b is a member of your list, you might instead try the MemberQ function, which I find a good deal more transparent then the pattern matching: In[5]:= MemberQ[{a,a,a,a,a,b},b] Out[5]:= True In[6]:= MemberQ[{a,a,a,a,a},b] Out[6]:= False Rick Muirhead Physics UW