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)
ina
的“else”是指数组的第 0 个参数,是什么a
意思a[i] = k!5!7[k!6[i]]
?是否有可能从 Z3 中获得具体令人满意的任务a
,例如a = [1 -> 1, else -> 0]
?