src/HOL/Tools/BNF/bnf_lfp_rec_sugar_more.ML
changeset 58461 75ee8d49c724
parent 58460 a88eb33058f7
child 58634 9f10d82e8188
equal deleted inserted replaced
58460:a88eb33058f7 58461:75ee8d49c724
    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