Skip to content

Commit 89f7cac

Browse files
committed
Tweak streamScript.sml, pulling in ideas from miller/../sequence
Make the unfold function take two functions (β → α) and (β → β) rather than one (β → α × β); define the "eventually equal" relation; and define the drop function.
1 parent 961048d commit 89f7cac

File tree

1 file changed

+122
-56
lines changed

1 file changed

+122
-56
lines changed

src/coalgebras/streamScript.sml

Lines changed: 122 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -62,35 +62,6 @@ Proof
6262
metis_tac[scons_hdtl]
6363
QED
6464

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-
9465
Theorem sbisimulation:
9566
(s1 = s2) ⇔
9667
∃R. R s1 s2 ∧
@@ -108,8 +79,48 @@ Proof
10879
gvs[stl_def, ADD1, FUN_EQ_THM]
10980
QED
11081

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+
111122
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
113124
End
114125

115126
Theorem smap_thm[simp]:
@@ -238,7 +249,6 @@ Proof
238249
LEAST_ELIM_TAC >> conj_tac >- metis_tac[] >> rw[]
239250
QED
240251

241-
242252
Definition sconst_def:
243253
sconst x = λi. x
244254
End
@@ -249,41 +259,97 @@ Proof
249259
simp[sconst_def, scons_alt, FUN_EQ_THM] >> Cases >> simp[]
250260
QED
251261

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
254264
End
255265

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)
258271
Proof
259-
simp[siterate_def, Once sunfold_thm]
272+
simp[sdrop_def, numeralTheory.numeral_funpow, PRE_SUB1] >>
273+
simp[GSYM FUNPOW_SUC] >> simp[FUNPOW]
260274
QED
261275

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
264278
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]
267281
QED
268282

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)
271285
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]
276287
QED
277288

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
280295
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[]
289355
QED

0 commit comments

Comments
 (0)