muller.mlw 797 Bytes
Newer Older
1

Jean-Christophe Filliatre's avatar
Jean-Christophe Filliatre committed
2 3 4 5 6 7
(* A small verification challenge proposed by Peter Müller.

   Given an array of integers, we first count how many non-zero values
   it contains. Then we allocate a new array with exactly this size and
   we fill it with the non-zero values. *)

8 9
module Muller

10 11 12
  use int.Int
  use ref.Refint
  use array.Array
13
  use int.NumOf as N
14

15
  function numof (a: array int) (l u: int) : int =
16
    N.numof (fun i -> a[i] <> 0) l u
17

Jean-Christophe Filliatre's avatar
Jean-Christophe Filliatre committed
18
  let compact (a: array int) =
19
    let count = ref 0 in
20
    for i = 0 to length a - 1 do
21
      invariant { !count = numof a 0 i }
22 23 24 25 26
      if a[i] <> 0 then incr count
    done;
    let u = make !count 0 in
    count := 0;
    for i = 0 to length a - 1 do
27
      invariant { !count = numof a 0 i }
28
      if a[i] <> 0 then begin u[!count] <- a[i]; incr count end
29
    done
30 31

end