如何从Z3数组中删除(或“取消存储”)元素?

时间:2016-06-15 14:17:51

标签: z3

将元素存储到Z3数组中很容易。例如:

ArrayExpr mem = ctx.MkArrayConst("mem", ctx.MkBitVecSort(nBits), ctx.MkBitVecSort(nBits));
BitVecExpr addr = ctx.MkBV(10, nBits);
BitVecExpr value = ctx.MkBV(20, nBits);
mem = ctx.MkStore(mem, addr, value);

但是如何更改或删除此类数组中的元素?

带有签名“ArrayExpr MkSetDel(ArrayExpr set,Expr element)”的方法MkSetDel似乎暗示它可以(错误地)用于此目的;但遗憾的是,它只接受集合。

如果存在迭代数组中断言元素的方法,我可以填充一个新数组并跳过我正在更改或删除的数组。但我找不到这样的方法。

我想我错过了什么。

1 个答案:

答案 0 :(得分:0)

Z3本质上支持具有理论扩展(如数组)的一阶逻辑,因此仅支持,根据定义,它们是不可变的。数组也是值,不能更改。更新数组(在某个索引处)会生成一个新数组(一个数组值),其元素等于原始数组中的元素(除外)在您的更改受影响的索引处。

有关数组以及storeselect操作的更多详细信息,请参阅Z3 tutorial on array

顺便问一下,“从数组中删除一个元素”是什么意思?是否会通过切割元素来缩短阵列?大多数编程语言甚至都不支持这种语言(其中数组是连续的内存位置)。它会将所有后续元素转移到前面吗?

相关问题