避免在Z3中截断大型模型

时间:2018-06-14 14:20:28

标签: z3 z3py

对于大型模型,通过Z3 Python API使用的函数model()会截断输出(在某些时候,模型以“......”继续)。

有没有办法避免这种情况?

2 个答案:

答案 0 :(得分:0)

我有下面的函数,它尝试将str(self.solver.check())给出的答案和str(self.solver.model())给出的模型保存到fileName中

def createSMT2LIBFileSolution(self, fileName):
  with open(fileName, 'w+') as foo:
    foo.write(str(self.solver.check()))
    foo.write(str(self.solver.model()))
  foo.close()

问题的输出是:

sat[C5_VM1 = 0,
... //these "..." are added by me
VM6Type = 6,
ProcProv11 = 18,
VM2Type = 5,
...]

“...]”出现在截断的所有文件的第130行。我不知道是Python还是Z3。如果模型可以写在少于130行,一切都很好。

答案 1 :(得分:0)

如果我没记错的话,这是一个Python“功能”。而不是str(...)尝试使用repr(...),它应该产生一个可以被解释器回读(如果需要)的字符串。您当然可以单独迭代模型元素,以便使所有字符串都需要输出更小。例如,沿着这些方向:

s = Solver()
# Add constraints...
print(s.check())
m = s.model()
for k in m:
     print('%s=%s' % (k, m[k]))