试图在python中使用Z3查找布尔公式的所有解决方案

帽子

我是Z3的新手,正在尝试制作一个求解器,该求解器将所有可满足的解决方案返回给布尔公式。记下其他SO帖子的注释,我已经编码了我希望能奏效的代码,但没有奏效。问题似乎在于,通过添加先前的解决方案,我删除了一些变量,但是后来它们又返回了以后的解决方案?

目前,我只是想解决a或b或c。

如果我讲得不好,请告诉我,我将尝试进一步解释。

预先感谢您的回复:)

我的代码:

from z3 import *

a, b, c = Bools('a b c')
s = Solver()
s.add(Or([a, b, c]))

while (s.check() == sat):
        print(s.check())
        print(s)
        print(s.model())
        print(s.model().decls())
        print("\n")
        s.add(Or([ f() != s.model()[f] for f in s.model().decls() if f.arity() == 0])) 

我的输出:

sat
[Or(a, b, c)]
[c = False, b = False, a = True]
[c, b, a]


sat
[Or(a, b, c), Or(c != False, b != False, a != True)]
[b = True, a = False]
[b, a]


sat
[Or(a, b, c),
 Or(c != False, b != False, a != True),
 Or(b != True, a != False)]
[b = True, a = True]
[b, a]


sat
[Or(a, b, c),
 Or(c != False, b != False, a != True),
 Or(b != True, a != False),
 Or(b != True, a != True)]
[b = False, c = True]
[b, c]
别名

编码此类问题的典型方法如下:

from z3 import *

a, b, c = Bools('a b c')
s = Solver()
s.add(Or([a, b, c]))

res = s.check()
while (res == sat):
  m = s.model()
  print(m)
  block = []
  for var in m:
      block.append(var() != m[var])
  s.add(Or(block))
  res = s.check()

打印:

[b = True, a = False, c = False]
[a = True]
[c = True, a = False]

您会注意到并非所有模型都是“完整的”。这是因为z3一旦确定问题已解决,通常就会“停止”分配变量,因为其他变量无关紧要。

我想您的困惑是您的问题应该有7个模型:除了全误分配之外,您还应该有一个模型。如果要以这种方式获取所有变量的值,则应显式查询它们,如下所示:

from z3 import *

a, b, c = Bools('a b c')
s = Solver()
s.add(Or([a, b, c]))

myvars = [a, b, c]

res = s.check()
while (res == sat):
  m = s.model()
  block = []
  for var in myvars:
      v = m.evaluate(var, model_completion=True)
      print("%s = %s " % (var, v)),
      block.append(var != v)
  s.add(Or(block))
  print("\n")
  res = s.check()

打印:

a = False  b = True  c = False

a = True  b = False  c = False

a = True  b = True  c = False

a = True  b = True  c = True

a = True  b = False  c = True

a = False  b = False  c = True

a = False  b = True  c = True

正如您所期望的,总共有7种型号。

注意model_completion参数。这对于新手来说是一个常见的陷阱,因为z3中没有“开箱即用”的方法来获取所有可能的分配,因此您必须像上面那样小心地对其进行编码。之所以没有这样的函数,是因为通常很难实现它:考虑一下,如果变量是函数,数组,用户定义的数据类型等,而不是简单的布尔值,那么它应该如何工作。正确地,有效地处理所有这些可能性,以实现通用的全卫星功能可能会非常棘手。因此,它留给用户使用,因为在大多数时候,您只关心特定的全周概念,一旦学习了基本习语,通常就不难编写代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用minisat查找SAT的所有解决方案

来自分类Dev

在Z3Py中获取布尔表达式的所有解决方案永远不会结束

来自分类Dev

C#VisualStudio 2015如何从现有解决方案到新解决方案中使用代码

来自分类Dev

如何获得拓扑排序的所有解决方案

来自分类Dev

如何获得拓扑排序的所有解决方案

来自分类Dev

使用\ n \以矩阵形状打印所有解决方案

来自分类Dev

在 R 中使用 lpSolveAPI 的所有可行解决方案

来自分类Dev

