Z3获取最后一个有效模型 我使用Z3C++ API找到一个满足一些布尔变量(我们称之为B0,…,BN)为最小的可满足公式。p>
我有一个包含布尔变量b0,…,bn的公式,我想找到一个可满足的公式,其中b0,…,bn的最小值设置为true 我首先找到b0,…,bn的子集,该子集可以指定为true并满足我的公式,然后我递增地要求解算器找到更小的子集(即其中一个布尔变量翻转为false) 当我找不到更小的子集时,我找到了我的局部最小值,即,我从Z3得到了一个未统计的结果。此时,我想访问最后一个有效的模型 可能吗?当调用“check”时,Z3是否修改模型? 如果是这样,我怎么能使用C++ API?Z3获取最后一个有效模型 我使用Z3C++ API找到一个满足一些布尔变量(我们称之为B0,…,BN)为最小的可满足公式。p>,z3,Z3,我有一个包含布尔变量b0,…,bn的公式,我想找到一个可满足的公式,其中b0,…,bn的最小值设置为true 我首先找到b0,…,bn的子集,该子集可以指定为true并满足我的公式,然后我递增地要求解算器找到更小的子集(即其中一个布尔变量翻转为false) 当我找不到更小的子集时,我找到了我的局部最小值,即,我从Z3得到了一个未统计的结果。此时,我想访问最后一个有效的模型 可能吗?当调用“check”时,Z3是否修改模型? 如果是这样,我怎么能使用C++ API? 非常感谢,如果解算器返回“sa
非常感谢,如果解算器返回“sat”,您可以检索模型。模型引用解算器的状态,因此,如果添加断言,状态将更改,并且模型将不再有效,直到您检查可满足性并返回sat。
因此,您可以在每次解算器返回SAT时检索一个模型,然后释放除最后一个模型之外的所有模型。正如Nikolaj所提到的,如果您遵循您概述的策略,您需要在每次调用后跟踪导致
SAT的模型,并在得到unsat
时返回最后一个模型
然而,可能还有另一种选择,完全避免重复呼叫。您可以将问题转换为优化问题,而不是满意度问题。您提到您有控制变量b0
,b1
bn
,这样您就可以最小化设置为true
的数量,以获得满意的模型。创建一个度量来计算这些变量中的个数。比如:
metric = (if b0 then 1 else 0)
+ (if b1 then 1 else 0)
+ ...
+ (if bn then 1 else 0)
然后使用Z3的优化例程最小化度量
。我相信这将为您提供解决方案,您正在寻找在一个电话只
一些有用的参考资料:
- 以下是Z3优化教程:
- 特别是,这个示例讨论了软约束,并且可能也适用于您的情况:
> p>这里是优化器的C++ API引用:.< /p>
谢谢!这很有帮助!