我有一个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)
)
谢谢!
答案 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))