将元素存储到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似乎暗示它可以(错误地)用于此目的;但遗憾的是,它只接受集合。
如果存在迭代数组中断言元素的方法,我可以填充一个新数组并跳过我正在更改或删除的数组。但我找不到这样的方法。
我想我错过了什么。
答案 0 :(得分:0)
Z3本质上支持具有理论扩展(如数组)的一阶逻辑,因此仅支持值,根据定义,它们是不可变的。数组也是值,不能更改。更新数组(在某个索引处)会生成一个新数组(一个数组值),其元素等于原始数组中的元素(除外)在您的更改受影响的索引处。
有关数组以及store
和select
操作的更多详细信息,请参阅Z3 tutorial on array。
顺便问一下,“从数组中删除一个元素”是什么意思?是否会通过切割元素来缩短阵列?大多数编程语言甚至都不支持这种语言(其中数组是连续的内存位置)。它会将所有后续元素转移到前面吗?