我的量词有问题。
设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是否可以处理这种量词,如果有人可以给出一些建议。
感谢。
答案 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)