src/HOLCF/Dlist.ML
changeset 1267 bca91b4e1710
parent 1168 74be52691d62
equal deleted inserted replaced
1266:3ae9fe3c0f68 1267:bca91b4e1710
    23 (* ------------------------------------------------------------------------*)
    23 (* ------------------------------------------------------------------------*)
    24 
    24 
    25 val temp = prove_goalw Dlist.thy  [dlist_copy_def] "dlist_copy`f`UU=UU"
    25 val temp = prove_goalw Dlist.thy  [dlist_copy_def] "dlist_copy`f`UU=UU"
    26  (fn prems =>
    26  (fn prems =>
    27 	[
    27 	[
    28 	(asm_simp_tac (HOLCF_ss addsimps 
    28 	(asm_simp_tac (!simpset addsimps 
    29 		(dlist_rews @ [dlist_abs_iso,dlist_rep_iso])) 1)
    29 		(dlist_rews @ [dlist_abs_iso,dlist_rep_iso])) 1)
    30 	]);
    30 	]);
    31 
    31 
    32 val dlist_copy = [temp];
    32 val dlist_copy = [temp];
    33 
    33 
    34 
    34 
    35 val temp = prove_goalw Dlist.thy  [dlist_copy_def,dnil_def] 
    35 val temp = prove_goalw Dlist.thy  [dlist_copy_def,dnil_def] 
    36     "dlist_copy`f`dnil=dnil"
    36     "dlist_copy`f`dnil=dnil"
    37  (fn prems =>
    37  (fn prems =>
    38 	[
    38 	[
    39 	(asm_simp_tac (HOLCF_ss addsimps 
    39 	(asm_simp_tac (!simpset addsimps 
    40 		(dlist_rews @ [dlist_abs_iso,dlist_rep_iso])) 1)
    40 		(dlist_rews @ [dlist_abs_iso,dlist_rep_iso])) 1)
    41 	]);
    41 	]);
    42 
    42 
    43 val dlist_copy = temp :: dlist_copy;
    43 val dlist_copy = temp :: dlist_copy;
    44 
    44 
    46 val temp = prove_goalw Dlist.thy  [dlist_copy_def,dcons_def] 
    46 val temp = prove_goalw Dlist.thy  [dlist_copy_def,dcons_def] 
    47 	"xl~=UU ==> dlist_copy`f`(dcons`x`xl)= dcons`x`(f`xl)"
    47 	"xl~=UU ==> dlist_copy`f`(dcons`x`xl)= dcons`x`(f`xl)"
    48  (fn prems =>
    48  (fn prems =>
    49 	[
    49 	[
    50 	(cut_facts_tac prems 1),
    50 	(cut_facts_tac prems 1),
    51 	(asm_simp_tac (HOLCF_ss addsimps 
    51 	(asm_simp_tac (!simpset addsimps 
    52 		(dlist_rews @ [dlist_abs_iso,dlist_rep_iso])) 1),
    52 		(dlist_rews @ [dlist_abs_iso,dlist_rep_iso])) 1),
    53 	(res_inst_tac [("Q","x=UU")] classical2 1),
    53 	(res_inst_tac [("Q","x=UU")] classical2 1),
    54 	(asm_simp_tac HOLCF_ss  1),
    54 	(Asm_simp_tac  1),
    55 	(asm_simp_tac (HOLCF_ss addsimps [defined_spair]) 1)
    55 	(asm_simp_tac (!simpset addsimps [defined_spair]) 1)
    56 	]);
    56 	]);
    57 
    57 
    58 val dlist_copy = temp :: dlist_copy;
    58 val dlist_copy = temp :: dlist_copy;
    59 
    59 
    60 val dlist_rews =  dlist_copy @ dlist_rews; 
    60 val dlist_rews =  dlist_copy @ dlist_rews; 
    65 
    65 
    66 qed_goalw "Exh_dlist" Dlist.thy [dcons_def,dnil_def]
    66 qed_goalw "Exh_dlist" Dlist.thy [dcons_def,dnil_def]
    67 	"l = UU | l = dnil | (? x xl. x~=UU &xl~=UU & l = dcons`x`xl)"
    67 	"l = UU | l = dnil | (? x xl. x~=UU &xl~=UU & l = dcons`x`xl)"
    68  (fn prems =>
    68  (fn prems =>
    69 	[
    69 	[
    70 	(simp_tac HOLCF_ss  1),
    70 	(Simp_tac 1),
    71 	(rtac (dlist_rep_iso RS subst) 1),
    71 	(rtac (dlist_rep_iso RS subst) 1),
    72 	(res_inst_tac [("p","dlist_rep`l")] ssumE 1),
    72 	(res_inst_tac [("p","dlist_rep`l")] ssumE 1),
    73 	(rtac disjI1 1),
    73 	(rtac disjI1 1),
    74 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
    74 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
    75 	(rtac disjI2 1),
    75 	(rtac disjI2 1),
    76 	(rtac disjI1 1),
    76 	(rtac disjI1 1),
    77 	(res_inst_tac [("p","x")] oneE 1),
    77 	(res_inst_tac [("p","x")] oneE 1),
    78 	(contr_tac 1),
    78 	(contr_tac 1),
    79 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
    79 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
    80 	(rtac disjI2 1),
    80 	(rtac disjI2 1),
    81 	(rtac disjI2 1),
    81 	(rtac disjI2 1),
    82 	(res_inst_tac [("p","y")] sprodE 1),
    82 	(res_inst_tac [("p","y")] sprodE 1),
    83 	(contr_tac 1),
    83 	(contr_tac 1),
    84 	(rtac exI 1),
    84 	(rtac exI 1),
    85 	(rtac exI 1),
    85 	(rtac exI 1),
    86 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
    86 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
    87 	(fast_tac HOL_cs 1)
    87 	(fast_tac HOL_cs 1)
    88 	]);
    88 	]);
    89 
    89 
    90 
    90 
    91 qed_goal "dlistE" Dlist.thy 
    91 qed_goal "dlistE" Dlist.thy 
   109 (* ------------------------------------------------------------------------*)
   109 (* ------------------------------------------------------------------------*)
   110 
   110 
   111 val temp = prove_goalw  Dlist.thy  [dlist_when_def] "dlist_when`f1`f2`UU=UU"
   111 val temp = prove_goalw  Dlist.thy  [dlist_when_def] "dlist_when`f1`f2`UU=UU"
   112  (fn prems =>
   112  (fn prems =>
   113 	[
   113 	[
   114 	(asm_simp_tac (HOLCF_ss addsimps [dlist_iso_strict]) 1)
   114 	(asm_simp_tac (!simpset addsimps [dlist_iso_strict]) 1)
   115 	]);
   115 	]);
   116 
   116 
   117 val dlist_when = [temp];
   117 val dlist_when = [temp];
   118 
   118 
   119 val temp = prove_goalw  Dlist.thy [dlist_when_def,dnil_def]
   119 val temp = prove_goalw  Dlist.thy [dlist_when_def,dnil_def]
   120  "dlist_when`f1`f2`dnil= f1"
   120  "dlist_when`f1`f2`dnil= f1"
   121  (fn prems =>
   121  (fn prems =>
   122 	[
   122 	[
   123 	(asm_simp_tac (HOLCF_ss addsimps [dlist_abs_iso]) 1)
   123 	(asm_simp_tac (!simpset addsimps [dlist_abs_iso]) 1)
   124 	]);
   124 	]);
   125 
   125 
   126 val dlist_when = temp::dlist_when;
   126 val dlist_when = temp::dlist_when;
   127 
   127 
   128 val temp = prove_goalw  Dlist.thy [dlist_when_def,dcons_def]
   128 val temp = prove_goalw  Dlist.thy [dlist_when_def,dcons_def]
   129  "[|x~=UU;xl~=UU|] ==> dlist_when`f1`f2`(dcons`x`xl)= f2`x`xl"
   129  "[|x~=UU;xl~=UU|] ==> dlist_when`f1`f2`(dcons`x`xl)= f2`x`xl"
   130  (fn prems =>
   130  (fn prems =>
   131 	[
   131 	[
   132 	(cut_facts_tac prems 1),
   132 	(cut_facts_tac prems 1),
   133 	(asm_simp_tac (HOLCF_ss addsimps [dlist_abs_iso,defined_spair]) 1)
   133 	(asm_simp_tac (!simpset addsimps [dlist_abs_iso,defined_spair]) 1)
   134 	]);
   134 	]);
   135 
   135 
   136 val dlist_when = temp::dlist_when;
   136 val dlist_when = temp::dlist_when;
   137 
   137 
   138 val dlist_rews = dlist_when @ dlist_rews;
   138 val dlist_rews = dlist_when @ dlist_rews;
   142 (* ------------------------------------------------------------------------*)
   142 (* ------------------------------------------------------------------------*)
   143 
   143 
   144 fun prover defs thm = prove_goalw Dlist.thy defs thm
   144 fun prover defs thm = prove_goalw Dlist.thy defs thm
   145  (fn prems =>
   145  (fn prems =>
   146 	[
   146 	[
   147 	(simp_tac (HOLCF_ss addsimps dlist_rews) 1)
   147 	(simp_tac (!simpset addsimps dlist_rews) 1)
   148 	]);
   148 	]);
   149 
   149 
   150 val dlist_discsel = [
   150 val dlist_discsel = [
   151 	prover [is_dnil_def] "is_dnil`UU=UU",
   151 	prover [is_dnil_def] "is_dnil`UU=UU",
   152 	prover [is_dcons_def] "is_dcons`UU=UU",
   152 	prover [is_dcons_def] "is_dcons`UU=UU",
   156 
   156 
   157 fun prover defs thm = prove_goalw Dlist.thy defs thm
   157 fun prover defs thm = prove_goalw Dlist.thy defs thm
   158  (fn prems =>
   158  (fn prems =>
   159 	[
   159 	[
   160 	(cut_facts_tac prems 1),
   160 	(cut_facts_tac prems 1),
   161 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1)
   161 	(asm_simp_tac (!simpset addsimps dlist_rews) 1)
   162 	]);
   162 	]);
   163 
   163 
   164 val dlist_discsel = [
   164 val dlist_discsel = [
   165 prover [is_dnil_def,is_dcons_def,dhd_def,dtl_def]
   165 prover [is_dnil_def,is_dcons_def,dhd_def,dtl_def]
   166   "is_dnil`dnil=TT",
   166   "is_dnil`dnil=TT",
   187 
   187 
   188 fun prover contr thm = prove_goal Dlist.thy thm
   188 fun prover contr thm = prove_goal Dlist.thy thm
   189  (fn prems =>
   189  (fn prems =>
   190 	[
   190 	[
   191 	(res_inst_tac [("P1",contr)] classical3 1),
   191 	(res_inst_tac [("P1",contr)] classical3 1),
   192 	(simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   192 	(simp_tac (!simpset addsimps dlist_rews) 1),
   193 	(dtac sym 1),
   193 	(dtac sym 1),
   194 	(asm_simp_tac HOLCF_ss  1),
   194 	(Asm_simp_tac  1),
   195 	(simp_tac (HOLCF_ss addsimps (prems @ dlist_rews)) 1)
   195 	(simp_tac (!simpset addsimps (prems @ dlist_rews)) 1)
   196 	]);
   196 	]);
   197 
   197 
   198 
   198 
   199 val dlist_constrdef = [
   199 val dlist_constrdef = [
   200 prover "is_dnil`(UU::'a dlist) ~= UU" "dnil~=(UU::'a dlist)",
   200 prover "is_dnil`(UU::'a dlist) ~= UU" "dnil~=(UU::'a dlist)",
   204 
   204 
   205 
   205 
   206 fun prover defs thm = prove_goalw Dlist.thy defs thm
   206 fun prover defs thm = prove_goalw Dlist.thy defs thm
   207  (fn prems =>
   207  (fn prems =>
   208 	[
   208 	[
   209 	(simp_tac (HOLCF_ss addsimps dlist_rews) 1)
   209 	(simp_tac (!simpset addsimps dlist_rews) 1)
   210 	]);
   210 	]);
   211 
   211 
   212 val dlist_constrdef = [
   212 val dlist_constrdef = [
   213 	prover [dcons_def] "dcons`UU`xl=UU",
   213 	prover [dcons_def] "dcons`UU`xl=UU",
   214 	prover [dcons_def] "dcons`x`UU=UU"
   214 	prover [dcons_def] "dcons`x`UU=UU"
   226 	[
   226 	[
   227 	(res_inst_tac [("P1","TT << FF")] classical3 1),
   227 	(res_inst_tac [("P1","TT << FF")] classical3 1),
   228 	(resolve_tac dist_less_tr 1),
   228 	(resolve_tac dist_less_tr 1),
   229 	(dres_inst_tac [("fo5","is_dnil")] monofun_cfun_arg 1),
   229 	(dres_inst_tac [("fo5","is_dnil")] monofun_cfun_arg 1),
   230 	(etac box_less 1),
   230 	(etac box_less 1),
   231 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   231 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   232 	(res_inst_tac [("Q","(x::'a)=UU")] classical2 1),
   232 	(res_inst_tac [("Q","(x::'a)=UU")] classical2 1),
   233 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   233 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   234 	(res_inst_tac [("Q","(xl ::'a dlist)=UU")] classical2 1),
   234 	(res_inst_tac [("Q","(xl ::'a dlist)=UU")] classical2 1),
   235 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   235 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   236 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1)
   236 	(asm_simp_tac (!simpset addsimps dlist_rews) 1)
   237 	]);
   237 	]);
   238 
   238 
   239 val dlist_dist_less = [temp];
   239 val dlist_dist_less = [temp];
   240 
   240 
   241 val temp = prove_goal Dlist.thy  "[|x~=UU;xl~=UU|]==>~ dcons`x`xl << dnil"
   241 val temp = prove_goal Dlist.thy  "[|x~=UU;xl~=UU|]==>~ dcons`x`xl << dnil"
   244 	(cut_facts_tac prems 1),
   244 	(cut_facts_tac prems 1),
   245 	(res_inst_tac [("P1","TT << FF")] classical3 1),
   245 	(res_inst_tac [("P1","TT << FF")] classical3 1),
   246 	(resolve_tac dist_less_tr 1),
   246 	(resolve_tac dist_less_tr 1),
   247 	(dres_inst_tac [("fo5","is_dcons")] monofun_cfun_arg 1),
   247 	(dres_inst_tac [("fo5","is_dcons")] monofun_cfun_arg 1),
   248 	(etac box_less 1),
   248 	(etac box_less 1),
   249 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   249 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   250 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1)
   250 	(asm_simp_tac (!simpset addsimps dlist_rews) 1)
   251 	]);
   251 	]);
   252 
   252 
   253 val dlist_dist_less = temp::dlist_dist_less;
   253 val dlist_dist_less = temp::dlist_dist_less;
   254 
   254 
   255 val temp = prove_goal Dlist.thy  "dnil ~= dcons`x`xl"
   255 val temp = prove_goal Dlist.thy  "dnil ~= dcons`x`xl"
   256  (fn prems =>
   256  (fn prems =>
   257 	[
   257 	[
   258 	(res_inst_tac [("Q","x=UU")] classical2 1),
   258 	(res_inst_tac [("Q","x=UU")] classical2 1),
   259 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   259 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   260 	(res_inst_tac [("Q","xl=UU")] classical2 1),
   260 	(res_inst_tac [("Q","xl=UU")] classical2 1),
   261 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   261 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   262 	(res_inst_tac [("P1","TT = FF")] classical3 1),
   262 	(res_inst_tac [("P1","TT = FF")] classical3 1),
   263 	(resolve_tac dist_eq_tr 1),
   263 	(resolve_tac dist_eq_tr 1),
   264 	(dres_inst_tac [("f","is_dnil")] cfun_arg_cong 1),
   264 	(dres_inst_tac [("f","is_dnil")] cfun_arg_cong 1),
   265 	(etac box_equals 1),
   265 	(etac box_equals 1),
   266 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   266 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   267 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1)
   267 	(asm_simp_tac (!simpset addsimps dlist_rews) 1)
   268 	]);
   268 	]);
   269 
   269 
   270 val dlist_dist_eq = [temp,temp RS not_sym];
   270 val dlist_dist_eq = [temp,temp RS not_sym];
   271 
   271 
   272 val dlist_rews = dlist_dist_less @ dlist_dist_eq @ dlist_rews;
   272 val dlist_rews = dlist_dist_less @ dlist_dist_eq @ dlist_rews;
   281 	[
   281 	[
   282 	(cut_facts_tac prems 1),
   282 	(cut_facts_tac prems 1),
   283 	(rtac conjI 1),
   283 	(rtac conjI 1),
   284 	(dres_inst_tac [("fo5","dlist_when`UU`(LAM x l.x)")] monofun_cfun_arg 1),
   284 	(dres_inst_tac [("fo5","dlist_when`UU`(LAM x l.x)")] monofun_cfun_arg 1),
   285 	(etac box_less 1),
   285 	(etac box_less 1),
   286 	(asm_simp_tac (HOLCF_ss addsimps dlist_when) 1),
   286 	(asm_simp_tac (!simpset addsimps dlist_when) 1),
   287 	(asm_simp_tac (HOLCF_ss addsimps dlist_when) 1),
   287 	(asm_simp_tac (!simpset addsimps dlist_when) 1),
   288 	(dres_inst_tac [("fo5","dlist_when`UU`(LAM x l.l)")] monofun_cfun_arg 1),
   288 	(dres_inst_tac [("fo5","dlist_when`UU`(LAM x l.l)")] monofun_cfun_arg 1),
   289 	(etac box_less 1),
   289 	(etac box_less 1),
   290 	(asm_simp_tac (HOLCF_ss addsimps dlist_when) 1),
   290 	(asm_simp_tac (!simpset addsimps dlist_when) 1),
   291 	(asm_simp_tac (HOLCF_ss addsimps dlist_when) 1)
   291 	(asm_simp_tac (!simpset addsimps dlist_when) 1)
   292 	]);
   292 	]);
   293 
   293 
   294 val dlist_invert =[temp];
   294 val dlist_invert =[temp];
   295 
   295 
   296 (* ------------------------------------------------------------------------*)
   296 (* ------------------------------------------------------------------------*)
   303 	[
   303 	[
   304 	(cut_facts_tac prems 1),
   304 	(cut_facts_tac prems 1),
   305 	(rtac conjI 1),
   305 	(rtac conjI 1),
   306 	(dres_inst_tac [("f","dlist_when`UU`(LAM x l.x)")] cfun_arg_cong 1),
   306 	(dres_inst_tac [("f","dlist_when`UU`(LAM x l.x)")] cfun_arg_cong 1),
   307 	(etac box_equals 1),
   307 	(etac box_equals 1),
   308 	(asm_simp_tac (HOLCF_ss addsimps dlist_when) 1),
   308 	(asm_simp_tac (!simpset addsimps dlist_when) 1),
   309 	(asm_simp_tac (HOLCF_ss addsimps dlist_when) 1),
   309 	(asm_simp_tac (!simpset addsimps dlist_when) 1),
   310 	(dres_inst_tac [("f","dlist_when`UU`(LAM x l.l)")] cfun_arg_cong 1),
   310 	(dres_inst_tac [("f","dlist_when`UU`(LAM x l.l)")] cfun_arg_cong 1),
   311 	(etac box_equals 1),
   311 	(etac box_equals 1),
   312 	(asm_simp_tac (HOLCF_ss addsimps dlist_when) 1),
   312 	(asm_simp_tac (!simpset addsimps dlist_when) 1),
   313 	(asm_simp_tac (HOLCF_ss addsimps dlist_when) 1)
   313 	(asm_simp_tac (!simpset addsimps dlist_when) 1)
   314 	]);
   314 	]);
   315 
   315 
   316 val dlist_inject = [temp];
   316 val dlist_inject = [temp];
   317  
   317  
   318 
   318 
   324  (fn prems =>
   324  (fn prems =>
   325 	[
   325 	[
   326 	(cut_facts_tac prems 1),
   326 	(cut_facts_tac prems 1),
   327 	(rtac dlistE 1),
   327 	(rtac dlistE 1),
   328 	(contr_tac 1),
   328 	(contr_tac 1),
   329 	(REPEAT (asm_simp_tac (HOLCF_ss addsimps dlist_discsel) 1))
   329 	(REPEAT (asm_simp_tac (!simpset addsimps dlist_discsel) 1))
   330 	]);
   330 	]);
   331 
   331 
   332 val dlist_discsel_def = 
   332 val dlist_discsel_def = 
   333 	[
   333 	[
   334 	prover "l~=UU ==> is_dnil`l~=UU", 
   334 	prover "l~=UU ==> is_dnil`l~=UU", 
   344 qed_goal "dhd2" Dlist.thy "xl~=UU ==> dhd`(dcons`x`xl)=x"
   344 qed_goal "dhd2" Dlist.thy "xl~=UU ==> dhd`(dcons`x`xl)=x"
   345  (fn prems =>
   345  (fn prems =>
   346 	[
   346 	[
   347 	(cut_facts_tac prems 1),
   347 	(cut_facts_tac prems 1),
   348 	(res_inst_tac [("Q","x=UU")] classical2 1),
   348 	(res_inst_tac [("Q","x=UU")] classical2 1),
   349 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   349 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   350 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1)
   350 	(asm_simp_tac (!simpset addsimps dlist_rews) 1)
   351 	]);
   351 	]);
   352 
   352 
   353 qed_goal "dtl2" Dlist.thy "x~=UU ==> dtl`(dcons`x`xl)=xl"
   353 qed_goal "dtl2" Dlist.thy "x~=UU ==> dtl`(dcons`x`xl)=xl"
   354  (fn prems =>
   354  (fn prems =>
   355 	[
   355 	[
   356 	(cut_facts_tac prems 1),
   356 	(cut_facts_tac prems 1),
   357 	(res_inst_tac [("Q","xl=UU")] classical2 1),
   357 	(res_inst_tac [("Q","xl=UU")] classical2 1),
   358 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   358 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   359 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1)
   359 	(asm_simp_tac (!simpset addsimps dlist_rews) 1)
   360 	]);
   360 	]);
   361 
   361 
   362 val dlist_rews = dhd2 :: dtl2 :: dlist_rews;
   362 val dlist_rews = dhd2 :: dtl2 :: dlist_rews;
   363 
   363 
   364 (* ------------------------------------------------------------------------*)
   364 (* ------------------------------------------------------------------------*)
   367 
   367 
   368 val temp = prove_goalw Dlist.thy [dlist_take_def] "dlist_take n`UU=UU"
   368 val temp = prove_goalw Dlist.thy [dlist_take_def] "dlist_take n`UU=UU"
   369  (fn prems =>
   369  (fn prems =>
   370 	[
   370 	[
   371 	(res_inst_tac [("n","n")] natE 1),
   371 	(res_inst_tac [("n","n")] natE 1),
   372 	(asm_simp_tac iterate_ss 1),
   372 	(Asm_simp_tac 1),
   373 	(asm_simp_tac iterate_ss 1),
   373 	(Asm_simp_tac 1),
   374 	(simp_tac (HOLCF_ss addsimps dlist_rews) 1)
   374 	(simp_tac (!simpset addsimps dlist_rews) 1)
   375 	]);
   375 	]);
   376 
   376 
   377 val dlist_take = [temp];
   377 val dlist_take = [temp];
   378 
   378 
   379 val temp = prove_goalw Dlist.thy [dlist_take_def] "dlist_take 0`xs=UU"
   379 val temp = prove_goalw Dlist.thy [dlist_take_def] "dlist_take 0`xs=UU"
   380  (fn prems =>
   380  (fn prems =>
   381 	[
   381 	[
   382 	(asm_simp_tac iterate_ss 1)
   382 	(Asm_simp_tac 1)
   383 	]);
   383 	]);
   384 
   384 
   385 val dlist_take = temp::dlist_take;
   385 val dlist_take = temp::dlist_take;
   386 
   386 
   387 val temp = prove_goalw Dlist.thy [dlist_take_def]
   387 val temp = prove_goalw Dlist.thy [dlist_take_def]
   388 	"dlist_take (Suc n)`dnil=dnil"
   388 	"dlist_take (Suc n)`dnil=dnil"
   389  (fn prems =>
   389  (fn prems =>
   390 	[
   390 	[
   391 	(asm_simp_tac iterate_ss 1),
   391 	(Asm_simp_tac 1),
   392 	(simp_tac (HOLCF_ss addsimps dlist_rews) 1)
   392 	(simp_tac (!simpset addsimps dlist_rews) 1)
   393 	]);
   393 	]);
   394 
   394 
   395 val dlist_take = temp::dlist_take;
   395 val dlist_take = temp::dlist_take;
   396 
   396 
   397 val temp = prove_goalw Dlist.thy [dlist_take_def]
   397 val temp = prove_goalw Dlist.thy [dlist_take_def]
   398   "dlist_take (Suc n)`(dcons`x`xl)= dcons`x`(dlist_take n`xl)"
   398   "dlist_take (Suc n)`(dcons`x`xl)= dcons`x`(dlist_take n`xl)"
   399  (fn prems =>
   399  (fn prems =>
   400 	[
   400 	[
   401 	(res_inst_tac [("Q","x=UU")] classical2 1),
   401 	(res_inst_tac [("Q","x=UU")] classical2 1),
   402 	(asm_simp_tac iterate_ss 1),
   402 	(Asm_simp_tac 1),
   403 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   403 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   404 	(res_inst_tac [("Q","xl=UU")] classical2 1),
   404 	(res_inst_tac [("Q","xl=UU")] classical2 1),
   405 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   405 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   406 	(asm_simp_tac iterate_ss 1),
   406 	(Asm_simp_tac 1),
   407 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   407 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   408 	(res_inst_tac [("n","n")] natE 1),
   408 	(res_inst_tac [("n","n")] natE 1),
   409 	(asm_simp_tac iterate_ss 1),
   409 	(Asm_simp_tac 1),
   410 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   410 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   411 	(asm_simp_tac iterate_ss 1),
   411 	(Asm_simp_tac 1),
   412 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   412 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   413 	(asm_simp_tac iterate_ss 1),
   413 	(Asm_simp_tac 1),
   414 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1)
   414 	(asm_simp_tac (!simpset addsimps dlist_rews) 1)
   415 	]);
   415 	]);
   416 
   416 
   417 val dlist_take = temp::dlist_take;
   417 val dlist_take = temp::dlist_take;
   418 
   418 
   419 val dlist_rews = dlist_take @ dlist_rews;
   419 val dlist_rews = dlist_take @ dlist_rews;
   451 "dlist_bisim R ==> ! p q. R p q --> dlist_take n`p = dlist_take n`q"
   451 "dlist_bisim R ==> ! p q. R p q --> dlist_take n`p = dlist_take n`q"
   452  (fn prems =>
   452  (fn prems =>
   453 	[
   453 	[
   454 	(cut_facts_tac prems 1),
   454 	(cut_facts_tac prems 1),
   455 	(nat_ind_tac "n" 1),
   455 	(nat_ind_tac "n" 1),
   456 	(simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   456 	(simp_tac (!simpset addsimps dlist_rews) 1),
   457 	(strip_tac 1),
   457 	(strip_tac 1),
   458 	((etac allE 1) THEN (etac allE 1) THEN (etac (mp RS disjE) 1)),
   458 	((etac allE 1) THEN (etac allE 1) THEN (etac (mp RS disjE) 1)),
   459 	(atac 1),
   459 	(atac 1),
   460 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   460 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   461 	(etac disjE 1),
   461 	(etac disjE 1),
   462 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   462 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   463 	(etac exE 1),
   463 	(etac exE 1),
   464 	(etac exE 1),
   464 	(etac exE 1),
   465 	(etac exE 1),
   465 	(etac exE 1),
   466 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   466 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   467 	(REPEAT (etac conjE 1)),
   467 	(REPEAT (etac conjE 1)),
   468 	(rtac cfun_arg_cong 1),
   468 	(rtac cfun_arg_cong 1),
   469 	(fast_tac HOL_cs 1)
   469 	(fast_tac HOL_cs 1)
   470 	]);
   470 	]);
   471 
   471 
   487 \  !! x l1.[|x~=UU;l1~=UU;P(l1)|] ==> P(dcons`x`l1)\
   487 \  !! x l1.[|x~=UU;l1~=UU;P(l1)|] ==> P(dcons`x`l1)\
   488 \  |] ==> !l.P(dlist_take n`l)"
   488 \  |] ==> !l.P(dlist_take n`l)"
   489  (fn prems =>
   489  (fn prems =>
   490 	[
   490 	[
   491 	(nat_ind_tac "n" 1),
   491 	(nat_ind_tac "n" 1),
   492 	(simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   492 	(simp_tac (!simpset addsimps dlist_rews) 1),
   493 	(resolve_tac prems 1),
   493 	(resolve_tac prems 1),
   494 	(rtac allI 1),
   494 	(rtac allI 1),
   495 	(res_inst_tac [("l","l")] dlistE 1),
   495 	(res_inst_tac [("l","l")] dlistE 1),
   496 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   496 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   497 	(resolve_tac prems 1),
   497 	(resolve_tac prems 1),
   498 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   498 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   499 	(resolve_tac prems 1),
   499 	(resolve_tac prems 1),
   500 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   500 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   501 	(res_inst_tac [("Q","dlist_take n1`xl=UU")] classical2 1),
   501 	(res_inst_tac [("Q","dlist_take n1`xl=UU")] classical2 1),
   502 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   502 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   503 	(resolve_tac prems 1),
   503 	(resolve_tac prems 1),
   504 	(resolve_tac prems 1),
   504 	(resolve_tac prems 1),
   505 	(atac 1),
   505 	(atac 1),
   506 	(atac 1),
   506 	(atac 1),
   507 	(etac spec 1)
   507 	(etac spec 1)
   510 qed_goal "dlist_all_finite_lemma1" Dlist.thy
   510 qed_goal "dlist_all_finite_lemma1" Dlist.thy
   511 "!l.dlist_take n`l=UU |dlist_take n`l=l"
   511 "!l.dlist_take n`l=UU |dlist_take n`l=l"
   512  (fn prems =>
   512  (fn prems =>
   513 	[
   513 	[
   514 	(nat_ind_tac "n" 1),
   514 	(nat_ind_tac "n" 1),
   515 	(simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   515 	(simp_tac (!simpset addsimps dlist_rews) 1),
   516 	(rtac allI 1),
   516 	(rtac allI 1),
   517 	(res_inst_tac [("l","l")] dlistE 1),
   517 	(res_inst_tac [("l","l")] dlistE 1),
   518 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   518 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   519 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   519 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   520 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   520 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   521 	(eres_inst_tac [("x","xl")] allE 1),
   521 	(eres_inst_tac [("x","xl")] allE 1),
   522 	(etac disjE 1),
   522 	(etac disjE 1),
   523 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   523 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   524 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1)
   524 	(asm_simp_tac (!simpset addsimps dlist_rews) 1)
   525 	]);
   525 	]);
   526 
   526 
   527 qed_goal "dlist_all_finite_lemma2" Dlist.thy "? n.dlist_take n`l=l"
   527 qed_goal "dlist_all_finite_lemma2" Dlist.thy "? n.dlist_take n`l=l"
   528  (fn prems =>
   528  (fn prems =>
   529 	[
   529 	[
   530 	(res_inst_tac [("Q","l=UU")] classical2 1),
   530 	(res_inst_tac [("Q","l=UU")] classical2 1),
   531 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   531 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   532 	(subgoal_tac "(!n.dlist_take n`l=UU) |(? n.dlist_take n`l = l)" 1),
   532 	(subgoal_tac "(!n.dlist_take n`l=UU) |(? n.dlist_take n`l = l)" 1),
   533 	(etac disjE 1),
   533 	(etac disjE 1),
   534 	(eres_inst_tac [("P","l=UU")] notE 1),
   534 	(eres_inst_tac [("P","l=UU")] notE 1),
   535 	(rtac dlist_take_lemma 1),
   535 	(rtac dlist_take_lemma 1),
   536 	(asm_simp_tac (HOLCF_ss addsimps dlist_rews) 1),
   536 	(asm_simp_tac (!simpset addsimps dlist_rews) 1),
   537 	(atac 1),
   537 	(atac 1),
   538 	(subgoal_tac "!n.!l.dlist_take n`l=UU |dlist_take n`l=l" 1),
   538 	(subgoal_tac "!n.!l.dlist_take n`l=UU |dlist_take n`l=l" 1),
   539 	(fast_tac HOL_cs 1),
   539 	(fast_tac HOL_cs 1),
   540 	(rtac allI 1),
   540 	(rtac allI 1),
   541 	(rtac dlist_all_finite_lemma1 1)
   541 	(rtac dlist_all_finite_lemma1 1)