在 Coq 中,一切都有类型。Type
也不例外:如果你用Check
命令询问 Coq,它会告诉你它的类型是…… Type
!
其实,这有点骗人。如果你通过发出指令来询问更多细节Set Printing Universes.
,Coq 会告诉你这Type
与第一个不同,而是一个“更大”的。形式上,每个Type
都有一个与之关联的索引,称为它的宇宙级别。通常在打印表达式时,该索引是不可见的。因此,该问题的正确答案是任何 indexType_i
都有 type 。这是确保 Coq 理论的一致性所必需的:如果只有一个,则可能会出现矛盾,类似于如果假设存在所有集合的集合,在集合论中如何得到矛盾。Type_j
j > i
Type
为了使使用类型索引更容易,Coq 为您提供了一些灵活性:实际上没有任何类型具有与之关联的固定索引。相反,Coq 每次编写时都会生成一个新的索引变量Type
,并跟踪内部约束以确保它们可以用满足理论要求的具体值来实例化。
您看到的错误消息意味着 Coq 的 Universe 级别的约束求解器说您要求的约束系统无法解决。问题是forall
的定义中的nat
被量化了Type_i
,但是 Coq 的逻辑强制nat
它本身是 类型的Type_j
,带有j > i
。另一方面,应用程序n nat
需要j <= i
,导致一组不可满足的索引约束。