Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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中的后果_Z3_Propagation - Fatal编程技术网

Z3中的后果

Z3中的后果,z3,propagation,Z3,Propagation,Z3能够导出理论的布尔结果,如中所述 现在我想知道是否也可以对数值执行此操作。 例如,根据以下理论: (declare-const x Int) (declare-const y Int) (declare-const z Int) (assert (= (+ x y) 10)) (assert (and (>= y 20) (>= x -20))) (check-sat) (get-model) 我想知道是否有可能推导出“y”必须在20和30之间,x必须在-20和-10之间 我能

Z3能够导出理论的布尔结果,如中所述

现在我想知道是否也可以对数值执行此操作。 例如,根据以下理论:

(declare-const x Int)
(declare-const y Int)
(declare-const z Int)
(assert (= (+ x y) 10))
(assert (and (>= y 20) (>= x -20)))
(check-sat)
(get-model)
我想知道是否有可能推导出“y”必须在20和30之间,x必须在-20和-10之间


我能想出的一个解决办法是最大化和最小化这些变量,然后我会得到各种可能性,但在我看来,有更好的方法可以做到这一点。

这与前面的堆栈溢出问题非常相似:

一句话:如果涉及多个变量,那么这个问题通常很难解决;除非您使用问题的特定知识。如果只有一个变量,那么您确实可以使用优化和其他技巧为您提供“范围”,但一般来说,这样的算法不一定是有效的。(尽管在实践中,它可以轻松处理最简单的事情。)

如果您不关心不连续性,只想找出max/min,那么可以使用z3的优化器。请注意,这不是标准SMTLib的一部分,而是z3扩展。下面是一个例子:

(declare-const x Int)
(declare-const y Int)
(declare-const z Int)
(assert (= (+ x y) 10))
(assert (and (>= y 20) (>= x -20)))

(assert (distinct x (- 15)))
(assert (distinct y 25))

(push) (minimize y) (check-sat) (get-objectives) (pop)
(push) (maximize y) (check-sat) (get-objectives) (pop)
(push) (minimize x) (check-sat) (get-objectives) (pop)
(push) (maximize x) (check-sat) (get-objectives) (pop)
这张照片是:

sat
(objectives
 (y 20)
)
sat
(objectives
 (y 30)
)
sat
(objectives
 (x (- 20))
)
sat
(objectives
 (x (- 10))
)
sat
(objectives
 (x (* (- 1) oo))
)
sat
(objectives
 (x 9)
)
因此,您可以获得边界,但请注意我是如何添加
x!=-15
y!=25
只是超出了您得到的范围

请注意,如果您的类型是无界的(例如
Int
),您还可以获得+/-无穷大作为界:

(declare-const x Int)
(assert (< x 10))
(push) (minimize x) (check-sat) (get-objectives) (pop)
(push) (maximize x) (check-sat) (get-objectives) (pop)

优化通常是一个困难的问题,z3中的优化解算器肯定比常规解算器慢。但是,它可能只是为你的问题域做的把戏

谢谢你的指点。然而,我觉得我的情况不同,因为我在问一个布尔情况已经支持的问题。我假设Z3在内部进行了一些边界推理,并在内部API中提供了一些此类信息。有可能把这个信息弄出来吗?(通过C++调用,例如)优化器跟踪边界,但是请记住,它不会告诉你它对于范围内的所有点都是有效的。(可能有不连续性。)这就是这个问题很难解决的主要原因。我很想获得这种信息,即使我知道可能有不连续性。你能告诉我哪里可以从优化器中提取这个吗;添加了一些关于如何获得边界的示例,并警告说不连续性将是有问题的。请检查,等等。我个人没有使用过这些示例,因此我无法评论它们在实践中的易用性或可靠性。