File: find_proofs.v

package info (click to toggle)
why 2.30%2Bdfsg-5
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 26,916 kB
  • sloc: ml: 116,979; java: 9,376; ansic: 5,175; makefile: 1,335; sh: 531; lisp: 127
file content (434 lines) | stat: -rw-r--r-- 11,695 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
(* Load Programs. *)(**********************************************************************)
(*                                                                    *)
(* FIND, an historical example.                                       *)
(*                                                                    *)
(* The proof of this program was originally done by C. A. R. Hoare    *)
(* and fully detailed in the following paper:                         *)
(*                                                                    *)
(* C. A. R. Hoare, , Communications of the  *)
(* ACM, 14(1), 39--45, January 1971.                                  *)
(*                                                                    *)
(**********************************************************************)
(* Jean-Christophe FILLIATRE, February 98                             *)
(**********************************************************************)
(* find_proofs.v                                                      *)
(**********************************************************************)

Require Import find_spec.
Require Import find_lemmas.
Require Import Why.
Require Import Omega.

Lemma zero_f_SN : (0 <= f < Zsucc N)%Z.
Proof.
generalize le_1_f; generalize le_f_N; intros; omega.
Qed.

(* Lemmas to prove arrays bounds obligations. *)

Lemma bound_3 :
 forall (m n i r:Z) (A:array Z),
   i_invariant m n i r A ->
   (i <= n)%Z -> (access A i < r)%Z -> (Zsucc i <= n)%Z.
Proof.
unfold i_invariant.
intros m n i r A Hi le_i_n lt_Ai_r.
decompose [and] Hi.
case (Z_le_lt_eq_dec i n le_i_n).
intro.
 abstract omega.
intro eq_i_n.
 elim (H2 le_i_n).
 intros.
absurd (access A i < r)%Z.
cut (x = i).
 intro eq_x_i.
 rewrite eq_x_i in H0.
 abstract omega.
abstract omega.
assumption.
Qed.


Lemma bound_4 :
 forall (m n j r:Z) (A:array Z),
   j_invariant m n j r A ->
   (m <= j)%Z -> (r < access A j)%Z -> (m <= Zpred j)%Z.
Proof.
unfold j_invariant.
intros m n j r A Hj le_m_j lt_r_Aj.
decompose [and] Hj.
case (Z_le_lt_eq_dec m j le_m_j).
intro.
 unfold Zpred.
 abstract omega.
intro eq_m_j.
 elim (H2 le_m_j).
 intros.
absurd (r < access A j)%Z.
cut (x = j).
 intro eq_x_j.
 rewrite eq_x_j in H0.
 abstract omega.
abstract omega.
assumption.
Qed.


(* Some subgoals of the main proof *)

Lemma subgoal_1 :
 forall (m1 n1 i2 j2 i3:Z) (A A0 A1:array Z),
   m_invariant m1 A0 /\
   n_invariant n1 A0 /\ permut A0 A /\ (1 <= m1)%Z /\ (n1 <= N)%Z ->
   (m1 < n1)%Z ->
   (0 <= f < Zsucc N)%Z ->
   i_invariant m1 n1 i2 (access A0 f) A1 /\
   j_invariant m1 n1 j2 (access A0 f) A1 /\
   m_invariant m1 A1 /\
   n_invariant n1 A1 /\
   (0 <= j2)%Z /\
   (i2 <= N + 1)%Z /\
   termination i2 j2 m1 n1 (access A0 f) A1 /\ permut A1 A ->
   (i2 <= j2)%Z ->
   i_invariant m1 n1 i3 (access A0 f) A1 /\
   (i2 <= i3)%Z /\
   (i3 <= n1)%Z /\ termination i3 j2 m1 n1 (access A0 f) A1 ->
   (access A1 i3 < access A0 f)%Z ->
   i_invariant m1 n1 (Zsucc i3) (access A0 f) A1 /\
   (i2 <= Zsucc i3)%Z /\
   (Zsucc i3 <= n1)%Z /\ termination (Zsucc i3) j2 m1 n1 (access A0 f) A1.

Proof.
intros m1 n1 i2 j2 i3 A A0 A1 HH_43 HH_42 HH_40 HH_28 HH_27 HH_4 HH_2.
split.
apply Lemma_8_15.
 elim HH_4; auto.
decompose [and] HH_4.
 elim H.
 intros.
 abstract omega.
split; [ abstract omega | split ].
cut (Zsucc i3 <= n1)%Z.
 abstract omega.
