Drexel dragonThe Math ForumDonate to the Math Forum

Search All of the Math Forum:

Views expressed in these public forums are not endorsed by Drexel University or The Math Forum.

Math Forum » Discussions » Software » comp.soft-sys.math.mathematica

Topic: Sum pattern
Replies: 1   Last Post: Oct 6, 2012 4:13 AM

Advanced Search

Back to Topic List Back to Topic List Jump to Tree View Jump to Tree View  
Dave Snead

Posts: 52
Registered: 12/13/04
Re: Sum pattern
Posted: Oct 6, 2012 4:13 AM
  Click to see the message monospaced in plain text Plain Text   Click to reply to this topic Reply

Thanks everyone,

I've concluded that the shortest way to do this
(in terms of the number of characters I need to type)
which works is:

In[1]:= x = f[a1, s] + f[a2, s] + f[a3, s]

Out[1]= f[a1, s] + f[a2, s] + f[a3, s]

In[3]:= z = x /. (p : Plus[_f, __f]) :> f[First /@ p, s]

Out[3]= f[a1 + a2 + a3, s]

-- Dave Snead

-----Original Message-----
From: Fred Simons
Sent: Thursday, October 04, 2012 11:48 PM
Subject: Re: Sum pattern

On Oct 3, 12:12 am, "Dave Snead"<dsne...@charter.net> wrote:

> Hi,
> I'm trying to put together a rule whose left hand side is a sum of
> arbitrary
> length whose elements all have the same head f.
> For example:
> In[4]:= x = f[a1, s] + f[a2, s] + f[a3, s]
> Out[4]= f[a1, s] + f[a2, s] + f[a3, s]
> In[6]:= y = f[First /@ x, s]
> Out[6]= f[a1 + a2 + a3, s]
> which is what I want.
> However when I turn this into a rule
> In[7]:= z = x /. (p : Plus[__f]) -> f[First /@ p, s]
> Out[7]= f[f[a1, s], s] + f[f[a2, s], s] + f[f[a3, s], s]
> Why isn't z equal to y?
> How can I make this rule work?
> Thanks in advance,
> Dave Snead

Your solution is almost correct, but fails since you did not take into
account that both sides of your rule are evaluated before it is applied.

In[1]:= (p:Plus[__f])->f[First/@p,s]
Out[1]= p__f->f[p,s]

Your rule wraps every expression with head f in another f, as you see in
your output.

To prevent the evaluation, use RuleDelayed for keeping the right-hand side
and HoldPattern for the left-hand side:

In[2]:= x=f[a1,s]+f[a2,s]+f[a3,s]
x /. (p:HoldPattern[Plus[__f]]):>f[First/@p,s]

Out[2]= f[a1,s]+f[a2,s]+f[a3,s]
Out[3]= f[a1+a2+a3,s]

Fred Simons
Eindhoven University of Technology

Point your RSS reader here for a feed of the latest messages in this topic.

[Privacy Policy] [Terms of Use]

© The Math Forum 1994-2015. All Rights Reserved.