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生成的模型。我有疑虑。
fun
只有else
部分。所以乍一看,无论参数如何,看起来都有一个值。但仔细看来,v0
和v1
似乎是fun
的形式参数。这有什么约定吗?elem!0
指的是哪个变量?感谢。
答案 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中描述的“投影”功能。