如何使用z3 Python API对bv redand进行编码?

如何使用z3 Python API对bv redand进行编码?,python,z3,Python,Z3,假设我希望使用Z3 python API对以下表达式进行编码: (bv-redand (bv-or (bv-xnor symbolic_bit_0 (bv-concat src_ip dst_ip src_port dst_port)) symbolic_dc_0))))) 我该怎么做 看来我必须做一些类似的事情: And(~(symbolic_bit_0 ^ Concat(src_ip dst_ip src_port dst_

假设我希望使用Z3 python API对以下表达式进行编码:

(bv-redand
    (bv-or
        (bv-xnor symbolic_bit_0 
            (bv-concat src_ip dst_ip src_port dst_port))
        symbolic_dc_0)))))
我该怎么做

看来我必须做一些类似的事情:

And(~(symbolic_bit_0 ^ Concat(src_ip dst_ip src_port dst_port)) | symbolic_dc_0)
但最外层和最外层似乎不起作用。我能想到的一个技巧是避免And,而是与所有1进行比较,但是有更好的方法吗


作为旁注,有没有一种方法可以直接指定一个Xnor b而不是~(a^b)?

reduce和,reduce或尚未添加到Python API中。请注意,还原和与“正常和”完全不同。我现在已将这些添加到不稳定的分支中。为了便于参考和将来使用,我们可以从外部添加存在于C-API中但不存在于Python API中的函数。例如,在这种情况下,我们可以定义

def BVRedAnd(a):
    return BitVecRef(Z3_mk_bvredand(a.ctx_ref(), a.as_ast()), a.ctx)
其他布尔运算符有Python等价物,但XNor没有。因此,没有添加相应的函数。但是,如果我们想:

def BVXNor(a, b):
    return BitVecRef(Z3_mk_bvxnor(a.ctx_ref(), a.as_ast(), b.as_ast()), a.ctx)

但是,性能上的差异可以忽略不计

谢谢你,克里斯托夫。这很有帮助。