@@ -26,6 +26,14 @@ ASSUME ValAssump == Values \subseteq Int
2626SortedSeqs == { ss \in Seq ( Values ) :
2727 \A i , j \in 1 .. Len ( ss ) : ( i < j ) => ( ss [ i ] =< ss [ j ] ) }
2828
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+
2937(* **************************************************************************
3038--fair algorithm BinarySearch {
3139 variables seq \in SortedSeqs , val \in Values ,
@@ -135,7 +143,7 @@ THEOREM Spec => []resultCorrect
135143 < 4 > DEFINE mid == ( low + high ) \div 2
136144 mval == seq [ mid ]
137145 < 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
139147 < 4 > 1 . TypeOK '
140148 < 5 > 1 . seq ' \in SortedSeqs
141149 BY < 2 > 1 DEF a , Inv , TypeOK
@@ -145,14 +153,14 @@ THEOREM Spec => []resultCorrect
145153 < 6 > 1 . CASE seq [ mid ] = val
146154 BY < 6 > 1 , < 2 > 1 , < 3 > 1 , Z3 DEF Inv , TypeOK , a
147155 < 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
149157 < 6 > 3 . QED
150158 BY < 6 > 1 , < 6 > 2
151159 < 5 > 4 . ( high \in 0 .. Len ( seq ) ) '
152160 < 6 > 1 . CASE seq [ mid ] = val
153161 BY < 6 > 1 , < 2 > 1 , < 3 > 1 , Z3 DEF Inv , TypeOK , a
154162 < 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
156164 < 6 > 3 . QED
157165 BY < 6 > 1 , < 6 > 2
158166 < 5 > 5 . ( result \in 0 .. Len ( seq ) ) '
@@ -180,56 +188,47 @@ THEOREM Spec => []resultCorrect
180188 < 5 > 1 . CASE seq [ mid ] = val
181189 BY < 5 > 1 , < 2 > 1 , < 3 > 1 DEF Inv , TypeOK , a
182190 < 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
185192 /\ low \in 1 .. Len ( seq )
186193 /\ high \in 1 .. Len ( seq )
187- BY ValAssump DEF Inv , TypeOK
194+ BY ValAssump DEF Inv , TypeOK , SortedSeqs
188195 < 6 > 2 . CASE \E i \in 1 .. Len ( seq ) : seq [ i ] = val
189196 < 7 > 1 . PICK i \in low .. high : seq [ i ] = val
190197 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
193199 /\ low \in 1 .. Len ( seq )
194200 /\ high \in 1 .. Len ( seq )
195201 /\ seq [ i ] = val
196- BY ValAssump , < 6 > 2 , < 7 > 1 DEF Inv , TypeOK
202+ BY ValAssump , < 6 > 2 , < 7 > 1 DEF Inv , TypeOK , SortedSeqs
197203 < 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 ]
207206 < 8 > 1 . seq [ i ] < seq [ mid ]
208- BY < 7 > 2 , < 7 > 5 \*, <8>5
207+ BY < 7 > 2 , < 7 > 4
209208 < 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
211210 < 8 > 3 . i \in low .. mid - 1
212211 BY ONLY < 7 > 2 , < 8 > 1 , < 8 > 2 , Z3
213212 < 8 > 4 . /\ ( pc ' = "a" ) /\ ( low ' = low ) /\ ( high ' = mid - 1 )
214213 /\ \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 ] )
219218 < 8 > HIDE DEF mid
220219 < 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
222221 < 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
224223 < 8 > 3 . i \in mid + 1 .. high
225224 BY < 7 > 2 , < 8 > 1 , < 8 > 2 , Z3
226225 < 8 > 4 . /\ ( pc ' = "a" ) /\ ( low ' = mid + 1 ) /\ ( high ' = high )
227226 /\ \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
229228 < 8 > 5 . QED
230229 BY < 7 > 2 , < 8 > 4 , < 8 > 3 \* , <8>5
231230 < 7 > 7 . QED
232- BY < 7 > 5 , < 7 > 6
231+ BY < 7 > 4 , < 7 > 5
233232 < 6 > 3 . CASE ~ \E i \in 1 .. Len ( seq ) : seq [ i ] = val
234233 BY < 6 > 3 , < 5 > 2 , < 2 > 1 , < 3 > 1 DEF Inv , TypeOK , a
235234 < 6 > 4 . QED
0 commit comments