public class InsertionSort { /*@ requires array != null; @ ensures (\forall int k1,k2; 0 <= k1&& k1 <= k2 && k2 < array.length; @ array[k1] <= array[k2]); @ modifies array[*]; @*/ public void sort(int[] array) { /*@ loop_invariant 1 <= i; @ loop_invariant (\forall int k1,k2; 0 <= k1&& k1 <= k2 && k2 < i; @ array[k1] <= array[k2]); @ decreases array.length - i+1; @ modifies array[*]; @*/ for (int i = 1; i < array.length; i++) { int t = array[i]; int j = i-1; /*@ loop_invariant 1 <= i && i < array.length; @ loop_invariant -1 <= j && j < i; @ loop_invariant (\forall int k1,k2; @ 0 <= k1 && k1 <= k2 && k2 <= (j == i-1 ? i-1 : i); @ array[k1] <= array[k2]); @ loop_invariant t <= array[j+1]; @ decreases j + 1; @ modifies array[*]; @*/ while (j >= 0) { if (array[j] > t) { array[j + 1] = array[j]; } else { break; } j--; } array[j+1] = t; } } }