Z3为证明禁用断言简化

Z3为证明禁用断言简化,z3,key-formal-verification,Z3,Key Formal Verification,在Z3(版本4.8.8)中,有没有办法禁用断言的简化/重写 我目前正在进行密钥()中Z3校对的校对重播。然而,为了能够重播Z3的“断言”规则,我需要在Z3的SMT-LIB输入中指定的确切断言,而不是它的简化版本 作为可能发生的极端例子,考虑一下SMT-LIB输入: (set-option :produce-proofs true) (assert (not (forall ((y Int)) (exists ((x Int)) (= x (+ y 1))

在Z3(版本4.8.8)中,有没有办法禁用断言的简化/重写

我目前正在进行密钥()中Z3校对的校对重播。然而,为了能够重播Z3的“断言”规则,我需要在Z3的SMT-LIB输入中指定的确切断言,而不是它的简化版本

作为可能发生的极端例子,考虑一下SMT-LIB输入:

(set-option :produce-proofs true)

(assert
  (not
    (forall ((y Int))
      (exists ((x Int))
        (= x (+ y 1))
      )
    )
  )
)
(check-sat)
(get-proof)
运行Z3 4.8.8将导致以下输出:

unsat
((proof
(asserted false)))
显然,断言已被简化,这使得证明并非真正有用。
有没有办法完全禁用这种简化(从而从Z3获得“真实”的证据,我可以在我们的工具中重播)?

如果您使用Z3的最新版本,您可能会得到更好的服务。例如,以您的示例为例,最近从github主版本编译的版本会生成:

((proof
(let (($x88 (not true)))
 (let (($x48 (forall ((y Int) )(! (exists ((x Int) )(! (= x (+ 1 y)) :qid k!8))
  :qid k!9))
 ))
 (let (($x54 (not $x48)))
 (let ((@x36 (rewrite (= $x54 $x54))))
 (let (($x30 (forall ((y Int) )(! (exists ((x Int) )(! (= x (+ y 1)) :qid k!8))
  :qid k!9))
 ))
 (let (($x31 (not $x30)))
 (let ((@x32 (asserted $x31)))
 (let ((@x45 (mp (mp (mp @x32 (rewrite (= $x31 $x54)) $x54) @x36 $x54) @x36 $x54)))
 (let ((@x53 (mp (mp (mp @x45 @x36 $x54) @x36 $x54) (rewrite (= $x54 $x88)) $x88)))
 (mp @x53 (rewrite (= $x88 false)) false))))))))))))
这种格式仍然没有文档记录,一般来说,z3在有量词的情况下很难生成粒度证明。直接引述:说:

证明对象的粒度是在尽最大努力的基础上确定的。证明 SMT内核的粒度相对较细,而 执行量词消除的过程,例如QSAT 如第6.4节所述,以不透明的大台阶形式暴露


如果您使用更新版本的z3,您可能会得到更好的服务。例如,以您的示例为例,最近从github主版本编译的版本会生成:

((proof
(let (($x88 (not true)))
 (let (($x48 (forall ((y Int) )(! (exists ((x Int) )(! (= x (+ 1 y)) :qid k!8))
  :qid k!9))
 ))
 (let (($x54 (not $x48)))
 (let ((@x36 (rewrite (= $x54 $x54))))
 (let (($x30 (forall ((y Int) )(! (exists ((x Int) )(! (= x (+ y 1)) :qid k!8))
  :qid k!9))
 ))
 (let (($x31 (not $x30)))
 (let ((@x32 (asserted $x31)))
 (let ((@x45 (mp (mp (mp @x32 (rewrite (= $x31 $x54)) $x54) @x36 $x54) @x36 $x54)))
 (let ((@x53 (mp (mp (mp @x45 @x36 $x54) @x36 $x54) (rewrite (= $x54 $x88)) $x88)))
 (mp @x53 (rewrite (= $x88 false)) false))))))))))))
这种格式仍然没有文档记录,一般来说,z3在有量词的情况下很难生成粒度证明。直接引述:说:

证明对象的粒度是在尽最大努力的基础上确定的。证明 SMT内核的粒度相对较细,而 执行量词消除的过程,例如QSAT 如第6.4节所述,以不透明的大台阶形式暴露


谢谢你对这个版本的提示,我不知道已经有一个更新的版本了。如您所述,对于4.8.9版,断言不再简化。但是,此版本的Z3是否保证不会发生简化,即
断言的
规则中的公式与输入文件中所述的公式完全相同(可能除了通过
let
和本例中的注释共享之外)?不。我不认为会发生什么样的简化有任何保证。如果运行
z3-p | grep simplify
,您将看到一系列与简化相关的设置。(通常也要查看
z3-p
的输出。)调整这些可能会使您获得一致性,但我不会依赖于生成的证明对象的任何特定行为。好的,谢谢。显然,这对于校对重播来说是个坏消息。我希望接下来可以为断言指定名称,以便在回放
断言
规则(相关问题)时可靠地识别它们。感谢您对版本的提示,我没有意识到已经有了更新的版本。如您所述,对于4.8.9版,断言不再简化。但是,此版本的Z3是否保证不会发生简化,即
断言的
规则中的公式与输入文件中所述的公式完全相同(可能除了通过
let
和本例中的注释共享之外)?不。我不认为会发生什么样的简化有任何保证。如果运行
z3-p | grep simplify
,您将看到一系列与简化相关的设置。(通常也要查看
z3-p
的输出。)调整这些可能会使您获得一致性,但我不会依赖于生成的证明对象的任何特定行为。好的,谢谢。显然,这对于校对重播来说是个坏消息。我希望接下来可以为断言指定名称,以便在回放
asserted
规则(相关问题)时可靠地识别它们。