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,我已经更新了这个问题。我希望这能澄清我的疑虑。谢谢你,我已经更新了问题。我希望这能对你好,克里斯托夫,我已经更新了这个问题。我希望这能有所帮助