apply bound_3 with (m := m1) (r := access A0 f) (A := A1); auto.
elim HH_4; auto.
 abstract omega.
(* term. *)
unfold termination.
 decompose [and] HH_4.
 elim H3.
intro.
 left.
 abstract omega.
intro.
 right.
 decompose [and] H2.
case (Z_le_lt_eq_dec i3 f H6).
  intro.
 abstract omega.
  intro eq_i3_f.
 absurd (access A1 i3 < access A0 f)%Z; auto.
  rewrite eq_i3_f.
 abstract omega.
Qed.


Lemma subgoal_2 :
 forall (m1 n1 i2 j2 i3 j3:Z) (A A0 A1:array Z),
   m_invariant m1 A0 /\
   n_invariant n1 A0 /\ permut A0 A /\ (1 <= m1)%Z /\ (n1 <= N)%Z ->
   (m1 < n1)%Z ->
   (0 <= f < Zsucc N)%Z ->
   i_invariant m1 n1 i2 (access A0 f) A1 /\
   j_invariant m1 n1 j2 (access A0 f) A1 /\
   m_invariant m1 A1 /\
   n_invariant n1 A1 /\
   (0 <= j2)%Z /\
   (i2 <= N + 1)%Z /\
   termination i2 j2 m1 n1 (access A0 f) A1 /\ permut A1 A ->
   (i2 <= j2)%Z ->
   (i_invariant m1 n1 i3 (access A0 f) A1 /\
    (i2 <= i3)%Z /\
    (i3 <= n1)%Z /\ termination i3 j2 m1 n1 (access A0 f) A1) /\
   (access A1 i3 >= access A0 f)%Z ->
   j_invariant m1 n1 j3 (access A0 f) A1 /\
   (j3 <= j2)%Z /\
   (m1 <= j3)%Z /\ termination i3 j3 m1 n1 (access A0 f) A1 ->
   (access A0 f < access A1 j3)%Z ->
   j_invariant m1 n1 (Zpred j3) (access A0 f) A1 /\
   (Zpred j3 <= j2)%Z /\
   (m1 <= Zpred j3)%Z /\
   termination i3 (Zpred j3) m1 n1 (access A0 f) A1.

Proof.
intros m1 n1 i2 j2 i3 j3 A A0 A1 HH_43 HH_42 HH_40 HH_28 HH_27 HH_25
 HH_9 HH_7.
split.
apply Lemma_9_17.
 elim HH_9; auto.
unfold j_invariant in HH_9.
 decompose [and] HH_9.
 elim H3.
 intros.
 abstract omega.
assumption.
cut (m1 <= Zpred j3)%Z.
 unfold Zpred.
  split; [ abstract omega | split; [ abstract omega | idtac ] ].
(* term. *)
unfold termination.
decompose [and] HH_9.
 elim H4.
intro.
 left.
 abstract omega.
intro.
 right.
 decompose [and] H3.
case (Z_le_lt_eq_dec f j3 H8).
  intro.
 abstract omega.
  intro eq_f_j3.
 absurd (access A0 f < access A1 j3)%Z; auto.
  rewrite <- eq_f_j3.
 abstract omega.
(* *)
apply bound_4 with (n := n1) (r := access A0 f) (A := A1); auto.
elim HH_9; auto.
 abstract omega.
Qed.


Lemma subgoal_3 :
 forall (m0 n0 i0 j0 i1 j1:Z) (A A0 A1 A2:array Z),
   array_length A = (N + 1)%Z ->
   m_invariant m0 A0 /\
   n_invariant n0 A0 /\ permut A0 A /\ (1 <= m0)%Z /\ (n0 <= N)%Z ->
   (m0 < n0)%Z ->
   (0 <= f < Zsucc N)%Z ->
   i_invariant m0 n0 i0 (access A0 f) A1 /\
   j_invariant m0 n0 j0 (access A0 f) A1 /\
   m_invariant m0 A1 /\
   n_invariant n0 A1 /\
   (0 <= j0)%Z /\
   (i0 <= N + 1)%Z /\
   termination i0 j0 m0 n0 (access A0 f) A1 /\ permut A1 A ->
   (i0 <= j0)%Z ->
   (i_invariant m0 n0 i1 (access A0 f) A1 /\
    (i0 <= i1)%Z /\
    (i1 <= n0)%Z /\ termination i1 j0 m0 n0 (access A0 f) A1) /\
   (access A1 i1 >= access A0 f)%Z ->
   (j_invariant m0 n0 j1 (access A0 f) A1 /\
    (j1 <= j0)%Z /\
    (m0 <= j1)%Z /\ termination i1 j1 m0 n0 (access A0 f) A1) /\
   (access A0 f >= access A1 j1)%Z ->
   (access A1 j1 <= access A0 f <= access A1 i1)%Z ->
   (i1 <= j1)%Z ->
   exchange A2 A1 i1 j1 ->
   (access A2 i1 <= access A0 f)%Z ->
   (access A0 f <= access A2 j1)%Z ->
   Zwf 0 (N + 2 + Zpred j1 - Zsucc i1) (N + 2 + j0 - i0) /\
   i_invariant m0 n0 (Zsucc i1) (access A0 f) A2 /\
   j_invariant m0 n0 (Zpred j1) (access A0 f) A2 /\
   m_invariant m0 A2 /\
   n_invariant n0 A2 /\
   (0 <= Zpred j1)%Z /\
   (Zsucc i1 <= N + 1)%Z /\
   termination (Zsucc i1) (Zpred j1) m0 n0 (access A0 f) A2 /\ permut A2 A.
