Вместо
evalTy : Type → Set
вы можете написать
evalTy : (σ : Type) -> Set (levelOf σ)
(András Kovács, уход, чтобы добавить ответ со ссылками на ваше вложение предиктивного F?)
Этих достаточно для встраивания, но я видел много ошибок Setω
, и они травмировали меня, так что теперь я пытаюсь чтобы как можно больше избежать зависимых вселенных.
Вы можете вставлять полиморфные типы в Set₁
и мономорфные типы в Set
, поэтому вы можете вставлять любой тип в Set₁
с помощью уродливого механизма подъема. Я пробовал это несколько раз, и это всегда было ужасно.
То, что я хотел бы попробовать, чтобы определить evalTy
, как
evalTy : Type -> Set ⊎ Set₁
, а затем устранить ее на уровне типа, как это:
data [_,_]ᵀ {α β γ δ} {A : Set α} {B : Set β} (C : A -> Set γ) (D : B -> Set δ)
: A ⊎ B -> Set (γ ⊔ δ) where
inj¹ : ∀ {x} -> C x -> [ C , D ]ᵀ (inj₁ x)
inj² : ∀ {y} -> D y -> [ C , D ]ᵀ (inj₂ y)
Вы можете запустить это исключение:
Runᴸ : ∀ {α β γ δ} {A : Set α} {B : Set β} {C : A -> Set γ} {D : B -> Set δ} {s}
-> [ C , D ]ᵀ s -> Level
Runᴸ {γ = γ} (inj¹ _) = γ
Runᴸ {δ = δ} (inj² _) = δ
Runᵀ : ∀ {α β γ δ} {A : Set α} {B : Set β} {C : A -> Set γ} {D : B -> Set δ} {s}
-> (sᵀ : [ C , D ]ᵀ s) -> Set (Runᴸ sᵀ)
Runᵀ {C = C} (inj¹ {x} _) = C x
Runᵀ {D = D} (inj² {y} _) = D y
runᵀ : ∀ {α β γ δ} {A : Set α} {B : Set β} {C : A -> Set γ} {D : B -> Set δ} {s}
-> (sᵀ : [ C , D ]ᵀ s) -> Runᵀ sᵀ
runᵀ (inj¹ z) = z
runᵀ (inj² w) = w
Таким образом, вы вводите зависимость юниверса только в конце, когда вам действительно нужно вычислить что-то.
E.g.
SomeSet : ℕ -> Set ⊎ Set₁
SomeSet 0 = inj₁ ℕ
SomeSet n = inj₂ Set
ofSomeSet : ∀ n -> [ (λ A -> A × A) , id ]ᵀ (SomeSet n)
ofSomeSet zero = inj¹ (0 , 5)
ofSomeSet (suc n) = inj² ℕ
-- 0 , 5
test₁ : ℕ × ℕ
test₁ = runᵀ (ofSomeSet 0)
-- ℕ
test₂ : Set
test₂ = runᵀ (ofSomeSet 1)
ofSomeSet
является зависимой функцией, а не «универсально зависит», вы можете написать, например, f = ofSomeSet ∘ suc
, и это совершенно понятное выражение.Это не работает с вселенными зависимостями:
fun : ∀ α -> Set (Level.suc α)
fun α = Set α
oops = fun ∘ Level.suc
-- ((α : Level) → Set (Level.suc α)) !=< ((y : _B_160 .x) → _C_161 y)
-- because this would result in an invalid use of Setω
Вы можете также повысить [_,_]ᵀ
, чтобы сделать его отображаемым, как я сделал here, но все это, вероятно, слишком, и вы должны просто использовать
evalTy : (σ : Type) -> Set (levelOf σ)
Обратите внимание, что Я говорю только о предикативном фрагменте System F. Full System F не встраивается как Dominique Devriese объясняет в своих комментариях к вопросу.
Однако я чувствую, что мы можем встроить больше, чем предикативный фрагмент, если мы сначала нормализуем термин System F. Например. id [∀ α : *. α → α] id
не является непосредственно встраиваемым, но после нормализации он становится только id
, который встраивается.
Однако должно быть возможно встраивать id [∀ α : *. α → α] id
даже без нормализации, преобразовывая его в Λ α. id [α → α] (id [α])
, что и делает Agda с неявными аргументами (справа?). Поэтому мне непонятно, что именно мы не можем внедрить.
Как я понимаю: система F является нецелесообразной, а Агда нет, невозможно определить интерпретацию, где [[*]] = Set. Этому нас научили Рейнольдс: http://link.springer.com/chapter/10.1007/3-540-13346-1_7. Примечание: этот документ не является самым простым для чтения. –
Я думаю, вы могли бы попробовать альтернативы, хотя, например. интерпретируя [[*]] не как множество, а как подмножества предопределенной вселенной или что-то подобное. Возможно, у кого-то есть хорошая ссылка для этого ... Я не уверен, что это то, что вы ищете, хотя ... –
Также обратите внимание: статья Рейнольдса действительно посвящена интерпретации системы F в теории множеств с помощью [[*] ] = Set, а не о том, чтобы делать то же самое в теории зависимых типов, как Agda, но у меня есть интуиция, что результат здесь тоже ... –