move function to library
authorblanchet
Tue, 07 May 2013 16:15:21 +0200
changeset 51903 126f8d11f873
parent 51902 1ab4214a08f9
child 51904 ba735ac9044a
move function to library
src/HOL/BNF/Tools/bnf_fp_def_sugar.ML
src/HOL/BNF/Tools/bnf_util.ML
--- a/src/HOL/BNF/Tools/bnf_fp_def_sugar.ML	Tue May 07 15:40:00 2013 +0200
+++ b/src/HOL/BNF/Tools/bnf_fp_def_sugar.ML	Tue May 07 16:15:21 2013 +0200
@@ -27,6 +27,16 @@
   val exists_subtype_in: typ list -> typ -> bool
   val indexify_fst: ''a list -> (int -> ''a * 'b -> 'c) -> ''a * 'b -> 'c
   val mk_fp_iter: bool -> typ list -> typ list -> term list -> term list * typ list
+  val mk_un_fold_co_rec_prelims: bool -> typ list -> typ list -> typ list -> int list ->
+    int list list -> term list -> term list -> Proof.context ->
+    (term list * term list * ((term list list * typ list list * term list list list)
+       * (term list list * typ list list * term 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)
+    * Proof.context
   val build_map: local_theory -> (typ * typ -> term) -> typ * typ -> term
 
   val mk_iter_fun_arg_types_pairsss: typ list -> int list -> int list list -> term ->
@@ -156,11 +166,6 @@
 val simp_attrs = @{attributes [simp]};
 val code_simp_attrs = Code.add_default_eqn_attrib :: simp_attrs;
 
-fun split_list4 [] = ([], [], [], [])
-  | split_list4 ((x1, x2, x3, x4) :: xs) =
-    let val (xs1, xs2, xs3, xs4) = split_list4 xs;
-    in (x1 :: xs1, x2 :: xs2, x3 :: xs3, x4 :: xs4) end;
-
 val exists_subtype_in = Term.exists_subtype o member (op =);
 
 fun resort_tfree S (TFree (s, _)) = TFree (s, S);
@@ -334,6 +339,22 @@
     ((cs, cpss, (unfold_args, unfold_types), (corec_args, corec_types)), lthy)
   end;
 
+fun mk_un_fold_co_rec_prelims lfp fpTs As Cs ns mss fp_folds0 fp_recs0 lthy =
+  let
+    val (fp_folds, fp_fold_fun_Ts) = mk_fp_iter lfp As Cs fp_folds0;
+    val (fp_recs, fp_rec_fun_Ts) = mk_fp_iter lfp As Cs fp_recs0;
+
+    val ((fold_rec_args_types, unfold_corec_args_types), lthy') =
+      if lfp then
+        mk_fold_rec_args_types fpTs Cs ns mss fp_fold_fun_Ts fp_rec_fun_Ts lthy
+        |>> (rpair NONE o SOME)
+      else
+        mk_unfold_corec_args_types fpTs Cs ns mss fp_fold_fun_Ts fp_rec_fun_Ts lthy
+        |>> (pair NONE o SOME)
+  in
+    ((fp_folds, fp_recs, fold_rec_args_types, unfold_corec_args_types), lthy')
+  end;
+
 fun mk_map live Ts Us t =
   let val (Type (_, Ts0), Type (_, Us0)) = strip_typeN (live + 1) (fastype_of t) |>> List.last in
     Term.subst_atomic_types (Ts0 @ Us0 ~~ Ts @ Us) t
@@ -1130,16 +1151,8 @@
     val kss = map (fn n => 1 upto n) ns;
     val mss = map (map length) ctr_Tsss;
 
-    val (fp_folds, fp_fold_fun_Ts) = mk_fp_iter lfp As Cs fp_folds0;
-    val (fp_recs, fp_rec_fun_Ts) = mk_fp_iter lfp As Cs fp_recs0;
-
-    val ((fold_rec_arg_types, unfold_corec_args_types), _) =
-      if lfp then
-        mk_fold_rec_args_types fpTs Cs ns mss fp_fold_fun_Ts fp_rec_fun_Ts lthy
-        |>> rpair ([], [], (([], [], []), ([], [], [])), (([], [], []), ([], [], [])))
-      else
-        mk_unfold_corec_args_types fpTs Cs ns mss fp_fold_fun_Ts fp_rec_fun_Ts lthy
-        |>> pair (([], [], []), ([], [], []));
+    val ((fp_folds, fp_recs, fold_rec_args_types, unfold_corec_args_types), lthy) =
+      mk_un_fold_co_rec_prelims lfp fpTs As Cs ns mss fp_folds0 fp_recs0 lthy;
 
     fun define_ctrs_case_for_type (((((((((((((((((((((((((fp_bnf, fp_b), fpT), C), ctor), dtor),
             fp_fold), fp_rec), ctor_dtor), dtor_ctor), ctor_inject), pre_map_def), pre_set_defs),
@@ -1331,8 +1344,8 @@
       in
         (wrap_ctrs
          #> derive_maps_sets_rels
-         ##>> (if lfp then define_fold_rec fold_rec_arg_types
-           else define_unfold_corec unfold_corec_args_types)
+         ##>> (if lfp then define_fold_rec (the fold_rec_args_types)
+           else define_unfold_corec (the unfold_corec_args_types))
              mk_binding fpTs As Cs fp_fold fp_rec
          #> massage_res, lthy')
       end;
--- a/src/HOL/BNF/Tools/bnf_util.ML	Tue May 07 15:40:00 2013 +0200
+++ b/src/HOL/BNF/Tools/bnf_util.ML	Tue May 07 16:15:21 2013 +0200
@@ -46,6 +46,7 @@
   val fold_map9: ('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g -> 'h -> 'i -> 'j -> 'k * 'j) ->
     'a list -> 'b list -> 'c list -> 'd list -> 'e list -> 'f list -> 'g list -> 'h list ->
     'i list -> 'j -> 'k list * 'j
+  val split_list4: ('a * 'b * 'c * 'd) list -> 'a list * 'b list * 'c list * 'd list
   val splice: 'a list -> 'a list -> 'a list
   val transpose: 'a list list -> 'a list list
   val unsort: ('a * 'b -> bool) -> 'b list -> 'c list -> 'a list -> 'c list
@@ -306,6 +307,11 @@
     in (x :: xs, acc'') end
   | fold_map9 _ _ _ _ _ _ _ _ _ _ _ = raise ListPair.UnequalLengths;
 
+fun split_list4 [] = ([], [], [], [])
+  | split_list4 ((x1, x2, x3, x4) :: xs) =
+    let val (xs1, xs2, xs3, xs4) = split_list4 xs;
+    in (x1 :: xs1, x2 :: xs2, x3 :: xs3, x4 :: xs4) end;
+
 (*stolen from ~~/src/HOL/Tools/SMT/smt_utils.ML*)
 fun certify ctxt = Thm.cterm_of (Proof_Context.theory_of ctxt);
 fun certifyT ctxt = Thm.ctyp_of (Proof_Context.theory_of ctxt);