在Z3PY中使用数组

时间:2016-07-19 13:53:53

标签: arrays z3 z3py theorem-proving

我正在使用z3进行研究,我遇到了以下问题。我正在分析包含数组的可满足公式的模型,但我不了解模型的结果。例如,我有两个变量' pkgcounter'和' rxlen'以及两个命题p1和p2。我的目标是找出是否有一个满足两个命题的模型。

 pkgcounter = Array('pkgcounter',IntSort(),BitVecSort(8))

 rxlen = Array('rxlen',IntSort(),BitVecSort(8))

 s = Solver()

 p1 = (pkgcounter < rxlen)

 p2 = (pkgcounter == rxlen)


 s.add(p1,p2)

 if s.check() == sat:

    print s.model()

结果是以下型号:     [rxlen = [else - &gt; 0],      pkgcounter = [else - &gt; 0],      k!0 = [else - &gt; 0]]

有人可以帮我解释这个结果吗?因为如果rxlen和pkgcounter的所有字段都等于零,那么命题p1就没有模型。

1 个答案:

答案 0 :(得分:2)

根据您使用的Z3和Python版本,此问题会产生不同的结果,所有这些都由

触发
p1 = (pkgcounter < rxlen)

在Python 2.7 (pkgcounter < rxlen)中简化为False,因为ArrayRef个对象没有<运算符且对象不同。相反,Python 3.5抱怨这些对象没有被排序(TypeError: unorderable types: ArrayRef() < ArrayRef())。

请注意,Z3中的数组没有大小;如果它们被整数索引,它们确实具有无限大小。因此,(pkgcounter < rxlen)在这种情况下没有意义,因为这些数组不能以这种方式进行比较。 (另见SMT ArraysEx Theory)。

这个测试用例可以满足的原因可能是使用了旧版本的Z3。在最新版本(GitHub上的主分支)中,这是不可满足的,但这又是因为p1False

通常,Array变量的模型被报告为函数定义,例如rxlen = [else -> 0]表示查找数组rxlen中的元素的函数是始终返回{{1}的函数。 }。添加

0

我们可以强制rxlen在第一个位置具有不同的值,然后模型将报告为p3 = (rxlen[0] == 1) ;即rxlen = [0 -> 1, else -> 1]位于10其他地方。