Z3中量词的函数

时间:2017-10-27 14:41:27

标签: z3

我的量词有问题。

设a(0)= 0,并且a(n + 1)将基于x(n)的值为a(n)+1或a(n)+2。我们可以期望对于任何类型的x(。)和对于所有n,a(n)< = n * 2。

以下是Z3的代码:

(declare-fun a (Int) Int)
(declare-fun x (Int) Int)
(declare-fun N () Int)
(assert (forall 
    ((n Int))
    (=> (>= n 0)
        (= (a (+ n 1))
            (ite (> (x n) 0)
            (+ (a n) 1)
            (+ (a n) 2)
            )
        )
    )
))
(assert (= (a 0) 0))
(assert (> (a N) (+ N N)))

(check-sat)
(get-model)

我希望Z3可以返回“不满”,而它总是“超时”。 我想知道Z3是否可以处理这种量词,如果有人可以给出一些建议。

感谢。

2 个答案:

答案 0 :(得分:3)

该公式为SAT,N < 0,a的图形未指定。 但默认量词实例化引擎无法确定这一点。您可以利用您正在定义递归函数来强制执行不同的引擎。

;(declare-fun a (Int) Int)
 (declare-fun x (Int) Int)
 (declare-fun y (Int) Int)
 (declare-fun N () Int)
 (define-fun-rec a ((n Int)) Int
   (if (> n 0) (if (> (x (- n 1)) 0) (+ (a (- n 1)) 1) (+ (a (- n 1)) 2)) (y n)))
(assert (= (a 0) 0))
(assert (> (a N) (+ N N)))

(check-sat)
(get-model)

正如Malte写的那样,不支持对这些公式进行归纳,所以不要指望Z3能够产生感应式样张。它确实在一类Horn子句公式中找到归纳不变量,但它需要转换以将任意公式转换为这种格式。

答案 1 :(得分:1)

谢谢,Malte和Nikolaj。 变量N应该是有界的:

(assert (> N 0))
(assert (< N 10000))

我替换

(assert (> (a N) (+ N N)))

(assert (and
 (not (> (a N) (+ N N)))
 (> (a (+ N 1)) (+ (+ N 1) (+ N 1)))
))

它适用于a(n)的定义。 这是你提到的一种归纳证明吗?

以下是两个代码块,它们都返回&#34;不满&#34;:

(declare-fun a (Int) Int)
(declare-fun x (Int) Int)
(declare-fun N () Int)
(assert (forall 
  ((n Int))
    (=> (>= n 0)
        (= (a (+ n 1))
        (ite (> (x n) 0)
        (+ (a n) 1)
        (+ (a n) 2)
        )
    ))
))
(assert (= (a 0) 0))

(assert (> N 0))
(assert (< N 10000))
;(assert (> (a N) (+ N N)))
(assert (and
  (not (> (a N) (+ N N)))
  (> (a (+ N 1)) (+ (+ N 1) (+ N 1)))
))
(check-sat)
;(get-model)

(declare-fun x (Int) Int)
(declare-fun y (Int) Int)
(declare-fun N () Int)

(define-fun-rec a ((n Int)) Int
  (if (> n 0) 
  (if (> (x (- n 1)) 0) (+ (a (- n 1)) 1) (+ (a (- n 1)) 2)) (y n)))
(assert (= (a 0) 0))

(assert (> N 0))
(assert (< N 10000))
;(assert (> (a N) (+ N N)))
(assert (and
  (not (> (a N) (+ N N)))
  (> (a (+ N 1)) (+ (+ N 1) (+ N 1)))
))
(check-sat)
;(get-model)