我认为我可能需要其他不变式来说服Dafny代码起作用。 我尝试了几次,但没有通过。
URL[] urls = ((URLClassLoader) ClassLoader.getSystemClassLoader()).getURLs();
答案 0 :(得分:2)
当i减小时,必须保持不变的sorted(a,i,a。Length -1)。不变partioned(a,i)保证了这一点,因为它暗示a [i-1] <= a [i]。它之所以强大,是因为否则无法证明其不变性。
注意:partitioned(a,i)表示对于所有k <= i和i
答案 1 :(得分:1)
我在这些笔记中找到了一个经过dafny验证的气泡排序示例。
https://www.cs.cmu.edu/~mfredrik/15414/lectures/17-notes.pdf
predicate sorted ( a : array <int > , l : int , u : int)
reads a
{
forall i , j :: 0 <= l <= i <= j <= u < a . Length ==> a [ i ] <= a [ j ]
}
predicate partitioned ( a : array <int > , i : int)
reads a
{
forall k , k' :: 0 <= k <= i < k' < a . Length ==> a [ k ] <= a [k']
}
method BubbleSort(a: array<int>) returns (b: array<int>)
requires a.Length!=0
modifies a
ensures sorted(a,0,a.Length-1)
{
var i:=0;
var j:=0;
var temp:=0;
var n:=a.Length;
i:=n-1;
b:=a;
while i>0
invariant i<0 ==> a.Length==0
invariant -1<=i<n
invariant sorted (a , i , a . Length -1)
invariant partitioned(a,i)
{
j:=0;
while j<i
invariant 0<=j<=i
invariant 0<=i<n
invariant sorted(a , i , a . Length -1)
invariant forall k :: 0 <= k <j ==> a[j] >= a[k]
invariant partitioned(a,i)
{ if a[j]>a[j+1]
{
temp:=a[j];
a[j]:=a[j+1];
a[j+1]:=temp;
}
j:=j+1;
}
i:=i-1;
}
b:=a;
}