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和答案,所以我知道这不可能是正确的。我之前没有遇到涉及布尔值的循环不变量,我很困惑,有人可以帮忙解释一下吗?
答案 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;
}
}
中自动验证其正确性