src/HOL/Codatatype/Tools/bnf_fp_sugar.ML
changeset 49254 edc322ac5279
parent 49236 632f68beff2a
child 49255 2ecc533d6697
equal deleted inserted replaced
49253:4b11240d80bf 49254:edc322ac5279
   243           val mss' =  map (fn [0] => [1] | ms => ms) mss;
   243           val mss' =  map (fn [0] => [1] | ms => ms) mss;
   244 
   244 
   245           val p_Tss =
   245           val p_Tss =
   246             map2 (fn C => fn n => replicate (Int.max (0, n - 1)) (C --> HOLogic.boolT)) Cs ns;
   246             map2 (fn C => fn n => replicate (Int.max (0, n - 1)) (C --> HOLogic.boolT)) Cs ns;
   247 
   247 
   248           fun popescu_zip [] [fs] = fs
   248           fun zip_preds_getters [] [fs] = fs
   249             | popescu_zip (p :: ps) (fs :: fss) = p :: fs @ popescu_zip ps fss;
   249             | zip_preds_getters (p :: ps) (fs :: fss) = p :: fs @ zip_preds_getters ps fss;
   250 
   250 
   251           fun mk_types fun_Ts =
   251           fun mk_types fun_Ts =
   252             let
   252             let
   253               val f_sum_prod_Ts = map range_type fun_Ts;
   253               val f_sum_prod_Ts = map range_type fun_Ts;
   254               val f_prod_Tss = map2 dest_sumTN ns f_sum_prod_Ts;
   254               val f_prod_Tss = map2 dest_sumTN ns f_sum_prod_Ts;
   255               val f_Tsss =
   255               val f_Tsss =
   256                 map3 (fn C => map2 (map (curry (op -->) C) oo dest_tupleT)) Cs mss' f_prod_Tss;
   256                 map3 (fn C => map2 (map (curry (op -->) C) oo dest_tupleT)) Cs mss' f_prod_Tss;
   257               val pf_Tss = map2 popescu_zip p_Tss f_Tsss
   257               val pf_Tss = map2 zip_preds_getters p_Tss f_Tsss
   258             in (f_sum_prod_Ts, f_prod_Tss, f_Tsss, pf_Tss) end;
   258             in (f_sum_prod_Ts, f_prod_Tss, f_Tsss, pf_Tss) end;
   259 
   259 
   260           val (g_sum_prod_Ts, g_prod_Tss, g_Tsss, pg_Tss) = mk_types fp_iter_fun_Ts;
   260           val (g_sum_prod_Ts, g_prod_Tss, g_Tsss, pg_Tss) = mk_types fp_iter_fun_Ts;
   261           val (h_sum_prod_Ts, h_prod_Tss, h_Tsss, ph_Tss) = mk_types fp_rec_fun_Ts;
   261           val (h_sum_prod_Ts, h_prod_Tss, h_Tsss, ph_Tss) = mk_types fp_rec_fun_Ts;
   262 
   262 
   271 
   271 
   272           val cpss = map2 (fn c => map (fn p => p $ c)) cs pss;
   272           val cpss = map2 (fn c => map (fn p => p $ c)) cs pss;
   273 
   273 
   274           fun mk_terms fsss =
   274           fun mk_terms fsss =
   275             let
   275             let
   276               val pfss = map2 popescu_zip pss fsss;
   276               val pfss = map2 zip_preds_getters pss fsss;
   277               val cfsss = map2 (fn c => map (map (fn f => f $ c))) cs fsss
   277               val cfsss = map2 (fn c => map (map (fn f => f $ c))) cs fsss
   278             in (pfss, cfsss) end;
   278             in (pfss, cfsss) end;
   279         in
   279         in
   280           ((([], [], []), ([], [], [])),
   280           ((([], [], []), ([], [], [])),
   281            ([z], cs, cpss, p_Tss, (mk_terms gsss, g_sum_prod_Ts, g_prod_Tss, pg_Tss),
   281            ([z], cs, cpss, p_Tss, (mk_terms gsss, g_sum_prod_Ts, g_prod_Tss, pg_Tss),
   407               let
   407               let
   408                 val res_T = fold_rev (curry (op --->)) pf_Tss B_to_fpT;
   408                 val res_T = fold_rev (curry (op --->)) pf_Tss B_to_fpT;
   409 
   409 
   410                 val binder = Binding.suffix_name ("_" ^ suf) b;
   410                 val binder = Binding.suffix_name ("_" ^ suf) b;
   411 
   411 
   412                 fun mk_popescu_join c n cps sum_prod_T prod_Ts cfss =
   412                 fun mk_preds_getters_join c n cps sum_prod_T prod_Ts cfss =
   413                   Term.lambda c (mk_IfN sum_prod_T cps
   413                   Term.lambda c (mk_IfN sum_prod_T cps
   414                     (map2 (mk_InN prod_Ts) (map HOLogic.mk_tuple cfss) (1 upto n)));
   414                     (map2 (mk_InN prod_Ts) (map HOLogic.mk_tuple cfss) (1 upto n)));
   415 
   415 
   416                 val spec =
   416                 val spec =
   417                   mk_Trueprop_eq (lists_bmoc pfss (Free (Binding.name_of binder, res_T)),
   417                   mk_Trueprop_eq (lists_bmoc pfss (Free (Binding.name_of binder, res_T)),
   418                     Term.list_comb (fp_iter_like,
   418                     Term.list_comb (fp_iter_like,
   419                       map6 mk_popescu_join cs ns cpss f_sum_prod_Ts f_prod_Tss cfsss));
   419                       map6 mk_preds_getters_join cs ns cpss f_sum_prod_Ts f_prod_Tss cfsss));
   420               in (binder, spec) end;
   420               in (binder, spec) end;
   421 
   421 
   422             val coiter_likes =
   422             val coiter_likes =
   423               [(coiterN, fp_iter, coiter_only),
   423               [(coiterN, fp_iter, coiter_only),
   424                (corecN, fp_rec, corec_only)];
   424                (corecN, fp_rec, corec_only)];