src/HOL/BNF/Tools/bnf_fp_def_sugar.ML
changeset 52216 b6a0668211f6
parent 52215 7facaee8586f
child 52217 689062704416
equal deleted inserted replaced
52215:7facaee8586f 52216:b6a0668211f6
   264   in project end;
   264   in project end;
   265 
   265 
   266 val project_recT = project_co_recT @{type_name prod};
   266 val project_recT = project_co_recT @{type_name prod};
   267 val project_corecT = project_co_recT @{type_name sum};
   267 val project_corecT = project_co_recT @{type_name sum};
   268 
   268 
   269 fun unzip_recT fpTs = meta_unzip_rec I (project_recT fpTs fst) (project_recT fpTs snd) I fpTs;
   269 fun unzip_recT fpTs (T as Type (@{type_name prod}, Ts as [T', _])) =
       
   270     if member (op =) fpTs T' then Ts else [T]
       
   271   | unzip_recT _ T = [T];
   270 
   272 
   271 fun mk_fun_arg_typess n ms = map2 dest_tupleT ms o dest_sumTN_balanced n o domain_type;
   273 fun mk_fun_arg_typess n ms = map2 dest_tupleT ms o dest_sumTN_balanced n o domain_type;
   272 
   274 
   273 fun mk_iter_fun_arg_typessss fpTs ns mss =
   275 fun mk_iter_fun_arg_typessss fpTs ns mss =
   274   mk_fp_iter_fun_types
   276   mk_fp_iter_fun_types
   275   #> map3 mk_fun_arg_typess ns mss
   277   #> map3 mk_fun_arg_typess ns mss
   276   #> map (map (map (unzip_recT fpTs)));
   278   #> map (map (map (unzip_recT fpTs)));
   277 
   279 
   278 fun mk_fold_rec_args_types Cs ns mss ctor_fold_fun_Ts ctor_rec_fun_Ts lthy =
   280 fun mk_fold_rec_args_types fpTs Cs ns mss ctor_fold_fun_Ts ctor_rec_fun_Ts lthy =
   279   let
   281   let
   280     val Css = map2 replicate ns Cs;
   282     val Css = map2 replicate ns Cs;
   281     val y_Tsss = map3 mk_fun_arg_typess ns mss ctor_fold_fun_Ts;
   283     val y_Tsss = map3 mk_fun_arg_typess ns mss ctor_fold_fun_Ts;
   282     val g_Tss = map2 (fn C => map (fn y_Ts => y_Ts ---> C)) Cs y_Tsss;
   284     val g_Tss = map2 (fn C => map (fn y_Ts => y_Ts ---> C)) Cs y_Tsss;
   283 
   285 
   285       lthy
   287       lthy
   286       |> mk_Freess "f" g_Tss
   288       |> mk_Freess "f" g_Tss
   287       ||>> mk_Freesss "x" y_Tsss;
   289       ||>> mk_Freesss "x" y_Tsss;
   288     val yssss = map (map (map single)) ysss;
   290     val yssss = map (map (map single)) ysss;
   289 
   291 
   290     (* ### *)
       
   291     fun dest_rec_prodT (T as Type (@{type_name prod}, Us as [_, U])) =
       
   292         if member (op =) Cs U then Us else [T]
       
   293       | dest_rec_prodT T = [T];
       
   294 
       
   295     val z_Tssss =
   292     val z_Tssss =
   296       map3 (fn n => fn ms => map2 (map dest_rec_prodT oo dest_tupleT) ms o
   293       map3 (fn n => fn ms => map2 (map (unzip_recT fpTs) oo dest_tupleT) ms o
   297         dest_sumTN_balanced n o domain_type) ns mss ctor_rec_fun_Ts;
   294         dest_sumTN_balanced n o domain_type) ns mss ctor_rec_fun_Ts;
   298 
   295 
   299     val z_Tsss = map3 mk_fun_arg_typess ns mss ctor_rec_fun_Ts;
   296     val z_Tsss = map3 mk_fun_arg_typess ns mss ctor_rec_fun_Ts;
   300     val z_Tsss' = map (map (flat_rec I)) z_Tssss;
   297     val z_Tsss' = map (map (flat_rec I)) z_Tssss;
   301     val h_Tss = map2 (map2 (curry (op --->))) z_Tsss' Css;
   298     val h_Tss = map2 (map2 (curry (op --->))) z_Tsss' Css;
   374     val (fp_rec_fun_Ts, fp_recs) = mk_co_iters thy fp fpTs Cs fp_recs0
   371     val (fp_rec_fun_Ts, fp_recs) = mk_co_iters thy fp fpTs Cs fp_recs0
   375       |> `(mk_fp_iter_fun_types o hd);
   372       |> `(mk_fp_iter_fun_types o hd);
   376 
   373 
   377     val ((fold_rec_args_types, unfold_corec_args_types), lthy') =
   374     val ((fold_rec_args_types, unfold_corec_args_types), lthy') =
   378       if fp = Least_FP then
   375       if fp = Least_FP then
   379         mk_fold_rec_args_types Cs ns mss fp_fold_fun_Ts fp_rec_fun_Ts lthy
   376         mk_fold_rec_args_types fpTs Cs ns mss fp_fold_fun_Ts fp_rec_fun_Ts lthy
   380         |>> (rpair NONE o SOME)
   377         |>> (rpair NONE o SOME)
   381       else
   378       else
   382         mk_unfold_corec_args_types fpTs Cs ns mss fp_fold_fun_Ts fp_rec_fun_Ts lthy
   379         mk_unfold_corec_args_types fpTs Cs ns mss fp_fold_fun_Ts fp_rec_fun_Ts lthy
   383         |>> (pair NONE o SOME)
   380         |>> (pair NONE o SOME)
   384   in
   381   in
   579 
   576 
   580     val ctor_fold_fun_Ts = mk_fp_iter_fun_types (hd ctor_folds);
   577     val ctor_fold_fun_Ts = mk_fp_iter_fun_types (hd ctor_folds);
   581     val ctor_rec_fun_Ts = mk_fp_iter_fun_types (hd ctor_recs);
   578     val ctor_rec_fun_Ts = mk_fp_iter_fun_types (hd ctor_recs);
   582 
   579 
   583     val (((gss, _, _), (hss, _, _)), names_lthy0) =
   580     val (((gss, _, _), (hss, _, _)), names_lthy0) =
   584       mk_fold_rec_args_types Cs ns mss ctor_fold_fun_Ts ctor_rec_fun_Ts lthy;
   581       mk_fold_rec_args_types fpTs Cs ns mss ctor_fold_fun_Ts ctor_rec_fun_Ts lthy;
   585 
   582 
   586     val ((((ps, ps'), xsss), us'), names_lthy) =
   583     val ((((ps, ps'), xsss), us'), names_lthy) =
   587       names_lthy0
   584       names_lthy0
   588       |> mk_Frees' "P" (map mk_pred1T fpTs)
   585       |> mk_Frees' "P" (map mk_pred1T fpTs)
   589       ||>> mk_Freesss "x" ctr_Tsss
   586       ||>> mk_Freesss "x" ctr_Tsss