Solver.model()返回的不必要的Var()

时间:2012-12-07 21:25:03

标签: z3

Solver.model()有时会返回一个看似不必要Var()的作业,而我(可能是天真的)期望Solver.model()总是为每个变量返回一个具体的值。例如:

#!/usr/bin/python
import z3

x, y = z3.Ints('x y')
a = z3.Array('a', z3.IntSort(), z3.IntSort())
e = z3.Not(z3.Exists([x], z3.And(x != y, a[x] == a[y])))

solver = z3.Solver()
solver.add(e)
print solver.check()
print solver.model()

产生

sat
[k!1 = 0,
 a = [else -> k!5!7(k!6(Var(0)))],
 y = 1,
 k!5 = [else -> k!5!7(k!6(Var(0)))],
 k!5!7 = [1 -> 3, else -> 2],
 k!6 = [1 -> 1, else -> 0]]

这里发生了什么? Var(0)的“其他”中的a是指a数组的第0个参数,意为a[i] = k!5!7[k!6[i]]吗?是否可以从Z3中获得a的具体令人满意的作业,例如a = [1 -> 1, else -> 0]

1 个答案:

答案 0 :(得分:3)

这是预期的输出。函数和数组的解释应视为函数定义。请记住断言

z3.Not(z3.Exists([x], z3.And(x != y, a[x] == a[y])))

本质上是一种通用量词。对于量词免费问题,Z3会生成帖子中建议的“具体任务”。但是,这种表现形式不够表达。在消息的最后,我附上了一个无法使用“具体分配”编码的示例。 以下帖子提供了有关如何在Z3中编码模型的其他信息。

您可以在http://rise4fun.com/Z3/tutorial/guide

找到有关Z3使用的编码的更多详细信息

以下示例生成的模型无法使用“具体”分配进行编码(可在http://rise4fun.com/Z3Py/eggh在线获取):

a = Array('a', IntSort(), IntSort())
i, j = Ints('i j')
solver = Solver()
x, y = Ints('x y')
solver.add(ForAll([x, y], Implies(x <= y, a[x] <= a[y])))
solver.add(a[i] != a[j])
print solver.check()
print solver.model()