src/HOLCF/IOA/meta_theory/Seq.ML
changeset 5068 fb28eaa07e01
parent 4477 b3e5857d8d99
child 5976 44290b71a85f
equal deleted inserted replaced
5067:62b6288e6005 5068:fb28eaa07e01
     7 
     7 
     8 Addsimps (sfinite.intrs @ seq.rews);
     8 Addsimps (sfinite.intrs @ seq.rews);
     9 
     9 
    10 
    10 
    11 (* Instead of adding UU_neq_nil every equation UU~=x could be changed to x~=UU *)
    11 (* Instead of adding UU_neq_nil every equation UU~=x could be changed to x~=UU *)
    12 goal thy "UU ~=nil";
    12 Goal "UU ~=nil";
    13 by (res_inst_tac [("s1","UU"),("t1","nil")]  (sym RS rev_contrapos) 1);
    13 by (res_inst_tac [("s1","UU"),("t1","nil")]  (sym RS rev_contrapos) 1);
    14 by (REPEAT (Simp_tac 1));
    14 by (REPEAT (Simp_tac 1));
    15 qed"UU_neq_nil";
    15 qed"UU_neq_nil";
    16 
    16 
    17 Addsimps [UU_neq_nil];
    17 Addsimps [UU_neq_nil];
    34 bind_thm ("smap_unfold", fix_prover2 thy smap_def 
    34 bind_thm ("smap_unfold", fix_prover2 thy smap_def 
    35    "smap = (LAM f tr. case tr of  \
    35    "smap = (LAM f tr. case tr of  \
    36  \                         nil  => nil \
    36  \                         nil  => nil \
    37  \                       | x##xs => f`x ## smap`f`xs)");
    37  \                       | x##xs => f`x ## smap`f`xs)");
    38 
    38 
    39 goal thy "smap`f`nil=nil"; 
    39 Goal "smap`f`nil=nil"; 
    40 by (stac smap_unfold 1);
    40 by (stac smap_unfold 1);
    41 by (Simp_tac 1);
    41 by (Simp_tac 1);
    42 qed"smap_nil";
    42 qed"smap_nil";
    43 
    43 
    44 goal thy "smap`f`UU=UU"; 
    44 Goal "smap`f`UU=UU"; 
    45 by (stac smap_unfold 1);
    45 by (stac smap_unfold 1);
    46 by (Simp_tac 1);
    46 by (Simp_tac 1);
    47 qed"smap_UU";
    47 qed"smap_UU";
    48 
    48 
    49 goal thy 
    49 Goal 
    50 "!!x.[|x~=UU|] ==> smap`f`(x##xs)= (f`x)##smap`f`xs"; 
    50 "!!x.[|x~=UU|] ==> smap`f`(x##xs)= (f`x)##smap`f`xs"; 
    51 by (rtac trans 1);
    51 by (rtac trans 1);
    52 by (stac smap_unfold 1);
    52 by (stac smap_unfold 1);
    53 by (Asm_full_simp_tac 1);
    53 by (Asm_full_simp_tac 1);
    54 by (rtac refl 1);
    54 by (rtac refl 1);
    61 bind_thm ("sfilter_unfold", fix_prover2 thy sfilter_def 
    61 bind_thm ("sfilter_unfold", fix_prover2 thy sfilter_def 
    62   "sfilter = (LAM P tr. case tr of  \
    62   "sfilter = (LAM P tr. case tr of  \
    63  \         nil   => nil \
    63  \         nil   => nil \
    64  \       | x##xs => If P`x then x##(sfilter`P`xs) else sfilter`P`xs fi)");
    64  \       | x##xs => If P`x then x##(sfilter`P`xs) else sfilter`P`xs fi)");
    65 
    65 
    66 goal thy "sfilter`P`nil=nil";
    66 Goal "sfilter`P`nil=nil";
    67 by (stac sfilter_unfold 1);
    67 by (stac sfilter_unfold 1);
    68 by (Simp_tac 1);
    68 by (Simp_tac 1);
    69 qed"sfilter_nil";
    69 qed"sfilter_nil";
    70 
    70 
    71 goal thy "sfilter`P`UU=UU";
    71 Goal "sfilter`P`UU=UU";
    72 by (stac sfilter_unfold 1);
    72 by (stac sfilter_unfold 1);
    73 by (Simp_tac 1);
    73 by (Simp_tac 1);
    74 qed"sfilter_UU";
    74 qed"sfilter_UU";
    75 
    75 
    76 goal thy 
    76 Goal 
    77 "!!x. x~=UU ==> sfilter`P`(x##xs)=   \
    77 "!!x. x~=UU ==> sfilter`P`(x##xs)=   \
    78 \             (If P`x then x##(sfilter`P`xs) else sfilter`P`xs fi)";
    78 \             (If P`x then x##(sfilter`P`xs) else sfilter`P`xs fi)";
    79 by (rtac trans 1);
    79 by (rtac trans 1);
    80 by (stac sfilter_unfold 1);
    80 by (stac sfilter_unfold 1);
    81 by (Asm_full_simp_tac 1);
    81 by (Asm_full_simp_tac 1);
    89 bind_thm ("sforall2_unfold", fix_prover2 thy sforall2_def 
    89 bind_thm ("sforall2_unfold", fix_prover2 thy sforall2_def 
    90    "sforall2 = (LAM P tr. case tr of  \
    90    "sforall2 = (LAM P tr. case tr of  \
    91  \                         nil   => TT \
    91  \                         nil   => TT \
    92  \                       | x##xs => (P`x andalso sforall2`P`xs))");
    92  \                       | x##xs => (P`x andalso sforall2`P`xs))");
    93 
    93 
    94 goal thy "sforall2`P`nil=TT"; 
    94 Goal "sforall2`P`nil=TT"; 
    95 by (stac sforall2_unfold 1);
    95 by (stac sforall2_unfold 1);
    96 by (Simp_tac 1);
    96 by (Simp_tac 1);
    97 qed"sforall2_nil";
    97 qed"sforall2_nil";
    98 
    98 
    99 goal thy "sforall2`P`UU=UU"; 
    99 Goal "sforall2`P`UU=UU"; 
   100 by (stac sforall2_unfold 1);
   100 by (stac sforall2_unfold 1);
   101 by (Simp_tac 1);
   101 by (Simp_tac 1);
   102 qed"sforall2_UU";
   102 qed"sforall2_UU";
   103 
   103 
   104 goal thy 
   104 Goal 
   105 "!!x. x~=UU ==> sforall2`P`(x##xs)= ((P`x) andalso sforall2`P`xs)";
   105 "!!x. x~=UU ==> sforall2`P`(x##xs)= ((P`x) andalso sforall2`P`xs)";
   106 by (rtac trans 1);
   106 by (rtac trans 1);
   107 by (stac sforall2_unfold 1);
   107 by (stac sforall2_unfold 1);
   108 by (Asm_full_simp_tac 1);
   108 by (Asm_full_simp_tac 1);
   109 by (rtac refl 1);
   109 by (rtac refl 1);
   118 bind_thm ("stakewhile_unfold", fix_prover2 thy stakewhile_def 
   118 bind_thm ("stakewhile_unfold", fix_prover2 thy stakewhile_def 
   119    "stakewhile = (LAM P tr. case tr of  \
   119    "stakewhile = (LAM P tr. case tr of  \
   120  \                         nil   => nil \
   120  \                         nil   => nil \
   121  \                       | x##xs => (If P`x then x##(stakewhile`P`xs) else nil fi))");
   121  \                       | x##xs => (If P`x then x##(stakewhile`P`xs) else nil fi))");
   122 
   122 
   123 goal thy "stakewhile`P`nil=nil"; 
   123 Goal "stakewhile`P`nil=nil"; 
   124 by (stac stakewhile_unfold 1);
   124 by (stac stakewhile_unfold 1);
   125 by (Simp_tac 1);
   125 by (Simp_tac 1);
   126 qed"stakewhile_nil";
   126 qed"stakewhile_nil";
   127 
   127 
   128 goal thy "stakewhile`P`UU=UU"; 
   128 Goal "stakewhile`P`UU=UU"; 
   129 by (stac stakewhile_unfold 1);
   129 by (stac stakewhile_unfold 1);
   130 by (Simp_tac 1);
   130 by (Simp_tac 1);
   131 qed"stakewhile_UU";
   131 qed"stakewhile_UU";
   132 
   132 
   133 goal thy 
   133 Goal 
   134 "!!x. x~=UU ==> stakewhile`P`(x##xs) =   \
   134 "!!x. x~=UU ==> stakewhile`P`(x##xs) =   \
   135 \             (If P`x then x##(stakewhile`P`xs) else nil fi)";
   135 \             (If P`x then x##(stakewhile`P`xs) else nil fi)";
   136 by (rtac trans 1);
   136 by (rtac trans 1);
   137 by (stac stakewhile_unfold 1);
   137 by (stac stakewhile_unfold 1);
   138 by (Asm_full_simp_tac 1);
   138 by (Asm_full_simp_tac 1);
   147 bind_thm ("sdropwhile_unfold", fix_prover2 thy sdropwhile_def 
   147 bind_thm ("sdropwhile_unfold", fix_prover2 thy sdropwhile_def 
   148    "sdropwhile = (LAM P tr. case tr of  \
   148    "sdropwhile = (LAM P tr. case tr of  \
   149  \                         nil   => nil \
   149  \                         nil   => nil \
   150  \                       | x##xs => (If P`x then sdropwhile`P`xs else tr fi))");
   150  \                       | x##xs => (If P`x then sdropwhile`P`xs else tr fi))");
   151 
   151 
   152 goal thy "sdropwhile`P`nil=nil"; 
   152 Goal "sdropwhile`P`nil=nil"; 
   153 by (stac sdropwhile_unfold 1);
   153 by (stac sdropwhile_unfold 1);
   154 by (Simp_tac 1);
   154 by (Simp_tac 1);
   155 qed"sdropwhile_nil";
   155 qed"sdropwhile_nil";
   156 
   156 
   157 goal thy "sdropwhile`P`UU=UU"; 
   157 Goal "sdropwhile`P`UU=UU"; 
   158 by (stac sdropwhile_unfold 1);
   158 by (stac sdropwhile_unfold 1);
   159 by (Simp_tac 1);
   159 by (Simp_tac 1);
   160 qed"sdropwhile_UU";
   160 qed"sdropwhile_UU";
   161 
   161 
   162 goal thy 
   162 Goal 
   163 "!!x. x~=UU ==> sdropwhile`P`(x##xs) =   \
   163 "!!x. x~=UU ==> sdropwhile`P`(x##xs) =   \
   164 \             (If P`x then sdropwhile`P`xs else x##xs fi)";
   164 \             (If P`x then sdropwhile`P`xs else x##xs fi)";
   165 by (rtac trans 1);
   165 by (rtac trans 1);
   166 by (stac sdropwhile_unfold 1);
   166 by (stac sdropwhile_unfold 1);
   167 by (Asm_full_simp_tac 1);
   167 by (Asm_full_simp_tac 1);
   178    "slast = (LAM tr. case tr of  \
   178    "slast = (LAM tr. case tr of  \
   179  \                         nil   => UU \
   179  \                         nil   => UU \
   180  \                       | x##xs => (If is_nil`xs then x else slast`xs fi))");
   180  \                       | x##xs => (If is_nil`xs then x else slast`xs fi))");
   181 
   181 
   182 
   182 
   183 goal thy "slast`nil=UU"; 
   183 Goal "slast`nil=UU"; 
   184 by (stac slast_unfold 1);
   184 by (stac slast_unfold 1);
   185 by (Simp_tac 1);
   185 by (Simp_tac 1);
   186 qed"slast_nil";
   186 qed"slast_nil";
   187 
   187 
   188 goal thy "slast`UU=UU"; 
   188 Goal "slast`UU=UU"; 
   189 by (stac slast_unfold 1);
   189 by (stac slast_unfold 1);
   190 by (Simp_tac 1);
   190 by (Simp_tac 1);
   191 qed"slast_UU";
   191 qed"slast_UU";
   192 
   192 
   193 goal thy 
   193 Goal 
   194 "!!x. x~=UU ==> slast`(x##xs)= (If is_nil`xs then x else slast`xs fi)";
   194 "!!x. x~=UU ==> slast`(x##xs)= (If is_nil`xs then x else slast`xs fi)";
   195 by (rtac trans 1);
   195 by (rtac trans 1);
   196 by (stac slast_unfold 1);
   196 by (stac slast_unfold 1);
   197 by (Asm_full_simp_tac 1);
   197 by (Asm_full_simp_tac 1);
   198 by (rtac refl 1);
   198 by (rtac refl 1);
   207    "sconc = (LAM t1 t2. case t1 of  \
   207    "sconc = (LAM t1 t2. case t1 of  \
   208  \                         nil   => t2 \
   208  \                         nil   => t2 \
   209  \                       | x##xs => x ## (xs @@ t2))");
   209  \                       | x##xs => x ## (xs @@ t2))");
   210 
   210 
   211 
   211 
   212 goal thy "nil @@ y = y"; 
   212 Goal "nil @@ y = y"; 
   213 by (stac sconc_unfold 1);
   213 by (stac sconc_unfold 1);
   214 by (Simp_tac 1);
   214 by (Simp_tac 1);
   215 qed"sconc_nil";
   215 qed"sconc_nil";
   216 
   216 
   217 goal thy "UU @@ y=UU"; 
   217 Goal "UU @@ y=UU"; 
   218 by (stac sconc_unfold 1);
   218 by (stac sconc_unfold 1);
   219 by (Simp_tac 1);
   219 by (Simp_tac 1);
   220 qed"sconc_UU";
   220 qed"sconc_UU";
   221 
   221 
   222 goal thy "(x##xs) @@ y=x##(xs @@ y)";
   222 Goal "(x##xs) @@ y=x##(xs @@ y)";
   223 by (rtac trans 1);
   223 by (rtac trans 1);
   224 by (stac sconc_unfold 1);
   224 by (stac sconc_unfold 1);
   225 by (Asm_full_simp_tac 1);
   225 by (Asm_full_simp_tac 1);
   226 by (case_tac "x=UU" 1);
   226 by (case_tac "x=UU" 1);
   227 by (REPEAT (Asm_full_simp_tac 1));
   227 by (REPEAT (Asm_full_simp_tac 1));
   237 bind_thm ("sflat_unfold", fix_prover2 thy sflat_def 
   237 bind_thm ("sflat_unfold", fix_prover2 thy sflat_def 
   238    "sflat = (LAM tr. case tr of  \
   238    "sflat = (LAM tr. case tr of  \
   239  \                         nil   => nil \
   239  \                         nil   => nil \
   240  \                       | x##xs => x @@ sflat`xs)");
   240  \                       | x##xs => x @@ sflat`xs)");
   241 
   241 
   242 goal thy "sflat`nil=nil"; 
   242 Goal "sflat`nil=nil"; 
   243 by (stac sflat_unfold 1);
   243 by (stac sflat_unfold 1);
   244 by (Simp_tac 1);
   244 by (Simp_tac 1);
   245 qed"sflat_nil";
   245 qed"sflat_nil";
   246 
   246 
   247 goal thy "sflat`UU=UU"; 
   247 Goal "sflat`UU=UU"; 
   248 by (stac sflat_unfold 1);
   248 by (stac sflat_unfold 1);
   249 by (Simp_tac 1);
   249 by (Simp_tac 1);
   250 qed"sflat_UU";
   250 qed"sflat_UU";
   251 
   251 
   252 goal thy "sflat`(x##xs)= x@@(sflat`xs)"; 
   252 Goal "sflat`(x##xs)= x@@(sflat`xs)"; 
   253 by (rtac trans 1);
   253 by (rtac trans 1);
   254 by (stac sflat_unfold 1);
   254 by (stac sflat_unfold 1);
   255 by (Asm_full_simp_tac 1);
   255 by (Asm_full_simp_tac 1);
   256 by (case_tac "x=UU" 1);
   256 by (case_tac "x=UU" 1);
   257 by (REPEAT (Asm_full_simp_tac 1));
   257 by (REPEAT (Asm_full_simp_tac 1));
   269 \               nil   => nil    \
   269 \               nil   => nil    \
   270 \             | x##xs => (case t2 of     \
   270 \             | x##xs => (case t2 of     \
   271 \                          nil => UU    \
   271 \                          nil => UU    \
   272 \                        | y##ys => <x,y>##(szip`xs`ys)))");
   272 \                        | y##ys => <x,y>##(szip`xs`ys)))");
   273 
   273 
   274 goal thy "szip`nil`y=nil"; 
   274 Goal "szip`nil`y=nil"; 
   275 by (stac szip_unfold 1);
   275 by (stac szip_unfold 1);
   276 by (Simp_tac 1);
   276 by (Simp_tac 1);
   277 qed"szip_nil";
   277 qed"szip_nil";
   278 
   278 
   279 goal thy "szip`UU`y=UU"; 
   279 Goal "szip`UU`y=UU"; 
   280 by (stac szip_unfold 1);
   280 by (stac szip_unfold 1);
   281 by (Simp_tac 1);
   281 by (Simp_tac 1);
   282 qed"szip_UU1";
   282 qed"szip_UU1";
   283 
   283 
   284 goal thy "!!x. x~=nil ==> szip`x`UU=UU"; 
   284 Goal "!!x. x~=nil ==> szip`x`UU=UU"; 
   285 by (stac szip_unfold 1);
   285 by (stac szip_unfold 1);
   286 by (Asm_full_simp_tac 1);
   286 by (Asm_full_simp_tac 1);
   287 by (res_inst_tac [("x","x")] seq.casedist 1);
   287 by (res_inst_tac [("x","x")] seq.casedist 1);
   288 by (REPEAT (Asm_full_simp_tac 1));
   288 by (REPEAT (Asm_full_simp_tac 1));
   289 qed"szip_UU2";
   289 qed"szip_UU2";
   290 
   290 
   291 goal thy "!!x. x~=UU ==> szip`(x##xs)`nil=UU";
   291 Goal "!!x. x~=UU ==> szip`(x##xs)`nil=UU";
   292 by (rtac trans 1);
   292 by (rtac trans 1);
   293 by (stac szip_unfold 1);
   293 by (stac szip_unfold 1);
   294 by (REPEAT (Asm_full_simp_tac 1));
   294 by (REPEAT (Asm_full_simp_tac 1));
   295 qed"szip_cons_nil";
   295 qed"szip_cons_nil";
   296 
   296 
   297 goal thy "!!x.[| x~=UU; y~=UU|] ==> szip`(x##xs)`(y##ys) = <x,y>##szip`xs`ys";
   297 Goal "!!x.[| x~=UU; y~=UU|] ==> szip`(x##xs)`(y##ys) = <x,y>##szip`xs`ys";
   298 by (rtac trans 1);
   298 by (rtac trans 1);
   299 by (stac szip_unfold 1);
   299 by (stac szip_unfold 1);
   300 by (REPEAT (Asm_full_simp_tac 1));
   300 by (REPEAT (Asm_full_simp_tac 1));
   301 qed"szip_cons";
   301 qed"szip_cons";
   302 
   302 
   314 
   314 
   315 (* ------------------------------------------------------------------------------------- *)
   315 (* ------------------------------------------------------------------------------------- *)
   316 
   316 
   317 section "scons, nil";
   317 section "scons, nil";
   318 
   318 
   319 goal thy 
   319 Goal 
   320  "!!x. [|x~=UU;y~=UU|]==> (x##xs=y##ys) = (x=y & xs=ys)";
   320  "!!x. [|x~=UU;y~=UU|]==> (x##xs=y##ys) = (x=y & xs=ys)";
   321 by (rtac iffI 1);
   321 by (rtac iffI 1);
   322 by (etac (hd seq.injects) 1);
   322 by (etac (hd seq.injects) 1);
   323 by Auto_tac;
   323 by Auto_tac;
   324 qed"scons_inject_eq";
   324 qed"scons_inject_eq";
   325 
   325 
   326 goal thy "!!x. nil<<x ==> nil=x";
   326 Goal "!!x. nil<<x ==> nil=x";
   327 by (res_inst_tac [("x","x")] seq.casedist 1);
   327 by (res_inst_tac [("x","x")] seq.casedist 1);
   328 by (hyp_subst_tac 1);
   328 by (hyp_subst_tac 1);
   329 by (etac antisym_less 1);
   329 by (etac antisym_less 1);
   330 by (Asm_full_simp_tac 1);
   330 by (Asm_full_simp_tac 1);
   331 by (Asm_full_simp_tac 1);
   331 by (Asm_full_simp_tac 1);
   336 (* ------------------------------------------------------------------------------------- *)
   336 (* ------------------------------------------------------------------------------------- *)
   337 
   337 
   338 section "sfilter, sforall, sconc";
   338 section "sfilter, sforall, sconc";
   339 
   339 
   340 
   340 
   341 goal thy  "(if b then tr1 else tr2) @@ tr \
   341 Goal  "(if b then tr1 else tr2) @@ tr \
   342         \= (if b then tr1 @@ tr else tr2 @@ tr)";
   342         \= (if b then tr1 @@ tr else tr2 @@ tr)";
   343 by (res_inst_tac [("P","b"),("Q","b")] impCE 1);
   343 by (res_inst_tac [("P","b"),("Q","b")] impCE 1);
   344 by (fast_tac HOL_cs 1);
   344 by (fast_tac HOL_cs 1);
   345 by (REPEAT (Asm_full_simp_tac 1));
   345 by (REPEAT (Asm_full_simp_tac 1));
   346 qed"if_and_sconc";
   346 qed"if_and_sconc";
   347 
   347 
   348 Addsimps [if_and_sconc];
   348 Addsimps [if_and_sconc];
   349 
   349 
   350 
   350 
   351 goal thy "sfilter`P`(x @@ y) = (sfilter`P`x @@ sfilter`P`y)";
   351 Goal "sfilter`P`(x @@ y) = (sfilter`P`x @@ sfilter`P`y)";
   352 
   352 
   353 by (res_inst_tac[("x","x")] seq.ind 1);
   353 by (res_inst_tac[("x","x")] seq.ind 1);
   354 (* adm *)
   354 (* adm *)
   355 by (Simp_tac 1);
   355 by (Simp_tac 1);
   356 (* base cases *)
   356 (* base cases *)
   358 by (Simp_tac 1);
   358 by (Simp_tac 1);
   359 (* main case *)
   359 (* main case *)
   360 by (asm_full_simp_tac (simpset() setloop split_If_tac) 1);
   360 by (asm_full_simp_tac (simpset() setloop split_If_tac) 1);
   361 qed"sfiltersconc";
   361 qed"sfiltersconc";
   362 
   362 
   363 goal thy "sforall P (stakewhile`P`x)";
   363 Goal "sforall P (stakewhile`P`x)";
   364 by (simp_tac (simpset() addsimps [sforall_def]) 1);
   364 by (simp_tac (simpset() addsimps [sforall_def]) 1);
   365 by (res_inst_tac[("x","x")] seq.ind 1);
   365 by (res_inst_tac[("x","x")] seq.ind 1);
   366 (* adm *)
   366 (* adm *)
   367 by (simp_tac (simpset() addsimps [adm_trick_1]) 1);
   367 by (simp_tac (simpset() addsimps [adm_trick_1]) 1);
   368 (* base cases *)
   368 (* base cases *)
   370 by (Simp_tac 1);
   370 by (Simp_tac 1);
   371 (* main case *)
   371 (* main case *)
   372 by (asm_full_simp_tac (simpset() setloop split_If_tac) 1);
   372 by (asm_full_simp_tac (simpset() setloop split_If_tac) 1);
   373 qed"sforallPstakewhileP";
   373 qed"sforallPstakewhileP";
   374 
   374 
   375 goal thy "sforall P (sfilter`P`x)";
   375 Goal "sforall P (sfilter`P`x)";
   376 by (simp_tac (simpset() addsimps [sforall_def]) 1);
   376 by (simp_tac (simpset() addsimps [sforall_def]) 1);
   377 by (res_inst_tac[("x","x")] seq.ind 1);
   377 by (res_inst_tac[("x","x")] seq.ind 1);
   378 (* adm *)
   378 (* adm *)
   379 (* FIX should be refined in _one_ tactic *)
   379 (* FIX should be refined in _one_ tactic *)
   380 by (simp_tac (simpset() addsimps [adm_trick_1]) 1);
   380 by (simp_tac (simpset() addsimps [adm_trick_1]) 1);
   396 (* 1. Finite(nil),   (by definition)                    *)
   396 (* 1. Finite(nil),   (by definition)                    *)
   397 (* 2. ~Finite(UU),                                      *)
   397 (* 2. ~Finite(UU),                                      *)
   398 (* 3. a~=UU==> Finite(a##x)=Finite(x)                  *)
   398 (* 3. a~=UU==> Finite(a##x)=Finite(x)                  *)
   399 (* ----------------------------------------------------  *)
   399 (* ----------------------------------------------------  *)
   400 
   400 
   401 goal thy "Finite x --> x~=UU";
   401 Goal "Finite x --> x~=UU";
   402 by (rtac impI 1);
   402 by (rtac impI 1);
   403 by (etac sfinite.induct 1);
   403 by (etac sfinite.induct 1);
   404  by (Asm_full_simp_tac 1);
   404  by (Asm_full_simp_tac 1);
   405 by (Asm_full_simp_tac 1);
   405 by (Asm_full_simp_tac 1);
   406 qed"Finite_UU_a";
   406 qed"Finite_UU_a";
   407 
   407 
   408 goal thy "~(Finite UU)";
   408 Goal "~(Finite UU)";
   409 by (cut_inst_tac [("x","UU")]Finite_UU_a  1);
   409 by (cut_inst_tac [("x","UU")]Finite_UU_a  1);
   410 by (fast_tac HOL_cs 1);
   410 by (fast_tac HOL_cs 1);
   411 qed"Finite_UU";
   411 qed"Finite_UU";
   412 
   412 
   413 goal thy "Finite x --> a~=UU --> x=a##xs --> Finite xs";
   413 Goal "Finite x --> a~=UU --> x=a##xs --> Finite xs";
   414 by (strip_tac 1);
   414 by (strip_tac 1);
   415 by (etac sfinite.elim 1);
   415 by (etac sfinite.elim 1);
   416 by (fast_tac (HOL_cs addss simpset()) 1);
   416 by (fast_tac (HOL_cs addss simpset()) 1);
   417 by (fast_tac (HOL_cs addSDs seq.injects) 1);
   417 by (fast_tac (HOL_cs addSDs seq.injects) 1);
   418 qed"Finite_cons_a";
   418 qed"Finite_cons_a";
   419 
   419 
   420 goal thy "!!x. a~=UU ==>(Finite (a##x)) = (Finite x)";
   420 Goal "!!x. a~=UU ==>(Finite (a##x)) = (Finite x)";
   421 by (rtac iffI 1);
   421 by (rtac iffI 1);
   422 by (rtac (Finite_cons_a RS mp RS mp RS mp) 1);
   422 by (rtac (Finite_cons_a RS mp RS mp RS mp) 1);
   423 by (REPEAT (assume_tac 1));
   423 by (REPEAT (assume_tac 1));
   424 by (fast_tac HOL_cs 1);
   424 by (fast_tac HOL_cs 1);
   425 by (Asm_full_simp_tac 1);
   425 by (Asm_full_simp_tac 1);
   447         (etac subst 1),
   447         (etac subst 1),
   448         (resolve_tac prems 1)
   448         (resolve_tac prems 1)
   449         ]);
   449         ]);
   450 
   450 
   451 
   451 
   452 goal  thy 
   452 Goal 
   453 "!!P.[|P(UU);P(nil);\
   453 "!!P.[|P(UU);P(nil);\
   454 \  !! x s1.[|x~=UU;P(s1)|] ==> P(x##s1)\
   454 \  !! x s1.[|x~=UU;P(s1)|] ==> P(x##s1)\
   455 \  |] ==> seq_finite(s) --> P(s)";
   455 \  |] ==> seq_finite(s) --> P(s)";
   456 by (rtac seq_finite_ind_lemma 1);
   456 by (rtac seq_finite_ind_lemma 1);
   457 by (etac seq.finite_ind 1);
   457 by (etac seq.finite_ind 1);
   468    aus dem seq_finite Induktionsprinzip.
   468    aus dem seq_finite Induktionsprinzip.
   469    Problem bei admissibility von Finite-->seq_finite!
   469    Problem bei admissibility von Finite-->seq_finite!
   470    Deshalb Finite jetzt induktiv und nicht mehr rekursiv definiert! 
   470    Deshalb Finite jetzt induktiv und nicht mehr rekursiv definiert! 
   471    ------------------------------------------------------------------ *)
   471    ------------------------------------------------------------------ *)
   472 
   472 
   473 goal thy "seq_finite nil";
   473 Goal "seq_finite nil";
   474 by (simp_tac (simpset() addsimps [seq.sfinite_def]) 1);
   474 by (simp_tac (simpset() addsimps [seq.sfinite_def]) 1);
   475 by (res_inst_tac [("x","Suc 0")] exI 1);
   475 by (res_inst_tac [("x","Suc 0")] exI 1);
   476 by (simp_tac (simpset() addsimps seq.rews) 1);
   476 by (simp_tac (simpset() addsimps seq.rews) 1);
   477 qed"seq_finite_nil";
   477 qed"seq_finite_nil";
   478 
   478 
   479 goal thy "seq_finite UU";
   479 Goal "seq_finite UU";
   480 by (simp_tac (simpset() addsimps [seq.sfinite_def]) 1);
   480 by (simp_tac (simpset() addsimps [seq.sfinite_def]) 1);
   481 qed"seq_finite_UU";
   481 qed"seq_finite_UU";
   482 
   482 
   483 Addsimps[seq_finite_nil,seq_finite_UU];
   483 Addsimps[seq_finite_nil,seq_finite_UU];
   484 
   484 
   485 goal HOL.thy "(B-->A) --> (A--> (B-->C))--> (B--> C)";
   485 goal HOL.thy "(B-->A) --> (A--> (B-->C))--> (B--> C)";
   486 by (fast_tac HOL_cs 1);
   486 by (fast_tac HOL_cs 1);
   487 qed"logic_lemma";
   487 qed"logic_lemma";
   488 
   488 
   489 
   489 
   490 goal thy "!!P.[| P nil; \
   490 Goal "!!P.[| P nil; \
   491 \                !!a t. [|a~=UU;Finite t; P t|] ==> P (a##t)|]\
   491 \                !!a t. [|a~=UU;Finite t; P t|] ==> P (a##t)|]\
   492 \            ==> Finite x --> P x";
   492 \            ==> Finite x --> P x";
   493 
   493 
   494 by (rtac (logic_lemma RS mp RS mp) 1);
   494 by (rtac (logic_lemma RS mp RS mp) 1);
   495 by (rtac trf_impl_tf 1);
   495 by (rtac trf_impl_tf 1);
   498 by (simp_tac (simpset() addsimps [Finite_def]) 1);
   498 by (simp_tac (simpset() addsimps [Finite_def]) 1);
   499 by (asm_full_simp_tac (simpset() addsimps [Finite_def]) 1);
   499 by (asm_full_simp_tac (simpset() addsimps [Finite_def]) 1);
   500 qed"Finite_ind";
   500 qed"Finite_ind";
   501 
   501 
   502 
   502 
   503 goal thy "Finite tr --> seq_finite tr";
   503 Goal "Finite tr --> seq_finite tr";
   504 by (rtac seq.ind 1);
   504 by (rtac seq.ind 1);
   505 (* adm *)
   505 (* adm *)
   506 (* hier grosses Problem !!!!!!!!!!!!!!! *)
   506 (* hier grosses Problem !!!!!!!!!!!!!!! *)
   507 
   507 
   508 by (simp_tac (simpset() addsimps [Finite_def]) 2);
   508 by (simp_tac (simpset() addsimps [Finite_def]) 2);