我正在使用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就没有模型。
答案 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上的主分支)中,这是不可满足的,但这又是因为p1
是False
。
通常,Array变量的模型被报告为函数定义,例如rxlen = [else -> 0]
表示查找数组rxlen
中的元素的函数是始终返回{{1}的函数。 }。添加
0
我们可以强制rxlen在第一个位置具有不同的值,然后模型将报告为p3 = (rxlen[0] == 1)
;即rxlen = [0 -> 1, else -> 1]
位于1
和0
其他地方。