Re: Pattern Matching
- To: mathgroup at smc.vnet.net
- Subject: [mg23850] Re: [mg23826] Pattern Matching
- From: Andrzej Kozlowski <andrzej at tuins.ac.jp>
- Date: Mon, 12 Jun 2000 01:17:40 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
I just noticed that I failed to reply to the last part of your question. If I understand you correctly you want to be able to convert all terms of the form Sum[x[i] b[i],{i,1,n}] to z but leave alone ternms like x[1] b[2]. It seems to me that the easiest way to accomplish this is to use a global function rather than local rules. The following function will (I hope) do what (according to my interpretation) you want to do: In[1]:= Clear[funct] In[2]:= funct[expr_Plus] := expr /. HoldPattern[Plus[Times[x[_], b[_]] ..] ] :> z; funct[(x[i_]*b[j_] /; i != j) + c_] := x[i]*b[j] + funct[c]; funct[x_] := x Now, you get: In[5]:= funct[b[1] x[1] + b[2] x[2] + b[3] x[4]] Out[5]= z + b[3] x[4] Moreover, you can use MapAll to deal with more complex expresions, e.g.: In[6]:= expr = (b[1]*x[1] + b[2]*x[2] + b[3]*x[4])/(b[2]*x[2] + b[3]*x[3] + b[4]*x[5]) Out[6]= b[1] x[1] + b[2] x[2] + b[3] x[4] --------------------------------- b[2] x[2] + b[3] x[3] + b[4] x[5] In[7]:= MapAll[funct, expr] Out[7]= z + b[3] x[4] ------------- z + b[4] x[5] -- Andrzej Kozlowski Toyama International University, JAPAN For Mathematica related links and resources try: <http://www.sstreams.com/Mathematica/> on 00.6.10 10:48 PM, Andrzej Kozlowski at andrzej at tuins.ac.jp wrote: > The problem is that Plus[Times[x[_], b[_]] ..] evaluates before the pattern > matching is performed and Plus disappears from the Pattern (Plus[a] gives a): > > In[6]:= > Plus[Times[x[_], b[_]] ..] > Out[6]= > b[_] x[_] .. > > You have to prevent this from happening with HoldPattern: > > In[7]:= > Plus[x[1] b[1] , x[2] b[2] ] /. HoldPattern[Plus[Times[x[_], b[_]] ..] ] -> > z > > Out[7]= > z > > Andrzej > -- > Andrzej Kozlowski > Toyama International University, JAPAN > > For Mathematica related links and resources try: > <http://www.sstreams.com/Mathematica/> > > > on 6/10/00 4:00 PM, Johannes Ludsteck at ludsteck at zew.de wrote: > >> Dear Group Members, >> I would like to "find" and replace expressions with the simple >> structure x[1] b[1]+x[2] b2]+...+x[n] b[n] >> I tried to use the following replacement rule >> In[27]:= x[1] b[1] + x[2] b[2] /. Plus[Times[x[_], b[_]] ..] -> z >> >> Out[27]= b[1] x[1] + b[2] x[2] + b[3] x[3] >> Which didn't work (Out[27] should be z). >> Why? >> The following FullForm seems to give exactly the structure I used >> in my replacement rule. >> >> In[17]:= >> FullForm[x[1] b[1] + x[2] b[2] + x[3] b[3]] >> Out[17]//FullForm= >> Plus[Times[b[1], x[1]], Times[b[2], x[2]], Times[b[3], x[3]]] >> >> Even if this worked, my pattern wouldn't account for equal indices, >> i.e. it would match x[1] b[500]+x[12] b[3], even if it shouldn't. >> >> Any suggestions? >> Thanks, >> Johannes Ludsteck >> >> >> Johannes Ludsteck >> Centre for European Economic Research (ZEW) >> Department of Labour Economics, >> Human Resources and Social Policy >> Phone (+49)(0)621/1235-157 >> Fax (+49)(0)621/1235-225 >> >> P.O.Box 103443 >> D-68034 Mannheim >> GERMANY >> >> Email: ludsteck at zew.de >> >