【发布时间】:2020-03-15 03:36:20
【问题描述】:
有没有办法索引BitVec 中的元素?我想要这样的东西:
s = Solver()
x = BitVec('x', 8)
s.add(Not(And(x[0], x[2])))
或者是屏蔽位的唯一方法:
s.add(x & 5 != 5)
【问题讨论】:
有没有办法索引BitVec 中的元素?我想要这样的东西:
s = Solver()
x = BitVec('x', 8)
s.add(Not(And(x[0], x[2])))
或者是屏蔽位的唯一方法:
s.add(x & 5 != 5)
【问题讨论】:
您可以使用Extract(high, low, a) 从BitVec 类型的术语中提取一个或多个位。
例如
from z3 import *
s = Solver()
x = BitVec("x", 8)
x_0 = Extract(0, 0, x)
x_2 = Extract(2, 2, x)
expr = Or(x_0 == 0, x_2 == 0)
s.add(expr)
while s.check() == sat:
m = s.model()
print("Model: " + str(m))
v_0 = m.eval(x_0)
v_2 = m.eval(x_2)
bl = Or(x_0 != v_0, x_2 != v_2)
s.add(bl)
输出:
Model: [x = 4] # 0000 0100
Model: [x = 0] # 0000 0000
Model: [x = 1] # 0000 0001
【讨论】:
s.add(x & 5 != 5) 会更慢,因为它会生成无用的子句。一个后续问题是如何在内部表示位向量?它们是整数还是原子?
[ (G[i] & BitVecVal(5, 12)) != BitVecVal(5, 12) for i in range(len(grapheme)) ] 这样的约束平均为 1.86 秒。像 [ Not(And(Extract(2, 2, G[i]) == 1, Extract(0, 0, G[i]) == 1)) for i in range(len(grapheme)) ] 这样的约束平均为 1.43 秒。