@@ -26,6 +26,14 @@ ASSUME ValAssump == Values \subseteq Int
26
26
SortedSeqs == { ss \in Seq ( Values ) :
27
27
\A i , j \in 1 .. Len ( ss ) : ( i < j ) => ( ss [ i ] =< ss [ j ] ) }
28
28
29
+ LEMMA SortedLess ==
30
+ ASSUME NEW s \in SortedSeqs , NEW i \in 1 .. Len ( s ) , NEW j \in 1 .. Len ( s ) ,
31
+ s [ i ] < s [ j ]
32
+ PROVE i < j
33
+ < 1 > . SUFFICES ASSUME j <= i PROVE FALSE
34
+ OBVIOUS
35
+ < 1 > . QED BY ValAssump DEF SortedSeqs
36
+
29
37
(* **************************************************************************
30
38
--fair algorithm BinarySearch {
31
39
variables seq \in SortedSeqs , val \in Values ,
@@ -135,7 +143,7 @@ THEOREM Spec => []resultCorrect
135
143
< 4 > DEFINE mid == ( low + high ) \div 2
136
144
mval == seq [ mid ]
137
145
< 4 > ( low =< mid ) /\ ( mid =< high ) /\ ( mid \in 1 .. Len ( seq ) )
138
- BY < 3 > 1 , Z3 DEF Inv , TypeOK
146
+ BY < 3 > 1 , Z3 DEF Inv , TypeOK , SortedSeqs
139
147
< 4 > 1 . TypeOK '
140
148
< 5 > 1 . seq ' \in SortedSeqs
141
149
BY < 2 > 1 DEF a , Inv , TypeOK
@@ -145,14 +153,14 @@ THEOREM Spec => []resultCorrect
145
153
< 6 > 1 . CASE seq [ mid ] = val
146
154
BY < 6 > 1 , < 2 > 1 , < 3 > 1 , Z3 DEF Inv , TypeOK , a
147
155
< 6 > 2 . CASE seq [ mid ] /= val
148
- BY < 6 > 2 , < 2 > 1 , < 3 > 1 , Z3 DEF Inv , TypeOK , a
156
+ BY < 6 > 2 , < 2 > 1 , < 3 > 1 , Z3 DEF Inv , TypeOK , a , SortedSeqs
149
157
< 6 > 3 . QED
150
158
BY < 6 > 1 , < 6 > 2
151
159
< 5 > 4 . ( high \in 0 .. Len ( seq ) ) '
152
160
< 6 > 1 . CASE seq [ mid ] = val
153
161
BY < 6 > 1 , < 2 > 1 , < 3 > 1 , Z3 DEF Inv , TypeOK , a
154
162
< 6 > 2 . CASE seq [ mid ] /= val
155
- BY < 6 > 2 , < 2 > 1 , < 3 > 1 , Z3 DEF Inv , TypeOK , a
163
+ BY < 6 > 2 , < 2 > 1 , < 3 > 1 , Z3 DEF Inv , TypeOK , a , SortedSeqs
156
164
< 6 > 3 . QED
157
165
BY < 6 > 1 , < 6 > 2
158
166
< 5 > 5 . ( result \in 0 .. Len ( seq ) ) '
@@ -180,56 +188,47 @@ THEOREM Spec => []resultCorrect
180
188
< 5 > 1 . CASE seq [ mid ] = val
181
189
BY < 5 > 1 , < 2 > 1 , < 3 > 1 DEF Inv , TypeOK , a
182
190
< 5 > 2 . CASE seq [ mid ] /= val
183
- < 6 > 1 . /\ ( low =< mid ) /\ ( mid =< high ) /\ ( mid \in 1 .. Len ( seq ) )
184
- /\ Len ( seq ) > 0 /\ Len ( seq ) \in Nat
191
+ < 6 > 1 . /\ Len ( seq ) > 0 \* /\ Len(seq) \in Nat
185
192
/\ low \in 1 .. Len ( seq )
186
193
/\ high \in 1 .. Len ( seq )
187
- BY ValAssump DEF Inv , TypeOK
194
+ BY ValAssump DEF Inv , TypeOK , SortedSeqs
188
195
< 6 > 2 . CASE \E i \in 1 .. Len ( seq ) : seq [ i ] = val
189
196
< 7 > 1 . PICK i \in low .. high : seq [ i ] = val
190
197
BY < 6 > 2 , < 2 > 1 DEF a , Inv
191
- < 7 > 2 . /\ ( low =< mid ) /\ ( mid =< high ) /\ ( mid \in 1 .. Len ( seq ) )
192
- /\ Len ( seq ) > 0 /\ Len ( seq ) \in Nat
198
+ < 7 > 2 . /\ Len ( seq ) > 0 /\ Len ( seq ) \in Nat
193
199
/\ low \in 1 .. Len ( seq )
194
200
/\ high \in 1 .. Len ( seq )
195
201
/\ seq [ i ] = val
196
- BY ValAssump , < 6 > 2 , < 7 > 1 DEF Inv , TypeOK
202
+ BY ValAssump , < 6 > 2 , < 7 > 1 DEF Inv , TypeOK , SortedSeqs
197
203
< 7 > 3 . \A j \in 1 .. Len ( seq ) : seq [ j ] \in Int
198
- < 8 > 1 . seq \in Seq ( Values )
199
- BY DEF Inv , TypeOK , SortedSeqs
200
- < 8 > 2 . seq \in Seq ( Int )
201
- BY < 8 > 1 , ValAssump
202
- < 8 > 3 . QED
203
- BY < 8 > 2 DEF Inv , TypeOK , SortedSeqs
204
- < 7 > 4 . \A j , k \in 1 .. Len ( seq ) : j < k => seq [ j ] =< seq [ k ]
205
- BY DEF Inv , TypeOK , SortedSeqs
206
- < 7 > 5 . CASE val < seq [ mid ]
204
+ BY ValAssump DEF Inv , TypeOK , SortedSeqs
205
+ < 7 > 4 . CASE val < seq [ mid ]
207
206
< 8 > 1 . seq [ i ] < seq [ mid ]
208
- BY < 7 > 2 , < 7 > 5 \*, <8>5
207
+ BY < 7 > 2 , < 7 > 4
209
208
< 8 > 2 . i < mid
210
- BY ValAssump , < 7 > 2 , < 8 > 1 , < 7 > 4 , < 7 > 3 , Z3
209
+ BY < 7 > 2 , < 8 > 1 , SortedLess DEF Inv , TypeOK
211
210
< 8 > 3 . i \in low .. mid - 1
212
211
BY ONLY < 7 > 2 , < 8 > 1 , < 8 > 2 , Z3
213
212
< 8 > 4 . /\ ( pc ' = "a" ) /\ ( low ' = low ) /\ ( high ' = mid - 1 )
214
213
/\ \E j \in 1 .. Len ( seq ) : seq [ j ] = val
215
- BY < 2 > 1 , < 3 > 1 , < 5 > 2 , < 6 > 2 , < 7 > 5 DEF a , mid
216
- < 8 > 5 . QED
217
- BY < 7 > 2 , < 8 > 4 , < 8 > 3 \* , <8>5
218
- < 7 > 6 . CASE ~ ( val < seq [ mid ] )
214
+ BY < 2 > 1 , < 3 > 1 , < 5 > 2 , < 6 > 2 , < 7 > 4 DEF a , mid
215
+ < 8 > . QED
216
+ BY < 7 > 2 , < 8 > 4 , < 8 > 3
217
+ < 7 > 5 . CASE ~ ( val < seq [ mid ] )
219
218
< 8 > HIDE DEF mid
220
219
< 8 > 1 . seq [ mid ] < seq [ i ]
221
- BY ValAssump , < 7 > 2 , < 7 > 6 , < 5 > 2 , < 7 > 3 , Z3
220
+ BY ValAssump , < 7 > 2 , < 7 > 5 , < 5 > 2 , < 7 > 3 , Z3
222
221
< 8 > 2 . mid < i
223
- BY ValAssump , < 7 > 2 , < 8 > 1 , (* <8>a, <9>1, *) < 7 > 3 , < 7 > 4 , Z3
222
+ BY < 7 > 2 , < 8 > 1 , SortedLess DEF Inv , TypeOK
224
223
< 8 > 3 . i \in mid + 1 .. high
225
224
BY < 7 > 2 , < 8 > 1 , < 8 > 2 , Z3
226
225
< 8 > 4 . /\ ( pc ' = "a" ) /\ ( low ' = mid + 1 ) /\ ( high ' = high )
227
226
/\ \E j \in 1 .. Len ( seq ) : seq [ j ] = val
228
- BY < 2 > 1 , < 3 > 1 , < 5 > 2 , < 6 > 2 , < 7 > 6 DEF a , mid
227
+ BY < 2 > 1 , < 3 > 1 , < 5 > 2 , < 6 > 2 , < 7 > 5 DEF a , mid
229
228
< 8 > 5 . QED
230
229
BY < 7 > 2 , < 8 > 4 , < 8 > 3 \* , <8>5
231
230
< 7 > 7 . QED
232
- BY < 7 > 5 , < 7 > 6
231
+ BY < 7 > 4 , < 7 > 5
233
232
< 6 > 3 . CASE ~ \E i \in 1 .. Len ( seq ) : seq [ i ] = val
234
233
BY < 6 > 3 , < 5 > 2 , < 2 > 1 , < 3 > 1 DEF Inv , TypeOK , a
235
234
< 6 > 4 . QED
0 commit comments