Z3:Z3 C API中的未知结果

时间:2015-02-02 02:46:38

标签: z3

在当前的Z3上下文中,断言“try(X,i,j)=((X [i] [j] == i * j))”已经存在.X的类型是(Array Int(Array) Int Int))。try(X,i,j)是一个函数,返回类型是bool。这是Z3上下文:

 (kernel
      (forall ((Y (Array Int (Array Int Int))) (i Int) (j Int))
        (let ((a!1 (= (+ (select (select Y i) j) (* (- 1) j i)) 0)))
          (= (try Y i j) a!1))))

我想要证明Z3:

 forall i[0..99],j[0..199]. try(X,i,j) 
    =>
       (forall i[0..49],j[0..199]. try(X,i,j) 
    &&  forall i[50..99],j[0..199]. try(X,i,j))
换句话说,我检查的不是这个断言是坐着的。 Z3检查结果未知。 但当我证明Z3为时:

forall i[0..99],j[0..199]. (X[i][j] == i*j)
=>
  (forall i[0..49],j[0..199]. (X[i][j] == i*j)
&& forall i[50..99],j[0..199]. (X[i][j] == i*j))

Z3证明结果是有效的,换句话说,不是这个断言不是。

1 个答案:

答案 0 :(得分:0)

我不确定我是否理解这个问题,但总的来说我们不能指望Z3用量词来解决所有公式。在这种特殊情况下,启用宏查找器可能会有所帮助,宏查找器传播像

这样的函数定义
(forall ... (= (try ...) def )))

将所有try替换为def。其选项名称为smt.macro_finder

相关问题