12
$\begingroup$

I am a beginner exploring the world of Mathematica. I expected the following code

T[6, 5, 4, 1, 2, 3] /. {T[a___, 1, b___] -> Length[List[b]]} 

should return the value 2, rather than 1. Anyone could explain where I was wrong?

$\endgroup$
2
  • 4
    $\begingroup$ note that T is a bad choice of variable/function name. I suggest using names starting in lowercase letters, especially when using single letters. This avoids conflicts with built-ins (e.g. N, D...) $\endgroup$ Commented Apr 8, 2013 at 8:26
  • $\begingroup$ Related: (13472), (24860), (26619) $\endgroup$ Commented Jul 15, 2015 at 6:39

2 Answers 2

20
$\begingroup$

This is because the code Length[List[b]] is evaluated before the rule is applied. Using RuleDelayed rather than Rule would fix it:

T[6, 5, 4, 1, 2, 3] /. {T[a___, 1, b___] :> Length[{b}]}

$\endgroup$
0
10
$\begingroup$

The function Trace can be helpful in diagnosing the problem. The documentation says:

Trace returns a set of nested lists. Each individual list corresponds to a single evaluation chain, which contains the sequence of forms found for a particular expression. The list has sublists which give the histories of subsidiary evaluations.

With your input:

Trace[ T[6, 5, 4, 1, 2, 3] /. {T[a___, 1, b___] -> Length[List[b]]} ] 
{{{{Length[{b}],1},T[a___,1,b___]->1,T[a___,1,b___]->1}, {T[a___,1,b___]->1}},T[6,5,4,1,2,3]/.{T[a___,1,b___]->1},1} 

Observe that the first evaluation chain is {Length[{b}],1} which clearly shows the problem. Now compare the Trace when correctly using RuleDelayed:

Trace[ T[6, 5, 4, 1, 2, 3] /. {T[a___, 1, b___] :> Length[List[b]]} ] 
{{{T[a___,1,b___]:>Length[{b}],T[a___,1,b___]:>Length[{b}]}, {T[a___,1,b___]:>Length[{b}]}},T[6,5,4,1,2,3]/. {T[a___,1,b___]:>Length[{b}]},Length[{2,3}],2} 
$\endgroup$
1
  • $\begingroup$ Thank you. This would be very helpful to understand the behavior of Mathematica. $\endgroup$ Commented Apr 9, 2013 at 23:23

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.