Рассмотрим следующий код Dafny, который пытается найти элемент e внутри массива a:
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
на последней итерации. Почему Дафни не жалуется на то, что u-i
не ограничено нулем?