Skip to content

Commit 3d76c4a

Browse files
Fixed proof in LoopInvariance/BinarySearch.tla (#159)
Signed-off-by: Stephan Merz <[email protected]>
1 parent e75b5b6 commit 3d76c4a

File tree

1 file changed

+27
-28
lines changed

1 file changed

+27
-28
lines changed

specifications/LoopInvariance/BinarySearch.tla

+27-28
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,14 @@ ASSUME ValAssump == Values \subseteq Int
2626
SortedSeqs == {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

Comments
 (0)