1 typedef int value_type;
2 typedef unsigned int size_type;
6 predicate SomeEqual{A}(value_type* a, integer m, integer n, value_type v) =
7 \exists integer i; m <= i < n && a[i] == v;
9 predicate SomeEqual{A}(value_type* a, integer n, value_type v) =
10 SomeEqual(a, 0, n, v);
12 predicate NoneEqual(value_type* a, integer m, integer n, value_type v) =
13 \forall integer i; m <= i < n ==> a[i] != v;
15 predicate NoneEqual(value_type* a, integer n, value_type v) =
16 NoneEqual(a, 0, n, v);
18 lemma NotSomeEqual_NoneEqual:
19 \forall value_type *a, v, integer m, n;
20 !SomeEqual(a, m, n, v) ==> NoneEqual(a, m, n, v);
22 lemma NoneEqual_NotSomeEqual:
23 \forall value_type *a, v, integer m, n;
24 NoneEqual(a, m, n, v) ==> !SomeEqual(a, m, n, v);
31 Find(value_type* a, integer m, integer n, value_type v) =
33 0 : ((0 <= Find(a, m, n-1, v) < n-m-1) ?
34 Find(a, m, n-1, v) : ((a[n-1] == v) ? n-m-1 : n-m));
37 Find(value_type* a, integer n, value_type v) = Find(a, 0, n, v);
40 \forall value_type *a, v, integer m, n;
41 n <= m ==> Find(a, m, n, v) == 0;
44 \forall value_type *a, v, integer m, n;
46 Find(a, m, n, v) < n-m ==>
47 Find(a, m, n+1, v) == Find(a, m, n, v);
50 \forall value_type *a, v, integer m, n;
53 Find(a, m, n, v) == n-m ==>
54 Find(a, m, n+1, v) == n-m;
57 \forall value_type *a, v, integer m, n;
60 Find(a, m, n, v) == n-m ==>
61 Find(a, m, n+1, v) == (n+1)-m;
64 \forall value_type *a, v, integer m, n;
65 0 <= Find(a, m, n, v);
68 \forall value_type *a, v, integer m, n;
69 m <= n ==> Find(a, m, n, v) <= n-m;
71 lemma Find_WeaklyIncreasing:
72 \forall value_type *a, v, integer m, n;
73 m <= n ==> Find(a, m, n, v) <= Find(a, m, n+1, v);
75 lemma Find_Increasing:
76 \forall value_type *a, v, integer k, m, n;
78 Find(a, m, k, v) <= Find(a, m, n, v);
81 \forall value_type *a, v, integer k, m, n;
84 Find(a, m, k, v) == k-m ==>
85 Find(a, m, n, v) == k-m;
88 \forall value_type *a, v, integer k, m, n;
91 Find(a, m, n, v) <= k-m;
94 \forall value_type *a, v, integer m, n;
96 NoneEqual(a, m, n, v) ==>
97 Find(a, m, n, v) == n-m;
100 \forall value_type *a, v, integer k, m, n;
103 NoneEqual(a, m, k, v) ==>
104 Find(a, m, n, v) == k-m;
106 lemma Find_ResultNoneEqual:
107 \forall value_type *a, v, integer m, n;
108 m <= n ==> NoneEqual(a, m, m + Find(a, m, n, v), v);
110 lemma Find_ResultEqual:
111 \forall value_type *a, v, integer m, n;
112 0 <= Find(a, m, n, v) < n-m ==>
113 a[m + Find(a, m, n, v)] == v;
118 requires \valid_read(a + (0..n-1));
120 ensures 0 <= \result <= n;
123 assumes \exists integer i; 0 <= i < n && a[i] == v;
125 ensures 0 <= \result < n;
126 ensures a[\result] == v;
127 ensures \forall integer i; 0 <= i < \result ==> a[i] != v;
130 assumes \forall integer i; 0 <= i < n ==> a[i] != v;
132 ensures \result == n;
138 find(const value_type* a, size_type n, value_type v);
141 requires valid: \valid_read(a + (0..n-1));
143 ensures result: 0 <= \result <= n;
146 assumes SomeEqual(a, n, v);
148 ensures bound: 0 <= \result < n;
149 ensures result: a[\result] == v;
150 ensures first: NoneEqual(a, \result, v);
153 assumes NoneEqual(a, n, v);
155 ensures result: \result == n;
161 find2(const value_type* a, size_type n, value_type v);
164 requires valid: \valid_read(a + (0..n-1));
166 ensures result: 0 <= \result <= n;
167 ensures result: \result == Find(a, n, v);
170 find3(const value_type* a, size_type n, value_type v);