考虑以下尝试在数组a中查找元素e的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
不受零约束?