【问题标题】:Z3: eliminate don't care variablesZ3:消除无关变量
【发布时间】:2015-02-03 00:35:25
【问题描述】:

我有一个 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)
)

谢谢!

【问题讨论】:

    标签: z3 smt


    【解决方案1】:

    在对所指问题的答案中给出的示例稍微过时了。 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))

    【讨论】:

    • 感谢克里斯托夫!我在Z3中比较新,我想知道:1)在我的例子中,如何修改.smt2文件和我执行的命令,以获得结果(只有a=1,而不是(a=1 , b=2))? 2) smt.relevancy 的默认值是 2 吗?我执行的命令:z3 smt.relevancy=2 也会有同样的效果吗?再次感谢!
    • 我会让你自己运行这些组合,但是是的,smt.relevancy=2 是默认值,但似乎并非总是如此(参见旧示例),所以它可能会改变再次。在 SMT2 中,可以通过 (set-option :name value) 命令或在命令行上设置选项。不要忘记设置 auto_config=false,如果你不使用策略/求解器,那么相关性的参数是 smt.relevancy 而不仅仅是相关性。
    • 是的,我在原始帖子中列出的文件顶部添加了“(set-option :smt.auto-config false)(set-option :smt.relevancy 2)”,使用"z3 test.smt2" 执行程序,但仍然给出相同的结果(b=2,a=1)。无论如何,非常感谢您的回复,可能我误解了相关性。
    • 我使用的是 Z3 4.3.2,我正在添加 (set-option :auto-config false) (set-option :smt.auto-config false) (set-option :smt.相关性 2) 到 test.smt2。基本上我尝试了我能想到的任何组合,但 Z3 仍然给我结果 (a=2,b=1) 而不仅仅是 (a=2)。
    • 确实,我忘记了在 Python 之旅之后我必须回到 SMT2。我在答案中添加了一段关于此的内容,希望对您有所帮助!
    猜你喜欢
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多