我目前正在与vellvm合作,开展转型。我是一名新手。
编程时,我遇到了以下警告:
警告:工作时发生堆栈溢出或分段错误 在nat中有大量数字(观察到的阈值可能从5000到 70000,具体取决于您的系统限制和执行的命令。)
我生成此警告的函数会计算签名。签名分为上位和下位。给定两个nat n1和n2代表高位和低位,它计算(n1 * 65536)+ n2 - 这是并排放置两个16位二进制数的抽象。
由于S构造函数的原因,我很惊讶因为coq nat定义似乎可以处理来自外部的大量内容。
我应该如何避免此警告/使用coq中的大数字? 我愿意将实现从nat更改为某种二进制构造。
谢谢!
答案 0 :(得分:4)
而不是在Coq中使用nat
类型,有时(当你必须操纵大数字时)更好地使用Z
类型,这是使用符号幅度对表示的整数的形式化。权衡是您的证明可能会稍微复杂一些; nat
非常简单,因此承认简单的证明原则。
然而,在Coq中,广泛使用符号使编写定义,定理和证明变得更加简单。 Coq有一个非常小的内核(我们希望这是因为我们希望能够相信证明检查器是正确的,我们可以阅读它),并在其上面加上很多符号。然而,由于事物的表现形式不同,只有少数好的符号,我们的符号通常会发生冲突。为了解决这个问题,coq使用interpretation scopes消除符号歧义,并将其解析为名称(因为“+”表示add
,plus
等等。)
你是对的,Z_scope
位于+
plus
Z
的{{1}}位置。