(* Two Way Sort The following program sorts an array of Boolean values, with False a[i1] << a[i2] let two_way_sort (a: array bool) : unit ensures { sorted a } ensures { permut_all (old a) a } = let ref i = 0 in let ref j = length a - 1 in while i < j do invariant { 0 <= i /\ j < length a } invariant { forall i1: int. 0 <= i1 < i -> a[i1] = False } invariant { forall i2: int. j < i2 < length a -> a[i2] = True } invariant { permut_all (old a) a } variant { j - i } if not a[i] then incr i else if a[j] then decr j else begin swap a i j; incr i; decr j end done end