Transfinite Induction and Recursion

Ordinary proof by induction is a line of dominoes: knock over 0, show each domino topples the next, and every natural number falls. But the ordinals reach past \omega — and there is no single domino sitting just before \omega to knock it over. Transfinite induction repairs this with one extra move: a special rule for the limit ordinals, the places you can only reach "all at once."

Why it must work: no infinite descent

The principle is guaranteed by the very definition of well-ordering. Suppose P failed somewhere. Then the set of counterexamples — ordinals where P is false — is non-empty, so (the ordinals being well-ordered) it has a least member \alpha_0. But then P(\beta) holds for every \beta < \alpha_0 (those are smaller than the least counterexample), and the hypothesis forces P(\alpha_0) to hold too — contradicting that it was a counterexample. So there are no counterexamples. It is exactly the "least counterexample" argument, now running along the whole ordinal line.

Watch the wave of "proved" sweep up the staircase — through the finite steps, across the limit \omega, and onward:

Transfinite recursion: defining, not just proving

Its twin is transfinite recursion — the tool for defining a function on all ordinals. You specify a value in three matching cases, and recursion guarantees a unique function F exists:

This is how ordinal addition, multiplication, the cumulative hierarchy V_\alpha, and the aleph function \aleph_\alpha are all built. For example, ordinal addition \alpha + \beta is recursion on \beta:

\alpha + 0 = \alpha,\qquad \alpha + (\beta+1) = (\alpha+\beta)+1,\qquad \alpha + \lambda = \bigcup_{\beta<\lambda}(\alpha+\beta). // Recursion on a well-founded order: rank(x) = sup of (rank(child)+1) over children. // The empty node gets rank 0; the limit/union case is the max over all children. type Node = { name: string; children: Node[] }; function rank(n: Node): number { if (n.children.length === 0) return 0; // base return Math.max(...n.children.map((c) => rank(c) + 1)); // successor/sup step } const leaf = (name: string): Node => ({ name, children: [] }); const tree: Node = { name: "root", children: [leaf("a"), { name: "b", children: [leaf("c")] }] }; console.log("rank(root) = " + rank(tree)); // 0 -> a:0, c:0 -> b:1 -> root:2

Try proving "\alpha is finite" by induction — it sails through the base and successor steps (0 is finite; if \alpha is finite so is \alpha+1) yet is false, because the limit step fails: each finite ordinal below \omega is finite, but their union \omega is not. That broken limit step is not a nuisance — it is the whole reason transfinite induction has a third case. Ordinary induction never notices, because \mathbb{N} has no limit ordinals below \omega.