Разбираемся с Lift и Setω и вхождениями переменных в выражения

В предыдущем вопросе у меня были типы для игрушечного языка

data Type : Set where
  Nat  : Type
  Prp : Type

Я думал интерпретировать их, используя непересекающийся союз Type → Set ⊎ Set₁, но подумал, что лучше всего будет поднять уровень, и мне помогли получить

⟦_⟧ₜ : Type → Set₁
⟦ Nat ⟧ₜ = Lift ℕ
⟦ Prp ⟧ₜ = Set

Теперь предположим, что в моем игрушечном языке есть переменные и выражения.

data Variable : Type → Set where
  x y : ∀ {t} → Variable t

data Expr : Type → Set₁ where
  Var : ∀ {t} (v : Variable t) → Expr t      -- varaible symbols
  ???? : ℕ → Expr Nat                         -- constant symbols
  ???? : Set → Expr Prp
  _+_ : (m n : Expr Nat) → Expr Nat          -- binary function symbol
  _≈_ : (e f : Expr Nat) → Expr Prp          -- binary relation symbol

Затем семантика выражений,

State = ∀ {t} → Variable t → ⟦ t ⟧ₜ

⟦_⟧ₑ : ∀ {t} → Expr t → State → ⟦ t ⟧ₜ
⟦_⟧ₑ (Var v)  σ = σ v
⟦_⟧ₑ (???? q)   σ = lift q
⟦_⟧ₑ (???? p)   σ = p
⟦_⟧ₑ (e + e₁) σ = lift $ lower (⟦ e ⟧ₑ σ) +ℕ     lower (⟦ e₁ ⟧ₑ σ)
⟦_⟧ₑ (e ≈ e₁) σ = lift (lower (⟦ e ⟧ₑ σ)) ≡ lift (lower (⟦ e₁ ⟧ₑ σ))

Я как бы понимаю, что в целом lift (lower x) ≠ x из-за «обновления уровня» из-за lift, но все же, почему последняя строка не может быть просто ⟦ e ⟧ₑ σ ≡ ⟦ e₁ ⟧ₑ σ ?

Я должен признать, что это мой первый раз, когда я использую Lift и, к сожалению, не нашел учебника/объяснения по нему --- кроме идеи, что он встраивает маленькие типы в большие типы, как указано в его определении.


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

Со стандартными/производными равенствами

