我想创建一个Z3模型对象,例如由(get-model)
/ s.model()
和s = Solver()
返回的对象。我从一个元组列表(name, value)
开始,其中name
是表示模型中使用的Z3变量的字符串,value
是赋给变量的值(实数或布尔值) )。像
def myZ3Model(tuples):
""" Returns a Z3 model based on the values of the given tuples. """
<magic>
return model
t = [('a', True), ('b', 42), ('c', False)]
myZ3Model(t) --> [a = True, b = 42, c = False]
我已经想出了一个非常'hacky'的方法:初始化一个公式,它是所有变量的组合,等于它们的赋值,让一个求解器返回这个公式的模型。但是,我想知道是否有更优雅的方式来实现我的目标...
答案 0 :(得分:2)
这是一件相当离奇的事情。模型是对求解器的调用结果。您似乎希望能够无限制地创建模型而无需解决问题?
话虽如此,毕竟这只是编程,你肯定可以从你的列表中创建这样的约束,让Z3解决它们。这可以满足您的要求:
from z3 import *
def myZ3Model(tuples):
s = Solver()
for (n, v) in tuples:
if isinstance(v, bool):
s.add(Bool(n) == v)
else:
s.add(Real(n) == v)
s.check()
return s.model()
通过这个定义,您现在可以说:
t = [('a', True), ('b', 42), ('c', False)]
print myZ3Model(t)
这将做你想要的。一些警告:
该结构仅支持您指定的Bool
和Real
,
如果你想要其他类型,显然需要扩展。
请注意,代码确实涉及解决指定的约束:这应该没有性能损失 约束总是很容易满足。但你最终还是会打电话给解算器。