Z3不解决量词表达式,表达式为坐

时间:2018-10-27 12:46:19

标签: z3 smt

使用z3 v 4.8.1--64位-建立哈希码016872a5e0f6,以下脚本的评估结果为unsat,但预期结果为sat

  • z3是否支持求解此类表达式?
  • 不同的smt-solver可以解决此类表达式吗?

    (set-option :print-success false)
    (set-logic ALL)
    (push 1)
    (declare-const ss1 Int)
    (declare-const ss3 Int)
    
    (assert (forall ((t_ss3 Int)(t_ss1 Int))
    (=>
      (< t_ss1 t_ss3)
      (and (and
       (< ss1 ss3)
       (= t_ss1 ss1))
       (= t_ss3 ss3))
    )))
    (echo "Check if the P -> Q is satisfiable")
    (check-sat)
    (pop 1)
    

1 个答案:

答案 0 :(得分:2)

Z3在这里是正确的;您所构成的脚本确实是unsat。这就是你说的:

  • 让两个常量ss1ss3
  • 对于所有整数t_ss3t_ss1,只要t_ss1 < t_ss3成立,就必须满足以下条件:

    • ss1 < ss3
    • AND,t_ss1等于ss1
    • AND,t_ss3等于ss3

对于所有t_ss1t_ss3显然不是这样。对于 ALL ss1ss3,没有t_ss1t_ss2可以满足此要求。您只需要查看最后一个子句:您不能期望所有t_ss3等于任意ss3

我怀疑您正在尝试表达其他财产;但是您没有正确编码。也许您是想说t_ss1等于ss1t_ss3等于ss3t_ss1 < t_ss3,然后ss1 < ss3吗?该代码将如下所示:

(declare-const ss1 Int)
(declare-const ss3 Int)

(assert (forall ((t_ss3 Int) (t_ss1 Int))
        (=> (and (< t_ss1 t_ss3)
                 (= t_ss1 ss1)
                 (= t_ss3 ss3))
            (< ss1 ss3))))

(check-sat)

并确实会产生sat

如果您对要表达的内容有更好的描述,则可以在其他问题中使用SMT-Lib对其建模获得更好的帮助。