在Z3Py中从模型中检索数组

时间:2016-05-18 03:22:45

标签: arrays z3 z3py

我知道有一个similar question for Z3 C++ API,但我无法找到Z3Py的相应信息。我试图从Z3找到的模型中检索数组,以便我可以使用索引访问数组的值。例如,如果我有

>>> b = Array('b', IntSort(), BitVecSort(8))
>>> s = Solver()
>>> s.add(b[0] == 0)
>>> s.check()
sat

然后我想做像

这样的事情
>>> s.model()[b][0]
0

但我现在得到:

>>> s.model()[b][0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'FuncInterp' object does not support indexing

从C ++的答案来看,似乎我必须使用我从模型中获得的一些值来声明一个新函数,但我不能很好地理解它以使自己适应Z3Py。

1 个答案:

答案 0 :(得分:2)

您可以通过构造对相关数组模型函数的调用,让模型在特定点评估(eval(...))数组。这是一个例子:

b = Array('b', IntSort(), BitVecSort(8))
s = Solver()
s.add(b[0] == 21)
s.add(b[1] == 47)
s.check()

m = s.model()
print(m[b])

print(m.eval(b[0]))
print(m.eval(b[1]))

产生

[1 -> 47, 0 -> 21, else -> 47]
21
47