src/HOL/BNF/Tools/bnf_fp_def_sugar.ML
changeset 52872 fd14b0ead643
parent 52871 94ab1f8151e2
child 52898 2af1caada147
equal deleted inserted replaced
52871:94ab1f8151e2 52872:fd14b0ead643
    40         * term list list list list) list option
    40         * term list list list list) list option
    41      * (string * term list * term list list
    41      * (string * term list * term list list
    42         * ((term list list * term list list list) * (typ list * typ list list)) list) option)
    42         * ((term list list * term list list list) * (typ list * typ list list)) list) option)
    43     * Proof.context
    43     * Proof.context
    44 
    44 
    45   val mk_iter_fun_arg_typessss: typ list -> int list -> int list list -> term ->
    45   val mk_iter_fun_arg_types: typ list -> int list -> int list list -> term ->
    46     typ list list list list
    46     typ list list list list
       
    47   val mk_coiter_fun_arg_types: typ list -> int list -> int list list -> term ->
       
    48     typ list list list list * typ list list list * typ list list list list * typ list
    47   val define_iters: string list ->
    49   val define_iters: string list ->
    48     (typ list list * typ list list list list * term list list * term list list list list) list ->
    50     (typ list list * typ list list list list * term list list * term list list list list) list ->
    49     (string -> binding) -> typ list -> typ list -> term list -> Proof.context ->
    51     (string -> binding) -> typ list -> typ list -> term list -> Proof.context ->
    50     (term list * thm list) * Proof.context
    52     (term list * thm list) * Proof.context
    51   val define_coiters: string list -> string * term list * term list list
    53   val define_coiters: string list -> string * term list * term list list
   325 fun nesty_bnfs ctxt ctr_Tsss Us =
   327 fun nesty_bnfs ctxt ctr_Tsss Us =
   326   map_filter (bnf_of ctxt) (fold (fold (fold (add_nesty_bnf_names Us))) ctr_Tsss []);
   328   map_filter (bnf_of ctxt) (fold (fold (fold (add_nesty_bnf_names Us))) ctr_Tsss []);
   327 
   329 
   328 fun indexify proj xs f p = f (find_index (curry (op =) (proj p)) xs) p;
   330 fun indexify proj xs f p = f (find_index (curry (op =) (proj p)) xs) p;
   329 
   331 
   330 fun mk_fun_arg_typess n ms = map2 dest_tupleT ms o dest_sumTN_balanced n o domain_type;
   332 fun mk_iter_fun_arg_types0 n ms = map2 dest_tupleT ms o dest_sumTN_balanced n o domain_type;
   331 
   333 
   332 fun mk_iter_fun_arg_typessss Cs ns mss =
   334 fun mk_iter_fun_arg_types Cs ns mss =
   333   mk_fp_iter_fun_types
   335   mk_fp_iter_fun_types
   334   #> map3 mk_fun_arg_typess ns mss
   336   #> map3 mk_iter_fun_arg_types0 ns mss
   335   #> map (map (map (unzip_recT Cs)));
   337   #> map (map (map (unzip_recT Cs)));
   336 
   338 
   337 fun mk_iters_args_types Cs ns mss ctor_iter_fun_Tss lthy =
   339 fun mk_iters_args_types Cs ns mss ctor_iter_fun_Tss lthy =
   338   let
   340   let
   339     val Css = map2 replicate ns Cs;
   341     val Css = map2 replicate ns Cs;
   340     val y_Tsss = map3 mk_fun_arg_typess ns mss (map un_fold_of ctor_iter_fun_Tss);
   342     val y_Tsss = map3 mk_iter_fun_arg_types0 ns mss (map un_fold_of ctor_iter_fun_Tss);
   341     val g_Tss = map2 (fn C => map (fn y_Ts => y_Ts ---> C)) Cs y_Tsss;
   343     val g_Tss = map2 (fn C => map (fn y_Ts => y_Ts ---> C)) Cs y_Tsss;
   342 
   344 
   343     val ((gss, ysss), lthy) =
   345     val ((gss, ysss), lthy) =
   344       lthy
   346       lthy
   345       |> mk_Freess "f" g_Tss
   347       |> mk_Freess "f" g_Tss
   363     val zssss = map2 (map2 (map2 cons)) zssss_hd zssss_tl;
   365     val zssss = map2 (map2 (map2 cons)) zssss_hd zssss_tl;
   364   in
   366   in
   365     ([(g_Tss, y_Tssss, gss, yssss), (h_Tss, z_Tssss, hss, zssss)], lthy)
   367     ([(g_Tss, y_Tssss, gss, yssss), (h_Tss, z_Tssss, hss, zssss)], lthy)
   366   end;
   368   end;
   367 
   369 
   368 fun mk_coiter_fun_arg_typessss_typesss_typessss Cs ns mss fun_Ts =
   370 fun mk_coiter_fun_arg_types0 Cs ns mss fun_Ts =
   369   let
   371   let
   370     (*avoid "'a itself" arguments in coiterators and corecursors*)
   372     (*avoid "'a itself" arguments in coiterators and corecursors*)
   371     fun repair_arity [0] = [1]
   373     fun repair_arity [0] = [1]
   372       | repair_arity ms = ms;
   374       | repair_arity ms = ms;
   373 
   375 
   378     val q_Tssss = map (map (map (fn [_] => [] | [_, T] => [mk_pred1T (domain_type T)]))) f_Tssss;
   380     val q_Tssss = map (map (map (fn [_] => [] | [_, T] => [mk_pred1T (domain_type T)]))) f_Tssss;
   379   in
   381   in
   380     (q_Tssss, f_Tsss, f_Tssss, f_sum_prod_Ts)
   382     (q_Tssss, f_Tsss, f_Tssss, f_sum_prod_Ts)
   381   end;
   383   end;
   382 
   384 
       
   385 fun mk_coiter_fun_arg_types Cs ns mss =
       
   386   mk_fp_iter_fun_types
       
   387   #> mk_coiter_fun_arg_types0 Cs ns mss;
       
   388 
   383 fun mk_coiters_args_types Cs ns mss dtor_coiter_fun_Tss lthy =
   389 fun mk_coiters_args_types Cs ns mss dtor_coiter_fun_Tss lthy =
   384   let
   390   let
   385     val p_Tss = map2 (fn n => replicate (Int.max (0, n - 1)) o mk_pred1T) ns Cs;
   391     val p_Tss = map2 (fn n => replicate (Int.max (0, n - 1)) o mk_pred1T) ns Cs;
   386 
   392 
   387     fun mk_types get_Ts =
   393     fun mk_types get_Ts =
   388       let
   394       let
   389         val fun_Ts = map get_Ts dtor_coiter_fun_Tss;
   395         val fun_Ts = map get_Ts dtor_coiter_fun_Tss;
   390         val (q_Tssss, f_Tsss, f_Tssss, f_sum_prod_Ts) =
   396         val (q_Tssss, f_Tsss, f_Tssss, f_sum_prod_Ts) = mk_coiter_fun_arg_types0 Cs ns mss fun_Ts;
   391           mk_coiter_fun_arg_typessss_typesss_typessss Cs ns mss fun_Ts;
       
   392         val pf_Tss = map3 flat_corec_preds_predsss_gettersss p_Tss q_Tssss f_Tssss;
   397         val pf_Tss = map3 flat_corec_preds_predsss_gettersss p_Tss q_Tssss f_Tssss;
   393       in
   398       in
   394         (q_Tssss, f_Tsss, f_Tssss, (f_sum_prod_Ts, pf_Tss))
   399         (q_Tssss, f_Tsss, f_Tssss, (f_sum_prod_Ts, pf_Tss))
   395       end;
   400       end;
   396 
   401