如何使用Z3(python API)快速重命名公式中的所有变量

来自分类Dev

如何通过Django渠道共享文件,现在有不完整的解决方案,例如S3存储桶中的所有解决方案

来自分类Dev

有解决方案吗?

来自分类Dev

哈希难题表示法可解决带有Prolog限制的所有解决方案

来自分类Dev

有没有办法在Excel公式中使用Regex(或类似解决方案)?

来自分类Dev

Python Pip安装错误:找不到vcvarsall.bat。尝试了所有解决方案

来自分类Dev

使用z3证明布尔/算术公式的身份

来自分类Dev

没有项目\ bin \配置的所有解决方案输出的MSBuild复制任务

来自分类Dev

使用现有的线性编程工具查找所有替代基本解决方案

来自分类Dev

重复进行部分排列。列出所有解决方案算法

来自分类Dev

如何为所有解决方案将EditorConfig文件导入Visual Studio?

来自分类Dev

权限被拒绝(公钥)(尝试其他所有解决方案)

来自分类Dev

重复进行部分排列。列出所有解决方案算法

来自分类Dev

为什么VS build自动化会获取所有解决方案文件?

来自分类Dev

Z3为所有公式提供了意外的UNSAT

来自分类Dev

逆向工程Z3 SMT求解器解决方案

来自分类Dev

关于如何使用Excel SUMIFS和TEXT作为日期有解决方案吗?

来自分类Dev

是否有解决方案可以限制进程的CPU使用率?

来自分类Dev

使用静态IP时Internet无法正常工作。当前没有解决方案

来自分类Dev

无法使用带有解决方案的代理配置以 HttpClient 角度发布请求

来自分类Dev

确定同余系统是否有解决方案

来自分类Dev

Unity Project没有解决方案文件

Related 相关文章

  1. 1

    使用minisat查找SAT的所有解决方案

  2. 2

    在Z3Py中获取布尔表达式的所有解决方案永远不会结束

  3. 3

    C#VisualStudio 2015如何从现有解决方案到新解决方案中使用代码

  4. 4

    如何获得拓扑排序的所有解决方案

  5. 5

    如何获得拓扑排序的所有解决方案

  6. 6

    使用\ n \以矩阵形状打印所有解决方案

  7. 7

    在 R 中使用 lpSolveAPI 的所有可行解决方案

  8. 8

    如何使用Z3(python API)快速重命名公式中的所有变量

  9. 9

    如何通过Django渠道共享文件,现在有不完整的解决方案,例如S3存储桶中的所有解决方案

  10. 10

    有解决方案吗?

  11. 11

    哈希难题表示法可解决带有Prolog限制的所有解决方案

  12. 12

    有没有办法在Excel公式中使用Regex(或类似解决方案)?

  13. 13

    Python Pip安装错误:找不到vcvarsall.bat。尝试了所有解决方案

  14. 14

    使用z3证明布尔/算术公式的身份

  15. 15

    没有项目\ bin \配置的所有解决方案输出的MSBuild复制任务

  16. 16

    使用现有的线性编程工具查找所有替代基本解决方案

  17. 17

    重复进行部分排列。列出所有解决方案算法

  18. 18

    如何为所有解决方案将EditorConfig文件导入Visual Studio?

  19. 19

    权限被拒绝(公钥)(尝试其他所有解决方案)

  20. 20

    重复进行部分排列。列出所有解决方案算法

  21. 21

    为什么VS build自动化会获取所有解决方案文件?

  22. 22

    Z3为所有公式提供了意外的UNSAT

  23. 23

    逆向工程Z3 SMT求解器解决方案

  24. 24

    关于如何使用Excel SUMIFS和TEXT作为日期有解决方案吗?

  25. 25

    是否有解决方案可以限制进程的CPU使用率?

  26. 26

    使用静态IP时Internet无法正常工作。当前没有解决方案

  27. 27

    无法使用带有解决方案的代理配置以 HttpClient 角度发布请求

  28. 28

    确定同余系统是否有解决方案

  29. 29

    Unity Project没有解决方案文件

热门标签

归档