[英]Formalizing multiple type judgements ⊢ within the same Γ in Agda
我是 Agda 初學者! 我已經閱讀了Agda 中的編程語言基礎和 Agda 中的驗證函數式編程,現在我想嘗試自己將一種小型語言形式化。 因為我對代數效果和處理程序感興趣,所以我從 Pretnar 的教程“代數效果和處理程序簡介”開始。 Pretnar 的語言有兩種類型的判斷(Γ ⊢ 值和 Γ ⊢ 計算),因為它通常遵循接近 CBPV 的方法。 另外,正如 PLPA 所建議的那樣,我正在嘗試使用 de Bruijn 表示。
我擁有的一些代碼:
mutual
data ValueType : Set where
~ℕ : ValueType
~𝔹 : ValueType
~⊤ : ValueType
_⟶_ : ValueType → CompType → ValueType
_⇒_ : CompType → CompType → ValueType
data CompType : Set where
_!_ : ValueType → Δ → CompType
data Type : Set where
⋆ : ValueType → Type
✪ : CompType → Type
data Context : Set where
∅ : Context
_,_ : Context → Type → Context
data _∋_ : Context → Type → Set where
Z : ∀ {Γ A} → Γ , A ∋ A
S_ : ∀ {Γ A B} → Γ ∋ B → Γ , A ∋ B
mutual
data _⊢ₖ_ : Context → CompType → Set where
-- computation defs go here
data _⊢ₑ_ : Context → ValueType → Set where
-- values defs go here
data _⊢_ : Context → Type → Set where
~_ : ∀ {Γ A}
→ Γ ∋ A
-----
→ Γ ⊢ A
⋆ : ∀ {Γ} {A : ValueType}
→ Γ ⊢ₑ A
------
→ Γ ⊢ ⋆ A
✪ : ∀ {Γ} {C : CompType}
→ Γ ⊢ₖ C
-------
→ Γ ⊢ ✪ C
然后我繼續證明重命名和替換,這就是我的問題出現的地方:我如何證明它們?
mutual
renameₑ : ∀ {Γ Δ} → (∀ {A} → Γ ∋ A → Δ ∋ A)
→ (∀ {A} → Γ ⊢ₑ A → Δ ⊢ₑ A)
renameₖ : ∀ {Γ Δ} → (∀ {A} → Γ ∋ A → Δ ∋ A)
→ (∀ {A} → Γ ⊢ₖ A → Δ ⊢ₖ A)
rename : ∀ {Γ Δ} → (∀ {A} → Γ ∋ A → Δ ∋ A)
→ (∀ {A} → Γ ⊢ A → Δ ⊢ A)
rename ρ (~ x) = ~ (ρ x)
rename ρ (⋆ A) = {!!} (renameₑ ρ (⋆ A))
rename ρ (✪ A) = {!!} (renameₖ ρ (✪ A))
我可以證明每個判斷的rename
,但我似乎可以找到一種方法來證明統一它們的“主要”重命名函數。 我想知道這是否是一種正確的方法,我只需要提供我的證明(如果是,如何證明?)...或者是否有另一種更好的方法來形式化我感興趣的語言阿格達?
如果你寫
rename ρ (⋆ E) = {!!}
並查看洞中的上下文,您將看到E
的類型為.Γ ⊢ₑ .A
。 這可以使用renameₑ
輕松重命名:
renameₑ ρ E
這是.Δ ⊢ₑ .A
類型,它只剩下將⋆
應用於結果以獲得.Δ ⊢ .A
。
基本思想是對術語進行模式匹配,確定它是值還是計算,應用相應的重命名函數並使用相同的構造函數包裝結果。 即rename
將值映射到值並將計算映射到計算,但在引擎蓋下為這些判斷使用不同的重命名函數。
編碼:
rename : ∀ {Γ Δ} → (∀ {A} → Γ ∋ A → Δ ∋ A)
→ (∀ {A} → Γ ⊢ A → Δ ⊢ A)
rename ρ (~ x) = ~ (ρ x)
rename ρ (⋆ E) = ⋆ (renameₑ ρ E)
rename ρ (✪ E) = ✪ (renameₖ ρ E)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.