【发布时间】:2012-12-01 18:15:31
【问题描述】:
我目前正在与vellvm 合作,正在对其进行转换。我是 coq 新手。
在编程时,我遇到了以下警告:
警告:工作时发生堆栈溢出或分段错误 nat 中有大量数字(观察到的阈值可能从 5000 到 70000 取决于您的系统限制和执行的命令)。
生成此警告的函数会计算签名。签名分为上位和下位。给定两个代表高位和低位的 nat n1 和 n2,它计算 (n1*65536)+n2 - 这是将两个 16 位二进制数并排放置的抽象。
我很惊讶,因为 coq nat 定义似乎可以处理来自外部的大整数,这要归功于 S 构造函数。
我应该如何避免这个警告/在 coq 中使用大数字? 我愿意将实现从 nat 更改为某种二进制结构。
谢谢!
【问题讨论】:
-
使用 nats 很麻烦,因为它们是使用
S构建的,这意味着每个数字字面上都是S应用程序的序列:您可能会使用整数相反,它们具有相似的证明原理,但具有基于符号/幅度(位)的表示:coq.inria.fr/library/Coq.ZArith.BinInt.html -
那我该如何使用这些操作呢? (Zpos 1) + (Zpos 2) 似乎不起作用... - 错误:术语“1%Z”的类型为“|”而它的类型应该是“nat”。
-
那是因为“+”表示多种事物,具体取决于您所在的位置。实际上,“+”只是添加 nat 的语法糖,其中
plus是在两个 nat 上结构定义的。您想将plus用于整数,它与nat(即Int_scope)的解释范围不同。阅读解释范围以及如何打开和使用它们。 -
谢谢,我正在与范围作斗争,这工作得很好。最后一个问题:我让它使用 Z_scope 而不是 Int_scope。那样可以么? (请回答以便我选择您的答案)