以下程序使用主git分支中的最新版Z3(commit 89c1785b)生成无法打印的Z3模型(即print solver.model()
抛出异常):
x = Int('x')
a = Array('a', IntSort(), BoolSort())
b = Array('b', IntSort(), BoolSort())
c = Array('c', BoolSort(), BoolSort())
e = ForAll(x, Or(Not(a[x]), c[b[x]]))
print e
solver = Solver()
solver.add(e)
c = solver.check()
print c
if c == sat:
print solver.model()
产生
ForAll(x, Or(Not(a[x]), c[b[x]]))
sat
Traceback (most recent call last):
File "z3bug.py", line 16, in <module>
print solver.model()
File "src/api/python/z3.py", line 5177, in __repr__
File "src/api/python/z3printer.py", line 939, in obj_to_string
File "src/api/python/z3printer.py", line 841, in __call__
File "src/api/python/z3printer.py", line 831, in main
File "src/api/python/z3printer.py", line 760, in pp_model
File "src/api/python/z3printer.py", line 794, in pp_func_interp
File "src/api/python/z3.py", line 5088, in else_value
File "src/api/python/z3.py", line 818, in _to_expr_ref
File "src/api/python/z3core.py", line 2307, in Z3_get_ast_kind
z3types.Z3Exception: 'invalid argument'
我还可以在http://rise4fun.com/Z3Py/lfQG的在线z3py界面中重现相同的行为。略微更多的调试表明,模型对c
的赋值是z3.FuncInterp
,当您在其上调用else_value()
时会抛出“无效参数”异常。
这是Z3中的错误,还是我的期望不太对?我的期望是始终有可能获得else_value()
FuncInterp
,因为否则它不是一个完整的功能,但也许这并不总是正确的?
答案 0 :(得分:3)
这是Z3 Python打印机中的一个错误。我修复了错误,修复程序已经在codeplex上可用了。
http://z3.codeplex.com/SourceControl/changeset/f8014f54c18a
要获得修复(现在),我们必须检索“正在进行中的工作”(unstable
)分支。该修补程序将在下一个正式版本的master
分支中提供。要检索unstable
分支,我们应该使用:
git clone https://git01.codeplex.com/z3 -b unstable
另一种选择是使用print solver.model().sexpr()
。它将使用Z3内部打印机而不是基于Python的打印机。
关于else_value()
,Z3可能无法指定其值。意思是:它是“不在乎”。也就是说,任何解释都可用于满足公式。
我还修复了Z3 Python API,在未指定None
时返回else_value
。