22 |
22 |
23 fun is_new_datatype _ @{type_name nat} = true |
23 fun is_new_datatype _ @{type_name nat} = true |
24 | is_new_datatype ctxt s = |
24 | is_new_datatype ctxt s = |
25 (case fp_sugar_of ctxt s of SOME {fp = Least_FP, ...} => true | _ => false); |
25 (case fp_sugar_of ctxt s of SOME {fp = Least_FP, ...} => true | _ => false); |
26 |
26 |
27 fun basic_lfp_sugar_of C fun_arg_Tsss ({T, fp_res_index, fp_ctr_sugar = {ctr_sugar, ...}, co_rec = recx, |
27 fun basic_lfp_sugar_of C fun_arg_Tsss ({T, fp_res_index, fp_ctr_sugar = {ctr_sugar, ...}, |
28 fp_co_induct_sugar = {co_rec_thms = rec_thms, ...}, ...} : fp_sugar) = |
28 fp_co_induct_sugar = {co_rec = recx, co_rec_thms = rec_thms, ...}, ...} : fp_sugar) = |
29 {T = T, fp_res_index = fp_res_index, C = C, fun_arg_Tsss = fun_arg_Tsss, ctr_sugar = ctr_sugar, |
29 {T = T, fp_res_index = fp_res_index, C = C, fun_arg_Tsss = fun_arg_Tsss, ctr_sugar = ctr_sugar, |
30 recx = recx, rec_thms = rec_thms}; |
30 recx = recx, rec_thms = rec_thms}; |
31 |
31 |
32 fun basic_lfp_sugars_of _ [@{typ nat}] _ _ lthy = |
32 fun basic_lfp_sugars_of _ [@{typ nat}] _ _ lthy = |
33 ([], [0], [nat_basic_lfp_sugar], [], [], TrueI (*dummy*), [], false, lthy) |
33 ([], [0], [nat_basic_lfp_sugar], [], [], TrueI (*dummy*), [], false, lthy) |
34 | basic_lfp_sugars_of bs arg_Ts callers callssss0 lthy0 = |
34 | basic_lfp_sugars_of bs arg_Ts callers callssss0 lthy0 = |
35 let |
35 let |
36 val ((missing_arg_Ts, perm0_kks, |
36 val ((missing_arg_Ts, perm0_kks, |
37 fp_sugars as {fp_nesting_bnfs, common_co_inducts = [common_induct], ...} :: _, |
37 fp_sugars as {fp_nesting_bnfs, fp_co_induct_sugar = {common_co_inducts = [common_induct], ...}, ...} :: _, |
38 (lfp_sugar_thms, _)), lthy) = |
38 (lfp_sugar_thms, _)), lthy) = |
39 nested_to_mutual_fps (K true) Least_FP bs arg_Ts callers callssss0 lthy0; |
39 nested_to_mutual_fps (K true) Least_FP bs arg_Ts callers callssss0 lthy0; |
40 |
40 |
41 val induct_attrs = (case lfp_sugar_thms of SOME ((_, _, attrs), _) => attrs | NONE => []); |
41 val induct_attrs = (case lfp_sugar_thms of SOME ((_, _, attrs), _) => attrs | NONE => []); |
42 |
42 |
43 val Ts = map #T fp_sugars; |
43 val Ts = map #T fp_sugars; |
44 val Xs = map #X fp_sugars; |
44 val Xs = map #X fp_sugars; |
45 val Cs = map (body_type o fastype_of o #co_rec) fp_sugars; |
45 val Cs = map (body_type o fastype_of o #co_rec o #fp_co_induct_sugar) fp_sugars; |
46 val Xs_TCs = Xs ~~ (Ts ~~ Cs); |
46 val Xs_TCs = Xs ~~ (Ts ~~ Cs); |
47 |
47 |
48 fun zip_XrecT (Type (s, Us)) = [Type (s, map (HOLogic.mk_tupleT o zip_XrecT) Us)] |
48 fun zip_XrecT (Type (s, Us)) = [Type (s, map (HOLogic.mk_tupleT o zip_XrecT) Us)] |
49 | zip_XrecT U = |
49 | zip_XrecT U = |
50 (case AList.lookup (op =) Xs_TCs U of |
50 (case AList.lookup (op =) Xs_TCs U of |