Coq或Agda中的类型层次结构定义

Coq或Agda中的类型层次结构定义,coq,agda,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) 我问过这是否可以直接在Isabelle中实现,但你看到的答案是否定的。是否可以直接在Agda或Coq中编码 PS:假设A..F都是抽象的,并且在每种类型上定义了一些函数) 谢谢如果我正确理解了你的问题,你想要看起来像的东西。当我们声明类型构造函数时,我们提到了两

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

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)
我问过这是否可以直接在Isabelle中实现,但你看到的答案是否定的。是否可以直接在Agda或Coq中编码

PS:假设A..F都是抽象的,并且在每种类型上定义了一些函数)


谢谢

如果我正确理解了你的问题,你想要看起来像的东西。当我们声明类型构造函数时,我们提到了两个集(参数
A
和索引
B
),但是构造函数
确实
确保构造这种类型的元素的唯一方法是强制它们确实相等(并且
A
属于这种类型):

现在我们可以用函数作为参数来证明事物的类型是正确的。在这里,我翻译了您的需求,并假设我有一个功能
f
,能够将两个
C
s组合成一个。基于适当假设的模式匹配显示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的?可能有一种更惯用的方式来表述您的问题。

不,我感兴趣的是类型层次结构,我使用了“:”用于指定类型关系的符号:通过“C::B”和“B::a”,我的意思是C是在B上类型化的,B是在a上类型化的。因此,我想看看类型层次结构是否可以直接在Agda/Coq中实现。感谢gallais,我在这里描述了这个问题
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