- 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.