@@ -243,23 +243,27 @@ QED
243
243
244
244
245
245
246
- val exists_aux_def = Define`
246
+ Definition exists_aux_def:
247
247
(exists_aux f vec n 0 = F) /\
248
248
(exists_aux f vec n (SUC len) =
249
249
if f (sub vec n)
250
250
then T
251
- else exists_aux f vec (n + 1 ) len)`;
251
+ else exists_aux f vec (n + 1 ) len)
252
+ End
252
253
253
- val exists_def = Define`
254
- exists f vec = exists_aux f vec 0 (length vec)`;
254
+ Definition exists_def:
255
+ exists f vec = exists_aux f vec 0 (length vec)
256
+ End
255
257
256
- val exists_aux_thm = Q.prove(
257
- `!f vec n len. (n + len = length (vec)) ==>
258
- (exists_aux f vec n len = EXISTS f (DROP n (toList vec)))`,
259
- Induct_on `len` \\ Cases_on `vec` \\ rw[toList_thm, length_def, sub_def, exists_aux_def] THEN1
260
- rw [DROP_LENGTH_NIL, EVERY_DEF] \\
258
+ Theorem exists_aux_thm[local ]:
259
+ !f vec n len.
260
+ n + len = length vec ==>
261
+ exists_aux f vec n len = EXISTS f (DROP n (toList vec))
262
+ Proof
263
+ Induct_on `len` \\ Cases_on `vec` \\
264
+ rw[toList_thm, length_def, sub_def, exists_aux_def] \\
261
265
rw [DROP_EL_CONS]
262
- );
266
+ QED
263
267
264
268
Theorem exists_thm:
265
269
!f vec. exists f vec = EXISTS f (toList vec)
@@ -268,79 +272,91 @@ Proof
268
272
rw [exists_def, exists_aux_thm]
269
273
QED
270
274
271
-
272
-
273
- val all_aux_def = Define`
275
+ Definition all_aux_def:
274
276
(all_aux f vec n 0 = T) /\
275
277
(all_aux f vec n (SUC len) =
276
278
if f (sub vec n)
277
279
then all_aux f vec (n + 1 ) len
278
- else F)`;
280
+ else F)
281
+ End
279
282
280
- val all_def = Define`
281
- all f vec = all_aux f vec 0 (length vec)`;
283
+ Definition all_def: all f vec = all_aux f vec 0 (length vec)
284
+ End
282
285
283
- val all_aux_thm = Q.prove (
284
- `!f vec n len. (n + len = length vec) ==> (all_aux f vec n len = EVERY f (DROP n (toList vec)))`,
285
- Induct_on `len` \\ Cases_on `vec` \\ rw[toList_thm, length_def, sub_def, all_aux_def] THEN1
286
- rw [DROP_LENGTH_NIL] \\
286
+ Theorem all_aux_thm[local ]:
287
+ !f vec n len.
288
+ n + len = length vec ==>
289
+ all_aux f vec n len = EVERY f (DROP n (toList vec))
290
+ Proof
291
+ Induct_on `len` \\ Cases_on `vec` \\
292
+ rw[toList_thm, length_def, sub_def, all_aux_def] \\
287
293
rw [DROP_EL_CONS]
288
- );
294
+ QED
289
295
290
296
Theorem all_thm:
291
297
!f vec. all f vec = EVERY f (toList vec)
292
298
Proof
293
299
Cases_on `vec` \\ rw[all_def, all_aux_thm]
294
300
QED
295
301
296
-
297
-
298
- val collate_aux_def = Define`
302
+ Definition collate_aux_def:
299
303
(collate_aux f vec1 vec2 n ord 0 = ord) /\
300
304
(collate_aux f vec1 vec2 n ord (SUC len) =
301
305
if f (sub vec1 n) (sub vec2 n) = EQUAL
302
306
then collate_aux f vec1 vec2 (n + 1 ) ord len
303
- else f (sub vec1 n) (sub vec2 n))`;
307
+ else f (sub vec1 n) (sub vec2 n))
308
+ End
304
309
305
- val collate_def = Define`
310
+ Definition collate_def:
306
311
collate f vec1 vec2 =
307
312
if (length vec1) < (length vec2)
308
313
then collate_aux f vec1 vec2 0 LESS (length vec1)
309
314
else if (length vec2) < (length vec1)
310
315
then collate_aux f vec1 vec2 0 GREATER (length vec2)
311
- else collate_aux f vec1 vec2 0 EQUAL (length vec2)`;
312
-
313
- val collate_aux_less_thm = Q.prove (
314
- `!f vec1 vec2 n len. (n + len = length vec1) /\ (length vec1 < length vec2) ==>
315
- (collate_aux f vec1 vec2 n Less len = mllist$collate f (DROP n (toList vec1)) (DROP n (toList vec2)))`,
316
- Cases_on `vec1` \\ Cases_on `vec2` \\ Induct_on `len` \\
317
- rw [collate_aux_def, mllistTheory.collate_def, length_def, toList_thm, sub_def, DROP_EL_CONS]
318
- >- rw [DROP_LENGTH_TOO_LONG, mllistTheory.collate_def]
319
- );
316
+ else collate_aux f vec1 vec2 0 EQUAL (length vec2)
317
+ End
318
+
319
+ Theorem collate_aux_less_thm[local ]:
320
+ !f vec1 vec2 n len.
321
+ n + len = length vec1 /\ length vec1 < length vec2 ==>
322
+ collate_aux f vec1 vec2 n Less len =
323
+ mllist$collate f (DROP n (toList vec1)) (DROP n (toList vec2))
324
+ Proof
325
+ Cases_on ‘vec1’ \\ Cases_on ‘vec2’ \\ Induct_on ‘len’ \\
326
+ rw [collate_aux_def, mllistTheory.collate_def, length_def, toList_thm,
327
+ sub_def, DROP_EL_CONS]
328
+ QED
320
329
321
- val collate_aux_equal_thm = Q.prove (
322
- `!f vec1 vec2 n len. (n + len = length vec2) /\ (length vec1 = length vec2) ==>
323
- (collate_aux f vec1 vec2 n Equal len =
324
- mllist$collate f (DROP n (toList vec1)) (DROP n (toList vec2)))`,
325
- Cases_on `vec1` \\ Cases_on `vec2` \\ Induct_on `len` \\
326
- rw [collate_aux_def, mllistTheory.collate_def, length_def, toList_thm, sub_def]
330
+ Theorem collate_aux_equal_thm[local ]:
331
+ !f vec1 vec2 n len.
332
+ n + len = length vec2 /\ length vec1 = length vec2 ==>
333
+ collate_aux f vec1 vec2 n Equal len =
334
+ mllist$collate f (DROP n (toList vec1)) (DROP n (toList vec2))
335
+ Proof
336
+ Cases_on ‘vec1’ \\ Cases_on ‘vec2’ \\ Induct_on ‘len’ \\
337
+ rw [collate_aux_def, mllistTheory.collate_def, length_def, toList_thm,
338
+ sub_def]
327
339
>- rw [DROP_LENGTH_TOO_LONG, mllistTheory.collate_def] \\
328
340
fs [DROP_EL_CONS, mllistTheory.collate_def]
329
- );
341
+ QED
330
342
331
- val collate_aux_greater_thm = Q.prove (
332
- `!f vec1 vec2 n len. (n + len = length vec2) /\ (length vec2 < length vec1) ==>
333
- (collate_aux f vec1 vec2 n Greater len =
334
- mllist$collate f (DROP n (toList vec1)) (DROP n (toList vec2)))`,
335
- Cases_on `vec1` \\ Cases_on `vec2` \\ Induct_on `len` \\
336
- rw [collate_aux_def, mllistTheory.collate_def, length_def, toList_thm, sub_def, DROP_EL_CONS]
337
- >- rw [DROP_LENGTH_TOO_LONG, mllistTheory.collate_def]
338
- );
343
+ Theorem collate_aux_greater_thm[local ]:
344
+ !f vec1 vec2 n len.
345
+ n + len = length vec2 /\ length vec2 < length vec1 ==>
346
+ collate_aux f vec1 vec2 n Greater len =
347
+ mllist$collate f (DROP n (toList vec1)) (DROP n (toList vec2))
348
+ Proof
349
+ Cases_on ‘vec1’ \\ Cases_on ‘vec2’ \\ Induct_on ‘len’ \\
350
+ rw [collate_aux_def, mllistTheory.collate_def, length_def, toList_thm,
351
+ sub_def, DROP_EL_CONS]
352
+ QED
339
353
340
354
Theorem collate_thm:
341
- !f vec1 vec2. collate f vec1 vec2 = mllist$collate f (toList vec1) (toList vec2)
355
+ !f vec1 vec2.
356
+ collate f vec1 vec2 = mllist$collate f (toList vec1) (toList vec2)
342
357
Proof
343
- rw [collate_def, collate_aux_greater_thm, collate_aux_equal_thm, collate_aux_less_thm]
358
+ rw [collate_def, collate_aux_greater_thm, collate_aux_equal_thm,
359
+ collate_aux_less_thm]
344
360
QED
345
361
346
362
val _ = export_theory()
0 commit comments