MathGroup Archive 1997

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

Search the Archive

Re: Bug in pattern matching?

  • To: mathgroup at smc.vnet.net
  • Subject: [mg8741] Re: Bug in pattern matching?
  • From: gah at math.umd.edu (Garry Helzer)
  • Date: Sat, 20 Sep 1997 22:28:08 -0400
  • Organization: University of Maryland, College Park
  • Sender: owner-wri-mathgroup at wolfram.com

In article <5vt9or$glg at smc.vnet.net>, "Peter Strvmbeck"
<pqst at celsiustech.se> wrote:

> Hi, I've posted this problem to Wolfram support but received no answer so I
> thought I might just post it here aswell.
> 
> I'm trying to "deconstruct" a list, perform an operation to a pert of the
> list and then recombine the result. When I did this I found out that
> multiplication in pattern matching performs differently than otherwise.
> 
> Check version:
> 
> In[1]:=
> $Version
> Out[1]=
> "Microsoft Windows 3.0 (October 6, 1996)"
> 
> Define list:
> 
> In[2]:=
> ls=Table[a[j], {j,0,5}]
> Out[2]=
> {a[0],a[1],a[2],a[3],a[4],a[5]}
> 
> I want to split this list into the following three sublists: 
> 
> {a[0],a[1],a[2],a[3],a[4],a[5]} -> {a[0]}, {a[1], a[2], a[3], a[4]}, {a[5]}
> 
> Use pattern matching:
> 
> In[3]:=
> ls/.{first_, middle___, last_}\[Rule] {{first},{middle},{last}}
> Out[3]=
> {{a[0]},{a[1],a[2],a[3],a[4]},{a[5]}}
> 
> This works fine. Now I want to multiply the middle list by a factor C.
> Ordinary multiplication works like this:
> 
> In[4]:=
> C ls
> Out[4]=
> {C a[0],C a[1],C a[2],C a[3],C a[4],C a[5]}
> 
> Doing this in a pattern matching statement produces a totally different
> result:
> 
> In[5]:=
> ls/.{first_, middle___, last_}\[Rule] {{first},C {middle},{last}}
> Out[5]=
> {{a[0]},{C a[1] a[2] a[3] a[4]},{a[5]}}
> 
> The middle list now contains a completely different result than Out[4]!
> 
> Can anyone please explain this to me?
> 
> /Peter Strvmbeck

The problem is that you are using Rule ( -> ) where you want RuleDelayed (
:> ).  Since Times is listable, the expression C {middle} ==
Times[C,List[middle]] gets evaluated to List[Times[C,middle]] before the
rule is applied, and middle is a sequence when the rule is applied. Using
:> instead of -> puts a hold on the second argument and prevents this
premature evaluation.

-- 
Garry Helzer


  • Prev by Date: Re: Bug in pattern matching?
  • Next by Date: Re: Help! How can I control the size of individual point?
  • Previous by thread: Re: Bug in pattern matching?
  • Next by thread: [v2.2] Initialization cells and On[] / Off[]