Z3:unknown 结果为 Z3 C API
Z3:unknown result in Z3 C API
在当前的 Z3 上下文中,断言“try(X,i,j) = ((X[i][j] == i*j))”已经是 existed.the X 的类型是 ( Array Int (Array Int Int)).try(X,i,j) 是一个函数并且 return 类型是 bool.here 是 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 ast:
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))
换句话说,我检查是不是这个断言是sat。
Z3 检查结果未知。
但是当我证明 Z3 ast:
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证明结果是有效的,换句话说,不是这个断言是不满足的。
我不确定我是否理解这个问题,但总的来说我们不能指望 Z3 解决所有带量词的公式。在这种特殊情况下,它可能有助于启用宏查找器,它传播像
这样的函数定义
(forall ... (= (try ...) def )))
将所有出现的 try
替换为 def
。该选项的名称是 smt.macro_finder
.
在当前的 Z3 上下文中,断言“try(X,i,j) = ((X[i][j] == i*j))”已经是 existed.the X 的类型是 ( Array Int (Array Int Int)).try(X,i,j) 是一个函数并且 return 类型是 bool.here 是 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 ast:
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))
换句话说,我检查是不是这个断言是sat。 Z3 检查结果未知。 但是当我证明 Z3 ast:
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证明结果是有效的,换句话说,不是这个断言是不满足的。
我不确定我是否理解这个问题,但总的来说我们不能指望 Z3 解决所有带量词的公式。在这种特殊情况下,它可能有助于启用宏查找器,它传播像
这样的函数定义(forall ... (= (try ...) def )))
将所有出现的 try
替换为 def
。该选项的名称是 smt.macro_finder
.