219 val deads = deads_of_bnf bnf; |
219 val deads = deads_of_bnf bnf; |
220 val dead_Us = |
220 val dead_Us = |
221 map_filter (fn (T, U) => if member (op =) deads T then SOME U else NONE) (Ts ~~ Us); |
221 map_filter (fn (T, U) => if member (op =) deads T then SOME U else NONE) (Ts ~~ Us); |
222 in fold Term.add_tfreesT dead_Us [] end); |
222 in fold Term.add_tfreesT dead_Us [] end); |
223 |
223 |
224 val (pre_bnfs, (fp_res as {xtor_co_iterss = xtor_co_iterss0, xtor_co_induct, dtor_injects, |
224 val fp_absT_infos = map #absT_info fp_sugars0; |
225 dtor_ctors, xtor_co_iter_thmss, ...}, lthy)) = |
225 |
|
226 val ((pre_bnfs, absT_infos), (fp_res as {xtor_co_iterss = xtor_co_iterss0, xtor_co_induct, |
|
227 dtor_injects, dtor_ctors, xtor_co_iter_thmss, ...}, lthy)) = |
226 fp_bnf (construct_mutualized_fp fp fpTs fp_sugars0) fp_bs As' killed_As' fp_eqs |
228 fp_bnf (construct_mutualized_fp fp fpTs fp_sugars0) fp_bs As' killed_As' fp_eqs |
227 no_defs_lthy; |
229 no_defs_lthy0; |
|
230 |
|
231 val fp_abs_inverses = map #abs_inverse fp_absT_infos; |
|
232 val fp_type_definitions = map #type_definition fp_absT_infos; |
|
233 |
|
234 val abss = map #abs absT_infos; |
|
235 val reps = map #rep absT_infos; |
|
236 val absTs = map #absT absT_infos; |
|
237 val repTs = map #repT absT_infos; |
|
238 val abs_inverses = map #abs_inverse absT_infos; |
228 |
239 |
229 val nesting_bnfs = nesty_bnfs lthy ctrXs_Tsss As; |
240 val nesting_bnfs = nesty_bnfs lthy ctrXs_Tsss As; |
230 val nested_bnfs = nesty_bnfs lthy ctrXs_Tsss Xs; |
241 val nested_bnfs = nesty_bnfs lthy ctrXs_Tsss Xs; |
231 |
242 |
232 val ((xtor_co_iterss, iters_args_types, coiters_args_types), _) = |
243 val ((xtor_co_iterss, iters_args_types, coiters_args_types), _) = |
233 mk_co_iters_prelims fp ctr_Tsss fpTs Cs ns mss xtor_co_iterss0 lthy; |
244 mk_co_iters_prelims fp ctr_Tsss fpTs Cs absTs repTs ns mss xtor_co_iterss0 lthy; |
234 |
245 |
235 fun mk_binding b suf = Binding.suffix_name ("_" ^ suf) b; |
246 fun mk_binding b suf = Binding.suffix_name ("_" ^ suf) b; |
236 |
247 |
237 val ((co_iterss, co_iter_defss), lthy) = |
248 val ((co_iterss, co_iter_defss), lthy) = |
238 fold_map2 (fn b => |
249 fold_map2 (fn b => |
239 (if fp = Least_FP then define_iters [foldN, recN] (the iters_args_types) |
250 if fp = Least_FP then |
240 else define_coiters [unfoldN, corecN] (the coiters_args_types)) |
251 define_iters [foldN, recN] (the iters_args_types) (mk_binding b) fpTs Cs reps |
241 (mk_binding b) fpTs Cs) fp_bs xtor_co_iterss lthy |
252 else |
|
253 define_coiters [unfoldN, corecN] (the coiters_args_types) (mk_binding b) fpTs Cs abss) |
|
254 fp_bs xtor_co_iterss lthy |
242 |>> split_list; |
255 |>> split_list; |
243 |
256 |
244 val ((common_co_inducts, co_inductss, un_fold_thmss, co_rec_thmss, disc_unfold_thmss, |
257 val ((common_co_inducts, co_inductss, un_fold_thmss, co_rec_thmss, disc_unfold_thmss, |
245 disc_corec_thmss, sel_unfold_thmsss, sel_corec_thmsss), fp_sugar_thms) = |
258 disc_corec_thmss, sel_unfold_thmsss, sel_corec_thmsss), fp_sugar_thms) = |
246 if fp = Least_FP then |
259 if fp = Least_FP then |
247 derive_induct_iters_thms_for_types pre_bnfs (the iters_args_types) xtor_co_induct |
260 derive_induct_iters_thms_for_types pre_bnfs (the iters_args_types) xtor_co_induct |
248 xtor_co_iter_thmss nesting_bnfs nested_bnfs fpTs Cs Xs ctrXs_Tsss ctrss ctr_defss |
261 xtor_co_iter_thmss nesting_bnfs nested_bnfs fpTs Cs Xs ctrXs_Tsss fp_abs_inverses |
249 co_iterss co_iter_defss lthy |
262 fp_type_definitions abs_inverses ctrss ctr_defss co_iterss co_iter_defss lthy |
250 |> `(fn ((inducts, induct, _), (fold_thmss, rec_thmss, _)) => |
263 |> `(fn ((inducts, induct, _), (fold_thmss, rec_thmss, _)) => |
251 ([induct], [inducts], fold_thmss, rec_thmss, replicate nn [], |
264 ([induct], [inducts], fold_thmss, rec_thmss, replicate nn [], |
252 replicate nn [], replicate nn [], replicate nn [])) |
265 replicate nn [], replicate nn [], replicate nn [])) |
253 ||> (fn info => (SOME info, NONE)) |
266 ||> (fn info => (SOME info, NONE)) |
254 else |
267 else |
255 derive_coinduct_coiters_thms_for_types pre_bnfs (the coiters_args_types) xtor_co_induct |
268 derive_coinduct_coiters_thms_for_types pre_bnfs (the coiters_args_types) xtor_co_induct |
256 dtor_injects dtor_ctors xtor_co_iter_thmss nesting_bnfs fpTs Cs Xs ctrXs_Tsss kss mss |
269 dtor_injects dtor_ctors xtor_co_iter_thmss nesting_bnfs fpTs Cs Xs ctrXs_Tsss kss mss |
257 ns ctr_defss ctr_sugars co_iterss co_iter_defss |
270 ns fp_abs_inverses abs_inverses (fn thm => thm RS @{thm vimage2p_refl}) ctr_defss |
258 (Proof_Context.export lthy no_defs_lthy) lthy |
271 ctr_sugars co_iterss co_iter_defss (Proof_Context.export lthy no_defs_lthy) lthy |
259 |> `(fn ((coinduct_thms_pairs, _), (unfold_thmss, corec_thmss, _), |
272 |> `(fn ((coinduct_thms_pairs, _), (unfold_thmss, corec_thmss, _), |
260 (disc_unfold_thmss, disc_corec_thmss, _), _, |
273 (disc_unfold_thmss, disc_corec_thmss, _), _, |
261 (sel_unfold_thmsss, sel_corec_thmsss, _)) => |
274 (sel_unfold_thmsss, sel_corec_thmsss, _)) => |
262 (map snd coinduct_thms_pairs, map fst coinduct_thms_pairs, unfold_thmss, |
275 (map snd coinduct_thms_pairs, map fst coinduct_thms_pairs, unfold_thmss, |
263 corec_thmss, disc_unfold_thmss, disc_corec_thmss, sel_unfold_thmsss, |
276 corec_thmss, disc_unfold_thmss, disc_corec_thmss, sel_unfold_thmsss, |
264 sel_corec_thmsss)) |
277 sel_corec_thmsss)) |
265 ||> (fn info => (NONE, SOME info)); |
278 ||> (fn info => (NONE, SOME info)); |
266 |
279 |
267 val phi = Proof_Context.export_morphism no_defs_lthy no_defs_lthy0; |
280 val phi = Proof_Context.export_morphism no_defs_lthy no_defs_lthy0; |
268 |
281 |
269 fun mk_target_fp_sugar T X kk pre_bnf ctrXs_Tss ctr_defs ctr_sugar co_iters maps co_inducts |
282 fun mk_target_fp_sugar T X kk pre_bnf absT_info ctrXs_Tss ctr_defs ctr_sugar co_iters maps |
270 un_fold_thms co_rec_thms disc_unfold_thms disc_corec_thms sel_unfold_thmss |
283 co_inducts un_fold_thms co_rec_thms disc_unfold_thms disc_corec_thms sel_unfold_thmss |
271 sel_corec_thmss = |
284 sel_corec_thmss = |
272 {T = T, X = X, fp = fp, fp_res = fp_res, fp_res_index = kk, pre_bnf = pre_bnf, |
285 {T = T, X = X, fp = fp, fp_res = fp_res, fp_res_index = kk, pre_bnf = pre_bnf, |
273 nested_bnfs = nested_bnfs, nesting_bnfs = nesting_bnfs, ctrXs_Tss = ctrXs_Tss, |
286 absT_info = absT_info, nested_bnfs = nested_bnfs, nesting_bnfs = nesting_bnfs, |
274 ctr_defs = ctr_defs, ctr_sugar = ctr_sugar, co_iters = co_iters, maps = maps, |
287 ctrXs_Tss = ctrXs_Tss, ctr_defs = ctr_defs, ctr_sugar = ctr_sugar, co_iters = co_iters, |
275 common_co_inducts = common_co_inducts, co_inducts = co_inducts, |
288 maps = maps, common_co_inducts = common_co_inducts, co_inducts = co_inducts, |
276 co_iter_thmss = [un_fold_thms, co_rec_thms], |
289 co_iter_thmss = [un_fold_thms, co_rec_thms], |
277 disc_co_iterss = [disc_unfold_thms, disc_corec_thms], |
290 disc_co_iterss = [disc_unfold_thms, disc_corec_thms], |
278 sel_co_itersss = [sel_unfold_thmss, sel_corec_thmss]} |
291 sel_co_itersss = [sel_unfold_thmss, sel_corec_thmss]} |
279 |> morph_fp_sugar phi; |
292 |> morph_fp_sugar phi; |
280 |
293 |
281 val target_fp_sugars = |
294 val target_fp_sugars = |
282 map16 mk_target_fp_sugar fpTs Xs kks pre_bnfs ctrXs_Tsss ctr_defss ctr_sugars co_iterss |
295 map17 mk_target_fp_sugar fpTs Xs kks pre_bnfs absT_infos ctrXs_Tsss ctr_defss ctr_sugars |
283 mapss (transpose co_inductss) un_fold_thmss co_rec_thmss disc_unfold_thmss |
296 co_iterss mapss (transpose co_inductss) un_fold_thmss co_rec_thmss disc_unfold_thmss |
284 disc_corec_thmss sel_unfold_thmsss sel_corec_thmsss; |
297 disc_corec_thmss sel_unfold_thmsss sel_corec_thmsss; |
285 |
298 |
286 val n2m_sugar = (target_fp_sugars, fp_sugar_thms); |
299 val n2m_sugar = (target_fp_sugars, fp_sugar_thms); |
287 in |
300 in |
288 (n2m_sugar, lthy |> register_n2m_sugar key n2m_sugar) |
301 (n2m_sugar, lthy |> register_n2m_sugar key n2m_sugar) |