1
考慮以下Dafny代碼,試圖找到一個元素的數組一個內è:(Dafny)在數組中搜索 - 以零爲界的循環變體?
method findE(a:array<int>, e:int, l:int, u:int) returns (result:bool)
requires a != null
requires 0 <= l <= u < a.Length
ensures result <==> exists k | l <= k <= u :: a[k] == e
{
var i := l;
while i <= u
invariant l <= i <= u+1
invariant !(exists k | l <= k < i :: a[k] == e)
decreases u-i
{
if a[i] == e {
result := true;
return;
}
i := i+1;
}
result := false;
}
驗證工作正常,但沒有,我不知道明白了什麼:如果我我沒有弄錯,一個循環的變體,如果它是一個整數,必須以零爲界。然而u-i
在i = u+1
上次迭代時低於零。爲什麼不Dafny抱怨u-i
沒有被限制爲零?