# Stepwise simplification

I have a really, really complicated set of string simplification rules (only it doesn't actually work on strings, I use stuff like

F[x__,a,y__]:=F[x,b,y];
F[x__,b,b,y__]:=F[x,c,y];


to get the results on the fly - also I never know beforehand which rule is applicable in a concrete situation). As you can imagine, 100 of these rules have at least one hidden typo.
Is it possible to partially "Hold" the execution with something like this pseudocode happening

>exec F[a,a] 3 steps
F[b,a], rule 1 used
F[b,b], rule 1 used
F[c], rule 2 used
Done
>exec F[a,c] 1 steps
F[b,c], rule 1 used
Done


so I can then control by hand where a substition went haywire (which is luckily easy)? I.e. print out all intermediate results of the replacements?

• shouldn't F[x__,a,y__] be F[x___,a,y___]? and similarly, F[x__,b,b,y__] should be F[x___,b,b,y___]? – kglr Jul 3 '19 at 14:38
• Correct. I confused the two as in the actual case, rarely something happens at the boundary. – Hauke Reddmann Jul 4 '19 at 10:43

Perhaps Trace gives what you need:

ClearAll[F]
F[x___, a, y___]:= F[x, b, y];
F[x___, b, b, y___]:= F[x, c, y];

Trace[F[a, a]]


{F[a, a], F[b, a], F[b, b], F[c]}

Trace[F[a, c]]


{F[a, c], F[b, c]}

• I should have trusted my intuition which said "Surely, MATHEMATICA has something like a computation trace" and googled myself :-) Anyway, spot on. – Hauke Reddmann Jul 4 '19 at 10:45