Commit 4243f4c8 by Jean-Christophe Filliâtre

### new (simple) example: all_distinct

parent 2142447e
 (** Check an array of integers for duplicate values, using the fact that values are in interval [0,m-1]. *) module AllDistinct use import int.Int use import ref.Ref use import array.Array constant m: int axiom m_nonneg: 0 <= m exception Duplicate let all_distinct (a: array int) : bool requires { forall i: int. 0 <= i < length a -> 0 <= a[i] < m } ensures { result <-> forall i j: int. 0 <= i < length a -> 0 <= j < length a -> i <> j -> a[i] <> a[j] } = let dejavu = Array.make m False in try for k = 0 to Array.length a - 1 do invariant { forall i j: int. 0 <= i < k -> 0 <= j < k -> i <> j -> a[i] <> a[j] } invariant { forall x: int. 0 <= x < m -> dejavu[x] <-> exists i: int. 0 <= i < k /\ a[i] = x } let v = a[k] in if dejavu[v] then raise Duplicate; dejavu[v] <- True done; True with Duplicate -> False end end

Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment