#include #pragma PARSE_ACSL $input int N = 6; // upper bound on n $input int n; // size of array $assume(1<=n && n<=N); $input int LEFT; $input int RIGHT; $assume(1<=LEFT && LEFT < RIGHT && RIGHT= a[LEFT-1]); int left = LEFT, right = RIGHT; int k; /*@ loop invariant left <= right + 2; @ loop invariant LEFT <= k && k <= RIGHT+2; @ loop invariant \forall int i; LEFT <= i && i <= RIGHT ==> @ a[i] >= a[LEFT-1]; @ loop invariant \forall int j; LEFT <= j && j < k ==> @ a[j] <= a[j+1]; @*/ for (k = left; ++left <= right; k = ++left) { int a1 = a[k], a2 = a[left]; if (a1 < a2) { a2 = a1; a1 = a[left]; } /*@ loop invariant LEFT - 1 <= k && k <= left - 1; @ loop invariant \forall int i; k < i && i < left - 1 ==> @ a[i] <= a[i+1]; @*/ while (a1 < a[--k]) { a[k + 2] = a[k]; } a[++k + 1] = a1; /*@ loop invariant LEFT - 1 <= k && k <= left - 1; @ loop invariant \forall int i; LEFT <= i && i <= k+1 ==> @ a[i] <= a[i+1]; @*/ while (a2 < a[--k]) { a[k + 1] = a[k]; } a[k + 1] = a2; } }