Z3中带量词的函数

Z3中带量词的函数,z3,Z3,我对量词有问题 设a(0)=0,根据x(n)的值,a(n+1)可以是a(n)+1或a(n)+2。我们可以预期,对于任何类型的x(.)和所有n,a(n)的公式是SAT,对于n(>=n0) (=(a(+n 1)) (ite(>(xN)0) (+(a n)1) (+(a n)2) ) )) )) (断言(=(a0)0)) (断言(>n0)) (断言((a N)(+N))) (a)断言(和 (不是(>(a N)(+N))) (>(a(+n1))(+(+n1)(+n1))) )) (检查sat) ;(获取

我对量词有问题


设a(0)=0,根据x(n)的值,a(n+1)可以是a(n)+1或a(n)+2。我们可以预期,对于任何类型的x(.)和所有n,a(n)的公式是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子句公式上找到了归纳不变量,但它需要一种转换来将任意公式转换成这种格式。

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

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

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

下面是两段代码,它们都返回“unsat”:

(声明乐趣a(Int)Int)
(声明乐趣x(Int)Int)
(声明N()Int)
(全部)
((n Int))
(=>(>=n0)
(=(a(+n 1))
(ite(>(xN)0)
(+(a n)1)
(+(a n)2)
)
))
))
(断言(=(a0)0))
(断言(>n0))
(断言((a N)(+N)))
(a)断言(和
(不是(>(a N)(+N)))
(>(a(+n1))(+(+n1)(+n1)))
))
(检查sat)
;(获取模型)

(声明funx(Int)Int)
(声明乐趣y(Int)Int)
(声明N()Int)
(定义娱乐记录a((n Int))Int
(如果(>n0)
(如果(>(x(-n1))0)(+(a(-n1))1)(+(a(-n1))2))(yn)))
(断言(=(a0)0))
(断言(>n0))
(断言((a N)(+N)))
(a)断言(和
(不是(>(a N)(+N)))
(>(a(+n1))(+(+n1)(+n1)))
))
(检查sat)
;(获取模型)

你需要一个归纳证明来证明你的财产,而Z3不能做归纳证明Hanks,Nikolaj。你介意提供一个关于归纳不变量和你提到的变换的参考吗?这是你自己问题的答案吗?如果是这样,考虑接受它,这是完全好的。如果没有,请编辑您的原始问题,而不是使用答案提供更多详细信息或询问后续问题。
(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)))
))
(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)