Program verification

We did some program verification! See the lecture capture for details; here’s the Dafny code we ended up with.

predicate IsSorted(s:seq<int>)
{
  forall i,j :: 0 <= i <= j < |s| ==> s[i] <= s[j]
}

predicate IsPermutation(s1: seq<int>, s2: seq<int>)
{
  multiset(s1) == multiset(s2)
}

method insertion_sort(arr: array<int>) modifies arr
  ensures IsSorted(arr[..])
  ensures IsPermutation(old(arr[..]), arr[..])
{
  var index := 0;
  while index < arr.Length
    invariant index <= arr.Length
    invariant IsSorted(arr[..index])
    invariant IsPermutation(old(arr[..]), arr[..])
  {
    var element := arr[index];
    var insertion_index := index;
    while insertion_index > 0 && arr[insertion_index] < arr[insertion_index - 1]
      invariant arr[insertion_index] == element
      invariant IsSorted(arr[..insertion_index])
      invariant IsSorted(arr[insertion_index..index+1])
      invariant forall i,j :: 0 <= i < insertion_index < j <= index ==> arr[i] <= arr[j]
      invariant IsPermutation(old(arr[..]), arr[..])
    {
      arr[insertion_index] := arr[insertion_index - 1];
      arr[insertion_index - 1] := element;
      insertion_index := insertion_index - 1;
    }
    index := index + 1;
  }
}


method add_four_funny(x: int) returns (y: int)
  ensures y == x + 4
{
  var z := x + 2;
  z := z + 2;
  return z;
}


method veryquicksort(arr: array<int>)
  modifies arr
  ensures IsSorted(arr[..])
{
  var index := 0;
  while index < arr.Length
    invariant index <= arr.Length
    invariant forall i :: 0 <= i < index ==> arr[i] <= index
    invariant IsSorted(arr[..index])
  {
    arr[index] := index;
    index := index + 1;
  }
}