2 VSTTE'10 competition http://www.macs.hw.ac.uk/vstte10/Competition.html
3 Problem 2: inverting an injection
5 Author: Jean-Christophe Filliatre (CNRS)
6 Tool: Why3 (see http://why3.lri.fr/)
9 module InvertingAnInjection
13 use map.MapInjection as M
15 predicate injective (a: array int) (n: int) = M.injective a.elts n
17 predicate surjective (a: array int) (n: int) = M.surjective a.elts n
19 predicate range (a: array int) (n: int) = M.range a.elts n
21 let inverting (a: array int) (b: array int) (n: int) : unit
22 requires { n = length a = length b /\ injective a n /\ range a n }
23 ensures { injective b n }
24 = for i = 0 to n - 1 do
25 invariant { forall j. 0 <= j < i -> b[a[j]] = j }
29 (* variant where array b is returned /\ with additional post *)
31 let inverting2 (a: array int) (n: int) : array int
32 requires { n = length a /\ injective a n /\ range a n }
33 ensures { length result = n /\ injective result n /\
34 forall i. 0 <= i < n -> result[a[i]] = i }
37 invariant { forall j. 0 <= j < i -> b[a[j]] = j }
47 use InvertingAnInjection
73 let b = inverting2 a 10 in