Z3中的Horn子句

Z3中的Horn子句,z3,Z3,如果要分析的程序的语义以Horn子句的形式给出,Z3现在支持求解归纳不变量(表示所需的属性) 但是,上的Z3源代码的master分支中的版本不支持此功能。由于Z3通过使用插值的PDR算法解决了这些Horn子句问题,因此我编译了interp分支(d8b31773b809),它支持(设置逻辑Horn) 据我所知,Horn子句问题是用表示不变量的未知谓词来指定的,而X×Y上的谓词只是从X×Y到Bool的函数。到目前为止还不错 我尝试的第一个例子只是一个问题,即推断afor(int I=0;I使用“不稳

如果要分析的程序的语义以Horn子句的形式给出,Z3现在支持求解归纳不变量(表示所需的属性)

但是,上的Z3源代码的
master
分支中的版本不支持此功能。由于Z3通过使用插值的PDR算法解决了这些Horn子句问题,因此我编译了
interp
分支(
d8b31773b809
),它支持
(设置逻辑Horn)

据我所知,Horn子句问题是用表示不变量的未知谓词来指定的,而X×Y上的谓词只是从X×Y到Bool的函数。到目前为止还不错

我尝试的第一个例子只是一个问题,即推断a
for(int I=0;I使用“不稳定”分支的归纳不变量。
“interp”分支机构用于内部开发,该分支机构的状态可能会波动。
我得到了你第二道题的答案“sat”

第一个问题的一个稍微有趣的版本是:

(set-logic HORN)
(declare-fun inv (Int) Bool)
(assert (inv 0))
(assert (forall ((I Int)) (or (> I 10) (not (inv I)) (inv (+ I 1))))) 
(assert (forall ((I Int)) (=> (inv I) (<= I 11))))
(check-sat)
(get-model)
(设置逻辑喇叭)
(申报娱乐投资(国际)布尔)
(断言(库存0))
(断言(对于所有((I Int))(或(>I 10)(非(投资I))(投资(+I 1(()))))

(assert(For all((I Int))(=>(inv I)((inv I)(不管它值多少钱,我都会使用Z3获得
sat
(我相信提交210bca8f45631f696152be909e33a4e8b58607f)
(set-logic HORN)
(declare-fun inv (Int) Bool)
(assert (inv 0))
(assert (not (inv 15)))
(check-sat)
(set-logic HORN)
(declare-fun inv (Int) Bool)
(assert (inv 0))
(assert (forall ((I Int)) (or (> I 10) (not (inv I)) (inv (+ I 1))))) 
(assert (forall ((I Int)) (=> (inv I) (<= I 11))))
(check-sat)
(get-model)
(assert (forall ((I Int)) (=> (inv I) (<= I 10))))