25 Flat ::"('a Seq) seq -> 'a Seq" |
25 Flat ::"('a Seq) seq -> 'a Seq" |
26 |
26 |
27 Filter2 ::"('a => bool) => 'a Seq -> 'a Seq" |
27 Filter2 ::"('a => bool) => 'a Seq -> 'a Seq" |
28 |
28 |
29 abbreviation |
29 abbreviation |
30 Consq_syn ("(_/>>_)" [66,65] 65) where |
30 Consq_syn ("(_/\<leadsto>_)" [66,65] 65) where |
31 "a>>s == Consq a$s" |
31 "a\<leadsto>s == Consq a$s" |
32 |
|
33 notation (xsymbols) |
|
34 Consq_syn ("(_\<leadsto>_)" [66,65] 65) |
|
35 |
32 |
36 |
33 |
37 (* list Enumeration *) |
34 (* list Enumeration *) |
38 syntax |
35 syntax |
39 "_totlist" :: "args => 'a Seq" ("[(_)!]") |
36 "_totlist" :: "args => 'a Seq" ("[(_)!]") |
40 "_partlist" :: "args => 'a Seq" ("[(_)?]") |
37 "_partlist" :: "args => 'a Seq" ("[(_)?]") |
41 translations |
38 translations |
42 "[x, xs!]" == "x>>[xs!]" |
39 "[x, xs!]" == "x\<leadsto>[xs!]" |
43 "[x!]" == "x>>nil" |
40 "[x!]" == "x\<leadsto>nil" |
44 "[x, xs?]" == "x>>[xs?]" |
41 "[x, xs?]" == "x\<leadsto>[xs?]" |
45 "[x?]" == "x>>CONST bottom" |
42 "[x?]" == "x\<leadsto>CONST bottom" |
46 |
43 |
47 defs |
44 defs |
48 |
45 |
49 Consq_def: "Consq a == LAM s. Def a ## s" |
46 Consq_def: "Consq a == LAM s. Def a ## s" |
50 |
47 |
90 by (simp add: Map_def) |
87 by (simp add: Map_def) |
91 |
88 |
92 lemma Map_nil: "Map f$nil =nil" |
89 lemma Map_nil: "Map f$nil =nil" |
93 by (simp add: Map_def) |
90 by (simp add: Map_def) |
94 |
91 |
95 lemma Map_cons: "Map f$(x>>xs)=(f x) >> Map f$xs" |
92 lemma Map_cons: "Map f$(x\<leadsto>xs)=(f x) \<leadsto> Map f$xs" |
96 by (simp add: Map_def Consq_def flift2_def) |
93 by (simp add: Map_def Consq_def flift2_def) |
97 |
94 |
98 |
95 |
99 subsubsection {* Filter *} |
96 subsubsection {* Filter *} |
100 |
97 |
115 by (simp add: Forall_def sforall_def) |
112 by (simp add: Forall_def sforall_def) |
116 |
113 |
117 lemma Forall_nil: "Forall P nil" |
114 lemma Forall_nil: "Forall P nil" |
118 by (simp add: Forall_def sforall_def) |
115 by (simp add: Forall_def sforall_def) |
119 |
116 |
120 lemma Forall_cons: "Forall P (x>>xs)= (P x & Forall P xs)" |
117 lemma Forall_cons: "Forall P (x\<leadsto>xs)= (P x & Forall P xs)" |
121 by (simp add: Forall_def sforall_def Consq_def flift2_def) |
118 by (simp add: Forall_def sforall_def Consq_def flift2_def) |
122 |
119 |
123 |
120 |
124 subsubsection {* Conc *} |
121 subsubsection {* Conc *} |
125 |
122 |
126 lemma Conc_cons: "(x>>xs) @@ y = x>>(xs @@y)" |
123 lemma Conc_cons: "(x\<leadsto>xs) @@ y = x\<leadsto>(xs @@y)" |
127 by (simp add: Consq_def) |
124 by (simp add: Consq_def) |
128 |
125 |
129 |
126 |
130 subsubsection {* Takewhile *} |
127 subsubsection {* Takewhile *} |
131 |
128 |
134 |
131 |
135 lemma Takewhile_nil: "Takewhile P$nil =nil" |
132 lemma Takewhile_nil: "Takewhile P$nil =nil" |
136 by (simp add: Takewhile_def) |
133 by (simp add: Takewhile_def) |
137 |
134 |
138 lemma Takewhile_cons: |
135 lemma Takewhile_cons: |
139 "Takewhile P$(x>>xs)= (if P x then x>>(Takewhile P$xs) else nil)" |
136 "Takewhile P$(x\<leadsto>xs)= (if P x then x\<leadsto>(Takewhile P$xs) else nil)" |
140 by (simp add: Takewhile_def Consq_def flift2_def If_and_if) |
137 by (simp add: Takewhile_def Consq_def flift2_def If_and_if) |
141 |
138 |
142 |
139 |
143 subsubsection {* DropWhile *} |
140 subsubsection {* DropWhile *} |
144 |
141 |
147 |
144 |
148 lemma Dropwhile_nil: "Dropwhile P$nil =nil" |
145 lemma Dropwhile_nil: "Dropwhile P$nil =nil" |
149 by (simp add: Dropwhile_def) |
146 by (simp add: Dropwhile_def) |
150 |
147 |
151 lemma Dropwhile_cons: |
148 lemma Dropwhile_cons: |
152 "Dropwhile P$(x>>xs)= (if P x then Dropwhile P$xs else x>>xs)" |
149 "Dropwhile P$(x\<leadsto>xs)= (if P x then Dropwhile P$xs else x\<leadsto>xs)" |
153 by (simp add: Dropwhile_def Consq_def flift2_def If_and_if) |
150 by (simp add: Dropwhile_def Consq_def flift2_def If_and_if) |
154 |
151 |
155 |
152 |
156 subsubsection {* Last *} |
153 subsubsection {* Last *} |
157 |
154 |
214 lemma Zip_nil: "Zip$nil$y =nil" |
211 lemma Zip_nil: "Zip$nil$y =nil" |
215 apply (subst Zip_unfold) |
212 apply (subst Zip_unfold) |
216 apply simp |
213 apply simp |
217 done |
214 done |
218 |
215 |
219 lemma Zip_cons_nil: "Zip$(x>>xs)$nil= UU" |
216 lemma Zip_cons_nil: "Zip$(x\<leadsto>xs)$nil= UU" |
220 apply (subst Zip_unfold) |
217 apply (subst Zip_unfold) |
221 apply (simp add: Consq_def) |
218 apply (simp add: Consq_def) |
222 done |
219 done |
223 |
220 |
224 lemma Zip_cons: "Zip$(x>>xs)$(y>>ys)= (x,y) >> Zip$xs$ys" |
221 lemma Zip_cons: "Zip$(x\<leadsto>xs)$(y\<leadsto>ys)= (x,y) \<leadsto> Zip$xs$ys" |
225 apply (rule trans) |
222 apply (rule trans) |
226 apply (subst Zip_unfold) |
223 apply (subst Zip_unfold) |
227 apply simp |
224 apply simp |
228 apply (simp add: Consq_def) |
225 apply (simp add: Consq_def) |
229 done |
226 done |
250 |
247 |
251 |
248 |
252 |
249 |
253 section "Cons" |
250 section "Cons" |
254 |
251 |
255 lemma Consq_def2: "a>>s = (Def a)##s" |
252 lemma Consq_def2: "a\<leadsto>s = (Def a)##s" |
256 apply (simp add: Consq_def) |
253 apply (simp add: Consq_def) |
257 done |
254 done |
258 |
255 |
259 lemma Seq_exhaust: "x = UU | x = nil | (? a s. x = a >> s)" |
256 lemma Seq_exhaust: "x = UU | x = nil | (? a s. x = a \<leadsto> s)" |
260 apply (simp add: Consq_def2) |
257 apply (simp add: Consq_def2) |
261 apply (cut_tac seq.nchotomy) |
258 apply (cut_tac seq.nchotomy) |
262 apply (fast dest: not_Undef_is_Def [THEN iffD1]) |
259 apply (fast dest: not_Undef_is_Def [THEN iffD1]) |
263 done |
260 done |
264 |
261 |
265 |
262 |
266 lemma Seq_cases: |
263 lemma Seq_cases: |
267 "!!P. [| x = UU ==> P; x = nil ==> P; !!a s. x = a >> s ==> P |] ==> P" |
264 "!!P. [| x = UU ==> P; x = nil ==> P; !!a s. x = a \<leadsto> s ==> P |] ==> P" |
268 apply (cut_tac x="x" in Seq_exhaust) |
265 apply (cut_tac x="x" in Seq_exhaust) |
269 apply (erule disjE) |
266 apply (erule disjE) |
270 apply simp |
267 apply simp |
271 apply (erule disjE) |
268 apply (erule disjE) |
272 apply simp |
269 apply simp |
276 |
273 |
277 (* |
274 (* |
278 fun Seq_case_tac s i = rule_tac x",s)] Seq_cases i |
275 fun Seq_case_tac s i = rule_tac x",s)] Seq_cases i |
279 THEN hyp_subst_tac i THEN hyp_subst_tac (i+1) THEN hyp_subst_tac (i+2); |
276 THEN hyp_subst_tac i THEN hyp_subst_tac (i+1) THEN hyp_subst_tac (i+2); |
280 *) |
277 *) |
281 (* on a>>s only simp_tac, as full_simp_tac is uncomplete and often causes errors *) |
278 (* on a\<leadsto>s only simp_tac, as full_simp_tac is uncomplete and often causes errors *) |
282 (* |
279 (* |
283 fun Seq_case_simp_tac s i = Seq_case_tac s i THEN Asm_simp_tac (i+2) |
280 fun Seq_case_simp_tac s i = Seq_case_tac s i THEN Asm_simp_tac (i+2) |
284 THEN Asm_full_simp_tac (i+1) |
281 THEN Asm_full_simp_tac (i+1) |
285 THEN Asm_full_simp_tac i; |
282 THEN Asm_full_simp_tac i; |
286 *) |
283 *) |
287 |
284 |
288 lemma Cons_not_UU: "a>>s ~= UU" |
285 lemma Cons_not_UU: "a\<leadsto>s ~= UU" |
289 apply (subst Consq_def2) |
286 apply (subst Consq_def2) |
290 apply simp |
287 apply simp |
291 done |
288 done |
292 |
289 |
293 |
290 |
294 lemma Cons_not_less_UU: "~(a>>x) << UU" |
291 lemma Cons_not_less_UU: "~(a\<leadsto>x) << UU" |
295 apply (rule notI) |
292 apply (rule notI) |
296 apply (drule below_antisym) |
293 apply (drule below_antisym) |
297 apply simp |
294 apply simp |
298 apply (simp add: Cons_not_UU) |
295 apply (simp add: Cons_not_UU) |
299 done |
296 done |
300 |
297 |
301 lemma Cons_not_less_nil: "~a>>s << nil" |
298 lemma Cons_not_less_nil: "~a\<leadsto>s << nil" |
302 apply (simp add: Consq_def2) |
299 apply (simp add: Consq_def2) |
303 done |
300 done |
304 |
301 |
305 lemma Cons_not_nil: "a>>s ~= nil" |
302 lemma Cons_not_nil: "a\<leadsto>s ~= nil" |
306 apply (simp add: Consq_def2) |
303 apply (simp add: Consq_def2) |
307 done |
304 done |
308 |
305 |
309 lemma Cons_not_nil2: "nil ~= a>>s" |
306 lemma Cons_not_nil2: "nil ~= a\<leadsto>s" |
310 apply (simp add: Consq_def2) |
307 apply (simp add: Consq_def2) |
311 done |
308 done |
312 |
309 |
313 lemma Cons_inject_eq: "(a>>s = b>>t) = (a = b & s = t)" |
310 lemma Cons_inject_eq: "(a\<leadsto>s = b\<leadsto>t) = (a = b & s = t)" |
314 apply (simp only: Consq_def2) |
311 apply (simp only: Consq_def2) |
315 apply (simp add: scons_inject_eq) |
312 apply (simp add: scons_inject_eq) |
316 done |
313 done |
317 |
314 |
318 lemma Cons_inject_less_eq: "(a>>s<<b>>t) = (a = b & s<<t)" |
315 lemma Cons_inject_less_eq: "(a\<leadsto>s<<b\<leadsto>t) = (a = b & s<<t)" |
319 apply (simp add: Consq_def2) |
316 apply (simp add: Consq_def2) |
320 done |
317 done |
321 |
318 |
322 lemma seq_take_Cons: "seq_take (Suc n)$(a>>x) = a>> (seq_take n$x)" |
319 lemma seq_take_Cons: "seq_take (Suc n)$(a\<leadsto>x) = a\<leadsto> (seq_take n$x)" |
323 apply (simp add: Consq_def) |
320 apply (simp add: Consq_def) |
324 done |
321 done |
325 |
322 |
326 lemmas [simp] = |
323 lemmas [simp] = |
327 Cons_not_nil2 Cons_inject_eq Cons_inject_less_eq seq_take_Cons |
324 Cons_not_nil2 Cons_inject_eq Cons_inject_less_eq seq_take_Cons |
329 |
326 |
330 |
327 |
331 subsection "induction" |
328 subsection "induction" |
332 |
329 |
333 lemma Seq_induct: |
330 lemma Seq_induct: |
334 "!! P. [| adm P; P UU; P nil; !! a s. P s ==> P (a>>s)|] ==> P x" |
331 "!! P. [| adm P; P UU; P nil; !! a s. P s ==> P (a\<leadsto>s)|] ==> P x" |
335 apply (erule (2) seq.induct) |
332 apply (erule (2) seq.induct) |
336 apply defined |
333 apply defined |
337 apply (simp add: Consq_def) |
334 apply (simp add: Consq_def) |
338 done |
335 done |
339 |
336 |
340 lemma Seq_FinitePartial_ind: |
337 lemma Seq_FinitePartial_ind: |
341 "!! P.[|P UU;P nil; !! a s. P s ==> P(a>>s) |] |
338 "!! P.[|P UU;P nil; !! a s. P s ==> P(a\<leadsto>s) |] |
342 ==> seq_finite x --> P x" |
339 ==> seq_finite x --> P x" |
343 apply (erule (1) seq_finite_ind) |
340 apply (erule (1) seq_finite_ind) |
344 apply defined |
341 apply defined |
345 apply (simp add: Consq_def) |
342 apply (simp add: Consq_def) |
346 done |
343 done |
347 |
344 |
348 lemma Seq_Finite_ind: |
345 lemma Seq_Finite_ind: |
349 "!! P.[| Finite x; P nil; !! a s. [| Finite s; P s|] ==> P (a>>s) |] ==> P x" |
346 "!! P.[| Finite x; P nil; !! a s. [| Finite s; P s|] ==> P (a\<leadsto>s) |] ==> P x" |
350 apply (erule (1) Finite.induct) |
347 apply (erule (1) Finite.induct) |
351 apply defined |
348 apply defined |
352 apply (simp add: Consq_def) |
349 apply (simp add: Consq_def) |
353 done |
350 done |
354 |
351 |
377 |
374 |
378 (* ------------------------------------------------------------------------------------ *) |
375 (* ------------------------------------------------------------------------------------ *) |
379 |
376 |
380 subsection "HD,TL" |
377 subsection "HD,TL" |
381 |
378 |
382 lemma HD_Cons [simp]: "HD$(x>>y) = Def x" |
379 lemma HD_Cons [simp]: "HD$(x\<leadsto>y) = Def x" |
383 apply (simp add: Consq_def) |
380 apply (simp add: Consq_def) |
384 done |
381 done |
385 |
382 |
386 lemma TL_Cons [simp]: "TL$(x>>y) = y" |
383 lemma TL_Cons [simp]: "TL$(x\<leadsto>y) = y" |
387 apply (simp add: Consq_def) |
384 apply (simp add: Consq_def) |
388 done |
385 done |
389 |
386 |
390 (* ------------------------------------------------------------------------------------ *) |
387 (* ------------------------------------------------------------------------------------ *) |
391 |
388 |
392 subsection "Finite, Partial, Infinite" |
389 subsection "Finite, Partial, Infinite" |
393 |
390 |
394 lemma Finite_Cons [simp]: "Finite (a>>xs) = Finite xs" |
391 lemma Finite_Cons [simp]: "Finite (a\<leadsto>xs) = Finite xs" |
395 apply (simp add: Consq_def2 Finite_cons) |
392 apply (simp add: Consq_def2 Finite_cons) |
396 done |
393 done |
397 |
394 |
398 lemma FiniteConc_1: "Finite (x::'a Seq) ==> Finite y --> Finite (x@@y)" |
395 lemma FiniteConc_1: "Finite (x::'a Seq) ==> Finite y --> Finite (x@@y)" |
399 apply (erule Seq_Finite_ind, simp_all) |
396 apply (erule Seq_Finite_ind, simp_all) |
790 subsection "coinductive characterizations of Filter" |
787 subsection "coinductive characterizations of Filter" |
791 |
788 |
792 |
789 |
793 lemma divide_Seq_lemma: |
790 lemma divide_Seq_lemma: |
794 "HD$(Filter P$y) = Def x |
791 "HD$(Filter P$y) = Def x |
795 --> y = ((Takewhile (%x. ~P x)$y) @@ (x >> TL$(Dropwhile (%a. ~P a)$y))) |
792 --> y = ((Takewhile (%x. ~P x)$y) @@ (x \<leadsto> TL$(Dropwhile (%a. ~P a)$y))) |
796 & Finite (Takewhile (%x. ~ P x)$y) & P x" |
793 & Finite (Takewhile (%x. ~ P x)$y) & P x" |
797 |
794 |
798 (* FIX: pay attention: is only admissible with chain-finite package to be added to |
795 (* FIX: pay attention: is only admissible with chain-finite package to be added to |
799 adm test and Finite f x admissibility *) |
796 adm test and Finite f x admissibility *) |
800 apply (rule_tac x="y" in Seq_induct) |
797 apply (rule_tac x="y" in Seq_induct) |
806 apply blast |
803 apply blast |
807 (* ~ P a *) |
804 (* ~ P a *) |
808 apply simp |
805 apply simp |
809 done |
806 done |
810 |
807 |
811 lemma divide_Seq: "(x>>xs) << Filter P$y |
808 lemma divide_Seq: "(x\<leadsto>xs) << Filter P$y |
812 ==> y = ((Takewhile (%a. ~ P a)$y) @@ (x >> TL$(Dropwhile (%a. ~ P a)$y))) |
809 ==> y = ((Takewhile (%a. ~ P a)$y) @@ (x \<leadsto> TL$(Dropwhile (%a. ~ P a)$y))) |
813 & Finite (Takewhile (%a. ~ P a)$y) & P x" |
810 & Finite (Takewhile (%a. ~ P a)$y) & P x" |
814 apply (rule divide_Seq_lemma [THEN mp]) |
811 apply (rule divide_Seq_lemma [THEN mp]) |
815 apply (drule_tac f="HD" and x="x>>xs" in monofun_cfun_arg) |
812 apply (drule_tac f="HD" and x="x\<leadsto>xs" in monofun_cfun_arg) |
816 apply simp |
813 apply simp |
817 done |
814 done |
818 |
815 |
819 |
816 |
820 lemma nForall_HDFilter: |
817 lemma nForall_HDFilter: |
825 apply simp_all |
822 apply simp_all |
826 done |
823 done |
827 |
824 |
828 |
825 |
829 lemma divide_Seq2: "~Forall P y |
826 lemma divide_Seq2: "~Forall P y |
830 ==> ? x. y= (Takewhile P$y @@ (x >> TL$(Dropwhile P$y))) & |
827 ==> ? x. y= (Takewhile P$y @@ (x \<leadsto> TL$(Dropwhile P$y))) & |
831 Finite (Takewhile P$y) & (~ P x)" |
828 Finite (Takewhile P$y) & (~ P x)" |
832 apply (drule nForall_HDFilter [THEN mp]) |
829 apply (drule nForall_HDFilter [THEN mp]) |
833 apply safe |
830 apply safe |
834 apply (rule_tac x="x" in exI) |
831 apply (rule_tac x="x" in exI) |
835 apply (cut_tac P1="%x. ~ P x" in divide_Seq_lemma [THEN mp]) |
832 apply (cut_tac P1="%x. ~ P x" in divide_Seq_lemma [THEN mp]) |
836 apply auto |
833 apply auto |
837 done |
834 done |
838 |
835 |
839 |
836 |
840 lemma divide_Seq3: "~Forall P y |
837 lemma divide_Seq3: "~Forall P y |
841 ==> ? x bs rs. y= (bs @@ (x>>rs)) & Finite bs & Forall P bs & (~ P x)" |
838 ==> ? x bs rs. y= (bs @@ (x\<leadsto>rs)) & Finite bs & Forall P bs & (~ P x)" |
842 apply (drule divide_Seq2) |
839 apply (drule divide_Seq2) |
843 (*Auto_tac no longer proves it*) |
840 (*Auto_tac no longer proves it*) |
844 apply fastforce |
841 apply fastforce |
845 done |
842 done |
846 |
843 |
871 done |
868 done |
872 |
869 |
873 |
870 |
874 lemma take_reduction: |
871 lemma take_reduction: |
875 "!! n.[| x=y; s=t; !! k. k<n ==> seq_take k$y1 = seq_take k$y2|] |
872 "!! n.[| x=y; s=t; !! k. k<n ==> seq_take k$y1 = seq_take k$y2|] |
876 ==> seq_take n$(x @@ (s>>y1)) = seq_take n$(y @@ (t>>y2))" |
873 ==> seq_take n$(x @@ (s\<leadsto>y1)) = seq_take n$(y @@ (t\<leadsto>y2))" |
877 apply (auto intro!: take_reduction1 [rule_format]) |
874 apply (auto intro!: take_reduction1 [rule_format]) |
878 done |
875 done |
879 |
876 |
880 (* ------------------------------------------------------------------ |
877 (* ------------------------------------------------------------------ |
881 take-lemma and take_reduction for << instead of = |
878 take-lemma and take_reduction for << instead of = |
882 ------------------------------------------------------------------ *) |
879 ------------------------------------------------------------------ *) |
883 |
880 |
884 lemma take_reduction_less1: |
881 lemma take_reduction_less1: |
885 " ! n. ((! k. k < n --> seq_take k$y1 << seq_take k$y2) |
882 " ! n. ((! k. k < n --> seq_take k$y1 << seq_take k$y2) |
886 --> seq_take n$(x @@ (t>>y1)) << seq_take n$(x @@ (t>>y2)))" |
883 --> seq_take n$(x @@ (t\<leadsto>y1)) << seq_take n$(x @@ (t\<leadsto>y2)))" |
887 apply (rule_tac x="x" in Seq_induct) |
884 apply (rule_tac x="x" in Seq_induct) |
888 apply simp_all |
885 apply simp_all |
889 apply (intro strip) |
886 apply (intro strip) |
890 apply (case_tac "n") |
887 apply (case_tac "n") |
891 apply auto |
888 apply auto |
894 done |
891 done |
895 |
892 |
896 |
893 |
897 lemma take_reduction_less: |
894 lemma take_reduction_less: |
898 "!! n.[| x=y; s=t;!! k. k<n ==> seq_take k$y1 << seq_take k$y2|] |
895 "!! n.[| x=y; s=t;!! k. k<n ==> seq_take k$y1 << seq_take k$y2|] |
899 ==> seq_take n$(x @@ (s>>y1)) << seq_take n$(y @@ (t>>y2))" |
896 ==> seq_take n$(x @@ (s\<leadsto>y1)) << seq_take n$(y @@ (t\<leadsto>y2))" |
900 apply (auto intro!: take_reduction_less1 [rule_format]) |
897 apply (auto intro!: take_reduction_less1 [rule_format]) |
901 done |
898 done |
902 |
899 |
903 lemma take_lemma_less1: |
900 lemma take_lemma_less1: |
904 assumes "!! n. seq_take n$s1 << seq_take n$s2" |
901 assumes "!! n. seq_take n$s1 << seq_take n$s2" |
923 take-lemma proof principles |
920 take-lemma proof principles |
924 ------------------------------------------------------------------ *) |
921 ------------------------------------------------------------------ *) |
925 |
922 |
926 lemma take_lemma_principle1: |
923 lemma take_lemma_principle1: |
927 "!! Q. [|!! s. [| Forall Q s; A s |] ==> (f s) = (g s) ; |
924 "!! Q. [|!! s. [| Forall Q s; A s |] ==> (f s) = (g s) ; |
928 !! s1 s2 y. [| Forall Q s1; Finite s1; ~ Q y; A (s1 @@ y>>s2)|] |
925 !! s1 s2 y. [| Forall Q s1; Finite s1; ~ Q y; A (s1 @@ y\<leadsto>s2)|] |
929 ==> (f (s1 @@ y>>s2)) = (g (s1 @@ y>>s2)) |] |
926 ==> (f (s1 @@ y\<leadsto>s2)) = (g (s1 @@ y\<leadsto>s2)) |] |
930 ==> A x --> (f x)=(g x)" |
927 ==> A x --> (f x)=(g x)" |
931 apply (case_tac "Forall Q x") |
928 apply (case_tac "Forall Q x") |
932 apply (auto dest!: divide_Seq3) |
929 apply (auto dest!: divide_Seq3) |
933 done |
930 done |
934 |
931 |
935 lemma take_lemma_principle2: |
932 lemma take_lemma_principle2: |
936 "!! Q. [|!! s. [| Forall Q s; A s |] ==> (f s) = (g s) ; |
933 "!! Q. [|!! s. [| Forall Q s; A s |] ==> (f s) = (g s) ; |
937 !! s1 s2 y. [| Forall Q s1; Finite s1; ~ Q y; A (s1 @@ y>>s2)|] |
934 !! s1 s2 y. [| Forall Q s1; Finite s1; ~ Q y; A (s1 @@ y\<leadsto>s2)|] |
938 ==> ! n. seq_take n$(f (s1 @@ y>>s2)) |
935 ==> ! n. seq_take n$(f (s1 @@ y\<leadsto>s2)) |
939 = seq_take n$(g (s1 @@ y>>s2)) |] |
936 = seq_take n$(g (s1 @@ y\<leadsto>s2)) |] |
940 ==> A x --> (f x)=(g x)" |
937 ==> A x --> (f x)=(g x)" |
941 apply (case_tac "Forall Q x") |
938 apply (case_tac "Forall Q x") |
942 apply (auto dest!: divide_Seq3) |
939 apply (auto dest!: divide_Seq3) |
943 apply (rule seq.take_lemma) |
940 apply (rule seq.take_lemma) |
944 apply auto |
941 apply auto |
954 has to be used in the trivial direction afterwards for the (Forall Q x) case. *) |
951 has to be used in the trivial direction afterwards for the (Forall Q x) case. *) |
955 |
952 |
956 lemma take_lemma_induct: |
953 lemma take_lemma_induct: |
957 "!! Q. [|!! s. [| Forall Q s; A s |] ==> (f s) = (g s) ; |
954 "!! Q. [|!! s. [| Forall Q s; A s |] ==> (f s) = (g s) ; |
958 !! s1 s2 y n. [| ! t. A t --> seq_take n$(f t) = seq_take n$(g t); |
955 !! s1 s2 y n. [| ! t. A t --> seq_take n$(f t) = seq_take n$(g t); |
959 Forall Q s1; Finite s1; ~ Q y; A (s1 @@ y>>s2) |] |
956 Forall Q s1; Finite s1; ~ Q y; A (s1 @@ y\<leadsto>s2) |] |
960 ==> seq_take (Suc n)$(f (s1 @@ y>>s2)) |
957 ==> seq_take (Suc n)$(f (s1 @@ y\<leadsto>s2)) |
961 = seq_take (Suc n)$(g (s1 @@ y>>s2)) |] |
958 = seq_take (Suc n)$(g (s1 @@ y\<leadsto>s2)) |] |
962 ==> A x --> (f x)=(g x)" |
959 ==> A x --> (f x)=(g x)" |
963 apply (rule impI) |
960 apply (rule impI) |
964 apply (rule seq.take_lemma) |
961 apply (rule seq.take_lemma) |
965 apply (rule mp) |
962 apply (rule mp) |
966 prefer 2 apply assumption |
963 prefer 2 apply assumption |
975 |
972 |
976 |
973 |
977 lemma take_lemma_less_induct: |
974 lemma take_lemma_less_induct: |
978 "!! Q. [|!! s. [| Forall Q s; A s |] ==> (f s) = (g s) ; |
975 "!! Q. [|!! s. [| Forall Q s; A s |] ==> (f s) = (g s) ; |
979 !! s1 s2 y n. [| ! t m. m < n --> A t --> seq_take m$(f t) = seq_take m$(g t); |
976 !! s1 s2 y n. [| ! t m. m < n --> A t --> seq_take m$(f t) = seq_take m$(g t); |
980 Forall Q s1; Finite s1; ~ Q y; A (s1 @@ y>>s2) |] |
977 Forall Q s1; Finite s1; ~ Q y; A (s1 @@ y\<leadsto>s2) |] |
981 ==> seq_take n$(f (s1 @@ y>>s2)) |
978 ==> seq_take n$(f (s1 @@ y\<leadsto>s2)) |
982 = seq_take n$(g (s1 @@ y>>s2)) |] |
979 = seq_take n$(g (s1 @@ y\<leadsto>s2)) |] |
983 ==> A x --> (f x)=(g x)" |
980 ==> A x --> (f x)=(g x)" |
984 apply (rule impI) |
981 apply (rule impI) |
985 apply (rule seq.take_lemma) |
982 apply (rule seq.take_lemma) |
986 apply (rule mp) |
983 apply (rule mp) |
987 prefer 2 apply assumption |
984 prefer 2 apply assumption |
997 |
994 |
998 lemma take_lemma_in_eq_out: |
995 lemma take_lemma_in_eq_out: |
999 "!! Q. [| A UU ==> (f UU) = (g UU) ; |
996 "!! Q. [| A UU ==> (f UU) = (g UU) ; |
1000 A nil ==> (f nil) = (g nil) ; |
997 A nil ==> (f nil) = (g nil) ; |
1001 !! s y n. [| ! t. A t --> seq_take n$(f t) = seq_take n$(g t); |
998 !! s y n. [| ! t. A t --> seq_take n$(f t) = seq_take n$(g t); |
1002 A (y>>s) |] |
999 A (y\<leadsto>s) |] |
1003 ==> seq_take (Suc n)$(f (y>>s)) |
1000 ==> seq_take (Suc n)$(f (y\<leadsto>s)) |
1004 = seq_take (Suc n)$(g (y>>s)) |] |
1001 = seq_take (Suc n)$(g (y\<leadsto>s)) |] |
1005 ==> A x --> (f x)=(g x)" |
1002 ==> A x --> (f x)=(g x)" |
1006 apply (rule impI) |
1003 apply (rule impI) |
1007 apply (rule seq.take_lemma) |
1004 apply (rule seq.take_lemma) |
1008 apply (rule mp) |
1005 apply (rule mp) |
1009 prefer 2 apply assumption |
1006 prefer 2 apply assumption |
1082 |
1079 |
1083 fun Seq_case_tac ctxt s i = |
1080 fun Seq_case_tac ctxt s i = |
1084 Rule_Insts.res_inst_tac ctxt [((("x", 0), Position.none), s)] [] @{thm Seq_cases} i |
1081 Rule_Insts.res_inst_tac ctxt [((("x", 0), Position.none), s)] [] @{thm Seq_cases} i |
1085 THEN hyp_subst_tac ctxt i THEN hyp_subst_tac ctxt (i+1) THEN hyp_subst_tac ctxt (i+2); |
1082 THEN hyp_subst_tac ctxt i THEN hyp_subst_tac ctxt (i+1) THEN hyp_subst_tac ctxt (i+2); |
1086 |
1083 |
1087 (* on a>>s only simp_tac, as full_simp_tac is uncomplete and often causes errors *) |
1084 (* on a\<leadsto>s only simp_tac, as full_simp_tac is uncomplete and often causes errors *) |
1088 fun Seq_case_simp_tac ctxt s i = |
1085 fun Seq_case_simp_tac ctxt s i = |
1089 Seq_case_tac ctxt s i |
1086 Seq_case_tac ctxt s i |
1090 THEN asm_simp_tac ctxt (i+2) |
1087 THEN asm_simp_tac ctxt (i+2) |
1091 THEN asm_full_simp_tac ctxt (i+1) |
1088 THEN asm_full_simp_tac ctxt (i+1) |
1092 THEN asm_full_simp_tac ctxt i; |
1089 THEN asm_full_simp_tac ctxt i; |