Z3为证明禁用断言简化
在Z3(版本4.8.8)中,有没有办法禁用断言的简化/重写 我目前正在进行密钥()中Z3校对的校对重播。然而,为了能够重播Z3的“断言”规则,我需要在Z3的SMT-LIB输入中指定的确切断言,而不是它的简化版本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))
作为可能发生的极端例子,考虑一下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
规则(相关问题)时可靠地识别它们。