Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Z3返回这些horn子句的未知值_Z3_Z3 Fixedpoint - Fatal编程技术网

为什么Z3返回这些horn子句的未知值

为什么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) 但我的示例如下所

我正在使用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)
但我的示例如下所示,其中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)),等等。 这一切都取决于编码的意图