我正在使用z3py将基数约束转换为CNF。我使用的策略是t = Then('simplify', 'card2bv', 'simplify', 'bit-blast', 'tseitin-cnf')
。我的目标有800多个变量的100个约束。在Intel Xeon CPU上,转换大约需要48分钟。就紧凑性或速度而言,我使用最有效的策略来应对此类约束的问题?
z3是否实现了类似于Sinz,2005 [1]中的顺序计数器?
答案 0 :(得分:0)
Z3能够使用伪布尔不等式约束,可以使用 表达基数。
import z3
s = z3.Solver()
bvars = [z3.Bool("Var {0}".format(x)) for x in range(10)]
#Exactly 3 of the variables should be true
s.add( z3.PbEq([(x,1) for x in bvars], 3) )
s.check()
m = s.model()
s = z3.Solver()
bvars = [z3.Bool("Var {0}".format(x)) for x in range(10)]
#<=3 of the variables should be true
s.add( z3.PbLe([(x,1) for x in bvars], 3) )
s.check()
m = s.model()
s = z3.Solver()
bvars = [z3.Bool("Var {0}".format(x)) for x in range(10)]
#>=3 of the variables should be true
s.add( z3.PbGe([(x,1) for x in bvars], 3) )
s.check()
m = s.model()