Dafny
Dafny: A Language and Program Verifier for Functional Correctness
Dafny是用来更好的写出正确代码的语言
最简单的方法是在 这里 在线的进行程序验证
下边看几个例子
简单的验证
method Add(x:int,y:int) returns (r:int) requires 0 <= x && 0 <= y ensures r == 2*x+y { r:=x; var n:=y; while n != 0 invariant r == x+y-n && 0 <= n { r := r + 1; n := n - 1; } }
显然ensures r == 2 * x + y 这里不成立,rise4fun 报出这样的错误
Error BP5003: A postcondition might not hold on this return path
Related location: This is the postcondition that might not hold.
证明程序不正确
给他修改过后,则显示
Dafny program verifier finished with 1 verified, 0 errors
这证明程序是正确的。
简单的例子
method Abs(x:int) returns (y:int) { if x < 0 {return -x;} else {return x;} }
method MultipleReturns(x:int,y:int) returns (more:int,less:int)
{
more:=x+y;
less:=x-y;
}
/*导师发的验证冒泡排序的例子*/ predicate sorted_range(a: array<int>,l:nat,u:nat) requires a != null requires 0 <= l <= u <= a.Length; reads a; { forall i,j :: l <= i < j < u ==> a[i] <= a[j] } predicate pivot(a: array<int>, pv: nat,l:nat,up:nat) requires a!=null reauires 0 <= l <= pv <= up <= a.Length; reads a; { forall u,v :: l <= u < pv < v < up ==> a[u] <= a[v] } method bubbleSort(a:array<int>) requires a != null && a.Length > 1; ensures sorted_range(a,0,a.Length); ensures multiset(a[..]) == multiset(old(a[..])); modifies a; { var i:nat:=1; while(i < a.Length) invariant i <= a.Length; invariant sorted_range(a,0,i); invariant multiset(a[..]) == multiset(old(a[..])); { var j:nat:=1; var swapped::bool:=a[j-1]>a[j]; while(j>0&&swapped == true) invariant 0 <= j <= i; invariant sorted_range(a,0,j); invariant sorted_range(a,j,i+1); invariant pivot(a,j,0,i+1); invariant multiset(a[..]) == mulitset(old(a[..])); invariant swapped == true && j>0==>a[j-1] > a[j]; invariant swapped == false && j>0==>a[j-1] <= a[j]; { var temp:int:=a[j-1]; a[j-1]:=a[j]; a[j]:=tmp; j:=j-1; if j > 0{ if(a[j-1]>a[j]){ swapped := true; } else{ swapped := false; } } } i:=i+1; } }
这个冒泡排序验证看得不是太懂, 很懵