Я все еще озадачен тем, что означает Установить в COQ. Когда я использую Установить и когда я использую Тип?
В Hott Установить определяется как тип, где доказательства идентичности уникальны. Но я думаю, что в Кок есть другая интерпретация.
Я все еще озадачен тем, что означает Установить в COQ. Когда я использую Установить и когда я использую Тип?
В Hott Установить определяется как тип, где доказательства идентичности уникальны. Но я думаю, что в Кок есть другая интерпретация.
Set
означает довольно разные вещи в Coq и HoTT.
В Coq каждый объект имеет тип, включая сами типы. Типы типов обычно называются сортами, видами или юниверсами. В Coq все (все релевантно вычислимые) вселенные Set
и Type_i
, где i
пробегает натуральные числа (0, 1, 2, 3,...). Имеются следующие включения:
Set <= Type_0 <= Type_1 <= Type_2 <= ...
Эти юниверсы печатаются следующим образом:
Set : Type_i for any i
Type_i : Type_j for any i < j
Как и в Hott, эта стратификация необходима для обеспечения логической последовательности. Как отметил Антал, Set
ведет себя в основном как наименьший Type
, за одним исключением: его можно сделать нечистым, когда вы вызываете coqtop
с опцией -impredicative-set
. Конкретно это означает, что forall X : Set, A
имеет тип Set
всякий раз, когда A
. Напротив, forall X : Type_i, A
имеет тип Type_(i + 1)
, даже если A
имеет тип Type_i
.
Причиной этой разницы является то, что из-за логических парадоксов только наименьший уровень такой иерархии может стать беспристрастным. Тогда вы можете задаться вопросом, почему Set
по умолчанию не является неактивным. Это связано с тем, что нецелесообразный Set
несовместим с сильной формой аксиомы исключенной середины:
forall P : Prop, {P} + {~ P}.
То, что эта аксиома позволяет вам сделать, это написать функции, которые могут решать произвольные предложения. Обратите внимание, что тип {P} + {~ P}
находится в Set
, а не Prop
. Обычная форма исключенного среднего forall P : Prop, P \/ ~ P
не может использоваться таким же образом, потому что вещи, которые живут в Prop
, не могут быть использованы соответствующим образом.
В дополнение к ответу Артура:
Из того факта, что Set
расположен в нижней части иерархии,
из этого следует, что
Set
- это тип "малых" типов данных и типов функций, т.е. тех, чьи значения прямо или косвенно не включают типы.
Это означает, что следующее не удастся:
Fail Inductive Ts : Set :=
| constrS : Set -> Ts.
с этим сообщением об ошибке:
Большие непропозициональные индуктивные типы должны быть в
Type
.
Как следует из сообщения, мы можем изменить его, используя Type
:
Inductive Tt : Type :=
| constrT : Set -> Tt.
Ссылка: