【问题标题】:What values can be represented with BitVecs in z3?z3 中的 BitVecs 可以表示哪些值?
【发布时间】: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


    【解决方案1】:

    运算符 > 和 /

    底线:位向量表示数字,但您需要知道您正在使用的操作的符号是什么。在 Python API 中,所有运算符重载都是有符号运算。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-20
      • 2015-07-05
      • 2021-12-26
      相关资源
      最近更新 更多