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]
?
答案 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()