这是学习达芙妮的一个例子。
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;
}
}
为什么验证失败?
Dafny可以显示反例吗?
答案 0 :(得分:0)
是的,您可以得到一个反例。如果您使用的是Visual Studio,只需单击错误所在的红色圆圈即可。这将打开验证调试器。如果您使用的是VS Code,请按F7(请参阅https://marketplace.visualstudio.com/items?itemName=correctnessLab.dafny-vscode)。这将重新验证您的程序,并向您显示反例中的一些信息。
在您的情况下,这些反例显示x
和y
相等,并且最初与x[0]==y[0]==1
相等。实际上,从该初始状态开始,test5
不会建立其声明的后置条件。
Rustan