-- no quick `deriving Eq' mechanism, yet.
postulate _≟ₜ_ : Decidable {A = Type} _≡_   
postulate _≟ᵥ_ : ∀ {t s} → Variable t → Variable s → Bool

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

_[_/_] : ∀ {s t} → Expr t → Variable s → Expr s → Expr t
_[_/_] {s} {t} (Var v) u e with s ≟ₜ t
Var v [ u / e ] | yes refl = if v ≟ᵥ u then e else Var v
Var v [ u / e ] | no ¬p = Var v
???? n [ v / e ] = ???? n
???? p [ v / e ] = ???? p
(E + F) [ v / e ] = E [ v / e ] + F [ v / e ]
(E ≈ F) [ v / e ] = E [ v / e ] ≈ F [ v / e ]

Теперь вопрос о вхождениях переменных в выражения.

_not-occurs-in₀_ : ∀ {t} → Variable t → Expr t → Set₁
v not-occurs-in₀ E = ∀ {e} → E [ v / e ] ≡ E

_not-occurs-in₁_ : ∀ {t} → Variable t → Expr t → Set₁
v not-occurs-in₁ E = ∀ {e} {σ : State} → ⟦ E [ v / e ] ⟧ₑ σ ≡ ⟦ E ⟧ₑ σ

У меня были проблемы с использованием любого определения. В частности, я не мог даже определить одно через другое. Любая помощь в этом будет оценена по достоинству!


После некоторых копаний я попытался

levelOf : Type → Level
levelOf Nat = zero
levelOf Prp = suc zero

New⟦_⟧ₜ : (t : Type) → Set (levelOf t)
New⟦ Nat ⟧ₜ = ℕ
New⟦ Prp ⟧ₜ = Set    

Однако теперь я получаю Setω ошибок для определения State выше! То есть,

-- works fine if i use the risky {-# OPTIONS --type-in-type #-}
NState = {t : Type} → Variable t → New⟦ {!t!} ⟧ₜ

Насколько я знаю, возникает такая ошибка , грубо говоря, когда есть присвоение уровней вселенным.

Какие махинации я бессознательно делаю, чтобы получить эту проблему?


person Musa Al-hassy    schedule 30.03.2016    source источник


Ответы (1)


Напомним, что Set₁ ∋ Lift ℕ ∋ ⟦ e ⟧ₑ σ и Set α ∋ (Set α ∋ A ∋ x) ≡ (Set α ∋ A ∋ y), где _∋_ из модуля Function:

infixl 0 _∋_
_∋_ : ∀ {a} (A : Set a) → A → A
A ∋ x = x

Следовательно, выражение ⟦ e ⟧ₑ σ ≡ ⟦ e₁ ⟧ₑ σ лежит в Set₁ (поскольку типы ⟦ e ⟧ₑ σ и ⟦ e₁ ⟧ₑ σ лежат в Set₁), а вам нужно, чтобы оно было в Set. Вы можете либо написать

⟦_⟧ₑ (e ≈ e₁) σ = lower (⟦ e ⟧ₑ σ) ≡ lower (⟦ e₁ ⟧ₑ σ)

или переопределить _≡_, используя новую функцию, позволяющую "вытеснять" уровни, которые появляются только в типах параметров и индексах типа данных:

data _≡′_ {a} {A : Set a} (x : A) : A → Set where
  refl′ : x ≡′ x

Обратите внимание на Set вместо Set a. Тогда это

⟦_⟧ₑ (e ≈ e₁) σ = ⟦ e ⟧ₑ σ ≡′ ⟦ e₁ ⟧ₑ σ

Я выберу первый вариант.


Ваше _not-occurs-inₙ_ не совсем не встречается, поскольку e может быть Var v и E [ v / Var v ] ≡ E независимо от того, встречается ли v в E или нет. Почему бы не определить _not-occurs-in_ как тип данных? Кстати, я думаю, что было бы более стандартно произносить замены как E [ v ≔ e ], так и [ e / v ] E.

Вы можете перейти от _not-occurs-in₀_ к _not-occurs-in₁_ следующим образом:

+-inj : ∀ {E₁ E₂ E₃ E₄} -> E₁ + E₂ ≡ E₃ + E₄ -> E₁ ≡ E₃ × E₂ ≡ E₄ 
+-inj refl = refl , refl

≈-inj : ∀ {E₁ E₂ E₃ E₄} -> E₁ ≈ E₂ ≡ E₃ ≈ E₄ -> E₁ ≡ E₃ × E₂ ≡ E₄ 
≈-inj refl = refl , refl

coe : ∀ {t s} {v : Variable t} → (E : Expr s) → v not-occurs-in₀ E → v not-occurs-in₁ E
coe {t} {v} (Var w)  q {e} rewrite q {e} = refl
coe (???? n)  q = refl
coe (???? p)  q = refl
coe (E + E₁) q =
  cong₂ (λ n m → lift $ lower n +ℕ lower m) (coe E (proj₁ (+-inj q))) (coe E₁ (proj₂ (+-inj q)))
coe (E ≈ E₁) q =
  cong₂ (λ p₁ p₂ → lower p₁ ≡ lower p₂) (coe E (proj₁ (≈-inj q))) (coe E₁ (proj₂ (≈-inj q)))

Невозможно дать имя такому типу, как ∀ α -> Set (f α), потому что у этого типа нет типа в Agda, как объяснено в упомянутой вами ссылке. Но можно немного преобразовать выражение, чтобы получить функцию:

F : ∀ α -> Set (suc (f α))
F α = Set (f α)

Используя то же преобразование, вы можете определить NState и ⟦_⟧ₑ:

NState : ∀ t → Set (levelOf t)
NState t = Variable t → New⟦ t ⟧ₜ

⟦_⟧ₑ : ∀ {t} → Expr t → (∀ {t} -> NState t) → New⟦ t ⟧ₜ
⟦_⟧ₑ (Var v)  σ = σ v
⟦_⟧ₑ (???? q)   σ = q
⟦_⟧ₑ (???? p)   σ = p
⟦_⟧ₑ (e + e₁) σ = ⟦ e ⟧ₑ σ +ℕ ⟦ e₁ ⟧ₑ σ
⟦_⟧ₑ (e ≈ e₁) σ = ⟦ e ⟧ₑ σ ≡ ⟦ e₁ ⟧ₑ σ

Попробуйте перейти от текущего NState к исходному NState, чтобы увидеть проблему с последним: какой тип ∀ {t} -> NState t? Set применяется к чему? Тип NState t зависит от t, но когда t определяется количественно, эта зависимость не может быть отражена на уровне типа.

было бы неплохо написать

syntax (∀ {t} -> NState t) = State

но Агда не позволяет этого.

Кстати, теоретически вселенная вселенных (то есть Setω) существует: это супервселенная. Хотя Setω — неудачное имя для него, потому что такая вселенная не Set — она больше любого Set, потому что содержит их всех. Вы можете найти эти идеи, выраженные в Agda здесь.

Код.

person user3237465    schedule 31.03.2016