Дафни, пост-условие не держится после цикла

В следующем методе Дафни сообщает, что постусловие может не сохраняться, хотя я вполне уверен, что оно выполнено.

method toArrayConvert(s:seq<int>) returns (a:array<int>)
    requires |s| > 0
    ensures |s| == a.Length
    ensures forall i :: 0 <= i < a.Length ==> s[i] == a[i]  // This is the postcondition that might not hold.
{
    a := new int[|s|];
    var i:int := 0;
    while i < |s|
        decreases |s| - i
        invariant 0 <= i <= |s|
    {
        a[i] := s[i];
        i := i + 1;
    }

    return a;  // A postcondition might not hold on this return path.
}

1 ответ

Решение

Действительно, постусловие всегда выполняется, но Дафни не может сказать!

Это потому, что вам не хватает анвариантной аннотации цикла, такой как

invariant forall j :: 0 <= j < i ==> s[j] == a[j]

После добавления этой строки в цикл метод проверяет.

Для получения дополнительной информации о том, почему Dafny иногда сообщает об ошибках в правильных программах, см. (Совершенно новый) FAQ. Для получения дополнительной информации об инвариантах цикла см. Соответствующий раздел в руководстве sunrise4fun.

Другие вопросы по тегам