首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取Z3模型名称的相应python变量名

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

Stack Overflow用户
提问于 2019-01-10 01:58:48
回答 1查看 452关注 0票数 0

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

假设我有以下代码:

代码语言:javascript
复制
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])

在这里,m中的da_0, a_1, a_2,..., a_9,它们的所有值都是11。我正在尝试设置一些约束,使变量与之前的检查结果不相等,如下所示:

代码语言:javascript
复制
s.add(a[0] != m['a_0']
...
s.add(a[9] != m['a_9']

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

代码语言:javascript
复制
m = s.model()
for d in m:
    s.add(corresponding_python_variabl_name(d) != m[d])

Z3有corresponding_python_variable_name()功能吗?提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-10 02:50:45

看起来你正在尝试生成所有可能的模型?

如果是这种情况,请使用以下模板:

代码语言:javascript
复制
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耗尽等)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54115880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档