Z3 如何获得“唯一”;“真的”;SAT模型中的变量?

Z3 如何获得“唯一”;“真的”;SAT模型中的变量?,z3,Z3,假设我有一个简单的SMT lib公式: (declare-const a Bool) (declare-const b Bool) (declare-const c Bool) (declare-const d Bool) (assert (or a b)) (assert (or d c)) (check-sat) (get-model) 当SAT解算器给出一个模型时。它为所有变量提供真/假值。但我只想要“真”值赋值变量。有了Z3,这是可能的。这里有一个z3py脚本可以实现这一点 我认为要与

假设我有一个简单的SMT lib公式:

(declare-const a Bool)
(declare-const b Bool)
(declare-const c Bool)
(declare-const d Bool)
(assert (or a b))
(assert (or d c))
(check-sat)
(get-model)

当SAT解算器给出一个模型时。它为所有变量提供真/假值。但我只想要“真”值赋值变量。有了Z3,这是可能的。这里有一个z3py脚本可以实现这一点

我认为要与模型交互/遍历模型,需要使用API

a,b,c,d = Bools('a b c d')

s = Solver()

s.add( Or(a, b) )
s.add( Or(c, d) )

s.check()
m = s.model()
print m

for t in m.decls():
  if is_true(m[t]):
    print t
    print m[t]

谢谢你的及时回复。。但我不想遍历整个变量。可能是我有很多变量,然后我在线性时间内检查它们的赋值。我认为Z3知道变量赋值,有没有任何配置只给出“真”值变量。泰勒的解决方案在线性时间内打印“真”值变量。请记住,这比s.check()快得多。。感谢莱昂纳多·德莫拉,我的意思是,如果我遵循泰勒的解决方案,那么我必须在线性时间内检查所有变量赋值。但我不想那样做。我问-Z3是否有任何类型的配置,以便它总是给出只有“真”值变量的模型?此选项不存在。即使我们加上它,它也可能基本上实现泰勒的提议。我想强调的是,线性时间步长在Z3的上下文中是不相关的。如果您的问题太大,以至于这个线性步骤是一个问题,那么Z3可能无论如何都无法解决这个问题。请记住,
s.check()
在最坏的情况下是指数型的。