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

在Z3Py中获取布尔表达式的所有解永远不会结束,z3,z3py,Z3,Z3py,可能是与Z3有关的一个基本问题:我试图得到布尔表达式的所有解,例如,对于a或b,我想得到{(真,真),(假,真),(真,假)} 根据发现的其他响应,例如,我有以下代码: a = Bool('a') b = Bool('b') f1=Or(a,b) s=Solver() s.add(f1) while s.check() == sat: print s s.add(Not(And(a == s.model()[a], b == s.model()[b]))) 问题是它在第二次迭代时进

可能是与Z3有关的一个基本问题:我试图得到布尔表达式的所有解,例如,对于
a或b
,我想得到
{(真,真),(假,真),(真,假)}

根据发现的其他响应,例如,我有以下代码:

a = Bool('a')
b = Bool('b')

f1=Or(a,b)
s=Solver()
s.add(f1)

while s.check() == sat:
  print s
  s.add(Not(And(a == s.model()[a], b == s.model()[b])))
问题是它在第二次迭代时进入了一个无限循环:约束
a==s.model()[a]
被计算为假b/c
s.model()[a]
不再存在


有人能告诉我做错了什么吗?

我建议你试着这样写循环:

从z3导入*
a=Bool('a')
b=布尔值('b')
f1=或(a,b)
s=解算器()
s、 添加(f1)
而s.check()==sat:
m=s.模型()
v_a=m.eval(a,模型完成=真)
v_b=m.eval(b,模型_完成=真)
打印(“型号:”)
打印(“a:=”+str(v_a))
打印(“b:=”+str(v_b))
bc=或(a!=v_a,b!=v_b)
s、 加(bc)
输出为:

Model:
a := True
b := False
Model:
a := False
b := True
Model:
a := True
b := True
参数
model\u completion=True
是必需的,因为否则
m.eval(x)
的行为类似于当前模型
m
中具有不在乎值的任何
x
布尔变量的标识关系,并且它返回
x
作为结果,而不是
True/False
。()



注意:由于
z3
不关心布尔变量,另一种选择是编写自己的模型生成器,自动完成任何部分模型。这将减少调用
s.check()
的次数。此实现的性能影响很难衡量,但可能会稍微快一些。

感谢Patrick的快速回复-我从脚本中获得的输出是
[a=True,b=False][b=True]
-无限循环确实是固定的,但我如何推断解决方案集?而不是在循环中打印,简单地把a和b作为一对放在一个累加列表中,并在最后返回。请原谅我的无知,但它如何解决这个问题?循环仍然只会迭代两次,而我希望它会迭代三次。或者我应该理解,当只返回
[b=True]
时,这意味着
a
可以取任何值?@f1f2问题是
a
的模型值在第二次迭代时等于
a
,这可能是因为
a
的值在第二个模型中是一个
don care
。我得想几分钟如何修改脚本:)Patrick的解决方案非常有效。但要补充我的评论,当您执行
评估时,您会显式地得到一个值,因此可以避免“完成”问题。