Frama-C中的整型pow() 函数

编程语言 2026-07-09

《ANSI/ISO C规范语言版本1.23:在Frama-C 32.1中实现》附录A.2描述了一个内置函数 integer pow(integer x, integer y) ;(奇怪的是,它缺少前导的 \)。但 logic_builtin.mlhttps://git.frama-c.com/pub/frama-c/-/blob/stable/germanium/src/kernel_internals/typing/logic_builtin.ml)显示 pow 作为接收 doubles,而不是 integers。这里的预期行为是什么?文档和实现中是否有一个或两个不正确?我有点怀疑:a) 应该存在一个带前导斜杠的 integer\pow 的重载;b) 文档中有一个笔误,遗漏了斜杠;c) 实现缺少这个重载;d) 现有的 pow 实现是C 标准库函数,在某种程度上与A.2的定义并行(尽管也许值得在那里也包括)。是否有比

logic integer Pow2(integer k) =
    k <= 0 ? 1 : 2 * Pow2(k - 1);

更好的方式来表示一个 integer 2^k操作,若 pow(2, k) 确实不可用?

解决方案

确实存在一些与此主题相关的逻辑内置函数的问题。命名和类型上的不一致性,外加一些当前尚未文档化的内置函数。

考虑在WP中表示pow2操作以用于证明的问题,没有一个完美的答案:这在很大程度上取决于你想证明的性质。目前,WP对位相关运算的处理被卡在两个不兼容的约束之间:

  • 它被用于位表示通常无用的系统,因此相关考量通常被忽略,Qed为提升性能对所有算术运算进行大幅简化,
  • 在推理中处理位运算需要尽量保持表达式原样,以最大限度提高SMR求解器将其匹配并用以处理验证条件的机会。

目前,WP更偏向第一方向,因为从历史上看,这也是最常见的工业用例。

如果你想用WP来研究这类问题,最好的做法是联系开发者。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章