【发布时间】:2019-03-01 13:27:16
【问题描述】:
例如,在 Agda 中的 STLC 可以这样表示:
data Type : Set where
* : Type
_⇒_ : (S T : Type) → Type
data Context : Set where
ε : Context
_,_ : (Γ : Context) (S : Type) → Context
data _∋_ : Context → Type → Set where
here : ∀ {Γ S} → (Γ , S) ∋ S
there : ∀ {Γ S T} (i : Γ ∋ S) → (Γ , T) ∋ S
data Term : Context → Type → Set where
var : ∀ {Γ S} (v : Γ ∋ S) → Term Γ S
lam : ∀ {Γ S T} (t : Term (Γ , S) T) → Term Γ (S ⇒ T)
app : ∀ {Γ S T} (f : Term Γ (S ⇒ T)) (x : Term Γ S) → Term Γ T
(来自here。)但是,试图将其适应于构造微积分是有问题的,因为类型和术语是单一类型。这意味着不仅 Context/Term 必须相互递归,而且 Term 必须在自身上建立索引。这是一个初步的尝试:
data Γ : Set
data Term : Γ → Term → Set
data Γ where
ε : Γ
_,_ : (ty : Term) (ctx : Γ) → Γ
infixr 5 _,_
data Term where
-- ...
不过,Agda 抱怨 Term 不在其初始声明的范围内。是否有可能以这种方式表示,或者我们真的需要为 Term 和 Type 设置不同的类型?我非常希望在 Agda 中看到 CoC 的最小/参考实现。
【问题讨论】:
标签: agda