获取Z3模型名称的对应python变量名称

时间:2019-01-09 17:58:48

标签: python z3 smt z3py

有没有办法获得z3模型名称的对应python变量名称?

假设我有以下代码:

from z3 import *

s = Solver()

a = [Real('a_%s' % k) for k in range(10)]

for i in range(10):
    s.add(a[i] > 10)

s.check()

m = s.model()
for d in m:
    print(d, m[d])

此处d中的ma_0, a_1, a_2,..., a_9,其所有值均为11。我正在尝试设置一些约束,使这些变量不等于先前的检查结果,如下所示:

s.add(a[0] != m['a_0']
...
s.add(a[9] != m['a_9']

因此,我的问题是Z3是否有一种方法来获取z3模型名称的对应python变量名称?如果是这样,那么我不需要枚举所有变量名称。因为如果我们有很多变量,这将是一项巨大的工作。我想要实现的目标如下:

m = s.model()
for d in m:
    s.add(corresponding_python_variabl_name(d) != m[d])

Z3是否具有该corresponding_python_variable_name()功能?预先感谢!

1 个答案:

答案 0 :(得分:1)

您似乎正在尝试生成所有可能的模型?

在这种情况下,请使用以下模板:

from z3 import *

s = Solver()

a = [Real('a_%s' % k) for k in range(10)]

for i in range(10):
    s.add(a[i] > 10)

while s.check() == sat:
   m = s.model()

   if not m:
       break

   print m

   s.add(Not(And([v() == m[v] for v in m])))

请注意,这将循环尽可能多的不同模型;因此,如果您有许多模型(在您的问题中可能带有Real的无限模型),那么它将永远持续下去。 (或者直到内存/ CPU等耗尽)。