+<code>(Λ 'a (λ x:'a . x)): (∀ 'a . 'a -> 'a)</code>
+
+Pred in System F
+----------------
+
+We saw that the predecessor function couldn't be expressed in the
+simply-typed lambda calculus. It *can* be expressed in System F,
+however. Here is one way, coded in
+[[Benjamin Pierce's type-checker and evaluator for
+System F|http://www.cis.upenn.edu/~bcpierce/tapl/index.html]] (the
+relevant evaluator is called "fullpoly"):
+
+ N = All X . (X->X)->X->X;
+ Pair = (N -> N -> N) -> N;
+ let zero = lambda X . lambda s:X->X . lambda z:X. z in
+ let fst = lambda x:N . lambda y:N . x in
+ let snd = lambda x:N . lambda y:N . y in
+ let pair = lambda x:N . lambda y:N . lambda z:N->N->N . z x y in
+ let suc = lambda n:N . lambda X . lambda s:X->X . lambda z:X . s (n [X] s z) in
+ let shift = lambda p:Pair . pair (suc (p fst)) (p fst) in
+ let pre = lambda n:N . n [Pair] shift (pair zero zero) snd in
+
+ pre (suc (suc (suc zero)));
+
+We've truncated the names of "suc(c)" and "pre(d)", since those are
+reserved words in Pierce's system. Note that in this code, there is
+no typographic distinction between ordinary lambda and type-level
+lambda, though the difference is encoded in whether the variables are
+lower case (for ordinary lambda) or upper case (for type-level
+lambda).
+
+The key to the extra expressive power provided by System F is evident
+in the typing imposed by the definition of `pre`. The variable `n` is
+typed as a Church number, i.e., as `All X . (X->X)->X->X`. The type
+application `n [Pair]` instantiates `n` in a way that allows it to
+manipulate ordered pairs: `n [Pair]: (Pair->Pair)->Pair->Pair`. In
+other words, the instantiation turns a Church number into a
+pair-manipulating function, which is the heart of the strategy for
+this version of predecessor.
+
+Could we try to build a system for doing Church arithmetic in which
+the type for numbers always manipulated ordered pairs? The problem is
+that the ordered pairs we need here are pairs of numbers. If we tried
+to replace the type for Church numbers with a concrete (simple) type,
+we would have to replace each `X` with the type for Pairs, `(N -> N ->
+N) -> N`. But then we'd have to replace each of these `N`'s with the
+type for Church numbers, `(X -> X) -> X -> X`. And then we'd have to
+replace each of these `X`'s with... ad infinitum. If we had to choose
+a concrete type built entirely from explicit base types, we'd be
+unable to proceed.
+
+[See Benjamin C. Pierce. 2002. *Types and Programming Languages*, MIT
+Press, chapter 23.]
+
+Typing ω
+--------------
+
+In fact, unlike in the simply-typed lambda calculus,
+it is even possible to give a type for ω in System F.
+
+<code>ω = lambda x:(All X. X->X) . x [All X . X->X] x</code>
+
+In order to see how this works, we'll apply ω to the identity
+function.
+
+<code>ω id ==</code>