- Allows you to inspect the state of the computation when an error occurs.
- Built around subproblems and reductions
- Subproblems are created to evaluate simpler expressions whose values must be
combined, used, or modified to produce the value of a larger expression
- Reductions are created when a large expression can be converted into a simpler
expression which has precisely the same value as the large expression.