为什么Z3返回这些horn子句的未知值
我正在使用Z3解决我的horn子句。在Horn子句体中,未解释的谓词应为正。然而,我需要对一些未解释的谓词进行否定 我看到过一些否定很好的例子。例如,对于以下示例,Z3将返回为什么Z3返回这些horn子句的未知值,z3,z3-fixedpoint,Z3,Z3 Fixedpoint,我正在使用Z3解决我的horn子句。在Horn子句体中,未解释的谓词应为正。然而,我需要对一些未解释的谓词进行否定 我看到过一些否定很好的例子。例如,对于以下示例,Z3将返回sat: (set-logic HORN) (declare-fun inv (Int) Bool) (assert (inv 0)) (assert (forall ((k Int)) (or (> k 10) (not (inv k)) (inv (+ k 1))))) (check-sat) 但我的示例如下所
sat
:
(set-logic HORN)
(declare-fun inv (Int) Bool)
(assert (inv 0))
(assert (forall ((k Int)) (or (> k 10) (not (inv k)) (inv (+ k 1)))))
(check-sat)
但我的示例如下所示,其中Z3返回unknown
(set-logic HORN)
(declare-fun inv (Int ) Bool)
(declare-fun s ( Int ) Bool)
(assert (forall ((k Int) (pc Int))(=>(and (= pc 1)(= k 0)) (inv k ))))
(assert (forall ((k Int)(k_p Int)(pc Int)(pc_p Int))
(=>(and (inv k )(= pc 1)(= pc_p 2)(= k_p (+ k 1))(not (s pc ))(s pc_p ))
(inv k_p ))))
(check-sat)
我想知道是否有办法将我的子句重写为Z3的Horn子句片段。您的子句不在Horn片段中,因为谓词s在最后一个断言中与两个极性一起使用。因此,有两个谓词出现具有正极性(s-pc)和(inv-k_-p)都是正极性)。 避免极性问题的一个基本方法是向Bool类型的s引入一个额外的参数。因此,您还必须说明使用Horn子句的s的规范是什么,这样才有意义。典型的情况是,s编码递归过程的行为,s的额外布尔参数将是过程s的返回值。当然,这种编码不能确保s是完整的或功能性的。 还有第二种方法,就是在“inv”中添加一个额外的参数,让“s”成为一个数组。然后引用(非(s pc))变为(非(选择s pc)),等等。 这一切都取决于编码的意图