如何避免Coq nat中的堆栈溢出或分段错误?

时间:2012-12-01 18:15:32

标签: binary nat bignum coq

我目前正在与vellvm合作,开展转型。我是一名新手。

编程时,我遇到了以下警告:

  

警告:工作时发生堆栈溢出或分段错误   在nat中有大量数字(观察到的阈值可能从5000到   70000,具体取决于您的系统限制和执行的命令。)

我生成此警告的函数会计算签名。签名分为上位和下位。给定两个nat n1和n2代表高位和低位,它计算(n1 * 65536)+ n2 - 这是并排放置两个16位二进制数的抽象。

由于S构造函数的原因,我很惊讶因为coq nat定义似乎可以处理来自外部的大量内容。

我应该如何避免此警告/使用coq中的大数字? 我愿意将实现从nat更改为某种二进制构造。

谢谢!

1 个答案:

答案 0 :(得分:4)

而不是在Coq中使用nat类型,有时(当你必须操纵大数字时)更好地使用Z类型,这是使用符号幅度对表示的整数的形式化。权衡是您的证明可能会稍微复杂一些; nat非常简单,因此承认简单的证明原则。

然而,在Coq中,广泛使用符号使编写定义,定理和证明变得更加简单。 Coq有一个非常小的内核(我们希望这是因为我们希望能够相信证明检查器是正确的,我们可以阅读它),并在其上面加上很多符号。然而,由于事物的表现形式不同,只有少数好的符号,我们的符号通常会发生冲突。为了解决这个问题,coq使用interpretation scopes消除符号歧义,并将其解析为名称(因为“+”表示addplus等等。)

你是对的,Z_scope位于+ plus Z的{​​{1}}位置。