two forms of transformation extensionality
[why3.git] / examples_in_progress / binary_search2.mlw
blob53bf75fb9bd2780e1e1d14b50cf19793f1ccc475
2 (* yet another binary search *)
4 module BinarySearch
6   use int.Int
7   use int.ComputerDivision
9   val function f int : int
11   axiom f_monotonic : forall x y : int. x <= y -> f x <= f y
13   let rec binary_search target lo hi variant { hi-lo }
14     requires { f lo < target <= f hi }
15     ensures  { f result >= target /\
16       forall x : int. x < result -> f x < target }
17   = if lo < hi-1 then
18       let mid = div (lo + hi) 2 in
19       if f mid < target then
20         binary_search target mid hi
21       else
22         binary_search target lo mid
23     else
24       hi
26 end