【发布时间】:2019-11-02 01:58:10
【问题描述】:
我想捕获 fac 中的断言。
int f( x )
{
if( x == 1) return 1;
else{
assert( x > 0 );
return 2;
}
}
int g (x)
{ assert( x > 5 );
return f(x-1) + f(x-2);
}
我想要一个 smt2 代码。 我可以通过剥离参数并使用唯一名称使其全局化(也在 f 内重命名)来做到这一点,然后每次使用不同的函数名称执行 3 次。如下所示:
( declare-const x1 Int )
(define-fun f1 () Int
( ite ( x1 > 0) 1 2 )
)
(assert (> x1 0))
( declare-const x2 Int )
(define-fun f2 () Int
( ite ( x2 > 0) 1 2 )
)
(assert (> x2 0))
( declare-const x3 Int )
(define-fun g1 () Int
( + f1 f2 )
)
(assert (> x3 5))
我不想这样。有没有其他方法可以做到这一点而不重复?
编辑 我的目的是找到违反断言的值。
【问题讨论】:
-
你想要这些断言的语义是什么?找出是否可以使用可能违反它们的参数调用它们,或者将最终证明限制为仅满足它们的值?虽然这两个问题听起来很相似,但它们对于您最终如何建模这个结构很重要。
-
谢谢,我想要的是后者。
-
@JagadeepSai 编辑后 "accepted" 答案不再回答您的问题。要么不接受答案,所以我可以自行删除它,或者打开一个新问题。
-
@PatrickTrentin 我认为您的回答完全可以接受;应该保持被接受!
-
太棒了..您尝试做的事情既不容易,如果您手工完成也不会扩展。由于您似乎对 C 程序感兴趣,请查看klee.github.io,它将使用符号模拟自动为您检查这些
asserts。 (它将使用 z3 作为底层引擎。)您可以仔细阅读他们的文档以了解如何大规模执行此操作。