【问题标题】:Z3Py How to get values after solve() functionZ3Py如何在solve()函数后获取值
【发布时间】:2020-11-21 21:48:31
【问题描述】:

在使用https://pypi.org/project/z3-solver/ 的solve() 函数时,有人可以解释如何访问方程变量的结果值。

x, y = BitVecs('x y', 32)
solve(x + y == 2, x > 0, y > 0)

我尝试了以下无济于事

m = solve(x + y == 2, x > 0, y > 0)
print(m.x)

请注意,在这种情况下,我们不想使用 Solver

s = Solver()
s.add(And(x + y == 2, x > 0, y > 0))
s.check()
m = s.model()
print(m[x], m[y])

【问题讨论】:

    标签: python z3 z3py


    【解决方案1】:

    似乎没有直接的方法。函数solve() 打印找到的解决方案但不返回模型。

    文件z3.pysolve()的定义:

    def solve(*args, **keywords):
        """Solve the constraints `*args`.
    
        This is a simple function for creating demonstrations. It creates a solver,
        configure it using the options in `keywords`, adds the constraints
        in `args`, and invokes check.
    
        >>> a = Int('a')
        >>> solve(a > 0, a < 2)
        [a = 1]
        """
        s = Solver()
        s.set(**keywords)
        s.add(*args)
        if keywords.get('show', False):
            print(s)
        r = s.check()
        if r == unsat:
            print("no solution")
        elif r == unknown:
            print("failed to solve")
            try:
                print(s.model())
            except Z3Exception:
                return
        else:
            print(s.model())
    

    所以,solve() 只是一个包装函数。它会创建一个Solver(),并且不会公开生成的模型来访问变量。

    【讨论】:

    • 似乎纯粹是为了演示。我正在尝试从这里进一步研究
    • 可以通过main_ctx 访问默认上下文,如here 所述。不过,我还没有找到通过这个上下文获取默认模型的方法。
    • 正如 Alex 所提到的,只有在您不需要需要进一步访问模型时才使用solve。否则,请自行声明求解器。这是访问模型变量的官方方式;就 z3 本身的内部更改而言,任何其他“技巧”都不太可能足够强大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    相关资源
    最近更新 更多