Это на самом деле не совсем тривиальная теорема.Чтобы показать, что Type = Set
приводит к парадоксу (и, следовательно, наличие отдельных уровней Type
необходимо), вам нужно использовать стандартный результат, похожий на парадокс Рассела из теории множеств.В частности, вам понадобится парадокс Хюркена , который, по сути, говорит, что меньшие Type
s не могут быть в равной степени с большими Type
s (помните, что Type
полиморфна в Coq, и вв частности, Set
является самым низким уровнем (или вторым самым низким, если вы включите Prop
)).
Конкретную теорему, которую мы хотим, можно найти в стандартной библиотеке.
Require Logic.Hurkens.
Import Logic.Hurkens.TypeNeqSmallType.
Check paradox.
paradox
имеет тип подписи forall A : Type, Type = A -> False
.Это в значительной степени то, что мы хотим доказать, поскольку Set: Type
(по крайней мере, если Type
достаточно велико).
Lemma set_is_not_type: Type <> Set.
Proof.
intro F.
exact (paradox _ F).
Defined.
Coq автоматически устанавливает ограничения на Type
в этой лемме, чтобы гарантировать, чтоSet: Type
.
С другой стороны, Set
равен некоторому уровню Type
, поэтому мы должны быть в состоянии доказать, что Type = Set
с некоторымиразличные ограничения на это Type
.Самым простым способом, который я нашел, было доказать это Type = Type
, но затем создать экземпляр этой теоремы с помощью Set
.По какой-то причине, как вы обнаружили, рефлексивность не может сама по себе навязывать ограничения вселенной.Чтобы сделать это, нам нужно сделать обе леммы полиморфными вселенной, чтобы их можно было создавать с определенным уровнем вселенной.
Polymorphic Lemma type_is_type: Type = Type.
Proof.
reflexivity.
Defined.
Polymorphic Lemma type_is_set: Type = Set.
Proof.
apply type_is_type.
Defined.
Самый простой способ сделать все универсальным полиморфным - поставить Set Universe Polymorphism.
перед всеми.