Trainer for Symbolic Differentiation

Please write the programs directly into the section programs at the end of this notebook!

The Problem

Start from the programs for symbolic differentiation prepared for an earlier exercise and extend each differentiation rule that has been implemented by capabilities for explaining the computation of the derivative. All explanations should be displayed in a separate window, and each line of explanation should tell the actual rule that is applied and it should explain, how the general rule needs to be applied in the concrete case. Example: When computing the derivative of (t^2) Sin[t] w.r.t. t we first have to use the product rule (f*g)' = f'*g + g' f. In the explanation of the computation, do not explain the abstract product rule as written above but explain the rule for the concrete case, i.e. substitute concrete expressions for f and g in the abstract product rule. Write something like

Product Rule: (∂_t)((t^2) 
              Sin[t]) = ((∂_t) (t^2)) 
            Sin[t] + ((∂_t) Sin[t]) (t^2).

This explanation is only a proposal, try to explain the computation as you would explain differentiation to somebody who is in the process of learning how to differentiate functions "by hand". As a consequence, arrange the rules for computation in such a way that the computation not only produces a correct result but also reflects how you would teach the rules for differentiation to a student. Use formatting (colors, fonts, etc.) to your personal taste. 
Using an optional parameter, the user should have the possibility to turn the feature of explanation on or off.

Differentiate[(t^2) Sin[t], t, Explain -> True]

should explain the computation in a separate window and return the final result as a return value, whereas

Differentiate[(t^2) Sin[t], t, Explain -> False]

should "quietly" compute and return the result. If the third parameter is missing the default behavior should be to explain the computation.

Programs

Test Examples