Z3 这些条款的等效条款是什么?
我正在使用Z3和扩展的SMT-LIB2语法来解决我的horn子句。 我知道horn子句的开头应该是一个未被解释的谓词;但是,我想知道我应该如何将下面的条款改写成一组horn条款Z3 这些条款的等效条款是什么?,z3,z3-fixedpoint,horn,Z3,Z3 Fixedpoint,Horn,我正在使用Z3和扩展的SMT-LIB2语法来解决我的horn子句。 我知道horn子句的开头应该是一个未被解释的谓词;但是,我想知道我应该如何将下面的条款改写成一组horn条款 (declare-rel inv (Int Int )) (declare-var k Int) (declare-var k_p Int) (declare-var a Int) (declare-var a_p Int) (rule (=> (and (= a 0) (= k 0)) (inv a k)))
(declare-rel inv (Int Int ))
(declare-var k Int)
(declare-var k_p Int)
(declare-var a Int)
(declare-var a_p Int)
(rule (=> (and (= a 0) (= k 0)) (inv a k)))
(rule (=> (and (inv a k) (= a_p (+ a 1))(= k_p (+ k 1))) (inv a_p k_p)))
(rule (=> (and (inv a k) (> k 0) ) (> a 0)))
(query inv )
Z3抱怨说,(>a0)
不能作为horn子句的开头。
我可以将最后一条改写如下:
(rule (=> (and (inv a k) (> k 0) ) (gtz a)))
(rule (=> (> a 0) (gtz a)))
但是,这些子句变得非常弱,以至于我无法得到不变量inv
的预期模型。我想知道是否有更好的方法来做到这一点。也许你想说
(declare-rel inv (Int Int ))
(declare-rel q ())
(declare-var k Int)
(declare-var k_p Int)
(declare-var a Int)
(declare-var a_p Int)
(rule (=> (and (= a 0) (= k 0)) (inv a k)))
(rule (=> (and (inv a k) (= a_p (+ a 1))(= k_p (+ k 1))) (inv a_p k_p)))
(rule (=> (and (inv a k) (> k 0) (not (> a 0))) q))
(query q )