tuning
authorblanchet
Fri, 07 Jun 2013 10:55:44 +0200
changeset 52339 844b1c8e3d9e
parent 52338 8bf544733e0e
child 52340 754bc55dcb09
tuning
src/HOL/BNF/Tools/bnf_fp_def_sugar.ML
--- a/src/HOL/BNF/Tools/bnf_fp_def_sugar.ML	Fri Jun 07 10:37:13 2013 +0200
+++ b/src/HOL/BNF/Tools/bnf_fp_def_sugar.ML	Fri Jun 07 10:55:44 2013 +0200
@@ -675,10 +675,13 @@
 
 fun derive_coinduct_coiters_thms_for_types pre_bnfs (dtor_coiters1 :: _) dtor_coinduct
     dtor_strong_induct dtor_ctors [dtor_unfold_thms, dtor_corec_thms] nesting_bnfs nested_bnfs fpTs
-    Cs As kss mss ns ctr_defss ctr_sugars iterss iter_defss lthy =
+    Cs As kss mss ns ctr_defss ctr_sugars coiterss coiter_defss lthy =
   let
-    val [unfolds, corecs] = transpose iterss;
-    val [unfold_defs, corec_defs] = transpose iter_defss;
+    val coiterss' = transpose coiterss;
+    val coiter_defss' = transpose coiter_defss;
+
+    val [unfolds, corecs] = coiterss';
+    val [unfold_defs, corec_defs] = coiter_defss';
 
     val nn = length pre_bnfs;
 
@@ -692,8 +695,7 @@
 
     val fp_b_names = map base_name_of_typ fpTs;
 
-    val dtor_unfold_fun_Ts = mk_fp_iter_fun_types (un_fold_of dtor_coiters1);
-    val dtor_corec_fun_Ts = mk_fp_iter_fun_types (co_rec_of dtor_coiters1);
+    val dtor_iter_fun_Tss' = map mk_fp_iter_fun_types dtor_coiters1;
 
     val ctrss = map (map (mk_ctr As) o #ctrs) ctr_sugars;
     val discss = map (map (mk_disc_or_sel As) o #discs) ctr_sugars;
@@ -704,8 +706,9 @@
     val sel_thmsss = map #sel_thmss ctr_sugars;
 
     (* TODO: avoid duplication *)
-    val ((cs, cpss, [((pgss, crssss, cgssss), _), ((phss, csssss, chssss), _)]), names_lthy0) =
-      mk_coiters_args_types Cs ns mss (transpose [dtor_unfold_fun_Ts, dtor_corec_fun_Ts]) lthy;
+    val ((cs, cpss, [(unfold_args as (pgss, crssss, cgssss), _),
+           (corec_args as (phss, csssss, chssss), _)]), names_lthy0) =
+      mk_coiters_args_types Cs ns mss (transpose dtor_iter_fun_Tss') lthy;
 
     val (((rs, us'), vs'), names_lthy) =
       names_lthy0
@@ -808,8 +811,8 @@
 
     fun mk_maybe_not pos = not pos ? HOLogic.mk_not;
 
-    val gunfolds = map (lists_bmoc pgss) unfolds;
-    val hcorecs = map (lists_bmoc phss) corecs;
+    val fcoiterss' as [gunfolds, hcorecs] =
+      map2 (fn (pfss, _, _) => map (lists_bmoc pfss)) [unfold_args, corec_args] coiterss';
 
     val (unfold_thmss, corec_thmss, safe_unfold_thmss, safe_corec_thmss) =
       let
@@ -818,21 +821,22 @@
             (Logic.list_implies (seq_conds (HOLogic.mk_Trueprop oo mk_maybe_not) n k cps,
                mk_Trueprop_eq (fcoiter $ c, Term.list_comb (ctr, take m cfs'))));
 
-        (* TODO: get rid of "mk_U" *)
-        val mk_U = typ_subst_nonatomic (map2 pair Cs fpTs);
+        val substC = typ_subst_nonatomic (map2 pair Cs fpTs);
 
         fun intr_coiters fcoiters [] [cf] =
             let val T = fastype_of cf in
               if exists_subtype_in Cs T then
-                build_map lthy (indexify fst Cs (K o nth fcoiters)) (T, mk_U T) $ cf
+                build_map lthy (indexify fst Cs (K o nth fcoiters)) (T, substC T) $ cf
               else
                 cf
             end
           | intr_coiters fcoiters [cq] [cf, cf'] =
             mk_If cq (intr_coiters fcoiters [] [cf]) (intr_coiters fcoiters [] [cf']);
 
-        val crgsss = map2 (map2 (map2 (intr_coiters gunfolds))) crssss cgssss;
-        val cshsss = map2 (map2 (map2 (intr_coiters hcorecs))) csssss chssss;
+        val [crgsss, cshsss] =
+          map2 (fn fcoiters => fn (_, cqssss, cfssss) =>
+              map2 (map2 (map2 (intr_coiters fcoiters))) cqssss cfssss)
+            fcoiterss' [unfold_args, corec_args];
 
         val unfold_goalss = map8 (map4 oooo mk_goal pgss) cs cpss gunfolds ns kss ctrss mss crgsss;
         val corec_goalss = map8 (map4 oooo mk_goal phss) cs cpss hcorecs ns kss ctrss mss cshsss;