计算程序不变量的z3和muZ

计算程序不变量的z3和muZ,z3,Z3,我正在尝试使用z3(muZ)的不动点解算器,以便找到程序不变量。但是,在某些情况下,查询的答案是不可接受的,但我不知道为什么,因为代码是可访问的: (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) (dec

我正在尝试使用z3(muZ)的不动点解算器,以便找到程序不变量。但是,在某些情况下,查询的答案是不可接受的,但我不知道为什么,因为代码是可访问的:

(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;
; }
(声明rel b1(Int)间隔关系绑定关系)
(声明相关b2(Int)区间关系绑定关系)
(声明相关b3(Int Int)区间关系绑定关系)
(声明相关b4(Int Int)区间关系绑定关系)
(声明rel b5(Int Int)区间关系绑定关系)
(声明相关b6(Int)区间关系绑定关系)
(声明变量i Int)
(声明变量j Int)
(规则(b1.0))
(规则(=>(和(b1 i)((b2 i)(b3 i 0)))
(规则(=>(和(b3 i j)((b4 i j)(b3(+i 1)(+j 1)))
(规则(=>(和(b3 i j)(>=j 50))(b5 i j)))
(规则(=>(b5 i j)(b1(+1(-i j)())))
(规则(=>(和(b1 i)(>=i 50))(b6 i)))
(查询(b3 i j)
:编译为true
:未绑定的压缩程序错误
:引擎数据日志
:打印回答“真”
)
; 未获答覆
(查询(b4 i j)
:编译为true
:未绑定的压缩程序错误
:引擎数据日志
:打印回答“真”
)
; 答案是

; (和(这是Z3(muZ部分)当前版本中的一个bug)。 应用时,它会影响数据日志引擎 区间和边界域。 它现在已在本地(不稳定)分支中修复。
该修复程序将在下一版本中提供。

供未来读者使用:此代码已过时,不再在z3中编译。