62
62
metis_tac[scons_hdtl]
63
63
QED
64
64
65
-
66
- Definition seeds_def:
67
- seeds f sd 0 = sd /\
68
- seeds f sd (SUC n) = SND (f (seeds f sd n))
69
- End
70
-
71
- Definition sunfold_def:
72
- sunfold f sd = λn. FST (f (seeds f sd n))
73
- End
74
-
75
- Theorem seeds_lemma:
76
- ∀n f sd0 a sd.
77
- f sd0 = (a,sd) ⇒
78
- (seeds f sd0 n = case n of 0 => sd0
79
- | SUC m => seeds f sd m)
80
- Proof
81
- Induct >> simp[seeds_def] >> rw[] >> first_x_assum drule >>
82
- Cases_on ‘n’ >> simp[seeds_def]
83
- QED
84
-
85
- Theorem sunfold_thm:
86
- sunfold f sd0 = let (a,sd) = f sd0
87
- in
88
- scons a (sunfold f sd)
89
- Proof
90
- simp[FUN_EQ_THM,sunfold_def,scons_alt] >> pairarg_tac >> simp[] >>
91
- drule_then assume_tac seeds_lemma >> simp[] >> Cases >> simp[]
92
- QED
93
-
94
65
Theorem sbisimulation:
95
66
(s1 = s2) ⇔
96
67
∃R. R s1 s2 ∧
@@ -108,8 +79,48 @@ Proof
108
79
gvs[stl_def, ADD1, FUN_EQ_THM]
109
80
QED
110
81
82
+ Definition siterate_def:
83
+ siterate f x = λn. FUNPOW f n x
84
+ End
85
+
86
+ Theorem shd_siterate[simp]:
87
+ shd (siterate f sd) = sd
88
+ Proof
89
+ simp[siterate_def]
90
+ QED
91
+
92
+ Theorem stl_siterate[simp]:
93
+ stl (siterate f sd) = siterate f (f sd)
94
+ Proof
95
+ simp[stl_def, siterate_def, FUN_EQ_THM, GSYM ADD1, FUNPOW]
96
+ QED
97
+
98
+ Theorem siterate_scons_eqn:
99
+ siterate f sd = scons sd (siterate f (f sd))
100
+ Proof
101
+ simp[Once sbisimulation] >>
102
+ qexists
103
+ ‘λs1 s2. ∃sd. s1 = siterate f sd ∧ s2 = scons sd (siterate f (f sd))’ >>
104
+ rw[]>> simp[]
105
+ QED
106
+
107
+ Definition sunfold_def:
108
+ sunfold hd tl sd = λn. hd (siterate tl sd n)
109
+ End
110
+
111
+ Theorem sunfold_thm:
112
+ sunfold hd tl sd0 =
113
+ let a = hd sd0;
114
+ sd = tl sd0;
115
+ in
116
+ scons a (sunfold hd tl sd)
117
+ Proof
118
+ simp[FUN_EQ_THM,sunfold_def,scons_alt] >> Cases >> simp[] >>
119
+ simp[siterate_def, FUNPOW]
120
+ QED
121
+
111
122
Definition smap_def:
112
- smap f s = sunfold (\s. (f (shd s), stl s)) s
123
+ smap f s = sunfold (f o shd) stl s
113
124
End
114
125
115
126
Theorem smap_thm[simp]:
@@ -238,7 +249,6 @@ Proof
238
249
LEAST_ELIM_TAC >> conj_tac >- metis_tac[] >> rw[]
239
250
QED
240
251
241
-
242
252
Definition sconst_def:
243
253
sconst x = λi. x
244
254
End
@@ -249,41 +259,97 @@ Proof
249
259
simp[sconst_def, scons_alt, FUN_EQ_THM] >> Cases >> simp[]
250
260
QED
251
261
252
- Definition siterate_def :
253
- siterate f sd = sunfold (λsd0. (sd0, f sd0)) sd
262
+ Definition sdrop_def :
263
+ sdrop n s = FUNPOW stl n s
254
264
End
255
265
256
- Theorem shd_siterate[simp]:
257
- shd (siterate f sd) = sd
266
+ Theorem sdrop_thm[simp]:
267
+ sdrop 0 s = s ∧
268
+ sdrop (SUC n) s = stl (sdrop n s) ∧
269
+ sdrop (NUMERAL (BIT2 n)) s = stl (sdrop (NUMERAL (BIT1 n)) s) ∧
270
+ sdrop (NUMERAL (BIT1 n)) s = stl (sdrop (NUMERAL (BIT1 n) - 1 ) s)
258
271
Proof
259
- simp[siterate_def, Once sunfold_thm]
272
+ simp[sdrop_def, numeralTheory.numeral_funpow, PRE_SUB1] >>
273
+ simp[GSYM FUNPOW_SUC] >> simp[FUNPOW]
260
274
QED
261
275
262
- Theorem stl_siterate[simp] :
263
- stl (siterate f sd) = siterate f (f sd)
276
+ Theorem sdrop_eq_mono :
277
+ ∀m n s t. sdrop m s = sdrop m t ∧ m ≤ n ⇒ sdrop n s = sdrop n t
264
278
Proof
265
- simp[stl_def, siterate_def ] >>
266
- simp[Once sunfold_thm, SimpLHS, scons_alt, GSYM ADD1, FUN_EQ_THM ]
279
+ simp[sdrop_def, LESS_EQ_EXISTS, PULL_EXISTS] >> ONCE_REWRITE_TAC[ADD_COMM ] >>
280
+ simp[FUNPOW_ADD ]
267
281
QED
268
282
269
- Theorem siterate_scons_eqn :
270
- siterate f sd = scons sd (siterate f (f sd) )
283
+ Theorem stl_sdrop :
284
+ stl (sdrop i s) = sdrop i (stl s )
271
285
Proof
272
- simp[Once sbisimulation] >>
273
- qexists
274
- ‘λs1 s2. ∃sd. s1 = siterate f sd ∧ s2 = scons sd (siterate f (f sd))’ >>
275
- rw[]>> simp[]
286
+ simp[sdrop_def, GSYM FUNPOW_SUC, FUNPOW]
276
287
QED
277
288
278
- Theorem siterate_FUNPOW:
279
- siterate f sd = λi. FUNPOW f i sd
289
+ Definition sexists_def:
290
+ sexists P s = ∃i. P (s i)
291
+ End
292
+
293
+ Theorem sexists_thm[simp]:
294
+ sexists P (scons h t) ⇔ P h ∨ sexists P t
280
295
Proof
281
- simp[Once sbisimulation] >>
282
- qexists‘λs1 s2. ∃sd. s1 = siterate f sd ∧ s2 = λi. FUNPOW f i sd’ >>
283
- rw[]
284
- >- (rpt $ irule_at Any EQ_REFL)
285
- >- simp[Once sunfold_thm, siterate_def] >>
286
- disj1_tac >> qexists ‘f sd’ >> simp[SimpLHS, stl_def, FUNPOW_ADD] >>
287
- simp[siterate_def, Once sunfold_thm, SimpLHS, scons_alt, GSYM ADD1] >>
288
- simp[GSYM siterate_def, FUN_EQ_THM]
296
+ simp[sexists_def, scons_alt] >>
297
+ simp[SimpLHS, Once EXISTS_NUM]
298
+ QED
299
+
300
+ Theorem sexists_ind:
301
+ ∀P.
302
+ (∀h t. P h ⇒ Q (scons h t)) ∧
303
+ (∀h t. Q t ∧ sexists P t ⇒ Q (scons h t)) ⇒
304
+ ∀s. sexists P s ⇒ Q s
305
+ Proof
306
+ simp[sexists_def, PULL_EXISTS] >> gen_tac >> strip_tac >>
307
+ Induct_on ‘i’
308
+ >- (rpt strip_tac >> first_x_assum drule >>
309
+ disch_then $ qspec_then ‘stl s’ mp_tac >> simp[]) >>
310
+ rw[] >>
311
+ first_x_assum $ qspec_then ‘stl s’ mp_tac >>
312
+ ‘P (stl s i)’ by simp[stl_def, GSYM ADD1] >>
313
+ simp[] >> strip_tac >> first_x_assum drule_all >>
314
+ disch_then $ qspec_then ‘shd s’ mp_tac >> simp[]
315
+ QED
316
+
317
+ (* eventually two sequences exactly coincide *)
318
+ Definition seventuallyeq_def:
319
+ seventuallyeq s t ⇔ ∃i. sdrop i s = sdrop i t
320
+ End
321
+
322
+ Theorem seventuallyeq_REFL:
323
+ seventuallyeq s s
324
+ Proof
325
+ simp[seventuallyeq_def]
326
+ QED
327
+
328
+ Theorem seventuallyeq_SYM:
329
+ seventuallyeq s t ⇔ seventuallyeq t s
330
+ Proof
331
+ metis_tac[seventuallyeq_def]
332
+ QED
333
+
334
+ Theorem seventuallyeq_TRANS:
335
+ seventuallyeq s t ∧ seventuallyeq t u ⇒ seventuallyeq s u
336
+ Proof
337
+ simp[seventuallyeq_def, PULL_EXISTS] >> qx_genl_tac [‘i’, ‘j’] >>
338
+ strip_tac >> qexists ‘MAX i j’ >>
339
+ rpt (dxrule_then assume_tac sdrop_eq_mono) >>
340
+ rpt (first_x_assum (resolve_then Any assume_tac (iffRL $ cj 1 MAX_LE))) >>
341
+ metis_tac[LESS_EQ_REFL]
342
+ QED
343
+
344
+ Theorem seventuallyeq_ind:
345
+ ∀P.
346
+ (∀s. P s s) ∧
347
+ (∀h1 h2 s t. P s t ∧ seventuallyeq s t ⇒ P (scons h1 s) (scons h2 t)) ⇒
348
+ ∀s t. seventuallyeq s t ⇒ P s t
349
+ Proof
350
+ simp[seventuallyeq_def, PULL_EXISTS] >> gen_tac >> strip_tac >>
351
+ Induct_on ‘i’ >> simp[] >> rw[] >>
352
+ Cases_on ‘s’ using stream_cases >>
353
+ Cases_on ‘t’ using stream_cases >>
354
+ last_x_assum irule >> gvs[stl_sdrop] >> metis_tac[]
289
355
QED
0 commit comments