Python 如何从Lambda表达式中获取值?
我正在python中试验z3。我有以下型号:Python 如何从Lambda表达式中获取值?,python,z3,z3py,Python,Z3,Z3py,我正在python中试验z3。我有以下型号: (set-option :produce-models true) (set-logic QF_AUFBV ) (declare-fun a () (Array (_ BitVec 32) (_ BitVec 8) ) ) (declare-fun another () (Array (_ BitVec 32) (_ BitVec 8) ) ) (assert (and (= false (= (_ bv77 32) (concat (sel
(set-option :produce-models true)
(set-logic QF_AUFBV )
(declare-fun a () (Array (_ BitVec 32) (_ BitVec 8) ) )
(declare-fun another () (Array (_ BitVec 32) (_ BitVec 8) ) )
(assert (and (= false (= (_ bv77 32) (concat (select a (_ bv3 32) ) (concat (select a (_ bv2 32) ) (concat (select a (_ bv1 32) ) (select a (_ bv0 32) ) ) ) ) ) ) (= false (= (_ bv12 32) (concat (select another (_ bv3 32) ) (concat (select another (_ bv2 32) ) (concat (select another (_ bv1 32) ) (select another (_ bv0 32) ) ) ) ) ) ) ) )
我可以加载它并检查它是否为sat。此时,我如何获得a
和另一个
的示例值
import z3
s = z3.Solver()
s.from_file("first.smt")
"""
s
[And(False ==
(77 == Concat(a[3], Concat(a[2], Concat(a[1], a[0])))),
False ==
(12 ==
Concat(another[3],
Concat(another[2],
Concat(another[1], another[0])))))]
"""
s.check()
"""
sat
"""
m = s.model()
m
[a = Lambda(k!0, 1), another = Lambda(k!0, 1)]
感谢Z3默认为数组生成
Lambda
抽象;它们很有用,但很难看到模型中发生了什么。我建议通过在python程序中放入以下行来关闭该功能:
z3.set_param('model_compress', False)
您应该在导入z3后立即执行此操作
这样,如果您在程序中打印模型,您将获得:
>>> m
[a = [3 -> 1, else -> 1],
another = [1 -> 1, else -> 1],
k!0 = [3 -> 1, else -> 1],
k!1 = [1 -> 1, else -> 1]]
这应该更具可读性。(本质上说,
a
和另一个
都是将所有内容映射到1的数组;尽管有点复杂。)感谢您的回答,我现在能够以这种格式创建模型。如果可能的话,我会再问你一个问题。为此我编辑了我的原始问题。你能详细解释一下这个模型吗。ThanksOn stack overflow,最好开始一个不同的问题,而不是编辑原始问题。而且,“接受”答案告诉其他人问题已经解决;既适用于有类似问题的人,也适用于试图帮助他人的人。评论只应保留给最初的讨论。所以,请开始一个新的问题,我相信有人会回答!