我看到了一个示例程序,它将数组中的每个值设置为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)
答案 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中运行该程序来检查该程序是否确实验证了。