在Z3Py中索引BitVec的一个元素

在Z3Py中索引BitVec的一个元素,z3,smt,z3py,Z3,Smt,Z3py,是否有一种方法可以索引位向量中的元素?我想说这样的话: s = Solver() x = BitVec('x', 8) s.add(Not(And(x[0], x[2]))) 或者屏蔽是隔离位的唯一方法: s.add(x & 5 != 5) 您可以使用从BitVec类型的术语中提取一个或多个位 例如 从z3导入* s=解算器() x=比特向量(“x”,8) x_0=提取(0,0,x) x_2=提取(2,2,x) expr=Or(x_0==0,x_2==0) s、 添加(expr) 而

是否有一种方法可以索引
位向量中的元素?我想说这样的话:

s = Solver()
x = BitVec('x', 8)
s.add(Not(And(x[0], x[2])))
或者屏蔽是隔离位的唯一方法:

s.add(x & 5 != 5)
您可以使用从
BitVec
类型的术语中提取一个或多个位

例如

从z3导入*
s=解算器()
x=比特向量(“x”,8)
x_0=提取(0,0,x)
x_2=提取(2,2,x)
expr=Or(x_0==0,x_2==0)
s、 添加(expr)
而s.check()==sat:
m=s.模型()
打印(“型号:+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、 添加(bl)
输出:

Model: [x = 4]    # 0000 0100
Model: [x = 0]    # 0000 0000
Model: [x = 1]    # 0000 0001

回答得很好!真的应该进入某种Z3常见问题。@patricktrentin很好,你知道这是如何在内部表示的吗?具体来说,您的答案是否允许内部SAT表示?我想象我的掩蔽方法,
s.add(x&5!=5)
会更慢,因为它会生成无用的子句。接下来的一个问题是如何在内部表示位向量?它们是整数还是原子?@HiDefender AFAIK,您和我的解决方案都承认SAT表示,请参阅,例如;我宁愿避免在不进行小实验的情况下猜测编码的效率@PatrickTrentin在我当前的项目上对每种类型的约束进行了快速实验。像这样的约束[code>[(G[i]&BitVecVal(5,12))!=BitVecVal(5,12)对于范围内的i(len(grapheme))]
平均为1.86秒。对于范围(len(grapheme))内的i,像这样的约束[Not(And(Extract(2,2,G[i])==1,Extract(0,0,G[i])==1)]平均为1.43秒。