首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ACSL中写出"is方幂2“谓词?

如何在ACSL中写出"is方幂2“谓词?
EN

Stack Overflow用户
提问于 2020-10-08 18:14:50
回答 1查看 173关注 0票数 2

我试图编写一个ACSL谓词,以查看一个整数是否为2的幂,如下所示:

代码语言:javascript
复制
/*@
  predicate positive_power_of_2 (integer i) =
    i > 0 &&
    (i == 1 || ((i & 1) == 0 && positive_power_of_2 (i >> 1)));
 */

但是,当我在随机函数中添加一些断言行时,有些超时(即。失败)。我不明白为什么?

代码语言:javascript
复制
//@ assert positive_power_of_2 (1);  // Timeout
//@ assert positive_power_of_2 (2);  // Valid
//@ assert positive_power_of_2 (4);  // Valid
//@ assert !positive_power_of_2 (7); // Timeout
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-09 08:03:34

另外,对于这类纯粹的逻辑属性,您可以使用lemmas而不是assert,就像在//@ lemma pow2_1: positive_power_of_2(1);中那样。由于lemma是一个全局注释,因此它使您不必为了保存assert而编写函数。

现在回到问题本身。将按位运算与算术运算(小于比较)混合在一起,往往会混淆自动定理证明器。您没有指定您使用的是哪一个,但是如果您只使用一个,您可能想尝试安装其他的(现在,alt-ergo、z3和cvc4的混合使用会提供良好的结果)。尽管如此,对WP内部简化器QED的一个小的交互帮助也足够了:通过使用图形用户界面(参见可湿性粉剂手册的2.4节),您可以通过在每个目标中展开positive_power_of_2的定义来结束(据我所知,没有命令行选项来进行等效的操作)。

基本上,一旦您在图形用户界面的WP Proofs面板中,您必须双击与要处理的证明义务相对应的行的Script列,这将允许您进入交互式验证模式,如下所示:

现在,重点是可用策略列表(在右边)是上下文的:只有那些与你在证明义务(左边)中选择的术语相关的策略。有些策略总是相关的,比如Cut,它允许您证明一个辅助语句,它可以用作其他证据中的假设,但是只有在选择中有一个定义需要展开时,展开定义才有意义。因此,你必须点击P_positive_power_of_2让战术出现。然后,只需点击相应的三角形,让WP展开定义,然后尝试完成证明。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64268418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档