我们还需要添加哪些公理,以便Z3能够验证具有重现性的程序的可满足性?

时间:2017-07-10 06:57:06

标签: z3 smt z3py

因为我们know Z3对复发有局限性。有没有办法得到以下程序的结果?什么附加方程有助于z3得到结果?

Access-Control-Allow-Credentials: true

2 个答案:

答案 0 :(得分:2)

使用像Ackermann函数这样的嵌套递归定义,我不认为你可以做很多事情来说服Z3(或任何其他SMT求解器)实际做任何有趣的证明。这些属性需要巧妙的归纳论证,而SMT求解器不适合进行此类验证。像Isabelle,HOL,Coq ......这样的定理证明者是更好的选择。

话虽如此,在SMT中建立递归函数属性的基本方法是将归纳假设编码为量化公理,并在电子匹配时安排您希望证明的属性与该公理精确对齐引擎启动,因此它可以正确地实例化量词。"我在这里引用了正确这个词,因为匹配引擎会继续以非生产性的方式实例化公理,特别是对于像Ackermann这样的函数。另一方面,定理证明可以精确地控制证明结构,因此您可以通过证明搜索空间明确指导证明者。

以下是您可以查看的示例:list concat in z3使用SMT-Lib界面进行了比您目标更简单的归纳属性的归纳证明。虽然通过扩展它来处理您的特定示例并不容易,但它可能会提供一些有关如何实现它的见解。

在Z3的特定情况下,您还可以使用其定点推理引擎使用PDR算法来回答有关某些递归函数的查询。请参阅http://rise4fun.com/z3/tutorialcontent/fixedpoints#h22,了解如何将McCarthy着名的91函数建模为一个有趣的案例研究。

答案 1 :(得分:1)

Z3不会尝试通过归纳为你做任何事情,但是(正如Levent Erkok所提到的)你可以给它一个归纳假设并让它检查结果如何。

这适用于您的示例,如下所示。

(declare-fun ackermann (Int Int) Int)

(assert (forall ((m Int) (n Int))
                (= (ackermann m n)
                   (ite (= m 0) (+ n 1)
                        (ite (= n 0) (ackermann (- m 1) 1)
                             (ackermann (- m 1) (ackermann m (- n 1))))))))

(declare-const m Int)
(declare-const n Int)

(assert (>= m 0))
(assert (>= n 0))

; Here's the induction hypothesis
(assert (forall ((ihm Int) (ihn Int))
                (=> (and (<= 0 ihm) (<= 0 ihn)
                         (or (< ihm m) (and (= ihm m) (< ihn n))))
                    (>= (ackermann ihm ihn) 0))))

(assert (not (>= (ackermann m n) 0)))
(check-sat) ; reports unsat as desired