z3:在断言中添加变量声明

时间:2016-04-07 01:26:20

标签: z3

有没有办法在解算器中将函数定义添加为断言?

我目前正在研究C ++文件的有界模型检查,并且能够添加定义,因为断言语句将提供与解算器断言和代码行的一对一的对应关系。

例如,我有以下玩具程序:

int x, y;
x = y + 1;
assert(x != 0)

CBMC生成以下smt2文件:

(declare-fun |main::1::y!0@1#1| () (_ BitVec 32))
(define-fun |main::1::x!0@1#2| () (_ BitVec 32) (bvadd (_ bv1 32) |main::1::y!0@1#1|))
(define-fun |B0| () Bool (= |main::1::y!0@1#1| |main::1::y!0@1#1|))
(assert (not (not (= |main::1::x!0@1#2| (_ bv0 32)))))

z3_parse_string返回以下公式。

Not(Not(1 + main::1::y!0@1#1 == 0))

我想知道是否可以将函数声明添加到求解器中,这有点像:

(x!0@1#2 == 1 + y!0@1#1) AND !(x!0@1#2 == 0)

所以每个子句松散地对应一行源代码。

据我所知,目前z3_parse_string api只能访问(断言...行并从那里进行折叠(如果我错了请纠正我) 我能想到的唯一解决方案是修改文件,使define-fun变得声明有趣,并将定义推送到新的断言行,如:

(declare-fun |main::1::x!0@1#2| () (_ BitVec 32))
(assert (= |main::1::x!0@1#2| (bvadd (_ bv1 32) |main::1::y!0@1#1|)))

非常感谢提前。

1 个答案:

答案 0 :(得分:1)

没有看到更多示例或实际代码(CBMC或Z3),我也没有更好的解决方案。一般来说,我会阻止人们完全使用Z3_parse_string,这通常会造成比必要更多的混乱。最好是通过命令行切换到完整的SMT2文件,或者直接将问题转换为Z3-API调用(不包括字符串解析等)。最后我查了一下,CBMC有一个Z3的API后端,所以这应该非常简单。