具有两个以上变量的Xor奇偶校验约束

时间:2015-11-08 22:13:28

标签: z3 z3py

我正在使用以下Python函数为 Microsoft的 Xor求解器Z3的任意数量的变量建模Python API约束:

#  parity function
#  break up long input lists in two smaller lists
def odd(solver, lits):
    length = len(lits)
    check(length > 0, "Odd needs argument(s)")
    if length == 1:
        solver.add(lits[0])
    elif length == 2:
        solver.add(Xor(lits[0], lits[1]))
    elif length == 3:
        solver.add(Xor(lits[0], Xor(lits[1], lits[2])))
    elif length == 4:
        #  this symmetric form is much faster than the chained forms
        solver.add(Xor(Xor(lits[0], lits[1]), Xor(lits[2], lits[3])))
    else:
        aux = get_aux_variable()

        #  cf. http://www.gregorybard.com/papers/bard_thesis.pdf
        cut_len = 3
        odd(solver, lits[:cut_len] + [aux])
        odd(solver, [aux] + lits[cut_len:])

auxVariableIdx = 0

def get_aux_variable():
    global auxVariableIdx

    auxVariableIdx += 1
    aux = Bool('t%s' % auxVariableIdx)
    return aux

我注意到整体求解器性能在很大程度上依赖于方式,较小的Xor子案例被建模。示例:我使用“Xor(Xor(a,b), Xor(c,d))”声明带有四个输入的Xor。对于我的例子,替代“Xor(a,Xor(b,Xor(c,d)))”变慢了10倍。

另一个例子:如果为链接子表达式创建的辅助切换变量被添加到列表前面或后面的输入列表中,则会产生很大的不同。

  

Xor中使用多个变量为z3py约束建模的推荐方法是什么?

0 个答案:

没有答案