Z3 中允许的边界数 True/False
Bounding number of allowable True/False in Z3
假设我在 Z3 中有一组逻辑断言,我想检查可满足性。有没有办法限制满足模型中 Trues/Falses 的总数?
例如,我可能有一组涉及 100 个布尔变量的断言,但我只对至少有 90 个真值的解决方案感兴趣。
是的。有两种相对简单的方法可以实现这一点:
对于通用 SMT 求解器,只需断言:
(assert (<= 90 (+ (ite v1 1 0) (ite v2 1 0) ...)))
其中 v1
、v2
等是您的布尔值。这至少可以确保
其中 90 个将是真实的。
如果您使用的是 z3,那么您可以使用伪布尔约束。在您的情况下,您需要 PbGe
。有关详细信息,请参阅此答案:K-out-of-N constraint in Z3Py
请注意,您甚至可以使用 z3 来“最大化”真布尔值的数量。这将使用优化引擎,并通过最大化上面第一个选项中的求和表达式来工作。您可以在 SO 中找到许多关于如何使用优化器的参考资料。
假设我在 Z3 中有一组逻辑断言,我想检查可满足性。有没有办法限制满足模型中 Trues/Falses 的总数?
例如,我可能有一组涉及 100 个布尔变量的断言,但我只对至少有 90 个真值的解决方案感兴趣。
是的。有两种相对简单的方法可以实现这一点:
对于通用 SMT 求解器,只需断言:
(assert (<= 90 (+ (ite v1 1 0) (ite v2 1 0) ...)))
其中
v1
、v2
等是您的布尔值。这至少可以确保 其中 90 个将是真实的。如果您使用的是 z3,那么您可以使用伪布尔约束。在您的情况下,您需要
PbGe
。有关详细信息,请参阅此答案:K-out-of-N constraint in Z3Py
请注意,您甚至可以使用 z3 来“最大化”真布尔值的数量。这将使用优化引擎,并通过最大化上面第一个选项中的求和表达式来工作。您可以在 SO 中找到许多关于如何使用优化器的参考资料。