Z3Py:创建模型对象

时间:2017-01-24 10:23:22

标签: python z3 smt z3py

我想创建一个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'的方法:初始化一个公式,它是所有变量的组合,等于它们的赋值,让一个求解器返回这个公式的模型。但是,我想知道是否有更优雅的方式来实现我的目标...

1 个答案:

答案 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)

这将做你想要的。一些警告:

  • 该结构仅支持您指定的BoolReal, 如果你想要其他类型,显然需要扩展。

  • 请注意,代码确实涉及解决指定的约束:这应该没有性能损失 约束总是很容易满足。但你最终还是会打电话给解算器。