# HG changeset patch # User traytel # Date 1407333611 -7200 # Node ID 9c065009cd8acfa621909af2955fa0d26aa3cf0f # Parent 4adfa833072b04b0a23f2febcfb306f9fe001286 handle deep nesting in N2M diff -r 4adfa833072b -r 9c065009cd8a src/HOL/BNF_Def.thy --- a/src/HOL/BNF_Def.thy Wed Aug 06 10:20:50 2014 +0200 +++ b/src/HOL/BNF_Def.thy Wed Aug 06 16:00:11 2014 +0200 @@ -159,6 +159,11 @@ "case_sum f g \ Inr = g" by auto +lemma map_sum_o_inj: +"map_sum f g o Inl = Inl o f" +"map_sum f g o Inr = Inr o g" +by auto + lemma card_order_csum_cone_cexp_def: "card_order r \ ( |A1| +c cone) ^c r = |Func UNIV (Inl ` A1 \ {Inr ()})|" unfolding cexp_def cone_def Field_csum Field_card_of by (auto dest: Field_card_order) diff -r 4adfa833072b -r 9c065009cd8a src/HOL/Tools/BNF/bnf_fp_n2m.ML --- a/src/HOL/Tools/BNF/bnf_fp_n2m.ML Wed Aug 06 10:20:50 2014 +0200 +++ b/src/HOL/Tools/BNF/bnf_fp_n2m.ML Wed Aug 06 16:00:11 2014 +0200 @@ -240,29 +240,26 @@ val co_recs = of_fp_res #xtor_co_recs; val ns = map (length o #Ts o #fp_res) fp_sugars; - fun substT rho (Type (@{type_name fun}, [T, U])) = substT rho T --> substT rho U - | substT rho (Type (s, Ts)) = Type (s, map (typ_subst_nonatomic rho) Ts) - | substT _ T = T; - val typ_subst_nonatomic_sorted = fold_rev (typ_subst_nonatomic o single); fun foldT_of_recT recT = let - val ((FTXs, Xs), TX) = strip_fun_type recT |>> map_split dest_co_algT; + val ((FTXs, Ys), TX) = strip_fun_type recT |>> map_split dest_co_algT; + val Zs = union op = Xs Ys; fun subst (Type (C, Ts as [_, X])) = - if C = co_productC andalso member op = Xs X then X else Type (C, map subst Ts) + if C = co_productC andalso member op = Zs X then X else Type (C, map subst Ts) | subst (Type (C, Ts)) = Type (C, map subst Ts) | subst T = T; in - map2 (mk_co_algT o subst) FTXs Xs ---> TX + map2 (mk_co_algT o subst) FTXs Ys ---> TX end; - fun force_rec i TU TU_rec raw_rec = + fun force_rec i TU raw_rec = let val thy = Proof_Context.theory_of lthy; val approx_rec = raw_rec - |> force_typ names_lthy (replicate (nth ns i) dummyT ---> TU_rec); + |> force_typ names_lthy (replicate (nth ns i) dummyT ---> TU); val subst = Term.typ_subst_atomic fold_thetaAs; fun mk_fp_absT_repT fp_repT fp_absT = mk_absT thy fp_repT fp_absT ooo mk_repT; @@ -299,9 +296,7 @@ val i = find_index (fn T => x = T) Xs; val TUrec = (case find_first (fn f => body_fun_type (fastype_of f) = TU) recs of - NONE => - force_rec i TU - (TU |> is_none b_opt ? substT (map2 mk_co_productT fpTs Xs ~~ Xs)) (nth co_recs i) + NONE => force_rec i TU (nth co_recs i) | SOME f => f); val TUs = binder_fun_types (fastype_of TUrec); @@ -340,14 +335,21 @@ let val (TY, (U, X)) = TU |> dest_co_algT ||> dest_co_productT; val T = mk_co_algT TY U; + fun mk_co_proj TU = build_map lthy [] (fn TU => + let + val ((T1, T2), U) = TU |> co_swap |>> dest_co_productT + in + if T1 = U then co_proj1_const TU + else mk_co_comp (mk_co_proj (co_swap (T1, U)), + co_proj1_const (co_swap (mk_co_productT T1 T2, T1))) + end) TU; in - (case try (force_typ names_lthy T o build_map lthy [] co_proj1_const o dest_funT) T of - SOME f => mk_co_product f - (fst (fst (mk_rec NONE recs lthy (mk_co_algT TY X)))) - | NONE => mk_map_co_product - (build_map lthy [] co_proj1_const - (dest_funT (mk_co_algT (dest_co_productT TY |> fst) U))) - (HOLogic.id_const X)) + if not (can dest_co_productT TY) + then mk_co_product (mk_co_proj (dest_funT T)) + (fst (fst (mk_rec NONE recs lthy (mk_co_algT TY X)))) + else mk_map_co_product + (mk_co_proj (co_swap (dest_co_productT TY |> fst, U))) + (HOLogic.id_const X) end) val smap_args = map mk_smap_arg smap_argTs; in @@ -413,8 +415,8 @@ map (fn thm => thm RS rewrite_comp_comp) @{thms map_prod.comp map_sum.comp} @ @{thms id_apply comp_id id_comp map_prod.comp map_prod.id map_sum.comp map_sum.id}; val rec_thms = fold_thms @ case_fp fp - @{thms fst_convol map_prod_o_convol convol_o} - @{thms case_sum_o_inj(1) case_sum_o_map_sum o_case_sum}; + @{thms fst_convol map_prod_o_convol convol_o fst_comp_map_prod} + @{thms case_sum_o_inj(1) case_sum_o_map_sum o_case_sum map_sum_o_inj(1)}; val eq_thm_prop_untyped = Term.aconv_untyped o pairself Thm.full_prop_of;