在Coq或Agda中键入层次结构定义

时间:2014-11-13 18:03:34

标签: coq agda

我想构建一种类型层次结构:

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都是抽象的,并且在每种类型上定义了一些函数)

由于

1 个答案:

答案 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?可能有更惯用的方式来制定你的问题。