或z3Py中的bitvectors

时间:2014-03-12 16:17:56

标签: python z3 smt z3py bitvector

理想情况下,有可能将'或'两个数字表示为位向量,但我无法做到。请告诉代码中是否有错误

line1 = BitVec('line1', 1)
line2 = BitVec('line2', 1)
s = Solver()
s.add(Or(line1, line2) == 0)
print s.check()

给出的错误是

error: 'type error'
WARNING: invalid function application for or, sort mismatch on argument at position 1,         expected Bool but given (_ BitVec 1)
WARNING: (declare-fun or (Bool Bool) Bool) applied to: 
line1 of sort (_ BitVec 1)
line2 of sort (_ BitVec 1)

从这个错误中我理解或者只能对bool变量进行操作。我的问题是如何为BitVectors

1 个答案:

答案 0 :(得分:5)

是的,Or(a,b)是一个布尔式析取,你可能想要一个按位,或者因为你正在尝试比较位向量,这可以使用来自{{|的Python API来完成。 3}}(这里是' sa3py链接示例:documentation):

line1 = BitVec('line1', 2)
line2 = BitVec('line2', 2)
s = Solver()
P = (line1 | line2) != 0
print P
s.add(P)
print s.check()
print s.model() # [line2 = 0, line1 = 3]

我更新了你的例子,使得line1和line2长于1位(这相当于布尔情况,但是它是一个不同的类型,因此错误)。

请注意,这是SMT-LIB标准中的bvor,请参阅http://rise4fun.com/Z3Py/1l0