Proof.
intros m0 n0 i0 j0 i1 j1 A A0 A1 A2 HN Inv_mn Test7 Pre12 Inv_ij Test4
 Inv_i Inv_j Pre10 Test3 Post7 Pre8 Pre7.
split.
(* [Zwf] *)
  unfold Zwf.
  decompose [and] Inv_i.
 decompose [and] Inv_j.
 unfold Zpred.
   abstract omega.
split.
(* [i_invariant] *)
  apply Lemma_8_10 with (j := j1) (A' := A1); try assumption.
  SameLength A2 A1.
 intuition; SameLength A1 A.
 omega.
  decompose [and] Inv_i.
 elim H1.
 abstract omega.
  abstract omega.
 abstract omega.
    decompose [and] Inv_i.
 assumption.
  decompose [and] Inv_j.
 assumption.
split.
(* [j_invariant] *)
  apply Lemma_9_11 with (i := i1) (A' := A1); try assumption.
  SameLength A2 A1.
 intuition; SameLength A1 A.
 omega.
  decompose [and] Inv_j.
 elim H1.
 abstract omega.
   decompose [and] Inv_i.
 elim H1.
 abstract omega.
   decompose [and] Inv_mn.
 assumption.
  decompose [and] Inv_j.
 assumption.
  decompose [and] Inv_i.
 assumption.
split.
(* [m_invariant] *)
  apply Lemma_12' with (i := i1) (j := j1) (A := A1).
  intuition; SameLength A1 A; omega.
  decompose [and] Inv_i.
 elim H1.
 abstract omega.
  auto with datatypes.
  decompose [and] Inv_ij.
 assumption.
split.
(* [n_invariant] *)
  apply Lemma_13' with (i := i1) (j := j1) (A := A1).
  intuition; SameLength A1 A.
 omega.
  decompose [and] Inv_i.
 elim H1.
 abstract omega.
  decompose [and] Inv_j.
 elim H1.
 abstract omega.
  auto with datatypes.
  decompose [and] Inv_ij.
 assumption.
split.
(* [0<=j-1] *)
  unfold Zpred.
 abstract omega.
split.
(* [i+1<=N+1] *)
  abstract omega.
split.
(* [termination] *)
  unfold termination.
   left.
 unfold Zpred.
   decompose [and] Inv_i.
 elim H1.
 intros.
   decompose [and] Inv_j.
 elim H8.
 intros.
   abstract omega.
(* [permut] *)
  decompose [and] Inv_ij.
 eauto with datatypes.
Qed.


Lemma subgoal_5 :
 forall (m1 n1 i2 j2:Z) (A A0 A1:array Z),
   m_invariant m1 A0 /\
   n_invariant n1 A0 /\ permut A0 A /\ (1 <= m1)%Z /\ (n1 <= N)%Z ->
   (m1 < n1)%Z ->
   (0 <= f < Zsucc N)%Z ->
   (i_invariant m1 n1 i2 (access A0 f) A1 /\
    j_invariant m1 n1 j2 (access A0 f) A1 /\
    m_invariant m1 A1 /\
    n_invariant n1 A1 /\
    (0 <= j2)%Z /\
    (i2 <= N + 1)%Z /\
    termination i2 j2 m1 n1 (access A0 f) A1 /\ permut A1 A) /\
   (i2 > j2)%Z ->
   (m1 < i2)%Z /\ (j2 < n1)%Z ->
   (f <= j2)%Z ->
   Zwf 0 (j2 - m1) (n1 - m1) /\
   m_invariant m1 A1 /\
   n_invariant j2 A1 /\ permut A1 A /\ (1 <= m1)%Z /\ (j2 <= N)%Z.

Proof.
intros m1 n1 i2 j2 A A0 A1 HH_44 HH_43 HH_41 HH_40 HH_39 HH_37.
decompose [and] HH_40.
split;
 [ idtac
 | split;
    [ assumption | split; [ idtac | split; [ assumption | idtac ] ] ] ].
abstract (unfold Zwf; elim H; elim H0; elim H1; elim H2; intros; omega).
apply Lemma_6_a with (m := m1) (n := n1) (i := i2) (r := access A0 f);
 auto.
abstract omega.
Qed.


Lemma subgoal_6 :
 forall (m1 n1 i2 j2:Z) (A A0 A1:array Z),
   m_invariant m1 A0 /\
   n_invariant n1 A0 /\ permut A0 A /\ (1 <= m1)%Z /\ (n1 <= N)%Z ->
   (m1 < n1)%Z ->
   (0 <= f < Zsucc N)%Z ->
   (i_invariant m1 n1 i2 (access A0 f) A1 /\
    j_invariant m1 n1 j2 (access A0 f) A1 /\
    m_invariant m1 A1 /\
    n_invariant n1 A1 /\
    (0 <= j2)%Z /\
    (i2 <= N + 1)%Z /\
    termination i2 j2 m1 n1 (access A0 f) A1 /\ permut A1 A) /\
   (i2 > j2)%Z ->
   (m1 < i2)%Z /\ (j2 < n1)%Z ->
   (f > j2)%Z ->
   (i2 <= f)%Z ->
   Zwf 0 (n1 - i2) (n1 - m1) /\
   m_invariant i2 A1 /\
   n_invariant n1 A1 /\ permut A1 A /\ (1 <= i2)%Z /\ (n1 <= N)%Z.
Proof.
intros m1 n1 i2 j2 A A0 A1 HH_44 HH_43 HH_41 HH_40 HH_39 HH_36 HH_33.
decompose [and] HH_40.
split;
 [ idtac
 | split;
    [ idtac | split; [ assumption | split; [ assumption | idtac ] ] ] ].
abstract (unfold Zwf; elim H; elim H1; elim H2; elim H3; intros; omega).
apply Lemma_6_b with (m := m1) (n := n1) (j := j2) (r := access A0 f);
 auto.
abstract omega.
Qed.


Lemma subgoal_7 :
 forall (m1 n1 i2 j2:Z) (A A0 A1:array Z),
   m_invariant m1 A0 /\
   n_invariant n1 A0 /\ permut A0 A /\ (1 <= m1)%Z /\ (n1 <= N)%Z ->
   (m1 < n1)%Z ->
   (0 <= f < Zsucc N)%Z ->
   (i_invariant m1 n1 i2 (access A0 f) A1 /\
    j_invariant m1 n1 j2 (access A0 f) A1 /\
    m_invariant m1 A1 /\
    n_invariant n1 A1 /\
    (0 <= j2)%Z /\
    (i2 <= N + 1)%Z /\
    termination i2 j2 m1 n1 (access A0 f) A1 /\ permut A1 A) /\
   (i2 > j2)%Z ->
   (m1 < i2)%Z /\ (j2 < n1)%Z ->
   (f > j2)%Z ->
   (i2 > f)%Z ->
   Zwf 0 (f - f) (n1 - m1) /\
   m_invariant f A1 /\
   n_invariant f A1 /\ permut A1 A /\ (1 <= f <= N)%Z.

Proof.
intros m1 n1 i2 j2 A A0 A1 HH_44 HH_43 HH_41 HH_40 HH_39 HH_36 HH_32.
decompose [and] HH_40.
split;
 [ idtac
 | split; [ idtac | split; [ idtac | split; [ assumption | idtac ] ] ] ].
abstract (unfold Zwf; elim H; elim H0; elim H1; elim H2; intros; omega).
apply Lemma_6_c1 with
 (m := m1) (n := n1) (i := i2) (j := j2) (r := access A0 f); auto.
abstract omega.
apply Lemma_6_c2 with
 (m := m1) (n := n1) (i := i2) (j := j2) (r := access A0 f); auto.
abstract omega.
abstract omega.
Qed.