Z3:我应该使用数组,IntVectors还是其他东西?

时间:2018-09-24 19:40:13

标签: z3 smt z3py

我想知道我的z3应用程序应该使用哪种数据类型。我的理解是,类似于整数数组的数据结构的唯一选择是Array(IntSort(),IntSort())和IntVector()。

原因,我认为数组是过大的:每个数组元素仅写入一次,我没有做类似Store((Store(X, y, z1)), y, z2)的事情。此外,每个数组的预定义长度为<= 256(并且数组中的每个整数在0到63之间)。

原因,我认为BitVectors无效:我想使用Int变量来索引数组。例如,我可能有z = Int('z'),一些约束z的子句,然后是Or(arr[z] == 2, arr[z + 1] == 2)。在试用z3并阅读后,我的理解是向量不支持此功能。

是否有一种无需使用昂贵的Array操作即可获得变量索引功能的方法?

1 个答案:

答案 0 :(得分:1)

如果您有固定长度的小型数组,而没有符号索引访问,那么我强烈建议您使用IntVector(请参见https://z3prover.github.io/api/html/namespacez3py.html#a7e166f891df8f17fd23290bec963b03c

请注意,这里重要的是您是否需要使用符号索引进行访问。 (也就是说,您始终使用已知的常量索引来寻址数组,还是需要对符号寻址的位置进行读/写操作。)从您的描述中,您似乎总是静态地知道该地址,因此{{1} }是您的最佳选择。如果地址可以是符号性的,那么您就必须使用旧的SMTLib阵列,这会增加成本。