Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

This question already has an answer here:

I have the following line of code:

Plus @@ Table[p[x], {x, 0, 20}] /. p[x_] -> Boole[MemberQ[{0, 5}, x]]

The first part of this produces

p[0] + p[1] + p[2] + p[3] + p[4] + p[5] + p[6] + p[7] + p[8] + p[9] + p[10] +
p[11] + p[12] + p[13] + p[14] + p[15] + p[16] + p[17] + p[18] + p[19] + p[20]

What I thought the second part would do is to check each argument to p that occurs in this sum and replace p[x] with 1 if x is either 0 or 5 and with 0 if x is anything else. I thought, in short, the result would be 2. That's not, however, what I get. Instead Mathematica returns 0. What am I doing wrong?

share|improve this question
8  
Just change -> with :> ;) (you want the function on the right to evaluate on substitution and not when defining the rule, this is called a delayed rule, you can find more on the help.) –  Spawn1701D Apr 16 '13 at 2:07
    
D'oh! That did the trick. Thank you very much! –  RoyalTS Apr 16 '13 at 2:13
    
mathematica.stackexchange.com/questions/22917/… could be of interest... –  Pinguin Dirk Apr 16 '13 at 5:47
add comment

marked as duplicate by m_goldberg, István Zachar, Sjoerd C. de Vries, rm -rf Apr 16 '13 at 13:44

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

2 Answers

up vote 5 down vote accepted

Try this:

    Clear[p];
p[x_] := Boole[MemberQ[{0, 5}, x]];
Plus @@ Table[p[x], {x, 0, 20}]

this:

Plus @@ Table[Boole[MemberQ[{0, 5}, x]], {x, 0, 20}]

this:

Plus @@ Table[p[x], {x, 0, 20}] /. 
     p[x_] -> UnitBox[x] + UnitBox[x - 5]

this:

Plus @@ Table[UnitBox[x] + UnitBox[x - 5], {x, 0, 20}]

or this:

Sum[UnitBox[x] + UnitBox[x - 5], {x, 0, 20}]
share|improve this answer
add comment

You can certainly use Sum[] to directly generate your sum of p[]'s:

s = Sum[p[x], {x, 0, 20}];

From this, as you've been told, the use of RuleDelayed[] (:>) instead of Rule[] (->) is paramount here. Let me present a different way to do your replacement rule:

s /. p[x_] :> Boole[MatchQ[x, 0 | 5]]
   2

To explain: Alternatives (|) is a pattern that allows you to match any of its arguments; thus, 0 | 5 means "match either of 0 or 5". You can then use MatchQ[] to test if x matches that pattern, and Boole[] then converts True and False into 0 and 1 respectively (i.e. an Iverson bracket).

share|improve this answer
add comment

Not the answer you're looking for? Browse other questions tagged or ask your own question.