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 中找到。(至少,这些信息足以让我记住这个问题的答案。)
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 中找到。(至少,这些信息足以让我记住这个问题的答案。)