2 (* FoVeOOS 2011 verification competition
3 http://foveoos2011.cost-ic0701.org/verification-competition
13 type tree = Empty | Node tree int tree
15 function size (t: tree) : int = match t with
17 | Node l _ r -> 1 + size l + size r
20 lemma size_nonneg: forall t: tree. size t >= 0
22 predicate mem (x: int) (t: tree) = match t with
24 | Node l v r -> mem x l \/ x = v \/ mem x r
27 let rec maximum (t: tree) : int variant { size t }
28 requires { t <> Empty }
29 ensures { mem result t /\ forall x: int. mem x t -> x <= result }
32 | Node Empty v Empty -> v
34 | Node s v Empty -> max (maximum s) v
35 | Node l v r -> max (maximum l) (max v (maximum r))