我想构建一种类型层次结构:
B is of type A ( B::A )
C and D are of type of B (C,D ::B)
E and F are of type of C (E,F ::C)
我问here是否可以直接在Isabelle中实现,但你看到的答案是否可以直接在Agda或Coq编码?
PS:假设A..F都是抽象的,并且在每种类型上定义了一些函数)
由于
答案 0 :(得分:6)
如果我理解你的问题,你想要的东西看起来像the identity type。当我们声明类型构造函数_isOfType_
时,我们提到了两个Set
s(参数A
和索引B
),但构造函数indeed
确保了构造这种类型元素的唯一方法是强制它们确实是相等的(并且a
属于这种类型):
data _isOfType_ {ℓ} {A : Set ℓ} (a : A) : (B : Set ℓ) → Set where
indeed : a isOfType A
我们现在可以将函数作为参数证明事物是正确的类型。在这里,我翻译了您的要求&假设我有一个函数f
能够将两个C
合并为一个。在适当的假设上进行模式匹配表明E和F确实在C
类型上,因此可以将其输入f
以实现目标:
example : ∀ (A : Set₃) (B : Set₂) (C D : Set₁) (E F : Set) →
B isOfType A
→ C isOfType B → D isOfType B
→ E isOfType C → F isOfType C
→ (f : C → C → C) → C
example A B .Set D E F _ _ _ indeed indeed f = f E F
对于这种模式,您是否考虑过特定的用例,或者您是否正在使用其他编程语言遇到的想法来访问Agda?可能有更惯用的方式来制定你的问题。