我正在通过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.
此错误消息实际意味着什么?
答案 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
,从而导致一组不可满足的索引约束。