2016-03-30 12 views
2

В previous question, я имел виды на игрушечном языкеКак добраться до точки с лифтом и Setω и переменными вхождениями в выражениях

data Type : Set where 
    Nat : Type 
    Prp : Type 

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

⟦_⟧ₜ : 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 ⟧ₑ σ 

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


После some digging around, я попытался

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!} ⟧ₜ 

As far as I know, такая ошибка возникает, грубо говоря, когда есть задание уровней для вселенных.

Какие шениганы я бессознательно делаю, чтобы справиться с этой проблемой?

ответ

0

Напомним, что 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₁ ⟧ₑ σ 

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

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

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

но Agda не позволяет этого.

BTW, в теории существует вселенная вселенных (т. Е. Setω): это super universe. Хотя, Setω является неудачным именем для него, потому что такая вселенная не является Set - она ​​больше, чем любая Set, потому что она содержит их все. Вы можете найти эти идеи, выраженные в Agda here.

The code.

 Смежные вопросы

  • Нет связанных вопросов^_^