Python 如何从阵列的z3模型中获取示例值?

Python 如何从阵列的z3模型中获取示例值?,python,z3,z3py,Python,Z3,Z3py,多亏了我,我知道如何更轻松地查看模型。此时,如何获得a和另一个的预期值 如果可能的话,我想要使用pyz3的示例代码 澄清: 具有以下smt文件: (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) ) ) (as

多亏了我,我知道如何更轻松地查看模型。此时,如何获得
a
另一个的预期值

如果可能的话,我想要使用pyz3的示例代码

澄清:

具有以下smt文件:

(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  (=  true (=  (_ bv77 32) (concat  (select  a (_ bv3 32) 
) (concat  (select  a (_ bv2 32) ) (concat  (select  a (_ bv1 32) ) 
(select  a (_ bv0 32) ) ) ) ) ) ) (=  true (=  (_ bv12 32) (concat  
(select  another (_ bv3 32) ) (concat  (select  another (_ bv2 32) ) 
(concat  (select  another (_ bv1 32) ) (select  another (_ bv0 32) ) ) 
) ) ) ) ) )
我想要
a
另一个
的值,它们是
77
12

最好的方法是什么

目前我的做法是:

import z3
import binascii

z3.set_param('model_compress', False)
s = z3.Solver()
s.from_file("first.smt")

s.check()

m = s.model()

print(m)


a = m[m.decls()[0]]

print(a)

b = bytearray(a.num_entries())

for x in range(a.num_entries()):
    index = a.entry(x).as_list()[0]
    value = a.entry(x).as_list()[1]

    print(index, value)
    b[a.num_entries()-index.as_long()-1] = value.as_long()

expected = int(binascii.hexlify(b),16)

print(expected)
输出为预期的
77


感谢

如原问题所示,数组的模型值是将索引映射到值的函数。因此,
a
的一个示例值是
[3->1,else->1]
,该函数将索引
3
映射到值
1
,并将所有其他索引映射到值
1

如原始问题所示,数组的模型值是将索引映射到值的函数。因此,
a
的一个示例值是
[3->1,else->1]
,该函数将索引
3
映射到值
1
,并将所有其他索引映射到值
1

您在这里的用法非常脆弱。该行:

a = m[m.decls()[0]]
假设模型在第一个插槽中具有
a
值。它可能适用于这个特定的SMT文件;但不能保证它会一直保持

您的代码可以简化。但我认为这忽略了一点,这不是使用z3的正确方式。我建议您要么只使用SMTLib,要么直接使用z3py编码。混合这两个接口只会增加混乱,没有明显的好处,正如我提到的,这将是非常脆弱的


因为您似乎已经有了其他生成SMTLib的东西;为什么不坚持这种格式呢?可以使用SMTLib的
eval
命令从模型中提取任意值。或者,在z3py中重新编码所有内容,并直接使用这些设施。另外,还不清楚为什么要将
一个
另一个
建模为数组:似乎您只对这些数组的
[0]
第个元素感兴趣?如果是这种情况,只需使用32位向量而不是数组。

这里的用法非常脆弱。该行:

a = m[m.decls()[0]]
假设模型在第一个插槽中具有
a
值。它可能适用于这个特定的SMT文件;但不能保证它会一直保持

您的代码可以简化。但我认为这忽略了一点,这不是使用z3的正确方式。我建议您要么只使用SMTLib,要么直接使用z3py编码。混合这两个接口只会增加混乱,没有明显的好处,正如我提到的,这将是非常脆弱的


因为您似乎已经有了其他生成SMTLib的东西;为什么不坚持这种格式呢?可以使用SMTLib的
eval
命令从模型中提取任意值。或者,在z3py中重新编码所有内容,并直接使用这些设施。另外,还不清楚为什么要将
一个
另一个
建模为数组:似乎您只对这些数组的
[0]
第个元素感兴趣?如果是这种情况,只需使用32位向量而不是数组。

你所说的“预期”是什么意思?我怀疑你是在试图获取值并将其转换为Python对象?你可以用它来进一步编程吗?如果是这样的话,请把你尝试过的东西和你遇到的困难贴出来。通常提取数组对象并不容易,但也许您不需要从中开始。(通常可以忽略数组中的单个元素;但当然这在很大程度上取决于您试图解决的问题。)嗨,Levent,我已经更新了这个问题。我希望这能澄清我的疑虑。再次感谢“预期”是什么意思?我怀疑您试图获取该值并将其转换为Python对象?你可以用它来进一步编程吗?如果是这样的话,请把你尝试过的东西和你遇到的困难贴出来。通常提取数组对象并不容易,但也许您不需要从中开始。(通常可以忽略数组中的单个元素;但当然这在很大程度上取决于您试图解决的问题。)嗨,Levent,我已经更新了这个问题。我希望这能澄清我的疑虑。谢谢你,我已经更新了问题。我希望这能对你好,克里斯托夫,我已经更新了这个问题。我希望这能有所帮助