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$
    – Mr.Wizard
    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$
    – Joonho Kim
    Commented Apr 9, 2013 at 23:23

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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