有一个(lst_v
)BitVectors列表和一个(lst_b
)布尔表达式值列表。如何使用z3py执行以下操作:
lst_b
屏蔽lst_v
中的元素。使用And
函数需要屏蔽,因为布尔表达式需要在最后一步中解决。Solve
类的z3py测试结果中设置的所有位。问题的一个变体是将xor与add
交换答案 0 :(得分:1)
你想要达到的目标并不完全清楚;但也许以下内容会让你前进:
from z3 import *
# Assume we have a list of 3 32-bit values
x, y, z = BitVecs('x y z', 32)
lst_v = [x, y, z]
# Corresponding booleans:
mx, my, mz = Bools('mx my mz')
lst_b = [mx, my, mz]
# 32-bit zero
zero = BitVecVal(0, 32)
# Mask
masked = [If(b, v, zero) for (b, v) in zip(lst_b, lst_v)]
# Xor reduce
final = reduce(lambda x, y: x^y, masked, zero)
# 32-bit all 1's
allOnes = BitVecVal(-1, 32)
s = Solver()
s.add(final == allOnes)
# make it interesting, assert some known values and constraints
s.add(x == BitVecVal(123212, 32))
s.add(UGT(x + y, z+12))
s.add(ULT(y, allOnes))
if s.check() == sat:
print s.model()
else:
print "No solution"
当我跑步时,我得到:
[mz = True,
mx = False,
my = True,
z = 2147479427,
y = 2147487868,
x = 123212]
这表明,我应该将X和y作为32位值;它给出了4294967295,它的所有位都设置为32位数量。