author | wenzelm |
Fri, 06 Oct 2000 17:35:58 +0200 | |
changeset 10168 | 50be659d4222 |
parent 6161 | bc2a76ce1ea3 |
child 10835 | f4745d77e620 |
permissions | -rw-r--r-- |
3071 | 1 |
(* Title: HOLCF/IOA/meta_theory/Seq.ML |
3275 | 2 |
ID: $Id$ |
3071 | 3 |
Author: Olaf M"uller |
4 |
Copyright 1996 TU Muenchen |
|
5 |
||
6 |
*) |
|
7 |
||
8 |
Addsimps (sfinite.intrs @ seq.rews); |
|
9 |
||
10 |
||
11 |
(* Instead of adding UU_neq_nil every equation UU~=x could be changed to x~=UU *) |
|
5068 | 12 |
Goal "UU ~=nil"; |
3071 | 13 |
by (res_inst_tac [("s1","UU"),("t1","nil")] (sym RS rev_contrapos) 1); |
14 |
by (REPEAT (Simp_tac 1)); |
|
15 |
qed"UU_neq_nil"; |
|
16 |
||
17 |
Addsimps [UU_neq_nil]; |
|
18 |
||
3275 | 19 |
|
20 |
||
21 |
||
3071 | 22 |
(* ------------------------------------------------------------------------------------- *) |
23 |
||
24 |
||
25 |
(* ---------------------------------------------------- *) |
|
26 |
section "recursive equations of operators"; |
|
27 |
(* ---------------------------------------------------- *) |
|
28 |
||
29 |
||
30 |
(* ----------------------------------------------------------- *) |
|
31 |
(* smap *) |
|
32 |
(* ----------------------------------------------------------- *) |
|
33 |
||
34 |
bind_thm ("smap_unfold", fix_prover2 thy smap_def |
|
35 |
"smap = (LAM f tr. case tr of \ |
|
3361 | 36 |
\ nil => nil \ |
3071 | 37 |
\ | x##xs => f`x ## smap`f`xs)"); |
38 |
||
5068 | 39 |
Goal "smap`f`nil=nil"; |
3071 | 40 |
by (stac smap_unfold 1); |
41 |
by (Simp_tac 1); |
|
42 |
qed"smap_nil"; |
|
43 |
||
5068 | 44 |
Goal "smap`f`UU=UU"; |
3071 | 45 |
by (stac smap_unfold 1); |
46 |
by (Simp_tac 1); |
|
47 |
qed"smap_UU"; |
|
48 |
||
5068 | 49 |
Goal |
6161 | 50 |
"[|x~=UU|] ==> smap`f`(x##xs)= (f`x)##smap`f`xs"; |
3457 | 51 |
by (rtac trans 1); |
3071 | 52 |
by (stac smap_unfold 1); |
53 |
by (Asm_full_simp_tac 1); |
|
3457 | 54 |
by (rtac refl 1); |
3071 | 55 |
qed"smap_cons"; |
56 |
||
57 |
(* ----------------------------------------------------------- *) |
|
58 |
(* sfilter *) |
|
59 |
(* ----------------------------------------------------------- *) |
|
60 |
||
61 |
bind_thm ("sfilter_unfold", fix_prover2 thy sfilter_def |
|
62 |
"sfilter = (LAM P tr. case tr of \ |
|
63 |
\ nil => nil \ |
|
64 |
\ | x##xs => If P`x then x##(sfilter`P`xs) else sfilter`P`xs fi)"); |
|
65 |
||
5068 | 66 |
Goal "sfilter`P`nil=nil"; |
3071 | 67 |
by (stac sfilter_unfold 1); |
68 |
by (Simp_tac 1); |
|
69 |
qed"sfilter_nil"; |
|
70 |
||
5068 | 71 |
Goal "sfilter`P`UU=UU"; |
3071 | 72 |
by (stac sfilter_unfold 1); |
73 |
by (Simp_tac 1); |
|
74 |
qed"sfilter_UU"; |
|
75 |
||
5068 | 76 |
Goal |
6161 | 77 |
"x~=UU ==> sfilter`P`(x##xs)= \ |
3071 | 78 |
\ (If P`x then x##(sfilter`P`xs) else sfilter`P`xs fi)"; |
3457 | 79 |
by (rtac trans 1); |
3071 | 80 |
by (stac sfilter_unfold 1); |
81 |
by (Asm_full_simp_tac 1); |
|
3457 | 82 |
by (rtac refl 1); |
3071 | 83 |
qed"sfilter_cons"; |
84 |
||
85 |
(* ----------------------------------------------------------- *) |
|
86 |
(* sforall2 *) |
|
87 |
(* ----------------------------------------------------------- *) |
|
88 |
||
89 |
bind_thm ("sforall2_unfold", fix_prover2 thy sforall2_def |
|
90 |
"sforall2 = (LAM P tr. case tr of \ |
|
91 |
\ nil => TT \ |
|
92 |
\ | x##xs => (P`x andalso sforall2`P`xs))"); |
|
93 |
||
5068 | 94 |
Goal "sforall2`P`nil=TT"; |
3071 | 95 |
by (stac sforall2_unfold 1); |
96 |
by (Simp_tac 1); |
|
97 |
qed"sforall2_nil"; |
|
98 |
||
5068 | 99 |
Goal "sforall2`P`UU=UU"; |
3071 | 100 |
by (stac sforall2_unfold 1); |
101 |
by (Simp_tac 1); |
|
102 |
qed"sforall2_UU"; |
|
103 |
||
5068 | 104 |
Goal |
6161 | 105 |
"x~=UU ==> sforall2`P`(x##xs)= ((P`x) andalso sforall2`P`xs)"; |
3457 | 106 |
by (rtac trans 1); |
3071 | 107 |
by (stac sforall2_unfold 1); |
108 |
by (Asm_full_simp_tac 1); |
|
3457 | 109 |
by (rtac refl 1); |
3071 | 110 |
qed"sforall2_cons"; |
111 |
||
112 |
||
113 |
(* ----------------------------------------------------------- *) |
|
114 |
(* stakewhile *) |
|
115 |
(* ----------------------------------------------------------- *) |
|
116 |
||
117 |
||
118 |
bind_thm ("stakewhile_unfold", fix_prover2 thy stakewhile_def |
|
119 |
"stakewhile = (LAM P tr. case tr of \ |
|
120 |
\ nil => nil \ |
|
121 |
\ | x##xs => (If P`x then x##(stakewhile`P`xs) else nil fi))"); |
|
122 |
||
5068 | 123 |
Goal "stakewhile`P`nil=nil"; |
3071 | 124 |
by (stac stakewhile_unfold 1); |
125 |
by (Simp_tac 1); |
|
126 |
qed"stakewhile_nil"; |
|
127 |
||
5068 | 128 |
Goal "stakewhile`P`UU=UU"; |
3071 | 129 |
by (stac stakewhile_unfold 1); |
130 |
by (Simp_tac 1); |
|
131 |
qed"stakewhile_UU"; |
|
132 |
||
5068 | 133 |
Goal |
6161 | 134 |
"x~=UU ==> stakewhile`P`(x##xs) = \ |
3071 | 135 |
\ (If P`x then x##(stakewhile`P`xs) else nil fi)"; |
3457 | 136 |
by (rtac trans 1); |
3071 | 137 |
by (stac stakewhile_unfold 1); |
138 |
by (Asm_full_simp_tac 1); |
|
3457 | 139 |
by (rtac refl 1); |
3071 | 140 |
qed"stakewhile_cons"; |
141 |
||
142 |
(* ----------------------------------------------------------- *) |
|
143 |
(* sdropwhile *) |
|
144 |
(* ----------------------------------------------------------- *) |
|
145 |
||
146 |
||
147 |
bind_thm ("sdropwhile_unfold", fix_prover2 thy sdropwhile_def |
|
148 |
"sdropwhile = (LAM P tr. case tr of \ |
|
149 |
\ nil => nil \ |
|
150 |
\ | x##xs => (If P`x then sdropwhile`P`xs else tr fi))"); |
|
151 |
||
5068 | 152 |
Goal "sdropwhile`P`nil=nil"; |
3071 | 153 |
by (stac sdropwhile_unfold 1); |
154 |
by (Simp_tac 1); |
|
155 |
qed"sdropwhile_nil"; |
|
156 |
||
5068 | 157 |
Goal "sdropwhile`P`UU=UU"; |
3071 | 158 |
by (stac sdropwhile_unfold 1); |
159 |
by (Simp_tac 1); |
|
160 |
qed"sdropwhile_UU"; |
|
161 |
||
5068 | 162 |
Goal |
6161 | 163 |
"x~=UU ==> sdropwhile`P`(x##xs) = \ |
3071 | 164 |
\ (If P`x then sdropwhile`P`xs else x##xs fi)"; |
3457 | 165 |
by (rtac trans 1); |
3071 | 166 |
by (stac sdropwhile_unfold 1); |
167 |
by (Asm_full_simp_tac 1); |
|
3457 | 168 |
by (rtac refl 1); |
3071 | 169 |
qed"sdropwhile_cons"; |
170 |
||
171 |
||
172 |
(* ----------------------------------------------------------- *) |
|
173 |
(* slast *) |
|
174 |
(* ----------------------------------------------------------- *) |
|
175 |
||
176 |
||
177 |
bind_thm ("slast_unfold", fix_prover2 thy slast_def |
|
178 |
"slast = (LAM tr. case tr of \ |
|
179 |
\ nil => UU \ |
|
180 |
\ | x##xs => (If is_nil`xs then x else slast`xs fi))"); |
|
181 |
||
182 |
||
5068 | 183 |
Goal "slast`nil=UU"; |
3071 | 184 |
by (stac slast_unfold 1); |
185 |
by (Simp_tac 1); |
|
186 |
qed"slast_nil"; |
|
187 |
||
5068 | 188 |
Goal "slast`UU=UU"; |
3071 | 189 |
by (stac slast_unfold 1); |
190 |
by (Simp_tac 1); |
|
191 |
qed"slast_UU"; |
|
192 |
||
5068 | 193 |
Goal |
6161 | 194 |
"x~=UU ==> slast`(x##xs)= (If is_nil`xs then x else slast`xs fi)"; |
3457 | 195 |
by (rtac trans 1); |
3071 | 196 |
by (stac slast_unfold 1); |
197 |
by (Asm_full_simp_tac 1); |
|
3457 | 198 |
by (rtac refl 1); |
3071 | 199 |
qed"slast_cons"; |
200 |
||
201 |
||
202 |
(* ----------------------------------------------------------- *) |
|
203 |
(* sconc *) |
|
204 |
(* ----------------------------------------------------------- *) |
|
205 |
||
206 |
bind_thm ("sconc_unfold", fix_prover2 thy sconc_def |
|
207 |
"sconc = (LAM t1 t2. case t1 of \ |
|
208 |
\ nil => t2 \ |
|
209 |
\ | x##xs => x ## (xs @@ t2))"); |
|
210 |
||
211 |
||
5068 | 212 |
Goal "nil @@ y = y"; |
3071 | 213 |
by (stac sconc_unfold 1); |
214 |
by (Simp_tac 1); |
|
215 |
qed"sconc_nil"; |
|
216 |
||
5068 | 217 |
Goal "UU @@ y=UU"; |
3071 | 218 |
by (stac sconc_unfold 1); |
219 |
by (Simp_tac 1); |
|
220 |
qed"sconc_UU"; |
|
221 |
||
5068 | 222 |
Goal "(x##xs) @@ y=x##(xs @@ y)"; |
3457 | 223 |
by (rtac trans 1); |
3071 | 224 |
by (stac sconc_unfold 1); |
225 |
by (Asm_full_simp_tac 1); |
|
226 |
by (case_tac "x=UU" 1); |
|
227 |
by (REPEAT (Asm_full_simp_tac 1)); |
|
228 |
qed"sconc_cons"; |
|
229 |
||
3275 | 230 |
Addsimps [sconc_nil,sconc_UU,sconc_cons]; |
3071 | 231 |
|
232 |
||
233 |
(* ----------------------------------------------------------- *) |
|
234 |
(* sflat *) |
|
235 |
(* ----------------------------------------------------------- *) |
|
236 |
||
237 |
bind_thm ("sflat_unfold", fix_prover2 thy sflat_def |
|
238 |
"sflat = (LAM tr. case tr of \ |
|
239 |
\ nil => nil \ |
|
240 |
\ | x##xs => x @@ sflat`xs)"); |
|
241 |
||
5068 | 242 |
Goal "sflat`nil=nil"; |
3071 | 243 |
by (stac sflat_unfold 1); |
244 |
by (Simp_tac 1); |
|
245 |
qed"sflat_nil"; |
|
246 |
||
5068 | 247 |
Goal "sflat`UU=UU"; |
3071 | 248 |
by (stac sflat_unfold 1); |
249 |
by (Simp_tac 1); |
|
250 |
qed"sflat_UU"; |
|
251 |
||
5068 | 252 |
Goal "sflat`(x##xs)= x@@(sflat`xs)"; |
3457 | 253 |
by (rtac trans 1); |
3071 | 254 |
by (stac sflat_unfold 1); |
255 |
by (Asm_full_simp_tac 1); |
|
256 |
by (case_tac "x=UU" 1); |
|
257 |
by (REPEAT (Asm_full_simp_tac 1)); |
|
258 |
qed"sflat_cons"; |
|
259 |
||
260 |
||
261 |
||
262 |
||
263 |
(* ----------------------------------------------------------- *) |
|
264 |
(* szip *) |
|
265 |
(* ----------------------------------------------------------- *) |
|
266 |
||
267 |
bind_thm ("szip_unfold", fix_prover2 thy szip_def |
|
268 |
"szip = (LAM t1 t2. case t1 of \ |
|
269 |
\ nil => nil \ |
|
270 |
\ | x##xs => (case t2 of \ |
|
271 |
\ nil => UU \ |
|
272 |
\ | y##ys => <x,y>##(szip`xs`ys)))"); |
|
273 |
||
5068 | 274 |
Goal "szip`nil`y=nil"; |
3071 | 275 |
by (stac szip_unfold 1); |
276 |
by (Simp_tac 1); |
|
277 |
qed"szip_nil"; |
|
278 |
||
5068 | 279 |
Goal "szip`UU`y=UU"; |
3071 | 280 |
by (stac szip_unfold 1); |
281 |
by (Simp_tac 1); |
|
282 |
qed"szip_UU1"; |
|
283 |
||
6161 | 284 |
Goal "x~=nil ==> szip`x`UU=UU"; |
3071 | 285 |
by (stac szip_unfold 1); |
286 |
by (Asm_full_simp_tac 1); |
|
4042 | 287 |
by (res_inst_tac [("x","x")] seq.casedist 1); |
3071 | 288 |
by (REPEAT (Asm_full_simp_tac 1)); |
289 |
qed"szip_UU2"; |
|
290 |
||
6161 | 291 |
Goal "x~=UU ==> szip`(x##xs)`nil=UU"; |
3457 | 292 |
by (rtac trans 1); |
3071 | 293 |
by (stac szip_unfold 1); |
294 |
by (REPEAT (Asm_full_simp_tac 1)); |
|
295 |
qed"szip_cons_nil"; |
|
296 |
||
6161 | 297 |
Goal "[| x~=UU; y~=UU|] ==> szip`(x##xs)`(y##ys) = <x,y>##szip`xs`ys"; |
3457 | 298 |
by (rtac trans 1); |
3071 | 299 |
by (stac szip_unfold 1); |
300 |
by (REPEAT (Asm_full_simp_tac 1)); |
|
301 |
qed"szip_cons"; |
|
302 |
||
303 |
||
304 |
Addsimps [sfilter_UU,sfilter_nil,sfilter_cons, |
|
305 |
smap_UU,smap_nil,smap_cons, |
|
306 |
sforall2_UU,sforall2_nil,sforall2_cons, |
|
307 |
slast_UU,slast_nil,slast_cons, |
|
308 |
stakewhile_UU, stakewhile_nil, stakewhile_cons, |
|
309 |
sdropwhile_UU, sdropwhile_nil, sdropwhile_cons, |
|
310 |
sflat_UU,sflat_nil,sflat_cons, |
|
311 |
szip_UU1,szip_UU2,szip_nil,szip_cons_nil,szip_cons]; |
|
312 |
||
313 |
||
314 |
||
315 |
(* ------------------------------------------------------------------------------------- *) |
|
316 |
||
3275 | 317 |
section "scons, nil"; |
3071 | 318 |
|
5068 | 319 |
Goal |
6161 | 320 |
"[|x~=UU;y~=UU|]==> (x##xs=y##ys) = (x=y & xs=ys)"; |
3071 | 321 |
by (rtac iffI 1); |
322 |
by (etac (hd seq.injects) 1); |
|
4477
b3e5857d8d99
New Auto_tac (by Oheimb), and new syntax (without parens), and expandshort
paulson
parents:
4098
diff
changeset
|
323 |
by Auto_tac; |
3071 | 324 |
qed"scons_inject_eq"; |
325 |
||
6161 | 326 |
Goal "nil<<x ==> nil=x"; |
4042 | 327 |
by (res_inst_tac [("x","x")] seq.casedist 1); |
3275 | 328 |
by (hyp_subst_tac 1); |
329 |
by (etac antisym_less 1); |
|
330 |
by (Asm_full_simp_tac 1); |
|
331 |
by (Asm_full_simp_tac 1); |
|
332 |
by (hyp_subst_tac 1); |
|
333 |
by (Asm_full_simp_tac 1); |
|
334 |
qed"nil_less_is_nil"; |
|
3071 | 335 |
|
336 |
(* ------------------------------------------------------------------------------------- *) |
|
337 |
||
338 |
section "sfilter, sforall, sconc"; |
|
339 |
||
340 |
||
5068 | 341 |
Goal "(if b then tr1 else tr2) @@ tr \ |
3071 | 342 |
\= (if b then tr1 @@ tr else tr2 @@ tr)"; |
343 |
by (res_inst_tac [("P","b"),("Q","b")] impCE 1); |
|
344 |
by (fast_tac HOL_cs 1); |
|
345 |
by (REPEAT (Asm_full_simp_tac 1)); |
|
346 |
qed"if_and_sconc"; |
|
347 |
||
348 |
Addsimps [if_and_sconc]; |
|
349 |
||
350 |
||
5068 | 351 |
Goal "sfilter`P`(x @@ y) = (sfilter`P`x @@ sfilter`P`y)"; |
3071 | 352 |
|
353 |
by (res_inst_tac[("x","x")] seq.ind 1); |
|
354 |
(* adm *) |
|
355 |
by (Simp_tac 1); |
|
356 |
(* base cases *) |
|
357 |
by (Simp_tac 1); |
|
358 |
by (Simp_tac 1); |
|
359 |
(* main case *) |
|
4098 | 360 |
by (asm_full_simp_tac (simpset() setloop split_If_tac) 1); |
3071 | 361 |
qed"sfiltersconc"; |
362 |
||
5068 | 363 |
Goal "sforall P (stakewhile`P`x)"; |
4098 | 364 |
by (simp_tac (simpset() addsimps [sforall_def]) 1); |
3071 | 365 |
by (res_inst_tac[("x","x")] seq.ind 1); |
366 |
(* adm *) |
|
4098 | 367 |
by (simp_tac (simpset() addsimps [adm_trick_1]) 1); |
3071 | 368 |
(* base cases *) |
369 |
by (Simp_tac 1); |
|
370 |
by (Simp_tac 1); |
|
371 |
(* main case *) |
|
4098 | 372 |
by (asm_full_simp_tac (simpset() setloop split_If_tac) 1); |
3071 | 373 |
qed"sforallPstakewhileP"; |
374 |
||
5068 | 375 |
Goal "sforall P (sfilter`P`x)"; |
4098 | 376 |
by (simp_tac (simpset() addsimps [sforall_def]) 1); |
3071 | 377 |
by (res_inst_tac[("x","x")] seq.ind 1); |
378 |
(* adm *) |
|
4098 | 379 |
by (simp_tac (simpset() addsimps [adm_trick_1]) 1); |
3071 | 380 |
(* base cases *) |
381 |
by (Simp_tac 1); |
|
382 |
by (Simp_tac 1); |
|
383 |
(* main case *) |
|
4098 | 384 |
by (asm_full_simp_tac (simpset() setloop split_If_tac) 1); |
3071 | 385 |
qed"forallPsfilterP"; |
386 |
||
387 |
||
388 |
||
389 |
(* ------------------------------------------------------------------------------------- *) |
|
390 |
||
391 |
section "Finite"; |
|
392 |
||
393 |
(* ---------------------------------------------------- *) |
|
394 |
(* Proofs of rewrite rules for Finite: *) |
|
395 |
(* 1. Finite(nil), (by definition) *) |
|
396 |
(* 2. ~Finite(UU), *) |
|
397 |
(* 3. a~=UU==> Finite(a##x)=Finite(x) *) |
|
398 |
(* ---------------------------------------------------- *) |
|
399 |
||
5068 | 400 |
Goal "Finite x --> x~=UU"; |
3457 | 401 |
by (rtac impI 1); |
402 |
by (etac sfinite.induct 1); |
|
3071 | 403 |
by (Asm_full_simp_tac 1); |
404 |
by (Asm_full_simp_tac 1); |
|
405 |
qed"Finite_UU_a"; |
|
406 |
||
5068 | 407 |
Goal "~(Finite UU)"; |
3071 | 408 |
by (cut_inst_tac [("x","UU")]Finite_UU_a 1); |
409 |
by (fast_tac HOL_cs 1); |
|
410 |
qed"Finite_UU"; |
|
411 |
||
5068 | 412 |
Goal "Finite x --> a~=UU --> x=a##xs --> Finite xs"; |
3071 | 413 |
by (strip_tac 1); |
3457 | 414 |
by (etac sfinite.elim 1); |
4098 | 415 |
by (fast_tac (HOL_cs addss simpset()) 1); |
3071 | 416 |
by (fast_tac (HOL_cs addSDs seq.injects) 1); |
417 |
qed"Finite_cons_a"; |
|
418 |
||
6161 | 419 |
Goal "a~=UU ==>(Finite (a##x)) = (Finite x)"; |
3071 | 420 |
by (rtac iffI 1); |
421 |
by (rtac (Finite_cons_a RS mp RS mp RS mp) 1); |
|
422 |
by (REPEAT (assume_tac 1)); |
|
423 |
by (fast_tac HOL_cs 1); |
|
424 |
by (Asm_full_simp_tac 1); |
|
425 |
qed"Finite_cons"; |
|
426 |
||
427 |
Addsimps [Finite_UU]; |
|
428 |
||
429 |
||
430 |
(* ------------------------------------------------------------------------------------- *) |
|
431 |
||
432 |
section "induction"; |
|
433 |
||
434 |
||
435 |
(*-------------------------------- *) |
|
436 |
(* Extensions to Induction Theorems *) |
|
437 |
(*-------------------------------- *) |
|
438 |
||
439 |
||
440 |
qed_goalw "seq_finite_ind_lemma" thy [seq.finite_def] |
|
3847 | 441 |
"(!!n. P(seq_take n`s)) ==> seq_finite(s) -->P(s)" |
3071 | 442 |
(fn prems => |
443 |
[ |
|
444 |
(strip_tac 1), |
|
445 |
(etac exE 1), |
|
446 |
(etac subst 1), |
|
447 |
(resolve_tac prems 1) |
|
448 |
]); |
|
449 |
||
450 |
||
6161 | 451 |
Goal "!!P.[|P(UU);P(nil);\ |
3071 | 452 |
\ !! x s1.[|x~=UU;P(s1)|] ==> P(x##s1)\ |
453 |
\ |] ==> seq_finite(s) --> P(s)"; |
|
454 |
by (rtac seq_finite_ind_lemma 1); |
|
3457 | 455 |
by (etac seq.finite_ind 1); |
456 |
by (assume_tac 1); |
|
3071 | 457 |
by (Asm_full_simp_tac 1); |
458 |
qed"seq_finite_ind"; |
|
459 |
||
460 |