1

我看到了一个示例程序,它将数组中的每个值都设置为 0:

int a[n]; int i = 0;
while(i < n) {
    a[i] = 0;
    i++;
}

它表示循环不变量的一部分是0<=i<n. 但是,循环结束后,i 将等于 n。我是否正确地说这不是循环不变量的一部分?如果是这样,它应该用什么代替?完整的不变量是For All j (0<= j < i --> a[i] = 0) & 0 <= i < n)

4

1 回答 1

0

循环不变量必须保持循环入口并在每次迭代(包括最后一次迭代)中保留。

因此循环不变量应该是0 <= i <= n

为了支持我的主张,我将您的程序翻译成 Microsoft Dafny 的自动验证语言作为证据:

method Main(a:array<int>) requires a != null modifies a ensures forall j :: 0 <= j < a.Length ==> a[j] == 0 { var i:int := 0; while(i < a.Length) invariant 0 <= i <= a.Length invariant forall j :: (0 <= j < i ==> a[j] == 0) { a[i] := 0; i := i+1; } }

您可以通过在Dafny的在线版本中运行该程序来检查它是否确实进行了验证。

于 2016-05-12T22:20:56.237 回答