Dafny 迭代器:违反前提条件和修改条款

Dafny iterator: precondition and modifes clause violated

Dafny 在不执行任何操作的迭代器上调用 MoveNext() 时显示多个错误:

iterator Iter()
{}

method main()
    decreases *
{
    var iter := new Iter();
    while (true)
        decreases *
    {
        var more := iter.MoveNext();
        if (!more) { break; }
    }
}

调用 iter.MoveNext() 时出错:

call may violate context's modifies clause

A precondition for this call might not hold.

main 或 Iter 没有修改子句,Iter 也没有前置条件。为什么这个程序不正确?

您需要在循环中使用以下不变量

invariant iter.Valid() && fresh(iter._new)

然后你的程序会验证。与往常一样,您的程序没有任何问题(动态地),但由于缺少注释,您可能在验证时出现误报。

据我所知,使用迭代器时总是需要这个不变量。

(一点点)关于迭代器的更多信息可以在第 16 章的 Dafny Reference 中找到。(至少,这些信息足以让我记住这个问题的答案。)