如何在 Agda 中制定依赖类型的逻辑,而不是通过重用 Agda 类型系统本身来“作弊”?
我可以很容易地定义一个独立类型的逻辑:
infixr 5 _⇒_
data Type : Set where
_⇒_ : Type → Type → Type
infix 4 _⊢_
data _⊢_ : List Type → Type → Set where
var : {a : Type} → [ a ] ⊢ a
λ' : {a b : Type} {γ : _} → a ∷ γ ⊢ b → γ ⊢ a ⇒ b
ply : {a b : Type} {γ δ : _} → γ ⊢ a ⇒ b → δ ⊢ a → γ ++ δ ⊢ b
weak : {a b : Type} {γ : _} → γ ⊢ b → a ∷ γ ⊢ b
cntr : {a b : Type} {γ : _} → a ∷ a ∷ γ ⊢ b → a ∷ γ ⊢ b
xchg : {a : Type} {γ δ : _} → γ ↭ δ → γ ⊢ a → δ ⊢ a
我也可以大致遵循Haskell 中依赖类型 λ-演算的LambdaPi教程实现。但它是隐式类型的,不像我的 Agda 代码,我什至不知道从哪里开始修改我的代码,因为到目前为止想到的路径导致了无限的倒退:
data _⊢_ : List (? ⊢ ?) → (? ⊢ ?) → Set where ...
谷歌搜索“在 Agda 中嵌入依赖类型”等仅返回在Agda 中的依赖类型编程的命中...