src/HOL/BNF/Tools/bnf_fp_def_sugar.ML
changeset 52326 a9f75d64b3f4
parent 52321 30d516bbf19f
child 52327 9f14280aa080
--- a/src/HOL/BNF/Tools/bnf_fp_def_sugar.ML	Thu Jun 06 21:22:04 2013 +0200
+++ b/src/HOL/BNF/Tools/bnf_fp_def_sugar.ML	Thu Jun 06 21:32:39 2013 +0200
@@ -38,9 +38,7 @@
         * term list list list list) list option
      * (term list * term list list
         * ((term list list * term list list list list * term list list list list)
-           * (typ list * typ list list list * typ list list))
-        * ((term list list * term list list list list * term list list list list)
-           * (typ list * typ list list list * typ list list))) option)
+           * (typ list * typ list list list * typ list list)) list) option)
     * Proof.context
   val mk_map: int -> typ list -> typ list -> term -> term
   val build_map: local_theory -> (typ * typ -> term) -> typ * typ -> term
@@ -51,11 +49,9 @@
     (typ list list * typ list list list list * term list list * term list list list list) list ->
     (string -> binding) -> typ list -> typ list -> term list -> Proof.context ->
     (term list * thm list) * Proof.context
-  val define_coiters: term list * term list list
+  val define_coiters: string list -> term list * term list list
     * ((term list list * term list list list list * term list list list list)
-       * (typ list * typ list list list * typ list list))
-    * ((term list list * term list list list list * term list list list list)
-       * (typ list * typ list list list * typ list list)) ->
+       * (typ list * typ list list list * typ list list)) list ->
     (string -> binding) -> typ list -> typ list -> term list -> Proof.context ->
     (term list * thm list) * Proof.context
   val derive_induct_fold_rec_thms_for_types: BNF_Def.bnf list -> term list list ->
@@ -356,7 +352,7 @@
     val unfold_args = mk_args rssss gssss;
     val corec_args = mk_args sssss hssss;
   in
-    ((cs, cpss, (unfold_args, unfold_types), (corec_args, corec_types)), lthy)
+    ((cs, cpss, [(unfold_args, unfold_types), (corec_args, corec_types)]), lthy)
   end;
 
 fun mk_un_fold_co_rec_prelims fp fpTs Cs ns mss xtor_co_iterss0' lthy =
@@ -472,7 +468,7 @@
     Term.list_comb (dtor_coiter, map4 mk_preds_getterss_join cs cpss f_sum_prod_Ts cqfsss)
   end;
 
-fun define_iters iterNs iter_args_typess mk_binding fpTs Cs ctor_iters lthy0 =
+fun define_iters iterNs iter_args_typess' mk_binding fpTs Cs ctor_iters lthy0 =
   let
     val thy = Proof_Context.theory_of lthy0;
 
@@ -489,7 +485,7 @@
             mk_iter_body ctor_iter fss xssss);
       in (b, spec) end;
 
-    val binding_specs = map3 generate_iter iterNs iter_args_typess ctor_iters;
+    val binding_specs = map3 generate_iter iterNs iter_args_typess' ctor_iters;
 
     val ((csts, defs), (lthy', lthy)) = lthy0
       |> apfst split_list o fold_map (fn (b, spec) =>
@@ -507,17 +503,15 @@
   end;
 
 (* TODO: merge with above function? *)
-fun define_coiters (cs, cpss, unfold_args_types, corec_args_types) mk_binding fpTs Cs
-    [dtor_unfold, dtor_corec] lthy0 =
+fun define_coiters coiterNs (cs, cpss, coiter_args_typess') mk_binding fpTs Cs dtor_coiters lthy0 =
   let
     val thy = Proof_Context.theory_of lthy0;
 
     val nn = length fpTs;
 
-    val C_to_fpT as Type (_, [_, fpT]) = snd (strip_typeN nn (fastype_of dtor_unfold));
+    val C_to_fpT as Type (_, [_, fpT]) = snd (strip_typeN nn (fastype_of (hd dtor_coiters)));
 
-    fun generate_coiter (suf, dtor_coiter, ((pfss, cqssss, cfssss),
-        (f_sum_prod_Ts, f_Tsss, pf_Tss))) =
+    fun generate_coiter suf ((pfss, cqssss, cfssss), (f_sum_prod_Ts, f_Tsss, pf_Tss)) dtor_coiter =
       let
         val res_T = fold_rev (curry (op --->)) pf_Tss C_to_fpT;
         val b = mk_binding suf;
@@ -526,9 +520,7 @@
             mk_coiter_body lthy0 cs cpss f_sum_prod_Ts f_Tsss cqssss cfssss dtor_coiter);
       in (b, spec) end;
 
-    val binding_specs =
-      map generate_coiter [(unfoldN, dtor_unfold, unfold_args_types),
-        (corecN, dtor_corec, corec_args_types)];
+    val binding_specs = map3 generate_coiter coiterNs coiter_args_typess' dtor_coiters;
 
     val ((csts, defs), (lthy', lthy)) = lthy0
       |> apfst split_list o fold_map (fn (b, spec) =>
@@ -726,7 +718,7 @@
     val discIss = map #discIs ctr_sugars;
     val sel_thmsss = map #sel_thmss ctr_sugars;
 
-    val ((cs, cpss, ((pgss, crssss, cgssss), _), ((phss, csssss, chssss), _)), names_lthy0) =
+    val ((cs, cpss, [((pgss, crssss, cgssss), _), ((phss, csssss, chssss), _)]), names_lthy0) =
       mk_unfold_corec_args_types Cs ns mss [dtor_unfold_fun_Ts, dtor_corec_fun_Ts] lthy;
 
     val (((rs, us'), vs'), names_lthy) =
@@ -1316,7 +1308,7 @@
          #> derive_maps_sets_rels
          ##>>
            (if fp = Least_FP then define_iters [foldN, recN] (the fold_rec_args_types)
-            else define_coiters (the unfold_corec_args_types))
+            else define_coiters [unfoldN, corecN] (the unfold_corec_args_types))
              mk_binding fpTs Cs [xtor_un_fold, xtor_co_rec]
          #> massage_res, lthy')
       end;