5 Sugared datatype and codatatype constructions. |
5 Sugared datatype and codatatype constructions. |
6 *) |
6 *) |
7 |
7 |
8 signature BNF_FP_DEF_SUGAR = |
8 signature BNF_FP_DEF_SUGAR = |
9 sig |
9 sig |
10 val derive_induct_fold_rec_thms_for_types: int -> BNF_Def.BNF list -> thm -> thm list -> |
10 val derive_induct_fold_rec_thms_for_types: BNF_Def.BNF list -> thm -> thm list -> thm list -> |
11 thm list -> BNF_Def.BNF list -> BNF_Def.BNF list -> typ list -> typ list -> |
11 BNF_Def.BNF list -> BNF_Def.BNF list -> typ list -> typ list -> typ list list list -> |
12 typ list list list -> int list list -> int list -> term list list -> term list list -> |
12 int list list -> int list -> term list list -> term list list -> term list list -> term list |
13 term list list -> term list list list -> thm list list -> term list -> term list -> thm list -> |
13 list list -> thm list list -> term list -> term list -> thm list -> thm list -> Proof.context -> |
14 thm list -> Proof.context -> |
|
15 (thm * thm list * Args.src list) * (thm list list * Args.src list) |
14 (thm * thm list * Args.src list) * (thm list list * Args.src list) |
16 * (thm list list * Args.src list) |
15 * (thm list list * Args.src list) |
17 val derive_coinduct_unfold_corec_thms_for_types: Proof.context -> Proof.context -> int -> |
16 val derive_coinduct_unfold_corec_thms_for_types: Proof.context -> Proof.context -> |
18 BNF_Def.BNF list -> thm -> thm -> thm list -> thm list -> thm list -> BNF_Def.BNF list -> |
17 BNF_Def.BNF list -> thm -> thm -> thm list -> thm list -> thm list -> BNF_Def.BNF list -> |
19 BNF_Def.BNF list -> typ list -> typ list -> typ list -> int list list -> int list list -> |
18 BNF_Def.BNF list -> typ list -> typ list -> typ list -> int list list -> int list list -> |
20 int list -> term list -> term list list -> term list list -> term list list list list -> |
19 int list -> term list -> term list list -> term list list -> term list list list list -> |
21 term list list list list -> term list list -> term list list list list -> |
20 term list list list list -> term list list -> term list list list list -> |
22 term list list list list -> term list list -> thm list list -> |
21 term list list list list -> term list list -> thm list list -> |
197 val live = live_of_bnf bnf; |
196 val live = live_of_bnf bnf; |
198 val rel = mk_rel live Ts Ts (rel_of_bnf bnf); |
197 val rel = mk_rel live Ts Ts (rel_of_bnf bnf); |
199 val Ts' = map domain_type (fst (strip_typeN live (fastype_of rel))); |
198 val Ts' = map domain_type (fst (strip_typeN live (fastype_of rel))); |
200 in Term.list_comb (rel, map build_arg Ts') end; |
199 in Term.list_comb (rel, map build_arg Ts') end; |
201 |
200 |
202 fun derive_induct_fold_rec_thms_for_types nn pre_bnfs ctor_induct ctor_fold_thms ctor_rec_thms |
201 fun derive_induct_fold_rec_thms_for_types pre_bnfs ctor_induct ctor_fold_thms ctor_rec_thms |
203 nesting_bnfs nested_bnfs fpTs Cs ctr_Tsss mss ns gss hss ctrss xsss ctr_defss folds recs |
202 nesting_bnfs nested_bnfs fpTs Cs ctr_Tsss mss ns gss hss ctrss xsss ctr_defss folds recs |
204 fold_defs rec_defs lthy = |
203 fold_defs rec_defs lthy = |
205 let |
204 let |
|
205 val nn = length pre_bnfs; |
|
206 |
206 val pre_map_defs = map map_def_of_bnf pre_bnfs; |
207 val pre_map_defs = map map_def_of_bnf pre_bnfs; |
207 val pre_set_defss = map set_defs_of_bnf pre_bnfs; |
208 val pre_set_defss = map set_defs_of_bnf pre_bnfs; |
208 val nested_map_comp's = map map_comp'_of_bnf nested_bnfs; |
209 val nested_map_comp's = map map_comp'_of_bnf nested_bnfs; |
209 val nested_map_ids'' = map (unfold_thms lthy @{thms id_def} o map_id_of_bnf) nested_bnfs; |
210 val nested_map_ids'' = map (unfold_thms lthy @{thms id_def} o map_id_of_bnf) nested_bnfs; |
210 val nested_set_map's = maps set_map'_of_bnf nested_bnfs; |
211 val nested_set_map's = maps set_map'_of_bnf nested_bnfs; |
350 in |
351 in |
351 ((induct_thm, induct_thms, [induct_case_names_attr]), |
352 ((induct_thm, induct_thms, [induct_case_names_attr]), |
352 (fold_thmss, code_simp_attrs), (rec_thmss, code_simp_attrs)) |
353 (fold_thmss, code_simp_attrs), (rec_thmss, code_simp_attrs)) |
353 end; |
354 end; |
354 |
355 |
355 fun derive_coinduct_unfold_corec_thms_for_types names_lthy0 no_defs_lthy nn pre_bnfs dtor_coinduct |
356 fun derive_coinduct_unfold_corec_thms_for_types names_lthy0 no_defs_lthy pre_bnfs dtor_coinduct |
356 dtor_strong_induct dtor_ctors dtor_unfold_thms dtor_corec_thms nesting_bnfs nested_bnfs fpTs Cs |
357 dtor_strong_induct dtor_ctors dtor_unfold_thms dtor_corec_thms nesting_bnfs nested_bnfs fpTs Cs |
357 As kss mss ns cs cpss pgss crssss cgssss phss csssss chssss ctrss ctr_defss ctr_wrap_ress |
358 As kss mss ns cs cpss pgss crssss cgssss phss csssss chssss ctrss ctr_defss ctr_wrap_ress |
358 unfolds corecs unfold_defs corec_defs lthy = |
359 unfolds corecs unfold_defs corec_defs lthy = |
359 let |
360 let |
|
361 val nn = length pre_bnfs; |
|
362 |
360 val pre_map_defs = map map_def_of_bnf pre_bnfs; |
363 val pre_map_defs = map map_def_of_bnf pre_bnfs; |
361 val pre_rel_defs = map rel_def_of_bnf pre_bnfs; |
364 val pre_rel_defs = map rel_def_of_bnf pre_bnfs; |
362 val nested_map_comp's = map map_comp'_of_bnf nested_bnfs; |
365 val nested_map_comp's = map map_comp'_of_bnf nested_bnfs; |
363 val nested_map_comps'' = map ((fn thm => thm RS sym) o map_comp_of_bnf) nested_bnfs; |
366 val nested_map_comps'' = map ((fn thm => thm RS sym) o map_comp_of_bnf) nested_bnfs; |
364 val nested_map_ids'' = map (unfold_thms lthy @{thms id_def} o map_id_of_bnf) nested_bnfs; |
367 val nested_map_ids'' = map (unfold_thms lthy @{thms id_def} o map_id_of_bnf) nested_bnfs; |
527 map3 (map oo mk_corec_like_tac corec_defs nested_map_comps'' nested_map_comp's |
530 map3 (map oo mk_corec_like_tac corec_defs nested_map_comps'' nested_map_comp's |
528 (nested_map_ids'' @ nesting_map_ids'') nested_map_if_distribs) |
531 (nested_map_ids'' @ nesting_map_ids'') nested_map_if_distribs) |
529 dtor_corec_thms pre_map_defs ctr_defss; |
532 dtor_corec_thms pre_map_defs ctr_defss; |
530 |
533 |
531 fun prove goal tac = |
534 fun prove goal tac = |
532 Goal.prove_sorry lthy [] [] goal (tac o #context) |> Thm.close_derivation; |
535 Goal.prove_sorry lthy [] [] goal (tac o #context) |
|
536 |> Thm.close_derivation; |
533 |
537 |
534 val unfold_thmss = map2 (map2 prove) unfold_goalss unfold_tacss; |
538 val unfold_thmss = map2 (map2 prove) unfold_goalss unfold_tacss; |
535 val corec_thmss = map2 (map2 prove) corec_goalss corec_tacss; |
539 val corec_thmss = map2 (map2 prove) corec_goalss corec_tacss; |
536 |
540 |
537 val filter_safesss = |
541 val filter_safesss = |
1206 (((ctrss, xsss, ctr_defss, ctr_wrap_ress), (folds, recs, fold_defs, rec_defs)), lthy) = |
1210 (((ctrss, xsss, ctr_defss, ctr_wrap_ress), (folds, recs, fold_defs, rec_defs)), lthy) = |
1207 let |
1211 let |
1208 val ((induct_thm, induct_thms, induct_attrs), |
1212 val ((induct_thm, induct_thms, induct_attrs), |
1209 (fold_thmss, fold_attrs), |
1213 (fold_thmss, fold_attrs), |
1210 (rec_thmss, rec_attrs)) = |
1214 (rec_thmss, rec_attrs)) = |
1211 derive_induct_fold_rec_thms_for_types nn pre_bnfs fp_induct fp_fold_thms fp_rec_thms |
1215 derive_induct_fold_rec_thms_for_types pre_bnfs fp_induct fp_fold_thms fp_rec_thms |
1212 nesting_bnfs nested_bnfs fpTs Cs ctr_Tsss mss ns gss hss ctrss xsss ctr_defss folds recs |
1216 nesting_bnfs nested_bnfs fpTs Cs ctr_Tsss mss ns gss hss ctrss xsss ctr_defss folds recs |
1213 fold_defs rec_defs lthy; |
1217 fold_defs rec_defs lthy; |
1214 |
1218 |
1215 fun induct_type_attr T_name = Attrib.internal (K (Induct.induct_type T_name)); |
1219 fun induct_type_attr T_name = Attrib.internal (K (Induct.induct_type T_name)); |
1216 |
1220 |
1238 (unfold_thmss, corec_thmss, corec_like_attrs), |
1242 (unfold_thmss, corec_thmss, corec_like_attrs), |
1239 (safe_unfold_thmss, safe_corec_thmss), |
1243 (safe_unfold_thmss, safe_corec_thmss), |
1240 (disc_unfold_thmss, disc_corec_thmss, disc_corec_like_attrs), |
1244 (disc_unfold_thmss, disc_corec_thmss, disc_corec_like_attrs), |
1241 (disc_unfold_iff_thmss, disc_corec_iff_thmss, disc_corec_like_iff_attrs), |
1245 (disc_unfold_iff_thmss, disc_corec_iff_thmss, disc_corec_like_iff_attrs), |
1242 (sel_unfold_thmss, sel_corec_thmss, sel_corec_like_attrs)) = |
1246 (sel_unfold_thmss, sel_corec_thmss, sel_corec_like_attrs)) = |
1243 derive_coinduct_unfold_corec_thms_for_types names_lthy0 no_defs_lthy nn pre_bnfs fp_induct |
1247 derive_coinduct_unfold_corec_thms_for_types names_lthy0 no_defs_lthy pre_bnfs fp_induct |
1244 fp_strong_induct dtor_ctors fp_fold_thms fp_rec_thms nesting_bnfs nested_bnfs fpTs Cs As |
1248 fp_strong_induct dtor_ctors fp_fold_thms fp_rec_thms nesting_bnfs nested_bnfs fpTs Cs As |
1245 kss mss ns cs cpss pgss crssss cgssss phss csssss chssss ctrss ctr_defss ctr_wrap_ress |
1249 kss mss ns cs cpss pgss crssss cgssss phss csssss chssss ctrss ctr_defss ctr_wrap_ress |
1246 unfolds corecs unfold_defs corec_defs lthy; |
1250 unfolds corecs unfold_defs corec_defs lthy; |
1247 |
1251 |
1248 fun coinduct_type_attr T_name = Attrib.internal (K (Induct.coinduct_type T_name)); |
1252 fun coinduct_type_attr T_name = Attrib.internal (K (Induct.coinduct_type T_name)); |