Z3:为什么这个数组理论用法返回Unsat?

时间:2013-04-19 07:09:34

标签: python z3

我正在尝试使用数组理论建模内存访问。我有一个简单的代码如下(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'?

非常感谢。

1 个答案:

答案 0 :(得分:1)

为什么您希望此查询返回Sat

您的查询归结为要求Z3查找Memt的值Mem[t] = Mem[t] - 1Mem和{{t明显不正确1}}你可以想到;所以Z3回应Unsat

如果您能告诉我们您想要满足哪些属性,我们可以帮助您正确地制定它。