equal
deleted
inserted
replaced
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; |