有没有办法在解算器中将函数定义添加为断言?
我目前正在研究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|)))
非常感谢提前。
答案 0 :(得分:1)
没有看到更多示例或实际代码(CBMC或Z3),我也没有更好的解决方案。一般来说,我会阻止人们完全使用Z3_parse_string
,这通常会造成比必要更多的混乱。最好是通过命令行切换到完整的SMT2文件,或者直接将问题转换为Z3-API调用(不包括字符串解析等)。最后我查了一下,CBMC有一个Z3的API后端,所以这应该非常简单。