Z3:消除不关心变量

时间:2015-02-03 00:35:25

标签: z3 smt

我有一个test.smt2文件:

(set-logic QF_IDL)
(declare-const a Int)
(declare-const b Int)
(declare-const c Int)
(assert (or (< a 2) (< b 2 )) )
(check-sat)
(get-model)
(exit)

有没有告诉Z3只输出a = 1(或b = 1)?因为当a为1时,b值不再重要。

我执行了z3 smt.relevancy = 2 -smt2 test.smt2

(关注How do I get Z3 to return minimal model?,虽然smt.relevancy似乎有默认值2),但它仍然输出:

sat
(model
  (define-fun b () Int
    2)
  (define-fun a () Int
    1)
)

谢谢!

1 个答案:

答案 0 :(得分:0)

所提问题的答案中给出的例子略显过时。 Solver()会选择一个合适的策略来解决问题,而现在它似乎选择了另一个。我们仍然可以通过使用SimpleSolver()(可能会导致性能损失)来获得该行为。这是一个更新的例子:

from z3 import *

x, y = Bools('x y')
s = SimpleSolver()
s.set(auto_config=False,relevancy=2)
s.add(Or(x, y))
print s.check()
print s.model()

请注意,(check-sat)命令不会执行与SimpleSolver()相同的策略;为了在解决SMT2文件时获得相同的行为,我们需要使用smt策略,即使用(check-sat-using smt)。在许多情况下,通过构建自定义策略,例如(check-sat-using (then simplify smt))