Я пытаюсь выяснить, как иерархии типов работают в Agda.
Предполагая, что я задаю тип набора X:
X : Set
а затем приступим к построению индуктивного типа
data Y : X -> Set where
Каков тип X -> Set
? Установлен ли он или Тип?
Спасибо!
Я пытаюсь выяснить, как иерархии типов работают в Agda.
Предполагая, что я задаю тип набора X:
X : Set
а затем приступим к построению индуктивного типа
data Y : X -> Set where
Каков тип X -> Set
? Установлен ли он или Тип?
Спасибо!
Хорошо, почему бы не спросить Агда? Я собираюсь использовать отличный режим Agda для Emacs. Начнем с:
module Hierarchy where
postulate
X : Set
data Y : X → Set where
-- empty
Мы должны загрузить файл с помощью C-c C-l
; эта typechecks файл, превращает ?
в отверстия, выделяет синтаксис и т.д.
Теперь существует команда "Infer (выводить) тип", доступный через C-c C-d
, поэтому используйте это:
> C-c C-d
Expression:
> Y
X → Set
Правильно, это имеет смысл. Мы определили Y : X → Set
, поэтому это не должно удивлять. Позвольте спросить еще раз:
> C-c C-d
Expression:
> X → Set
Set₁
Итак, у вас есть это: Y : X → Set : Set₁
.
В то время как первая часть отвечает на вопрос и показывает вам, как проверять этот материал самостоятельно, делать это каждый раз было бы скучным, по крайней мере. Вот как это работает:
Чтобы избежать парадоксов, нам нужно
Set i : Set (i + 1)
который дает вам (бесконечную) иерархию Set
s. Если у вас есть Set : Set
(который Agda позволяет с помощью флага --type-in-type
), вы можете получить противоречие, например этот.
Это также дает нам простое правило для функций:
A : Set i
B : A → Set j
(a : A) → B a : Set (max i j)
Применение этого к вашему примеру:
X : Set
Set : Set₁
X → Set : Set (max 0 1)
X → Set : Set₁