z3对CNF的基数约束

时间:2018-07-04 09:15:29

标签: z3 z3py theorem-proving

我正在使用z3py将基数约束转换为CNF。我使用的策略是t = Then('simplify', 'card2bv', 'simplify', 'bit-blast', 'tseitin-cnf')。我的目标有800多个变量的100个约束。在Intel Xeon CPU上,转换大约需要48分钟。就紧凑性或速度而言,我使用最有效的策略来应对此类约束的问题?

z3是否实现了类似于Sinz,2005 [1]中的顺序计数器?

[1] http://www.carstensinz.de/papers/CP-2005.pdf

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()