Z3:消除无关变量
Z3: eliminate don't care variables
我有一个 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)
)
谢谢!
所指问题的答案中给出的示例略有过时。 A 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))
我有一个 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)
)
谢谢!
所指问题的答案中给出的示例略有过时。 A 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))