@requires n >= 1 && all(i =< j, 0:n-1, a[i] =< a[j]) @ensures x = a[p] || all(k, 0:n-1, x!= a[k]) @program @var lo, hi, x, p, n : int @var a: int[] lo = 0-1; hi = n; @invariant // must not have a @var declaration for i and j all(i= x) && lo+1 >= 0 && lo+1 =< hi && hi =< n while (lo+1 < hi) { p = (lo+hi)/2; // integer division; drop fraction if (a[p] == x) break; else if (a[p] < x) lo = p; else hi = p; } @end --