在当前的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证明结果是有效的,换句话说,不是这个断言不是。
答案 0 :(得分:0)
我不确定我是否理解这个问题,但总的来说我们不能指望Z3用量词来解决所有公式。在这种特殊情况下,启用宏查找器可能会有所帮助,宏查找器传播像
这样的函数定义(forall ... (= (try ...) def )))
将所有try
替换为def
。其选项名称为smt.macro_finder
。