了解z3模型

时间:2012-10-15 16:03:06

标签: python z3

Z3Py代码段

x = Int('x')
fun = Function('fun', IntSort(), IntSort(), IntSort())
phi = ForAll(x, (fun(x, x) != x)) 
print phi
solve(phi)

永久链接http://rise4fun.com/Z3Py/KZbR

输出

∀x : fun(x, x) ≠ x
[elem!0 = 0,
 fun!6 = [(1, 1) → 2, else → 1],
 fun = [else → fun!6(ζ5(ν0), ζ5(ν1))],
 ζ5 = [1 → 1, else → 0]]

问题: 我试图了解Z3生成的模型。我有疑虑。

  1. 在z3生成的模型中,fun只有else部分。所以乍一看,无论参数如何,看起来都有一个值。但仔细看来,v0v1似乎是fun的形式参数。这有什么约定吗?
  2. elem!0指的是哪个变量?
  3. 感谢。

1 个答案:

答案 0 :(得分:2)

Z3生产的模型应被视为纯功能程序。 当我们要求Z3以SMT 2.0格式显示模型时,这一点就变得清晰了。 我们可以使用方法sexpr()来实现这一点。以下是使用此方法的示例(http://rise4fun.com/Z3Py/4Pw):

x = Int('x')
fun = Function('fun', IntSort(), IntSort(), IntSort())
phi = ForAll(x, (fun(x, x) != x)) 
print phi
s = Solver()
s.add(phi)
print s.check()
print s.model().sexpr()

fun的解释包含自由变量。你应该把它读作: fun(v0, v1) = fun!6(k5(v0), k5(v1))。当模型以SMT 2.0格式显示时,这是明确的。当我编写Python漂亮的打印机时,我试图专注于无量词的问题。 “模型作为功能程序”的想法与无量词的问题无关。我将来会尝试改进Python模型漂亮的打印机。 常量elem!0是Z3在求解过程中创建的辅助常量。最终并不需要它(在模型简化之后)。我将改进模型“死代码”消除程序,以摆脱这些不必要的信息。但是,模型是正确的。它确实满足量词。您可以在http://rise4fun.com/Z3/tutorial/guide找到有关Z3使用的编码的更多详细信息,辅助功能k!5是此article中描述的“投影”功能。

相关问题