问题描述
考虑以下代码:
predicate sorted(a:array<int>,min:int,max:int)
requires a != null
requires 0 <= min <= max <= a.Length
reads a
{
forall i,j | min <= i < j < max :: a[i] <= a[j]
}
method test(a:array<int>,i:int)
requires a!=null
requires a.Length>i
requires i>0
requires sorted(a,i-1)
requires a[i-1]<a[i]
ensures sorted(a,i)
{
}
方法test
要求数组a
从0到i-1
排序,并且a[i-1] < a[i]
排序。但是Dafny报告了一个错误,其后置条件是a
从0到i
进行排序。这不是很明显吗?达夫妮为什么不能证明呢?
解决方法
Dafny无法证明它的原因是因为它是错误的。我们可以使用test
来证明错误,如下所示:
method using_test_proves_false()
{
var a := new int[3];
a[0] := 8;
a[1] := 7;
a[2] := 9;
assert sorted(a,1);
assert a[0] > a[1];
assert !sorted(a,2);
assert a[1] < a[2];
test(a,2);
assert sorted(a,2);
assert false;
}
基本问题是i
要求中的test
上存在一个错误的错误。我想您可能想说a[i-2] < a[i-1]
?
另外,根据您的要求a != null
,您似乎使用的是Dafny的较旧版本。我建议升级到最新版本。