以可读格式输出 z3 模型输出
Outputting z3 model output in a readable format
我问了 关于将变量分配给集合的问题,但我很难理解如何以可读格式输出 s.model()
结果。
虽然我可以解释以下内容
[A = Lambda(k!0, Or(k!0 == 1, k!0 == 4)),
b = 5,
a = 1,
d = 4,
sizeB = 2,
c = 3,
sizeA = 2,
B = Lambda(k!0, Or(k!0 == 3, k!0 == 5)),
Ext = [else -> 5]]
用户这样解释是不合理的。我想以易于 read/work 与(例如 {A: [a, d], B: [b, c]}
)的格式获得输出。我该怎么做?
当然..您可以以编程方式提取模型并以您喜欢的任何方式显示它。对于您提到的程序,只需在末尾添加以下内容,在 r = s.check()
行之后:
if r != sat:
print("Solver said: %s" % r)
else:
m = s.model()
print("A = %s" % [e for e in allElems if m.evaluate(m[A][e])])
print("B = %s" % [e for e in allElems if m.evaluate(m[B][e])])
加上这个,当我运行那个程序时,它打印:
A = [a, d]
B = [b, c]
我相信这就是您要找的东西。
显然,您可以提取这些值,对其进行操作,甚至可以根据您找到的模型声明新的约束,并查询更多信息。 API 非常灵活,如果您想用它进一步编程,我建议阅读 https://ericpony.github.io/z3py-tutorial/guide-examples.htm
我问了 s.model()
结果。
虽然我可以解释以下内容
[A = Lambda(k!0, Or(k!0 == 1, k!0 == 4)),
b = 5,
a = 1,
d = 4,
sizeB = 2,
c = 3,
sizeA = 2,
B = Lambda(k!0, Or(k!0 == 3, k!0 == 5)),
Ext = [else -> 5]]
用户这样解释是不合理的。我想以易于 read/work 与(例如 {A: [a, d], B: [b, c]}
)的格式获得输出。我该怎么做?
当然..您可以以编程方式提取模型并以您喜欢的任何方式显示它。对于您提到的程序,只需在末尾添加以下内容,在 r = s.check()
行之后:
if r != sat:
print("Solver said: %s" % r)
else:
m = s.model()
print("A = %s" % [e for e in allElems if m.evaluate(m[A][e])])
print("B = %s" % [e for e in allElems if m.evaluate(m[B][e])])
加上这个,当我运行那个程序时,它打印:
A = [a, d]
B = [b, c]
我相信这就是您要找的东西。
显然,您可以提取这些值,对其进行操作,甚至可以根据您找到的模型声明新的约束,并查询更多信息。 API 非常灵活,如果您想用它进一步编程,我建议阅读 https://ericpony.github.io/z3py-tutorial/guide-examples.htm