如何按顺序打印z3求解器结果print(s.model())?

问题描述 投票:1回答:1

假设我有一个包含10个变量的列表

v = [Real('v_%s' % (i+1)) for i in range(10)]

我想添加一个像这样的简单约束

s = Solver()
for i in range(10):
    s.add(v[i] == i)
if s.check() == sat:
    print(s.model())

所以一个令人满意的模型是v_1 = 0, v_2 = 1 .... v_10 = 9。然而print(s.model())的输出是无序的,这让我在一个更大的模型中有很多变量时感到困惑。对于这个例子,我的计算机的输出是v_5, v_7, v_4, v_2, v_1, v_3, v_6, v_8, v_9, v_10,但我想按照v_1, v_2, ..., v_10的顺序输出这个模型的变量。谁能告诉我z3Py有没有这种功能?谢谢!

python python-3.x z3 z3py
1个回答
1
投票

您可以将模型转换为列表并以您喜欢的任何方式对其进行排序:

from z3 import *

v = [Real('v_%s' % (i+1)) for i in range(10)]

s = Solver()
for i in range(10):
    s.add(v[i] == i)
if s.check() == sat:
    m = s.model()
    print (sorted ([(d, m[d]) for d in m], key = lambda x: str(x[0])))

这打印:

[(v_1, 0), (v_10, 9), (v_2, 1), (v_3, 2), (v_4, 3), (v_5, 4), (v_6, 5), (v_7, 6), (v_8, 7), (v_9, 8)]

请注意,名称按字典顺序排序,因此v_10位于v_1之后和v_2之前。如果你想让v_10到最后,你可以根据自己的需要进行进一步的处理。

© www.soinside.com 2019 - 2024. All rights reserved.