避免在 Z3 中截断大型模型
Avoiding truncation of large model in Z3
对于大型模型,通过 Z3 Python API 使用的函数 model() 会截断输出(在某些时候模型会以“...”继续)。
有没有办法避免这种情况?
我有下面的函数,它试图将 str(self.solver.check()) 给出的答案和 str(self.solver.model())[=12= 给出的模型保存到文件名中]
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 行以内就没问题。
如果我没记错的话,这是一个Python"feature"。尝试使用 repr(...)
而不是 str(...)
,它应该生成一个可以由解释器读回(如果需要)的字符串。你当然可以单独迭代模型元素,让所有需要输出的字符串变小。例如,沿着这些线:
s = Solver()
# Add constraints...
print(s.check())
m = s.model()
for k in m:
print('%s=%s' % (k, m[k]))
对于大型模型,通过 Z3 Python API 使用的函数 model() 会截断输出(在某些时候模型会以“...”继续)。
有没有办法避免这种情况?
我有下面的函数,它试图将 str(self.solver.check()) 给出的答案和 str(self.solver.model())[=12= 给出的模型保存到文件名中]
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 行以内就没问题。
如果我没记错的话,这是一个Python"feature"。尝试使用 repr(...)
而不是 str(...)
,它应该生成一个可以由解释器读回(如果需要)的字符串。你当然可以单独迭代模型元素,让所有需要输出的字符串变小。例如,沿着这些线:
s = Solver()
# Add constraints...
print(s.check())
m = s.model()
for k in m:
print('%s=%s' % (k, m[k]))