Саморепрезентация и вселенные в ОТТ

Вопрос касается теории наблюдательных типов.

Рассмотрим этот параметр:

data level : Set where
  # : ℕ -> level
  ω : level

_⊔_ : level -> level -> level
# α ⊔ # β = # (α ⊔ℕ β)
_   ⊔ _   = ω

_⊔ᵢ_ : level -> level -> level
α ⊔ᵢ # 0 = # 0
α ⊔ᵢ β   = α ⊔ β

mutual
  Prop = Univ (# 0)
  Type = Univ ∘ # ∘ suc

  data Univ : level -> Set where
    bot  : Prop
    top  : Prop
    nat  : Type 0
    univ : ∀ α -> Type α
    σ≡    : ∀ {α β γ} -> α ⊔  β ≡ γ -> (A : Univ α) -> (⟦ A ⟧ -> Univ β) -> Univ γ
    π≡    : ∀ {α β γ} -> α ⊔ᵢ β ≡ γ -> (A : Univ α) -> (⟦ A ⟧ -> Univ β) -> Univ γ
    πᵤ   : ∀ {α} -> (A : Univ α) {k : ⟦ A ⟧ -> level} -> (∀ x -> Univ (k x)) -> Univ ω

  ⟦_⟧ : ∀ {α} -> Univ α -> Set
  ⟦ bot      ⟧ = ⊥
  ⟦ top      ⟧ = ⊤
  ⟦ nat      ⟧ = ℕ
  ⟦ univ α   ⟧ = Univ (# α)
  ⟦ σ≡ _ A B ⟧ = Σ ⟦ A ⟧ λ x -> ⟦ B x ⟧
  ⟦ π≡ _ A B ⟧ = (x : ⟦ A ⟧) -> ⟦ B x ⟧
  ⟦ πᵤ   A B ⟧ = (x : ⟦ A ⟧) -> ⟦ B x ⟧

prop = univ 0
type = univ ∘ suc

У нас есть стратифицированная иерархия вселенных: Prop : Type 0 : Type 1 : ... (где Prop - импредикативный), коды для Σ- и Π-типов и один дополнительный код πᵤ для «полиморфных Π-типов вселенной». Так же, как в Agda ∀ α -> Set α имеет [скрытый] тип Setω, π nat univ имеет тип Univ ω.

С некоторыми ярлыками

_&_ : ∀ {α β} -> Univ α -> Univ β -> Univ (α ⊔  β)
A & B = σ A λ _ -> B

_⇒_ : ∀ {α β} -> Univ α -> Univ β -> Univ (α ⊔ᵢ β)
A ⇒ B = π A λ _ -> B

_‵π‵_ : ∀ {α β} -> (A : Univ α) -> (⟦ A ⟧ -> Univ β) -> Univ (α ⊔ᵢ β)
_‵π‵_ = π

_‵πᵤ‵_ : ∀ {α} -> (A : Univ α) {k : ⟦ A ⟧ -> level} -> (∀ x -> Univ (k x)) -> Univ ω
_‵πᵤ‵_ = πᵤ

мы можем определить множество функций, используя конструкции целевого языка, например

_≟ₚ_ : ⟦ nat ⇒ nat ⇒ prop ⟧
zero  ≟ₚ zero  = top
suc n ≟ₚ suc m = n ≟ₚ m
_     ≟ₚ _     = bot

На воображаемом языке мы можем идентифицировать коды и соответствующие типы, образуя замкнутую рефлексивную вселенную (нам также нужно некоторое представление типов данных первого порядка, но это уже другая история). Но рассмотрим обычное равенство типов:

Eq : ∀ {α β} -> Univ α -> Univ β -> Prop

Как встроить это в целевой язык? Мы можем написать

EqEmb : ⟦ (nat ‵πᵤ‵ λ α → nat ‵πᵤ‵ λ β → univ α ⇒ univ β ⇒ prop) ⟧

но обратите внимание, что в целевом языке ничего не говорится о ω. В Eq мы можем сопоставить аргументы по образцу следующим образом:

Eq (πᵤ A₁ B₁) (πᵤ A₂ B₂) = ...

α и β оба становятся ω, и все в порядке. Но в EqEmb мы не можем подобным образом сопоставить шаблон, потому что в univ α α это число и не может быть ω, поэтому ⟦ univ α ⟧ никогда не будет Univ ω.

Допустим, мы можем сопоставить шаблон с простыми типами Agda. Затем мы могли бы написать функцию, которая определяет, является ли какое-то значение функцией:

isFunction : ∀ {α} {A : Set α} -> A -> Bool
isFunction {A = Π A B} _ = true
isFunction             _ = false

Но что, если B "зависит от вселенной" и имеет, скажем, этот тип: ∀ α -> Set α? Тогда Π A B имеет тип Setω, а α объединен с ω. Но если бы мы могли создавать экземпляры переменных уровня с помощью ω, тогда мы могли бы писать такие вещи, как

Id : Set ω
Id = ∀ α -> (A : Set α) -> A -> A

id : Id
id α A x = x

id ω Id id ~> id

Это непредсказуемо (хотя я не знаю, приводит ли эта конкретная форма непредсказуемости к несогласованности. Неужели?).

Таким образом, мы не можем добавить ω в качестве юридического уровня к целевому языку, и мы не можем сопоставить шаблон на Set α при наличии "зависимых от юниверса" функций. Таким образом, «рефлексивное» равенство

EqEmb : ⟦ (nat ‵πᵤ‵ λ α → nat ‵πᵤ‵ λ β → univ α ⇒ univ β ⇒ prop) ⟧

не определен для всех полиморфных функций юниверса (не «зависит от юниверса»). Например. тип типа map

map : ∀ {α β} {A : Set α} {B : Set β} -> (A -> B) -> List A -> List B

равно Setω, и мы не можем спросить, Eq (typeOf emb-map) (typeOf emb-map), потому что в Eq A B тип A ⟦ univ α ⟧, который является "конечной" вселенной (то же самое верно для B).

Так можно ли встроить OTT в себя хорошо типизированным способом? Если нет, можем ли мы как-нибудь обмануть? Можем ли мы сопоставить шаблон на Set α при наличии "зависимых от вселенной" функций, как будто все в порядке?


person user3237465    schedule 05.12.2015    source источник


Ответы (1)


В итоге я получил следующую иерархию:

Prop : Type 0 : Type 1 : ...
(∀ α -> Type α) : Type ω₀ : Type ω₁

Код для Type ω₁ отсутствует, поскольку раньше не было кода для Type ω₀, но нам нужен код для Type ω₀, чтобы можно было определять равенство полиморфных функций юниверса, а код для Type ω₁ менее полезен.

Теперь у нас есть четыре квантора, зависящих от вселенной.

σ₀ π₀   : {α : Lev false}
        -> (A : Univ α) {k : ⟦ A ⟧ -> Lev false} -> (∀ x -> Univ (k x)) -> Univ {false} ω₀
σ₁ π₁   : ∀ {a} {α : Lev a}
        -> (A : Univ α) {b : ⟦ A ⟧ -> Bool} {k : ∀ x -> Lev (b x)}
        -> (∀ x -> Univ (k x))
        -> Univ ω₁

Дело в том, что теперь возможно сопоставление с образцом на π₀, что позволяет определять равенство полиморфных функций вселенной, но сопоставление с образцом на π₁ невозможно (как было с π₀, которое называлось πᵤ), и мы можем жить с этим.

Равенства бывают следующих «рефлексивных» типов:

mutual
  Eq : ⟦ (π₁ lev λ α -> π₁ lev λ β -> univ⁺ α ⇒ univ⁺ β ⇒ prop) ⟧
  eq : ⟦ (π₁ lev λ α -> π₁ lev λ β -> π (univ⁺ α) λ A -> π (univ⁺ β) λ B -> A ⇒ B ⇒ prop) ⟧

Код находится здесь. Однако похоже, что мне нужно еще раз расширить иерархию, чтобы иметь возможность доказать согласованность. Я задам вопрос по этому поводу.

person user3237465    schedule 01.02.2016