数组复制要修改源
Array copy wants to modify source
在以下将数组的一部分复制到另一个数组的代码中,表明源数组已保留的循环不变量不会验证。
这与 and 有关,但我还没有找到任何适用于这种情况的方法。
method copy
(a: array<int>, a0: nat,
b: array<int>, b0: nat,
len: nat)
requires a != null && b != null
requires a0 + len <= a.Length
requires b0 + len <= b.Length
modifies b
{
var i := 0;
while i < len
decreases len - i
invariant i <= len
invariant a[..] == old(a[..])
{
b[b0 + i] := a[a0 + i];
i := i + 1;
}
}
您需要添加一个前提条件a != b
。否则,如果 a
和 b
是别名,那么该方法可能确实会修改 a
.
在以下将数组的一部分复制到另一个数组的代码中,表明源数组已保留的循环不变量不会验证。
这与
method copy
(a: array<int>, a0: nat,
b: array<int>, b0: nat,
len: nat)
requires a != null && b != null
requires a0 + len <= a.Length
requires b0 + len <= b.Length
modifies b
{
var i := 0;
while i < len
decreases len - i
invariant i <= len
invariant a[..] == old(a[..])
{
b[b0 + i] := a[a0 + i];
i := i + 1;
}
}
您需要添加一个前提条件a != b
。否则,如果 a
和 b
是别名,那么该方法可能确实会修改 a
.