我正在使用以下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
约束建模的推荐方法是什么?