Zulip Chat Archive
Stream: new members
Topic: sanity check on Lean's type theory
Chris M (Jul 23 2020 at 05:23):
I've been lightly reading through some things, such as Mario Carneiro's thesis and the SEP entry on intuitionistic type theory. I just want to do a sanity check. Are the following correct?
-
We use the term predicative vs impredicative to refer to whether a definition is allowed to reference itself. For Lean, terms are predicative, all types are predicative, except
Prop
which is impredicative: terms are predicative in the sense that, (without themeta
keyword) I can't write a definition of a functionf
whose body callsf
itself. On the other handProp
is impredicative, in the sense that I can have a type\Pi P:Prop, P : Prop
where a term of typeProp
itself contains the type Prop. Other types are predicative, in the sense that if\Pi T: Type u, T
will have typeType u+1
. -
We need that terms are predicative in order to ensure that the type theory is consistent, but Prop being impredicative only means that the type theory becomes undecidable in general, it doesn't result in inconsistency (as far as we know). I'm unsure about this.
Mario Carneiro (Jul 23 2020 at 05:30):
We use the term predicative vs impredicative to refer to whether a definition is allowed to reference itself.
Not quite. A definition that references itself is called "recursive", and this is well known since antiquity to lead to contradictions without constraint, c.f. the liar paradox. Impredicativity refers to a definition that is allowed to quantify over a type or collection that contains the object being defined. This leads more subtly to contradiction via Russell's paradox, and different constraints are required to eliminate the contradictions
Mario Carneiro (Jul 23 2020 at 05:41):
Using impredicativity in lean you can create russell-like properties like:
def russell : Prop := ∃ p : Prop → Prop, ¬ p (∃ x, p x)
Chris M (Jul 23 2020 at 09:09):
Mario Carneiro said:
Using impredicativity in lean you can create russell-like properties like:
def russell : Prop := ∃ p : Prop → Prop, ¬ p (∃ x, p x)
So this property doesn't introduce an inconsistency, it just is a property for which we can neither prove it nor disprove it. i.e. we can neither have an inhabitant of russel
nor of ¬ russel
?
Chris Wong (Jul 23 2020 at 09:15):
Note that "impredicative" in this context has nothing to do with "impredicative types" in Haskell, which is about type inference on nested foralls.
Mario Carneiro (Jul 23 2020 at 11:08):
@Chris M No, that russell
can certainly be proven or disproven. It's not really possible to faithfully represent russell's class inside prop because Prop -> Prop doesn't inject into Prop; Exists
, playing the role of subtype
inside Prop
, is not an injective function (and if it was, Russell's class would yield a contradiction)
Mario Carneiro (Jul 23 2020 at 11:09):
def russell : Prop := ∃ p : Prop → Prop, ¬ p (∃ x, p x)
theorem russell_true : russell := ⟨λ _, false, id⟩
Mario Carneiro (Jul 23 2020 at 11:21):
@Chris Wong Actually I think the usage is related. Haskell is based on System F, in which there is one universe called *
which is impredicative (you can quantify over types and get another type). However type inference works with only a subset of these types, where all type quantifiers appear at the top level. These are called "rank 1" types, and if you use haskell without ImpredicativeTypes
, the universe is not fully impredicative, because types with quantifiers don't act like true types since they can't be used on the left of an arrow. The universe is basically first order at that point and so you don't get impredicative quantification.
Last updated: Dec 20 2023 at 11:08 UTC