我正在尝试使用数组理论建模内存访问。我有一个简单的代码如下(Z3 python)
Mem = Array('Mem', BitVecSort(32), BitVecSort(32))
F = True
tmp = BitVec('tmp', 32)
tmp3 = BitVec('tmp3', 32)
F = And(F, tmp3 == Select(Mem, tmp))
tmp4 = BitVec('tmp4', 32)
F = And(F, tmp4 == (tmp3 - 1))
F = And(F, Mem == Store(Mem, tmp, tmp4))
s = Solver()
s.add(F)
print s.check()
我想要'Sat'结果,但是这个脚本会返回'Unsat'。
我认为这是因为我从Mem读出来,然后给它写了不同的价值。这真的是我得到'Unsat'的原因吗?
如果是这样,我如何使用数组理论建模内存访问?如何修复上面的脚本,所以它返回'Sat'?
非常感谢。
答案 0 :(得分:1)
为什么您希望此查询返回Sat
?
您的查询归结为要求Z3查找Mem
和t
的值Mem[t] = Mem[t] - 1
,Mem
和{{t
明显不正确1}}你可以想到;所以Z3回应Unsat
。
如果您能告诉我们您想要满足哪些属性,我们可以帮助您正确地制定它。