“编码”;“至少-most-k/至少-k布尔值为真”;Z3中的约束

“编码”;“至少-most-k/至少-k布尔值为真”;Z3中的约束,z3,Z3,对于任意k和任意数量的布尔变量,Z3中编码“这些布尔变量中至少k/最多k必须为真”约束的好方法是什么 我正在考虑通过引入新的PB变量(使用),通过双条件(例如,x==true iff y==1)将“至少k”转换为伪布尔问题,并断言它们的和大于或等于k。这是一种合理的方法,还是有一种更简单/更有效的编码方法可以替代?最简单的方法是使用算术编码基数约束。 如果你想说a+b+c=2。 底层的解算器Simplex通常可以完成非常合理的工作 使用这种编码 还有许多其他方法可以处理基数约束。 一种是将基数约

对于任意k和任意数量的布尔变量,Z3中编码“这些布尔变量中至少k/最多k必须为真”约束的好方法是什么


我正在考虑通过引入新的PB变量(使用),通过双条件(例如,
x==true iff y==1
)将“至少k”转换为伪布尔问题,并断言它们的和大于或等于k。这是一种合理的方法,还是有一种更简单/更有效的编码方法可以替代?

最简单的方法是使用算术编码基数约束。 如果你想说a+b+c=2。 底层的解算器Simplex通常可以完成非常合理的工作 使用这种编码

还有许多其他方法可以处理基数约束。 一种是将基数约束编译成“排序回路”,并且 这方面的方法相当成熟。Z3的未来版本将具有直接 支持基数约束和更普遍的伪布尔不等式。 如果你有很多基本的限制,并且感觉非常冒险 欢迎您尝试“opt”分支,其中 这项技术正在开发中。它使用伪布尔不等式的专用格式 还包括一种模式,在该模式中,它将“(如果a 10)+(如果b 1 0)+(如果c 1 0)>=2”不等式检测为PB不等式。也就是说,我将首先尝试非常简单的编码,看看基于单纯形的引擎如何为您的域工作