【发布时间】:2017-12-17 09:00:58
【问题描述】:
我想我不明白 BitVecs 在 z3 中是如何工作的。我写了以下代码:
>>> import z3
>>> s = z3.Solver()
>>> a = z3.BitVec("a", 32)
>>> s.add(z3.ForAll(a, z3.Not(z3.And(a > 2147483647, a < 2147484671))))
我希望这是“不饱和”,因为在这个范围之内和之外都有值。但是当我运行s.check() 时,我得到:
>>> s.check()
sat
这让我很困惑,所以我猜这涉及到溢出。但后来我尝试了:
>>> b = z3.BitVec("b", 32)
>>> s = z3.Solver()
>>> s.add(b == 2147484671)
>>> s.check()
sat
>>> s.model()
[b = 2147484671]
这让我很困惑,因为它表明 z3 可以使用 32 位 BitVecs 对这个数字进行建模。另外我跑了:
>>> s = z3.Solver()
>>> c = z3.BitVec("c", 32)
>>> s.add(z3.And(c > 2147483647, c < 2147484671))
>>> s.check()
unsat
这更让我困惑,因为它似乎与第二个例子明显不兼容......
【问题讨论】:
标签: python z3 smt z3py bitvector