(* 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 { true } = label Init in let ref i = 0 in let ref j = length a - 1 in while i < j do invariant { forall i1: int. 0 <= i1 < i -> a[i1] = False } invariant { forall i2: int. j < i2 < length a -> a[i2] = True } invariant { 0 <= i /\ j < length 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