Coq中的“错误:宇宙不一致”是什么意思?

时间:2015-08-22 07:47:26

标签: compiler-errors coq church-encoding

我正在通过Software Foundations工作,目前正在进行关于教会数字的练习。以下是自然数的类型签名:

Definition nat := forall X : Type, (X -> X) -> X -> X.

我已经定义了succ类型的函数nat -> nat。我现在想定义一个像这样的加法函数:

Definition plus (n m : nat) : nat := n nat succ m.

但是,我收到以下错误消息:

Error: Universe inconsistency.

此错误消息实际意味着什么?

1 个答案:

答案 0 :(得分:16)

在Coq中,一切都有类型。 $con=mysqli_connect("localhost","root","","sample"); // Check connection if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } $query = "select * from add_exhibitor"; $result = mysqli_query($con,$query); $r = mysqli_fetch_array($result); $rows = array(); $rows[] = $r; echo json_encode($rows); mysqli_close($con); 也不例外:如果你向Coq询问Type命令,它会告诉你它的类型是...... Check

实际上,这有点谎言。如果您通过发出指令Type询问更多详细信息,Coq会告诉您Set Printing Universes.与第一个不同,但是#34更大"一。形式上,每个Type都有一个与之关联的索引,称为宇宙级别。通常在打印表达式时,此索引不可见。因此,该问题的正确答案是Type对于任何索引Type_i都具有类型Type_j。这是确保Coq理论的一致性所必需的:如果只有一个j > i,那么就有可能表现出一种矛盾,类似于如果你认为存在集合理论中的矛盾是一套所有套装。

为了更轻松地处理类型索引,Coq为您提供了一些灵活性:没有类型实际上有与之关联的固定索引。相反,Coq每次编写Type时都会生成一个新的索引变量,并跟踪内部约束,以确保它们可以使用满足理论要求的限制的具体值进行实例化。

您看到的错误消息意味着Coq的Universe级别约束求解器表示无法解决您要求的约束系统。问题在于Type定义中的forall是针对nat量化的,但Coq的逻辑强制Type_i本身属于nat类型},Type_j。另一方面,应用程序j > i需要n nat,从而导致一组不可满足的索引约束。