Z3不解决量词表达式,表达式是sat

Z3不解决量词表达式,表达式是sat,z3,smt,Z3,Smt,使用z3 v 4.8.1--64位编译哈希代码016872a5e0f6,下面的脚本计算为unsat,但预期结果为sat z3支持这样的表达式求解吗 一个不同的smt解算器可以解决这样的表达式吗 (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)) (=&

使用z3 v 4.8.1--64位编译哈希代码016872a5e0f6,下面的脚本计算为
unsat
,但预期结果为
sat

  • z3支持这样的表达式求解吗
  • 一个不同的smt解算器可以解决这样的表达式吗

    (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)
    (声明常量ss1 Int)
    (声明常量ss3 Int)
    (断言(对于所有((t_ss3 Int)(t_ss1 Int))
    (=>
    (Q是否满足要求”)
    (检查sat)
    (流行音乐1)
    

    • Z3在这里是正确的;您提出的脚本确实是
      unsat
      。你是这么说的:

      • 设有两个常数
        ss1
        ss3
      • 对于所有整数
        t_ss3
        t_ss1
        ,只要
        t_ss1
        成立,则必须是以下情况:

        • ss1
        • 而且,
          t_ss1
          等于
          ss1
        • 而且,
          t_ss3
          等于
          ss3
      这显然不适用于所有
      t\u ss1
      t\u ss3
      。没有任何
      ss1
      ss3
      能够满足所有
      t_ss1
      t_ss2
      的要求。你只需要看最后一句话:你不能期望所有的
      t_ss3
      都等于任意的
      ss3

      我怀疑你是想表达一些其他的属性;但是您没有正确地编写代码。也许你想说如果
      t_ss1
      等于
      ss1
      t_ss3
      等于
      ss3
      ,和
      t_ss1
      ,那么
      ss1
      ?其编码如下所示:

      (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)
      
      (声明常量ss1 Int)
      (声明常量ss3 Int)
      (断言(对于所有((t_ss3 Int)(t_ss1 Int))
      (=>(和(
      而且确实会产生
      sat


      如果您能更好地描述您想要表达的内容,您可以在SMT库中的另一个问题中获得更好的建模帮助。

      Z3在这里是正确的;您提出的脚本确实是
      unsat
      。你是这么说的:

      • 设有两个常数
        ss1
        ss3
      • 对于所有整数
        t_ss3
        t_ss1
        ,只要
        t_ss1
        成立,则必须是以下情况:

        • ss1
        • 而且,
          t_ss1
          等于
          ss1
        • 而且,
          t_ss3
          等于
          ss3
      这显然不适用于所有
      t\u ss1
      t\u ss3
      。没有任何
      ss1
      ss3
      能够满足所有
      t_ss1
      t_ss2
      的要求。你只需要看最后一句话:你不能期望所有的
      t_ss3
      都等于任意的
      ss3

      我怀疑你是想表达一些其他的属性;但是您没有正确地编写代码。也许你想说如果
      t_ss1
      等于
      ss1
      t_ss3
      等于
      ss3
      ,和
      t_ss1
      ,那么
      ss1
      ?其编码如下所示:

      (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)
      
      (声明常量ss1 Int)
      (声明常量ss3 Int)
      (断言(对于所有((t_ss3 Int)(t_ss1 Int))
      (=>(和(
      而且确实会产生
      sat

      如果您能够更好地描述您想要表达的内容,那么您可以在SMT库中的另一个问题中获得更好的帮助