我正在尝试使用z3(muZ)的fixpoint解算器,以便找到程序不变量。但是,在某些时候,查询的答案不尽如人意,但我不明白为什么,因为代码是可以访问的:
(declare-rel b1 (Int) interval_relation bound_relation)
(declare-rel b2 (Int) interval_relation bound_relation)
(declare-rel b3 (Int Int) interval_relation bound_relation)
(declare-rel b4 (Int Int) interval_relation bound_relation)
(declare-rel b5 (Int Int) interval_relation bound_relation)
(declare-rel b6 (Int) interval_relation bound_relation)
(declare-var i Int)
(declare-var j Int)
(rule (b1 0))
(rule (=> (and (b1 i) (< i 50)) (b2 i)))
(rule (=> (b2 i) (b3 i 0)))
(rule (=> (and (b3 i j) (< j 50)) (b4 i j)))
(rule (=> (b4 i j) (b3 (+ i 1) (+ j 1))))
(rule (=> (and (b3 i j) (>= j 50)) (b5 i j)))
(rule (=> (b5 i j) (b1 (+ 1 (- i j)))))
(rule (=> (and (b1 i) (>= i 50)) (b6 i)))
(query (b3 i j)
:compile-with-widening true
:unbound-compressor false
:engine datalog
:print-answer true
)
; answers unsat
(query (b4 i j)
:compile-with-widening true
:unbound-compressor false
:engine datalog
:print-answer true
)
; answers sat
; (and (<= 0 (:var 1)) (<= (:var 1) 49))
; this invariant is correct
; corresponding C program:
; int f() {
; int i = 0;
; int j = 0;
;
; while (i < 50) { // b1
; j = 0;
; while (j < 50) { // b3
; i++;
; j++;
; }
; i = i-j+1;
; }
; return i;
; }
有人可以解释为什么它会返回“不满”吗?谢谢你的帮助。
答案 0 :(得分:0)
这是当前版本的Z3(muZ部分)中的一个错误。 应用时会影响数据记录引擎 区间和边界域。 它现在固定在本地(不稳定)分支中。 该修复程序将在下一版本中提供。