簡體   English   中英

在 Agda 中的同一 Γ 內形式化多個類型判斷 ⊢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM