1 typedef int value_type;
2 typedef unsigned int size_type;
6 predicate NoneEqual(value_type* a, integer m, integer n, value_type v) =
7 \forall integer i; m <= i < n ==> a[i] != v;
9 predicate NoneEqual(value_type* a, integer n, value_type v) =
10 NoneEqual(a, 0, n, v);
18 Find(value_type* a, integer m, integer n, value_type v) =
20 0 : ((0 <= Find(a, m, n-1, v) < n-m-1) ?
21 Find(a, m, n-1, v) : ((a[n-1] == v) ? n-m-1 : n-m));
24 Find(value_type* a, integer n, value_type v) = Find(a, 0, n, v);
28 \forall value_type *a, v, integer m, n;
29 n <= m ==> Find(a, m, n, v) == 0;
33 \forall value_type *a, v, integer m, n;
35 Find(a, m, n, v) < n-m ==>
36 Find(a, m, n+1, v) == Find(a, m, n, v);
40 \forall value_type *a, v, integer m, n;
43 Find(a, m, n, v) == n-m ==>
44 Find(a, m, n+1, v) == n-m;
48 \forall value_type *a, v, integer m, n;
51 Find(a, m, n, v) == n-m ==>
52 Find(a, m, n+1, v) == (n+1)-m;
56 \forall value_type *a, v, integer m, n;
57 0 <= Find(a, m, n, v);
61 \forall value_type *a, v, integer m, n;
62 m <= n ==> Find(a, m, n, v) <= n-m;
65 Find_WeaklyIncreasing:
66 \forall value_type *a, v, integer m, n;
67 m <= n ==> Find(a, m, n, v) <= Find(a, m, n+1, v);
71 \forall value_type *a, v, integer k, m, n;
73 Find(a, m, k, v) <= Find(a, m, n, v);
77 \forall value_type *a, v, integer k, m, n;
80 Find(a, m, k, v) == k-m ==>
81 Find(a, m, n, v) == k-m;
85 \forall value_type *a, v, integer k, m, n;
88 Find(a, m, n, v) <= k-m;
92 \forall value_type *a, v, integer m, n;
94 NoneEqual(a, m, n, v) ==>
95 Find(a, m, n, v) == n-m;
99 \forall value_type *a, v, integer k, m, n;
102 NoneEqual(a, m, k, v) ==>
103 Find(a, m, n, v) == k-m;
106 Find_ResultNoneEqual:
107 \forall value_type *a, v, integer m, n;
108 m <= n ==> NoneEqual(a, m, m + Find(a, m, n, v), v);
112 \forall value_type *a, v, integer m, n;
113 0 <= Find(a, m, n, v) < n-m ==>
114 a[m + Find(a, m, n, v)] == v;
119 requires valid: \valid_read(a + (0..n-1));
121 ensures result: 0 <= \result <= n;
122 ensures result: \result == Find(a, n, v);
125 find3(const value_type* a, size_type n, value_type v);