dafny - 为什么这个 Dafny 示例验证失败?
问题描述
这是一个学习 Dafny 的例子。
method test5(x:array<int>,y:array<int>,n:int)
requires 0<=n
requires 0< x.Length
requires 0< y.Length
requires x[0]==y[0];
requires (x[0]>=0 ==> y[0]>=0)
requires (y[0]>= 0 ==> x[0]>= 0)
requires (x[0]+y[0]==0 || x[0]+y[0]>0);
modifies y;
modifies x;
ensures (x[0]==y[0]);
ensures (x[0]>0 ==> y[0]>0)
ensures (y[0] > 0 ==> x[0] > 0)
ensures (x[0]+y[0]==0 || x[0]+y[0]>0)
{ if (x[0]>0)
{x[0]:=x[0]- 1;
y[0]:=y[0]- 1;
}
}
为什么验证失败?
达夫尼可以举一个反例吗?
解决方案
是的,你可以举个反例。如果您使用的是 Visual Studio,只需单击错误所在的红色圆圈。这将打开验证调试器。如果您使用的是 VS Code,请按 F7(请参阅https://marketplace.visualstudio.com/items?itemName=correctnessLab.dafny-vscode)。这将重新验证您的程序并向您展示反例中的一些信息。
在您的情况下,这些反例显示x
和最初y
是相等的。x[0]==y[0]==1
实际上,从那个初始状态开始,test5
不会建立其声明的后置条件。
鲁斯坦
推荐阅读
- python - 如何使 DataFrame 列的其余部分采用函数输出的值?
- regex - 仅当字符串/行以组之前的特定字符开头或包含时才捕获重复模式
- javascript - 部署 Heroku 应用程序后 Nodemon 崩溃,错误:无效的 ELF 标头
- python - 循环数据集时 tf.function 中的异常执行顺序
- javascript - AG-Grid:基于子集的列分组
- unix - 根据多个选择标准打印
- azure-devops - 编辑 Azure DevOps 的 wiki 页面时自定义提交消息
- python - for 循环中 find() 的行为
- python - 为什么它会为 1 生成超出范围的索引错误?
- syntax - 逐元素求和和逐元素乘积之间的差异