z3 - Z3 中允许的 True/False 的边界数
问题描述
假设我在 Z3 中有一组逻辑断言,我想检查可满足性。有没有办法限制令人满意的模型中的真/假总数?
例如,我可能有一组涉及 100 个布尔变量的断言,但我只对至少有 90 个 True 的解决方案感兴趣。
解决方案
是的。有两种相对简单的方法可以实现这一点:
对于通用 SMT 求解器,只需断言:
(assert (<= 90 (+ (ite v1 1 0) (ite v2 1 0) ...)))
where
v1
等v2
是你的布尔值。这确保其中至少有 90 个是正确的。如果您使用的是 z3,那么您可以使用伪布尔约束。在您的情况下,您想要
PbGe
. 有关详细信息,请参阅此答案:Z3Py 中的 K-out-of-N 约束
请注意,您甚至可以让 z3 “最大化”真实布尔值的数量。这将使用优化引擎,并通过最大化上面第一个选项中的和表达式来工作。您可以在 SO 中找到许多关于如何使用优化器的参考资料。
推荐阅读
- javascript - 反应处理外部点击以关闭自定义按钮菜单组件
- python - 带有许多 if 语句的 For 循环
- python - 使用python从json对象中提取字段及其路径
- excel-formula - 根据另一个表中的映射对员工求和
- amazon-web-services - 创建 Route53 托管区域失败并显示 InvalidClientTokenId
- swift - 枚举作为字典的键
- javascript - 未找到模块:错误:无法解析...使用外部 JS 库时
- python - 从串口读取数据有问题
- android - Android 信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR),故障地址 00000023
- elasticsearch - ElasticSearch 嵌套必须和应该