如何从 SAT 模型中仅获取“真实”变量?

use*_*051 4 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)
Run Code Online (Sandbox Code Playgroud)

当 SAT 求解器给出模型时。它为所有变量提供真/假值。但我只想要“True”值分配变量。Z3可以吗?

Tay*_*son 5

这是一个完成此任务的 z3py 脚本。 http://rise4fun.com/Z3Py/fp5k

我认为要与模型交互/遍历模型,您需要使用 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]
Run Code Online (Sandbox Code Playgroud)

  • 该选项不存在。即使我们添加它,它也可能基本上按照泰勒的建议进行。我想强调的是,线性时间步长与 Z3 的上下文无关。如果你的问题很大,以至于这个线性步骤成为一个问题,那么 Z3 可能无论如何都无法解决该问题。请记住,在最坏的情况下,“s.check()”是指数级的。 (2认同)