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

Binary 如何避免Coq NAT中的堆栈溢出或分段错误?,binary,nat,bignum,coq,Binary,Nat,Bignum,Coq,我目前正在与之合作,开发一个关于它的转换。我是一个coq新手 编程时,我面临以下警告: 警告:工作时发生堆栈溢出或分段错误 nat中的数字较大时(观察到的阈值可能在5000到5000之间变化 70000(取决于您的系统限制和执行的命令) 生成此警告的函数将计算签名。签名分为高级位和低级位。给定表示高级位和低级位的两个NAT n1和n2,它计算(n1*65536)+n2-这是并排放置两个16位二进制数的抽象 我非常惊讶,因为coq nat定义似乎可以处理来自外部的大整数,这要感谢S构造函数 我应该

我目前正在与之合作,开发一个关于它的转换。我是一个coq新手

编程时,我面临以下警告:

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

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

我非常惊讶,因为coq nat定义似乎可以处理来自外部的大整数,这要感谢S构造函数

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


谢谢

在Coq中不使用
nat
类型,有时(当您必须操作大数字时)使用该类型更好,它是使用符号-大小对表示的整数形式化。取舍是你的证明可能会变得稍微复杂一些
nat
非常简单,因此允许使用简单的证明原则

然而,在Coq中,大量使用符号来简化定义、定理和证明的编写。Coq有一个非常小的内核(我们想要这个,因为我们希望能够相信证明检查器是正确的,并且我们可以读取它),上面有很多符号。然而,由于事物有不同的表现形式,只有少数好的符号,我们的符号通常会发生冲突。为了克服这个问题,coq使用消除符号歧义,并将它们解析为名称(因为“+”表示
添加
加上
,等等)


您是正确的,使用
Z_scope
是其中,
+
用于
Z

中的
plus
,使用nats很粗糙,因为它们是用
S
构建的,这意味着每个数字实际上都是
S
应用程序的序列:您可以使用整数,哪些具有类似的证明原则,但具有基于符号/幅度(位)的表示:那么我如何使用这些运算?(Zpos 1)+(Zpos 2)似乎不起作用…-错误:术语“1%Z”的类型为“|”,而它的类型应为“nat”。这是因为“+”表示多种含义,具体取决于您所在的位置。实际上,“+”只是添加NAT的语法糖,其中,
plus
是在两个NAT上按结构定义的。您希望对整数使用
plus
,它位于与
nat
不同的解释范围内(即
Int\u范围
)。阅读解释作用域以及如何打开和使用它们。谢谢,我一直在与作用域作斗争,这很好。最后一个问题:我让它使用Z_范围而不是Int_范围。可以吗?(请回答,以便我选择您的答案)