# HG changeset patch # User blanchet # Date 1379033704 -7200 # Node ID 5a7bf8c859f67dc6d7a85687b8b585e7c53c89f2 # Parent b6e2993fd0d3bafb2527f558063a40d8ef1ecdeb made non-co case more robust as well (cf. b6e2993fd0d3) diff -r b6e2993fd0d3 -r 5a7bf8c859f6 src/HOL/BNF/Tools/bnf_fp_def_sugar.ML --- a/src/HOL/BNF/Tools/bnf_fp_def_sugar.ML Fri Sep 13 02:26:59 2013 +0200 +++ b/src/HOL/BNF/Tools/bnf_fp_def_sugar.ML Fri Sep 13 02:55:04 2013 +0200 @@ -53,7 +53,7 @@ * ((term list list * term list list list) * (typ list * typ list list)) list) option) * Proof.context - val mk_iter_fun_arg_types: typ list -> int list -> int list list -> term -> + val mk_iter_fun_arg_types: typ list list list -> int list -> int list list -> term -> typ list list list list val mk_coiter_fun_arg_types: typ list list list -> typ list -> int list -> term -> typ list list @@ -268,9 +268,8 @@ val mk_fp_iter_fun_types = binder_fun_types o fastype_of; -(* ### FIXME? *) -fun unzip_recT Cs (T as Type (@{type_name prod}, Ts as [_, U])) = - if member (op =) Cs U then Ts else [T] +fun unzip_recT (Type (@{type_name prod}, _)) T = [T] + | unzip_recT _ (T as Type (@{type_name prod}, Ts)) = Ts | unzip_recT _ T = [T]; fun unzip_corecT (Type (@{type_name sum}, _)) T = [T] @@ -399,12 +398,12 @@ fun mk_iter_fun_arg_types0 n ms = map2 dest_tupleT ms o dest_sumTN_balanced n o domain_type; -fun mk_iter_fun_arg_types Cs ns mss = +fun mk_iter_fun_arg_types ctr_Tsss ns mss = mk_fp_iter_fun_types #> map3 mk_iter_fun_arg_types0 ns mss - #> map (map (map (unzip_recT Cs))); + #> map2 (map2 (map2 unzip_recT)) ctr_Tsss; -fun mk_iters_args_types Cs ns mss ctor_iter_fun_Tss lthy = +fun mk_iters_args_types ctr_Tsss Cs ns mss ctor_iter_fun_Tss lthy = let val Css = map2 replicate ns Cs; val y_Tsss = map3 mk_iter_fun_arg_types0 ns mss (map un_fold_of ctor_iter_fun_Tss); @@ -419,8 +418,11 @@ val yssss = map (map (map single)) ysss; val z_Tssss = - map3 (fn n => fn ms => map2 (map (unzip_recT Cs) oo dest_tupleT) ms o - dest_sumTN_balanced n o domain_type o co_rec_of) ns mss ctor_iter_fun_Tss; + map4 (fn n => fn ms => fn ctr_Tss => fn ctor_iter_fun_Ts => + map3 (fn m => fn ctr_Ts => fn ctor_iter_fun_T => + map2 unzip_recT ctr_Ts (dest_tupleT m ctor_iter_fun_T)) + ms ctr_Tss (dest_sumTN_balanced n (domain_type (co_rec_of ctor_iter_fun_Ts)))) + ns mss ctr_Tsss ctor_iter_fun_Tss; val z_Tsss' = map (map flat_rec_arg_args) z_Tssss; val h_Tss = map2 (map2 (curry op --->)) z_Tsss' Css; @@ -522,7 +524,7 @@ val ((iters_args_types, coiters_args_types), lthy') = if fp = Least_FP then - mk_iters_args_types Cs ns mss xtor_co_iter_fun_Tss lthy |>> (rpair NONE o SOME) + mk_iters_args_types ctr_Tsss Cs ns mss xtor_co_iter_fun_Tss lthy |>> (rpair NONE o SOME) else mk_coiters_args_types ctr_Tsss Cs ns mss xtor_co_iter_fun_Tss lthy |>> (pair NONE o SOME) in diff -r b6e2993fd0d3 -r 5a7bf8c859f6 src/HOL/BNF/Tools/bnf_fp_rec_sugar_util.ML --- a/src/HOL/BNF/Tools/bnf_fp_rec_sugar_util.ML Fri Sep 13 02:26:59 2013 +0200 +++ b/src/HOL/BNF/Tools/bnf_fp_rec_sugar_util.ML Fri Sep 13 02:55:04 2013 +0200 @@ -312,7 +312,8 @@ val perm_Cs = map (body_type o fastype_of o co_rec_of o of_fp_sugar (#xtor_co_iterss o #fp_res)) perm_fp_sugars; - val perm_fun_arg_Tssss = mk_iter_fun_arg_types perm_Cs perm_ns perm_mss (co_rec_of ctor_iters1); + val perm_fun_arg_Tssss = + mk_iter_fun_arg_types perm_ctr_Tsss perm_ns perm_mss (co_rec_of ctor_iters1); fun unpermute0 perm0_xs = permute_like (op =) perm0_kks kks perm0_xs; fun unpermute perm_xs = permute_like (op =) perm_indices indices perm_xs;