src/HOL/Codatatype/Tools/bnf_fp_sugar.ML
changeset 49183 0cc46e2dee7e
parent 49182 b8517107ffc5
child 49184 83fdea0c4779
equal deleted inserted replaced
49182:b8517107ffc5 49183:0cc46e2dee7e
    85     val ctr_binderss = map (map ctr_of) ctr_specss;
    85     val ctr_binderss = map (map ctr_of) ctr_specss;
    86     val ctr_argsss = map (map args_of) ctr_specss;
    86     val ctr_argsss = map (map args_of) ctr_specss;
    87     val ctr_mixfixess = map (map ctr_mixfix_of) ctr_specss;
    87     val ctr_mixfixess = map (map ctr_mixfix_of) ctr_specss;
    88 
    88 
    89     val sel_bindersss = map (map (map fst)) ctr_argsss;
    89     val sel_bindersss = map (map (map fst)) ctr_argsss;
    90     val ctr_Tsss = map (map (map (prepare_typ fake_lthy o snd))) ctr_argsss;
    90     val fake_ctr_Tsss = map (map (map (prepare_typ fake_lthy o snd))) ctr_argsss;
    91 
    91 
    92     val rhs_As' = fold (fold (fold Term.add_tfreesT)) ctr_Tsss [];
    92     val rhs_As' = fold (fold (fold Term.add_tfreesT)) fake_ctr_Tsss [];
    93     val _ = (case subtract (op =) As' rhs_As' of
    93     val _ = (case subtract (op =) As' rhs_As' of
    94         [] => ()
    94         [] => ()
    95       | A' :: _ => error ("Extra type variables on rhs: " ^
    95       | A' :: _ => error ("Extra type variables on rhs: " ^
    96           quote (Syntax.string_of_typ lthy (TFree A'))));
    96           quote (Syntax.string_of_typ lthy (TFree A'))));
    97 
    97 
   110         (case find_index (is_same_recT T) fake_Ts of
   110         (case find_index (is_same_recT T) fake_Ts of
   111           ~1 => Type (s, map freeze_recXs Us)
   111           ~1 => Type (s, map freeze_recXs Us)
   112         | i => nth Xs i)
   112         | i => nth Xs i)
   113       | freeze_recXs T = T;
   113       | freeze_recXs T = T;
   114 
   114 
   115     val ctr_TsssXs = map (map (map freeze_recXs)) ctr_Tsss;
   115     val ctr_TsssXs = map (map (map freeze_recXs)) fake_ctr_Tsss;
   116     val sum_prod_TsXs = map (mk_sumTN o map HOLogic.mk_tupleT) ctr_TsssXs;
   116     val sum_prod_TsXs = map (mk_sumTN o map HOLogic.mk_tupleT) ctr_TsssXs;
   117 
   117 
   118     val eqs = map dest_TFree Xs ~~ sum_prod_TsXs;
   118     val eqs = map dest_TFree Xs ~~ sum_prod_TsXs;
   119 
   119 
   120     val ((raw_unfs, raw_flds, raw_fp_iters, raw_fp_recs, unf_flds, fld_unfs, fld_injects), lthy') =
   120     val ((raw_unfs, raw_flds, raw_fp_iters, raw_fp_recs, unf_flds, fld_unfs, fld_injects), lthy') =
   132 
   132 
   133     val unfs = map (mk_unf As) raw_unfs;
   133     val unfs = map (mk_unf As) raw_unfs;
   134     val flds = map (mk_fld As) raw_flds;
   134     val flds = map (mk_fld As) raw_flds;
   135 
   135 
   136     val fp_Ts = map (domain_type o fastype_of) unfs;
   136     val fp_Ts = map (domain_type o fastype_of) unfs;
       
   137     val ctr_Tsss = map (map (map (Term.typ_subst_atomic (Xs ~~ fp_Ts)))) ctr_TsssXs;
   137 
   138 
   138     fun mk_fp_iter_or_rec Ts Us t =
   139     fun mk_fp_iter_or_rec Ts Us t =
   139       let
   140       let
   140         val (binders, body) = strip_type (fastype_of t);
   141         val (binders, body) = strip_type (fastype_of t);
   141         val Type (_, Ts0) = if gfp then body else List.last binders;
   142         val Type (_, Ts0) = if gfp then body else List.last binders;