Z3Py:创建模型对象
Z3Py: Create model object
我想创建一个 Z3 模型对象,例如 return 由 (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' 的方法来做到这一点:初始化一个公式,该公式是所有变量的联合等于它们的赋值,并让求解器 return 一个模型这个公式。但是,我想知道是否有更优雅的方式来实现我的目标...
这是一件相当奇怪的事情。模型是调用求解器的结果。您似乎希望能够凭空创建一个模型,无需解决任何约束?
话虽如此,这毕竟只是编程,你肯定可以从你的列表中创建这样的约束,让 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
,如您指定的,
如果你想要其他类型,显然需要扩展。
请注意,代码确实涉及解决指定的约束:这应该没有性能损失,因为
约束总是很容易满足。但是你最终还是调用了求解器。
我想创建一个 Z3 模型对象,例如 return 由 (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' 的方法来做到这一点:初始化一个公式,该公式是所有变量的联合等于它们的赋值,并让求解器 return 一个模型这个公式。但是,我想知道是否有更优雅的方式来实现我的目标...
这是一件相当奇怪的事情。模型是调用求解器的结果。您似乎希望能够凭空创建一个模型,无需解决任何约束?
话虽如此,这毕竟只是编程,你肯定可以从你的列表中创建这样的约束,让 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
,如您指定的, 如果你想要其他类型,显然需要扩展。请注意,代码确实涉及解决指定的约束:这应该没有性能损失,因为 约束总是很容易满足。但是你最终还是调用了求解器。