Iteration and Invariants

Recall the first iterative factorial procedure:
(define factorial
  (lambda (n)
    (factorial-product 1 n)))

(define factorial-product
 (lambda (a b)  ; compute a × b!
  (if (= b 0)   ; as (a × b) × (b-1)!
      a
      (factorial-product (* a b) (- b 1)))))
factorial correctly computes the factorial of n if factorial-product correctly computes a × b!

This quantity is also an invariant. Example:

                   1 × 5!  = 120

             (1 × 5) × 4!  = 120

             (5 × 4) × 3!  = 120

            (20 × 3) × 2!  = 120

            (60 × 2) × 1!  = 120

           (120 × 1) × 0!  = 120