src/HOLCF/Dnat.ML
changeset 1267 bca91b4e1710
parent 1168 74be52691d62
equal deleted inserted replaced
1266:3ae9fe3c0f68 1267:bca91b4e1710
    24 
    24 
    25 fun prover defs thm =  prove_goalw Dnat.thy defs thm
    25 fun prover defs thm =  prove_goalw Dnat.thy defs thm
    26  (fn prems =>
    26  (fn prems =>
    27 	[
    27 	[
    28 	(cut_facts_tac prems 1),
    28 	(cut_facts_tac prems 1),
    29 	(asm_simp_tac (HOLCF_ss addsimps 
    29 	(asm_simp_tac (!simpset addsimps 
    30 		(dnat_rews @ [dnat_abs_iso,dnat_rep_iso])) 1)
    30 		(dnat_rews @ [dnat_abs_iso,dnat_rep_iso])) 1)
    31 	]);
    31 	]);
    32 
    32 
    33 val dnat_copy = 
    33 val dnat_copy = 
    34 	[
    34 	[
    46 
    46 
    47 qed_goalw "Exh_dnat" Dnat.thy [dsucc_def,dzero_def]
    47 qed_goalw "Exh_dnat" Dnat.thy [dsucc_def,dzero_def]
    48 	"n = UU | n = dzero | (? x . x~=UU & n = dsucc`x)"
    48 	"n = UU | n = dzero | (? x . x~=UU & n = dsucc`x)"
    49  (fn prems =>
    49  (fn prems =>
    50 	[
    50 	[
    51 	(simp_tac HOLCF_ss  1),
    51 	(Simp_tac  1),
    52 	(rtac (dnat_rep_iso RS subst) 1),
    52 	(rtac (dnat_rep_iso RS subst) 1),
    53 	(res_inst_tac [("p","dnat_rep`n")] ssumE 1),
    53 	(res_inst_tac [("p","dnat_rep`n")] ssumE 1),
    54 	(rtac disjI1 1),
    54 	(rtac disjI1 1),
    55 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
    55 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
    56 	(rtac (disjI1 RS disjI2) 1),
    56 	(rtac (disjI1 RS disjI2) 1),
    57 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
    57 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
    58 	(res_inst_tac [("p","x")] oneE 1),
    58 	(res_inst_tac [("p","x")] oneE 1),
    59 	(contr_tac 1),
    59 	(contr_tac 1),
    60 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
    60 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
    61 	(rtac (disjI2 RS disjI2) 1),
    61 	(rtac (disjI2 RS disjI2) 1),
    62 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
    62 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
    63 	(fast_tac HOL_cs 1)
    63 	(fast_tac HOL_cs 1)
    64 	]);
    64 	]);
    65 
    65 
    66 qed_goal "dnatE" Dnat.thy 
    66 qed_goal "dnatE" Dnat.thy 
    67  "[| n=UU ==> Q; n=dzero ==> Q; !!x.[|n=dsucc`x;x~=UU|]==>Q|]==>Q"
    67  "[| n=UU ==> Q; n=dzero ==> Q; !!x.[|n=dsucc`x;x~=UU|]==>Q|]==>Q"
    83 
    83 
    84 fun prover defs thm =  prove_goalw Dnat.thy defs thm
    84 fun prover defs thm =  prove_goalw Dnat.thy defs thm
    85  (fn prems =>
    85  (fn prems =>
    86 	[
    86 	[
    87 	(cut_facts_tac prems 1),
    87 	(cut_facts_tac prems 1),
    88 	(asm_simp_tac (HOLCF_ss addsimps 
    88 	(asm_simp_tac (!simpset addsimps 
    89 		(dnat_rews @ [dnat_abs_iso,dnat_rep_iso])) 1)
    89 		(dnat_rews @ [dnat_abs_iso,dnat_rep_iso])) 1)
    90 	]);
    90 	]);
    91 
    91 
    92 
    92 
    93 val dnat_when = [
    93 val dnat_when = [
   104 (* ------------------------------------------------------------------------*)
   104 (* ------------------------------------------------------------------------*)
   105 
   105 
   106 fun prover defs thm = prove_goalw Dnat.thy defs thm
   106 fun prover defs thm = prove_goalw Dnat.thy defs thm
   107  (fn prems =>
   107  (fn prems =>
   108 	[
   108 	[
   109 	(simp_tac (HOLCF_ss addsimps dnat_rews) 1)
   109 	(simp_tac (!simpset addsimps dnat_rews) 1)
   110 	]);
   110 	]);
   111 
   111 
   112 val dnat_discsel = [
   112 val dnat_discsel = [
   113 	prover [is_dzero_def] "is_dzero`UU=UU",
   113 	prover [is_dzero_def] "is_dzero`UU=UU",
   114 	prover [is_dsucc_def] "is_dsucc`UU=UU",
   114 	prover [is_dsucc_def] "is_dsucc`UU=UU",
   118 
   118 
   119 fun prover defs thm = prove_goalw Dnat.thy defs thm
   119 fun prover defs thm = prove_goalw Dnat.thy defs thm
   120  (fn prems =>
   120  (fn prems =>
   121 	[
   121 	[
   122 	(cut_facts_tac prems 1),
   122 	(cut_facts_tac prems 1),
   123 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1)
   123 	(asm_simp_tac (!simpset addsimps dnat_rews) 1)
   124 	]);
   124 	]);
   125 
   125 
   126 val dnat_discsel = [
   126 val dnat_discsel = [
   127 	prover [is_dzero_def] "is_dzero`dzero=TT",
   127 	prover [is_dzero_def] "is_dzero`dzero=TT",
   128 	prover [is_dzero_def] "n~=UU ==>is_dzero`(dsucc`n)=FF",
   128 	prover [is_dzero_def] "n~=UU ==>is_dzero`(dsucc`n)=FF",
   140 
   140 
   141 fun prover contr thm = prove_goal Dnat.thy thm
   141 fun prover contr thm = prove_goal Dnat.thy thm
   142  (fn prems =>
   142  (fn prems =>
   143 	[
   143 	[
   144 	(res_inst_tac [("P1",contr)] classical3 1),
   144 	(res_inst_tac [("P1",contr)] classical3 1),
   145 	(simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   145 	(simp_tac (!simpset addsimps dnat_rews) 1),
   146 	(dtac sym 1),
   146 	(dtac sym 1),
   147 	(asm_simp_tac HOLCF_ss  1),
   147 	(Asm_simp_tac  1),
   148 	(simp_tac (HOLCF_ss addsimps (prems @ dnat_rews)) 1)
   148 	(simp_tac (!simpset addsimps (prems @ dnat_rews)) 1)
   149 	]);
   149 	]);
   150 
   150 
   151 val dnat_constrdef = [
   151 val dnat_constrdef = [
   152 	prover "is_dzero`UU ~= UU" "dzero~=UU",
   152 	prover "is_dzero`UU ~= UU" "dzero~=UU",
   153 	prover "is_dsucc`UU ~= UU" "n~=UU ==> dsucc`n~=UU"
   153 	prover "is_dsucc`UU ~= UU" "n~=UU ==> dsucc`n~=UU"
   155 
   155 
   156 
   156 
   157 fun prover defs thm = prove_goalw Dnat.thy defs thm
   157 fun prover defs thm = prove_goalw Dnat.thy defs thm
   158  (fn prems =>
   158  (fn prems =>
   159 	[
   159 	[
   160 	(simp_tac (HOLCF_ss addsimps dnat_rews) 1)
   160 	(simp_tac (!simpset addsimps dnat_rews) 1)
   161 	]);
   161 	]);
   162 
   162 
   163 val dnat_constrdef = [
   163 val dnat_constrdef = [
   164 	prover [dsucc_def] "dsucc`UU=UU"
   164 	prover [dsucc_def] "dsucc`UU=UU"
   165 	] @ dnat_constrdef;
   165 	] @ dnat_constrdef;
   176 	[
   176 	[
   177 	(res_inst_tac [("P1","TT << FF")] classical3 1),
   177 	(res_inst_tac [("P1","TT << FF")] classical3 1),
   178 	(resolve_tac dist_less_tr 1),
   178 	(resolve_tac dist_less_tr 1),
   179 	(dres_inst_tac [("fo5","is_dzero")] monofun_cfun_arg 1),
   179 	(dres_inst_tac [("fo5","is_dzero")] monofun_cfun_arg 1),
   180 	(etac box_less 1),
   180 	(etac box_less 1),
   181 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   181 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
   182 	(res_inst_tac [("Q","n=UU")] classical2 1),
   182 	(res_inst_tac [("Q","n=UU")] classical2 1),
   183 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   183 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
   184 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1)
   184 	(asm_simp_tac (!simpset addsimps dnat_rews) 1)
   185 	]);
   185 	]);
   186 
   186 
   187 val dnat_dist_less = [temp];
   187 val dnat_dist_less = [temp];
   188 
   188 
   189 val temp = prove_goal Dnat.thy  "n~=UU ==> ~dsucc`n << dzero"
   189 val temp = prove_goal Dnat.thy  "n~=UU ==> ~dsucc`n << dzero"
   192 	(cut_facts_tac prems 1),
   192 	(cut_facts_tac prems 1),
   193 	(res_inst_tac [("P1","TT << FF")] classical3 1),
   193 	(res_inst_tac [("P1","TT << FF")] classical3 1),
   194 	(resolve_tac dist_less_tr 1),
   194 	(resolve_tac dist_less_tr 1),
   195 	(dres_inst_tac [("fo5","is_dsucc")] monofun_cfun_arg 1),
   195 	(dres_inst_tac [("fo5","is_dsucc")] monofun_cfun_arg 1),
   196 	(etac box_less 1),
   196 	(etac box_less 1),
   197 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   197 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
   198 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1)
   198 	(asm_simp_tac (!simpset addsimps dnat_rews) 1)
   199 	]);
   199 	]);
   200 
   200 
   201 val dnat_dist_less = temp::dnat_dist_less;
   201 val dnat_dist_less = temp::dnat_dist_less;
   202 
   202 
   203 val temp = prove_goal Dnat.thy   "dzero ~= dsucc`n"
   203 val temp = prove_goal Dnat.thy   "dzero ~= dsucc`n"
   204  (fn prems =>
   204  (fn prems =>
   205 	[
   205 	[
   206 	(res_inst_tac [("Q","n=UU")] classical2 1),
   206 	(res_inst_tac [("Q","n=UU")] classical2 1),
   207 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   207 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
   208 	(res_inst_tac [("P1","TT = FF")] classical3 1),
   208 	(res_inst_tac [("P1","TT = FF")] classical3 1),
   209 	(resolve_tac dist_eq_tr 1),
   209 	(resolve_tac dist_eq_tr 1),
   210 	(dres_inst_tac [("f","is_dzero")] cfun_arg_cong 1),
   210 	(dres_inst_tac [("f","is_dzero")] cfun_arg_cong 1),
   211 	(etac box_equals 1),
   211 	(etac box_equals 1),
   212 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   212 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
   213 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1)
   213 	(asm_simp_tac (!simpset addsimps dnat_rews) 1)
   214 	]);
   214 	]);
   215 
   215 
   216 val dnat_dist_eq = [temp, temp RS not_sym];
   216 val dnat_dist_eq = [temp, temp RS not_sym];
   217 
   217 
   218 val dnat_rews = dnat_dist_less @ dnat_dist_eq @ dnat_rews;
   218 val dnat_rews = dnat_dist_less @ dnat_dist_eq @ dnat_rews;
   228  (fn prems =>
   228  (fn prems =>
   229 	[
   229 	[
   230 	(cut_facts_tac prems 1),
   230 	(cut_facts_tac prems 1),
   231 	(dres_inst_tac [("fo5","dnat_when`c`(LAM x.x)")] monofun_cfun_arg 1),
   231 	(dres_inst_tac [("fo5","dnat_when`c`(LAM x.x)")] monofun_cfun_arg 1),
   232 	(etac box_less 1),
   232 	(etac box_less 1),
   233 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   233 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
   234 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1)
   234 	(asm_simp_tac (!simpset addsimps dnat_rews) 1)
   235 	])
   235 	])
   236 	];
   236 	];
   237 
   237 
   238 (* ------------------------------------------------------------------------*)
   238 (* ------------------------------------------------------------------------*)
   239 (* Injectivity                                                             *)
   239 (* Injectivity                                                             *)
   246  (fn prems =>
   246  (fn prems =>
   247 	[
   247 	[
   248 	(cut_facts_tac prems 1),
   248 	(cut_facts_tac prems 1),
   249 	(dres_inst_tac [("f","dnat_when`c`(LAM x.x)")] cfun_arg_cong 1),
   249 	(dres_inst_tac [("f","dnat_when`c`(LAM x.x)")] cfun_arg_cong 1),
   250 	(etac box_equals 1),
   250 	(etac box_equals 1),
   251 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   251 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
   252 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1)
   252 	(asm_simp_tac (!simpset addsimps dnat_rews) 1)
   253 	])
   253 	])
   254 	];
   254 	];
   255 
   255 
   256 (* ------------------------------------------------------------------------*)
   256 (* ------------------------------------------------------------------------*)
   257 (* definedness for  discriminators and  selectors                          *)
   257 (* definedness for  discriminators and  selectors                          *)
   262  (fn prems =>
   262  (fn prems =>
   263 	[
   263 	[
   264 	(cut_facts_tac prems 1),
   264 	(cut_facts_tac prems 1),
   265 	(rtac dnatE 1),
   265 	(rtac dnatE 1),
   266 	(contr_tac 1),
   266 	(contr_tac 1),
   267 	(REPEAT (asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1))
   267 	(REPEAT (asm_simp_tac (!simpset addsimps dnat_rews) 1))
   268 	]);
   268 	]);
   269 
   269 
   270 val dnat_discsel_def = 
   270 val dnat_discsel_def = 
   271 	[
   271 	[
   272 	prover  "n~=UU ==> is_dzero`n ~= UU",
   272 	prover  "n~=UU ==> is_dzero`n ~= UU",
   281 (* ------------------------------------------------------------------------*)
   281 (* ------------------------------------------------------------------------*)
   282 val temp = prove_goalw Dnat.thy [dnat_take_def] "dnat_take n`UU = UU"
   282 val temp = prove_goalw Dnat.thy [dnat_take_def] "dnat_take n`UU = UU"
   283  (fn prems =>
   283  (fn prems =>
   284 	[
   284 	[
   285 	(res_inst_tac [("n","n")] natE 1),
   285 	(res_inst_tac [("n","n")] natE 1),
   286 	(asm_simp_tac iterate_ss 1),
   286 	(Asm_simp_tac 1),
   287 	(asm_simp_tac iterate_ss 1),
   287 	(Asm_simp_tac 1),
   288 	(simp_tac (HOLCF_ss addsimps dnat_rews) 1)
   288 	(simp_tac (!simpset addsimps dnat_rews) 1)
   289 	]);
   289 	]);
   290 
   290 
   291 val dnat_take = [temp];
   291 val dnat_take = [temp];
   292 
   292 
   293 val temp = prove_goalw Dnat.thy [dnat_take_def] "dnat_take 0`xs = UU"
   293 val temp = prove_goalw Dnat.thy [dnat_take_def] "dnat_take 0`xs = UU"
   294  (fn prems =>
   294  (fn prems =>
   295 	[
   295 	[
   296 	(asm_simp_tac iterate_ss 1)
   296 	(Asm_simp_tac 1)
   297 	]);
   297 	]);
   298 
   298 
   299 val dnat_take = temp::dnat_take;
   299 val dnat_take = temp::dnat_take;
   300 
   300 
   301 val temp = prove_goalw Dnat.thy [dnat_take_def]
   301 val temp = prove_goalw Dnat.thy [dnat_take_def]
   302 	"dnat_take (Suc n)`dzero=dzero"
   302 	"dnat_take (Suc n)`dzero=dzero"
   303  (fn prems =>
   303  (fn prems =>
   304 	[
   304 	[
   305 	(asm_simp_tac iterate_ss 1),
   305 	(Asm_simp_tac 1),
   306 	(simp_tac (HOLCF_ss addsimps dnat_rews) 1)
   306 	(simp_tac (!simpset addsimps dnat_rews) 1)
   307 	]);
   307 	]);
   308 
   308 
   309 val dnat_take = temp::dnat_take;
   309 val dnat_take = temp::dnat_take;
   310 
   310 
   311 val temp = prove_goalw Dnat.thy [dnat_take_def]
   311 val temp = prove_goalw Dnat.thy [dnat_take_def]
   312   "dnat_take (Suc n)`(dsucc`xs)=dsucc`(dnat_take n ` xs)"
   312   "dnat_take (Suc n)`(dsucc`xs)=dsucc`(dnat_take n ` xs)"
   313  (fn prems =>
   313  (fn prems =>
   314 	[
   314 	[
   315 	(res_inst_tac [("Q","xs=UU")] classical2 1),
   315 	(res_inst_tac [("Q","xs=UU")] classical2 1),
   316 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   316 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
   317 	(asm_simp_tac iterate_ss 1),
   317 	(Asm_simp_tac 1),
   318 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   318 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
   319 	(res_inst_tac [("n","n")] natE 1),
   319 	(res_inst_tac [("n","n")] natE 1),
   320 	(asm_simp_tac iterate_ss 1),
   320 	(Asm_simp_tac 1),
   321 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   321 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
   322 	(asm_simp_tac iterate_ss 1),
   322 	(Asm_simp_tac 1),
   323 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   323 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
   324 	(asm_simp_tac iterate_ss 1),
   324 	(Asm_simp_tac 1),
   325 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1)
   325 	(asm_simp_tac (!simpset addsimps dnat_rews) 1)
   326 	]);
   326 	]);
   327 
   327 
   328 val dnat_take = temp::dnat_take;
   328 val dnat_take = temp::dnat_take;
   329 
   329 
   330 val dnat_rews = dnat_take @ dnat_rews;
   330 val dnat_rews = dnat_take @ dnat_rews;
   363 "dnat_bisim R ==> ! p q. R p q --> dnat_take n`p = dnat_take n`q"
   363 "dnat_bisim R ==> ! p q. R p q --> dnat_take n`p = dnat_take n`q"
   364  (fn prems =>
   364  (fn prems =>
   365 	[
   365 	[
   366 	(cut_facts_tac prems 1),
   366 	(cut_facts_tac prems 1),
   367 	(nat_ind_tac "n" 1),
   367 	(nat_ind_tac "n" 1),
   368 	(simp_tac (HOLCF_ss addsimps dnat_take) 1),
   368 	(simp_tac (!simpset addsimps dnat_take) 1),
   369 	(strip_tac 1),
   369 	(strip_tac 1),
   370 	((etac allE 1) THEN (etac allE 1) THEN (etac (mp RS disjE) 1)),
   370 	((etac allE 1) THEN (etac allE 1) THEN (etac (mp RS disjE) 1)),
   371 	(atac 1),
   371 	(atac 1),
   372 	(asm_simp_tac (HOLCF_ss addsimps dnat_take) 1),
   372 	(asm_simp_tac (!simpset addsimps dnat_take) 1),
   373 	(etac disjE 1),
   373 	(etac disjE 1),
   374 	(asm_simp_tac (HOLCF_ss addsimps dnat_take) 1),
   374 	(asm_simp_tac (!simpset addsimps dnat_take) 1),
   375 	(etac exE 1),
   375 	(etac exE 1),
   376 	(etac exE 1),
   376 	(etac exE 1),
   377 	(asm_simp_tac (HOLCF_ss addsimps dnat_take) 1),
   377 	(asm_simp_tac (!simpset addsimps dnat_take) 1),
   378 	(REPEAT (etac conjE 1)),
   378 	(REPEAT (etac conjE 1)),
   379 	(rtac cfun_arg_cong 1),
   379 	(rtac cfun_arg_cong 1),
   380 	(fast_tac HOL_cs 1)
   380 	(fast_tac HOL_cs 1)
   381 	]);
   381 	]);
   382 
   382 
   407 	(rtac fix_ind 1),
   407 	(rtac fix_ind 1),
   408 	(rtac adm_all2 1),
   408 	(rtac adm_all2 1),
   409 	(rtac adm_subst 1),
   409 	(rtac adm_subst 1),
   410 	(cont_tacR 1),
   410 	(cont_tacR 1),
   411 	(resolve_tac prems 1),
   411 	(resolve_tac prems 1),
   412 	(simp_tac HOLCF_ss 1),
   412 	(Simp_tac 1),
   413 	(resolve_tac prems 1),
   413 	(resolve_tac prems 1),
   414 	(strip_tac 1),
   414 	(strip_tac 1),
   415 	(res_inst_tac [("n","xa")] dnatE 1),
   415 	(res_inst_tac [("n","xa")] dnatE 1),
   416 	(asm_simp_tac (HOLCF_ss addsimps dnat_copy) 1),
   416 	(asm_simp_tac (!simpset addsimps dnat_copy) 1),
   417 	(resolve_tac prems 1),
   417 	(resolve_tac prems 1),
   418 	(asm_simp_tac (HOLCF_ss addsimps dnat_copy) 1),
   418 	(asm_simp_tac (!simpset addsimps dnat_copy) 1),
   419 	(resolve_tac prems 1),
   419 	(resolve_tac prems 1),
   420 	(asm_simp_tac (HOLCF_ss addsimps dnat_copy) 1),
   420 	(asm_simp_tac (!simpset addsimps dnat_copy) 1),
   421 	(res_inst_tac [("Q","x`xb=UU")] classical2 1),
   421 	(res_inst_tac [("Q","x`xb=UU")] classical2 1),
   422 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   422 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
   423 	(resolve_tac prems 1),
   423 	(resolve_tac prems 1),
   424 	(eresolve_tac prems 1),
   424 	(eresolve_tac prems 1),
   425 	(etac spec 1)
   425 	(etac spec 1)
   426 	]);
   426 	]);
   427 *)
   427 *)
   431 \  !! s1.[|s1~=UU;P(s1)|] ==> P(dsucc`s1)\
   431 \  !! s1.[|s1~=UU;P(s1)|] ==> P(dsucc`s1)\
   432 \  |] ==> !s.P(dnat_take n`s)"
   432 \  |] ==> !s.P(dnat_take n`s)"
   433  (fn prems =>
   433  (fn prems =>
   434 	[
   434 	[
   435 	(nat_ind_tac "n" 1),
   435 	(nat_ind_tac "n" 1),
   436 	(simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   436 	(simp_tac (!simpset addsimps dnat_rews) 1),
   437 	(resolve_tac prems 1),
   437 	(resolve_tac prems 1),
   438 	(rtac allI 1),
   438 	(rtac allI 1),
   439 	(res_inst_tac [("n","s")] dnatE 1),
   439 	(res_inst_tac [("n","s")] dnatE 1),
   440 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   440 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
   441 	(resolve_tac prems 1),
   441 	(resolve_tac prems 1),
   442 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   442 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
   443 	(resolve_tac prems 1),
   443 	(resolve_tac prems 1),
   444 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   444 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
   445 	(res_inst_tac [("Q","dnat_take n1`x=UU")] classical2 1),
   445 	(res_inst_tac [("Q","dnat_take n1`x=UU")] classical2 1),
   446 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   446 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
   447 	(resolve_tac prems 1),
   447 	(resolve_tac prems 1),
   448 	(resolve_tac prems 1),
   448 	(resolve_tac prems 1),
   449 	(atac 1),
   449 	(atac 1),
   450 	(etac spec 1)
   450 	(etac spec 1)
   451 	]);
   451 	]);
   453 qed_goal "dnat_all_finite_lemma1" Dnat.thy
   453 qed_goal "dnat_all_finite_lemma1" Dnat.thy
   454 "!s.dnat_take n`s=UU |dnat_take n`s=s"
   454 "!s.dnat_take n`s=UU |dnat_take n`s=s"
   455  (fn prems =>
   455  (fn prems =>
   456 	[
   456 	[
   457 	(nat_ind_tac "n" 1),
   457 	(nat_ind_tac "n" 1),
   458 	(simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   458 	(simp_tac (!simpset addsimps dnat_rews) 1),
   459 	(rtac allI 1),
   459 	(rtac allI 1),
   460 	(res_inst_tac [("n","s")] dnatE 1),
   460 	(res_inst_tac [("n","s")] dnatE 1),
   461 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   461 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
   462 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   462 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
   463 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   463 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
   464 	(eres_inst_tac [("x","x")] allE 1),
   464 	(eres_inst_tac [("x","x")] allE 1),
   465 	(etac disjE 1),
   465 	(etac disjE 1),
   466 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   466 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
   467 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1)
   467 	(asm_simp_tac (!simpset addsimps dnat_rews) 1)
   468 	]);
   468 	]);
   469 
   469 
   470 qed_goal "dnat_all_finite_lemma2" Dnat.thy "? n.dnat_take n`s=s"
   470 qed_goal "dnat_all_finite_lemma2" Dnat.thy "? n.dnat_take n`s=s"
   471  (fn prems =>
   471  (fn prems =>
   472 	[
   472 	[
   473 	(res_inst_tac [("Q","s=UU")] classical2 1),
   473 	(res_inst_tac [("Q","s=UU")] classical2 1),
   474 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   474 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
   475 	(subgoal_tac "(!n.dnat_take(n)`s=UU) |(? n.dnat_take(n)`s=s)" 1),
   475 	(subgoal_tac "(!n.dnat_take(n)`s=UU) |(? n.dnat_take(n)`s=s)" 1),
   476 	(etac disjE 1),
   476 	(etac disjE 1),
   477 	(eres_inst_tac [("P","s=UU")] notE 1),
   477 	(eres_inst_tac [("P","s=UU")] notE 1),
   478 	(rtac dnat_take_lemma 1),
   478 	(rtac dnat_take_lemma 1),
   479 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   479 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
   480 	(atac 1),
   480 	(atac 1),
   481 	(subgoal_tac "!n.!s.dnat_take(n)`s=UU |dnat_take(n)`s=s" 1),
   481 	(subgoal_tac "!n.!s.dnat_take(n)`s=UU |dnat_take(n)`s=s" 1),
   482 	(fast_tac HOL_cs 1),
   482 	(fast_tac HOL_cs 1),
   483 	(rtac allI 1),
   483 	(rtac allI 1),
   484 	(rtac dnat_all_finite_lemma1 1)
   484 	(rtac dnat_all_finite_lemma1 1)
   506 	(res_inst_tac [("s","x")] dnat_ind 1),
   506 	(res_inst_tac [("s","x")] dnat_ind 1),
   507 	(fast_tac HOL_cs 1),
   507 	(fast_tac HOL_cs 1),
   508 	(rtac allI 1),
   508 	(rtac allI 1),
   509 	(res_inst_tac [("n","y")] dnatE 1),
   509 	(res_inst_tac [("n","y")] dnatE 1),
   510 	(fast_tac (HOL_cs addSIs [UU_I]) 1),
   510 	(fast_tac (HOL_cs addSIs [UU_I]) 1),
   511 	(asm_simp_tac HOLCF_ss 1),
   511 	(Asm_simp_tac 1),
   512 	(asm_simp_tac (HOLCF_ss addsimps dnat_dist_less) 1),
   512 	(asm_simp_tac (!simpset addsimps dnat_dist_less) 1),
   513 	(rtac allI 1),
   513 	(rtac allI 1),
   514 	(res_inst_tac [("n","y")] dnatE 1),
   514 	(res_inst_tac [("n","y")] dnatE 1),
   515 	(fast_tac (HOL_cs addSIs [UU_I]) 1),
   515 	(fast_tac (HOL_cs addSIs [UU_I]) 1),
   516 	(asm_simp_tac (HOLCF_ss addsimps dnat_dist_less) 1),
   516 	(asm_simp_tac (!simpset addsimps dnat_dist_less) 1),
   517 	(asm_simp_tac (HOLCF_ss addsimps dnat_rews) 1),
   517 	(asm_simp_tac (!simpset addsimps dnat_rews) 1),
   518 	(strip_tac 1),
   518 	(strip_tac 1),
   519 	(subgoal_tac "s1<<xa" 1),
   519 	(subgoal_tac "s1<<xa" 1),
   520 	(etac allE 1),
   520 	(etac allE 1),
   521 	(dtac mp 1),
   521 	(dtac mp 1),
   522 	(atac 1),
   522 	(atac 1),
   523 	(etac disjE 1),
   523 	(etac disjE 1),
   524 	(contr_tac 1),
   524 	(contr_tac 1),
   525 	(asm_simp_tac HOLCF_ss 1),
   525 	(Asm_simp_tac 1),
   526 	(resolve_tac  dnat_invert 1),
   526 	(resolve_tac  dnat_invert 1),
   527 	(REPEAT (atac 1))
   527 	(REPEAT (atac 1))
   528 	]);
   528 	]);
   529 
   529 
   530 
   530