Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Z3获取最后一个有效模型 我使用Z3C++ API找到一个满足一些布尔变量(我们称之为B0,…,BN)为最小的可满足公式。p>_Z3 - Fatal编程技术网

Z3获取最后一个有效模型 我使用Z3C++ API找到一个满足一些布尔变量(我们称之为B0,…,BN)为最小的可满足公式。p>

Z3获取最后一个有效模型 我使用Z3C++ API找到一个满足一些布尔变量(我们称之为B0,…,BN)为最小的可满足公式。p>,z3,Z3,我有一个包含布尔变量b0,…,bn的公式,我想找到一个可满足的公式,其中b0,…,bn的最小值设置为true 我首先找到b0,…,bn的子集,该子集可以指定为true并满足我的公式,然后我递增地要求解算器找到更小的子集(即其中一个布尔变量翻转为false) 当我找不到更小的子集时,我找到了我的局部最小值,即,我从Z3得到了一个未统计的结果。此时,我想访问最后一个有效的模型 可能吗?当调用“check”时,Z3是否修改模型? 如果是这样,我怎么能使用C++ API? 非常感谢,如果解算器返回“sa

我有一个包含布尔变量b0,…,bn的公式,我想找到一个可满足的公式,其中b0,…,bn的最小值设置为true

我首先找到b0,…,bn的子集,该子集可以指定为true并满足我的公式,然后我递增地要求解算器找到更小的子集(即其中一个布尔变量翻转为false)

当我找不到更小的子集时,我找到了我的局部最小值,即,我从Z3得到了一个未统计的结果。此时,我想访问最后一个有效的模型

可能吗?当调用“check”时,Z3是否修改模型? 如果是这样,我怎么能使用C++ API?
非常感谢,如果解算器返回“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>
谢谢!这很有帮助!