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?

  • 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$ Apr 8 '13 at 8:26
  • $\begingroup$ Related: (13472), (24860), (26619) $\endgroup$
    – Mr.Wizard
    Jul 15 '15 at 6:39

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}]}


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:

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

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

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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