循环不变的简单while循环

时间:2016-04-08 03:57:22

标签: loops invariants loop-invariant

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

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

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

1 个答案:

答案 0 :(得分: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; } }

您可以通过在online version of Dafny中运行该程序来检查该程序是否确实验证了。