【问题标题】:Z3: why this array theory usage returns Unsat?Z3:为什么这个数组理论使用返回 Unsat?
【发布时间】:2013-04-19 07:09:33
【问题描述】:

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

非常感谢。

【问题讨论】:

  • 你导入什么?还是这是一条完全不同的蟒蛇?

标签: python z3


【解决方案1】:

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

您的查询归结为要求 Z3 查找 Memt 的值,例如 Mem[t] = Mem[t] - 1,这显然不是您能想到的 Memt 的任何值;所以Z3回复Unsat

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

【讨论】:

  • Levent,我正在尝试使用 Z3 中的数组理论来模拟内存访问。您可以从上面的代码中看到,我正在做的是任何程序中发生的正常内存访问:我可以写入内存,然后再将其读出。您对如何使用 Z3 方程正确模拟内存访问有什么建议吗?非常感谢
  • 请记住Store 返回一个全新的数组;它确实不会改变您拥有的旧版本。 (这有时被称为“功能性”语义;此模型中没有破坏性更新。)因此,一种方法是将Mem2 定义为Store 的结果,然后对内容进行断言MemMem2。详情见:rise4fun.com/Z3Py/tutorial/advanced;尤其是“数组”部分。
猜你喜欢
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
相关资源
最近更新 更多