In Polymorphism is not set-theoretic, John Reynolds demonstrates that polymorphic lambda calculus has no set theoretic models, or, more precisely, no set theoretic models which preserve the binary product and function space and also satisfy some weak condition on universal quantification. The proof was elucidated in On Functors Expressible in the Polymorphic Typed Lambda Calculus by John Reynolds and Gordon Plotkin. The exposition in the latter is much clearer. I’ll reproduce a rough sketch of the proof here.
The crux of the argument is to show that if a set-theoretic model existed then it would contain all initial algebras of “definable functors”, i.e. all initial algebras of those functors on Set which are definable within the polymorphic ambda calculus. Then a particular initial algebra can be constructed whose existence is a contradiction.
Roughly, the proof proceeds by defining
P = Fix T = forall k. (T k -> k) -> k for any lambda calculus functor
T. This comes with a special map
h :: T P -> P. (In some sense this is an initial algebra in the lambda calculus but without reference to a denotational semantics perhaps that is a meaningless concept.) In any case, assuming we have a set theoretic model, the denotations of
h give a weak initial algebra on Set. Now in Set all weak initial algebras are in fact initial algebras, because certain equalizers exist. Thus
h give moreover an initial algebra and hence, in denotation,
T P is isomorphic to
To arrive at a contradiction we simply choose
T a = ((a -> Bool) -> Bool). Then the denotation of
T P cannot be isomorphic to the denotation of
P since it has larger cardinality.
What on earth is
Fix ((_ -> Bool) -> Bool)?
Natbut it’s not yet clear to me whether the identification depends on adding specific axioms to constructive set theory.
Is it morally the same thing in all models?
If it is different in different models what are the philosophical implications?
Is it useful for programming?
If not, is it possible to construct a polymorphic lambda calculus that has enough polymorphism for programming but not so much polymorphism that it permits the existence of