2 VSTTE'10 competition http://www.macs.hw.ac.uk/vstte10/Competition.html
3 Problem 1: maximum /\ sum of an array
5 Author: Jean-Christophe Filliatre (CNRS)
6 Tool: Why3 (see http://why3.lri.fr/)
15 let max_sum (a: array int) (n: int) : (sum: int, max: int)
16 requires { n = length a }
17 requires { forall i. 0 <= i < n -> a[i] >= 0 }
18 ensures { sum <= n * max }
22 invariant { sum <= i * max }
23 if max < a[i] then max <- a[i];
37 predicate is_max (a: array int) (l h: int) (m: int) =
38 (forall k. l <= k < h -> a[k] <= m) &&
40 (l < h && exists k. l <= k < h && m = a[k]))
42 let max_sum (a: array int) (n: int) : (s: int, m: int)
43 requires { n = length a /\ forall i. 0 <= i < n -> a[i] >= 0 }
44 ensures { s = sum a 0 n /\ is_max a 0 n m /\ s <= n * m }
48 invariant { s = sum a 0 i }
49 invariant { is_max a 0 i m }
50 invariant { s <= i * m }
51 if m < a[i] then m <- a[i];
65 exception BenchFailure
80 let s, m = max_sum a n in
85 let test_case () raises { BenchFailure -> true } =
88 if s <> 45 then raise BenchFailure;
89 if m <> 10 then raise BenchFailure;