dafny - Dafny 迭代器:违反了前提条件和修改子句
问题描述
在不执行任何操作的迭代器上调用 MoveNext() 时,Dafny 显示多个错误:
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 参考中找到。(至少,有足够的信息让我记住这个问题的答案。)
推荐阅读
- javascript - javascript和html,css的错误魔术缩放
- javascript - 将js对象数组转换为关联数组
- c# - C# - 如何使用 C# 在整个 Excel 文件中取消选择换行
- powershell - Exchange Powershell 循环分发列表
- python - 提取文件名 python 的一部分并插入 MySQL DB
- audio-streaming - 将原始音频数据从服务器流式传输到客户端
- nativescript - Nativescript RadDataForm - 从后面的代码中提供 valuesProvider
- android - variant.getJavaCompiler()、variant.getJavaCompileProvider()、variantOutput.getPackageLibrary()、variant.getPackageLibraryProvider() 中的警告
- angular - 已修复:Angular 9:使用 Angular 功能的未修饰基类
- ruby-on-rails - 是什么导致 bin/rails:与非类/模块(TypeError)相比?