在当前的Z3上下文中,断言“try(X,i,j) = ((Xi == i* j)”)已经是existed.the类型的X is (Array Int (Array Int Int)).try(X,i,j)是一个函数,返回类型是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过去:
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证明了结果是有效的,换句话说,不是这个断言是非卫星的。
发布于 2015-02-03 10:20:05
我不确定我是否理解这个问题,但是一般来说,我们不能期望Z3用量词来解决所有的公式。在这种情况下,它可能有助于启用宏查找器,该宏查找器传播函数定义,如
(forall ... (= (try ...) def )))它将所有出现的try替换为def。该选项名为smt.macro_finder。
https://stackoverflow.com/questions/28270465
复制相似问题