Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从Lambda表达式中获取值?_Python_Z3_Z3py - Fatal编程技术网

Python 如何从Lambda表达式中获取值?

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

我正在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  (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,最好开始一个不同的问题,而不是编辑原始问题。而且,“接受”答案告诉其他人问题已经解决;既适用于有类似问题的人,也适用于试图帮助他人的人。评论只应保留给最初的讨论。所以,请开始一个新的问题,我相信有人会回答!