数组副本想要修改源代码

时间:2017-09-16 10:30:26

标签: arrays copy dafny

在下面的代码中,将数组的一个片段复制到另一个数组中,表示保留源数组的循环不变量不会验证。

这与this questionthis other one有关,但我还没有发现在这种情况下有效的任何内容。

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;
  }
}

1 个答案:

答案 0 :(得分:1)

您需要添加a != b的前提条件。否则,如果ab有别名,则该方法可能确实会修改a