Loop Invariant用于线性阵列搜索

时间:2014-01-16 23:40:57

标签: loop-invariant

int i = 0
boolean answer = false
while (i < a.length) {
    if a[i] == 0
        answer = true
    i = i + 1

其中'a'是整数数组。 我正在做一个问题论文,它问我这是什么循环不变量,我已经确定代码可以判断数组是否包含0.但到目前为止,我只能将不变量视为

i <= a.length

并且问题表明在变量中包含变量i,a和答案,所以我知道这不可能是正确的。我之前没有遇到涉及布尔值的循环不变量,我很困惑,有人可以帮忙解释一下吗?

1 个答案:

答案 0 :(得分:0)

以下是Microsoft Dafny中的循环实现,其中指定了适当的循环不变量:

method Main(a:array<int>) returns (answer:bool)
   requires a != null
   ensures answer <==> (exists i :: 0 <= i < a.Length && a[i] == 0) 
{
   var i:int := 0;
   answer := false;
   while (i < a.Length)
     invariant 0 <= i <= a.Length;
     invariant !answer ==> !(exists j :: 0 <= j < i && a[j] == 0)
     invariant answer ==> (exists j :: 0 <= j < i && a[j] == 0)  
   {
     if a[i] == 0 {
        answer := true;
     }
     i := i + 1;
   }
}

您可以在online version of Dafny

中自动验证其正确性