author | blanchet |
Wed, 06 Nov 2013 22:50:12 +0100 | |
changeset 54284 | 0b53378080d9 |
parent 54283 | 6f0a49ed1bb1 |
child 54286 | 22616f65d4ea |
permissions | -rw-r--r-- |
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
1 |
(* Title: HOL/BNF/Tools/bnf_fp_n2m_sugar.ML |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
2 |
Author: Jasmin Blanchette, TU Muenchen |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
3 |
Copyright 2013 |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
4 |
|
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
5 |
Suggared flattening of nested to mutual (co)recursion. |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
6 |
*) |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
7 |
|
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
8 |
signature BNF_FP_N2M_SUGAR = |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
9 |
sig |
54243 | 10 |
val unfold_let: term -> term |
11 |
val dest_map: Proof.context -> string -> term -> term * term list |
|
12 |
||
54009 | 13 |
val mutualize_fp_sugars: bool -> BNF_FP_Util.fp_kind -> binding list -> typ list -> |
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
14 |
(term -> int list) -> term list list list list -> BNF_FP_Def_Sugar.fp_sugar list -> |
53746
bd038e48526d
have "datatype_new_compat" register induction and recursion theorems in nested case
blanchet
parents:
53678
diff
changeset
|
15 |
local_theory -> |
bd038e48526d
have "datatype_new_compat" register induction and recursion theorems in nested case
blanchet
parents:
53678
diff
changeset
|
16 |
(BNF_FP_Def_Sugar.fp_sugar list |
bd038e48526d
have "datatype_new_compat" register induction and recursion theorems in nested case
blanchet
parents:
53678
diff
changeset
|
17 |
* (BNF_FP_Def_Sugar.lfp_sugar_thms option * BNF_FP_Def_Sugar.gfp_sugar_thms option)) |
bd038e48526d
have "datatype_new_compat" register induction and recursion theorems in nested case
blanchet
parents:
53678
diff
changeset
|
18 |
* local_theory |
54267 | 19 |
val indexify_callsss: BNF_FP_Def_Sugar.fp_sugar -> (term * term list list) list -> |
20 |
term list list list |
|
54009 | 21 |
val nested_to_mutual_fps: BNF_FP_Util.fp_kind -> binding list -> typ list -> (term -> int list) -> |
22 |
(term * term list list) list list -> local_theory -> |
|
53746
bd038e48526d
have "datatype_new_compat" register induction and recursion theorems in nested case
blanchet
parents:
53678
diff
changeset
|
23 |
(typ list * int list * BNF_FP_Def_Sugar.fp_sugar list |
bd038e48526d
have "datatype_new_compat" register induction and recursion theorems in nested case
blanchet
parents:
53678
diff
changeset
|
24 |
* (BNF_FP_Def_Sugar.lfp_sugar_thms option * BNF_FP_Def_Sugar.gfp_sugar_thms option)) |
bd038e48526d
have "datatype_new_compat" register induction and recursion theorems in nested case
blanchet
parents:
53678
diff
changeset
|
25 |
* local_theory |
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
26 |
end; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
27 |
|
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
28 |
structure BNF_FP_N2M_Sugar : BNF_FP_N2M_SUGAR = |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
29 |
struct |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
30 |
|
54006 | 31 |
open Ctr_Sugar |
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
32 |
open BNF_Util |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
33 |
open BNF_Def |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
34 |
open BNF_FP_Util |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
35 |
open BNF_FP_Def_Sugar |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
36 |
open BNF_FP_N2M |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
37 |
|
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
38 |
val n2mN = "n2m_" |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
39 |
|
54256 | 40 |
type n2m_sugar = fp_sugar list * (lfp_sugar_thms option * gfp_sugar_thms option); |
41 |
||
42 |
structure Data = Generic_Data |
|
43 |
( |
|
44 |
type T = n2m_sugar Typtab.table; |
|
45 |
val empty = Typtab.empty; |
|
46 |
val extend = I; |
|
47 |
val merge = Typtab.merge (eq_fst (eq_list eq_fp_sugar)); |
|
48 |
); |
|
49 |
||
50 |
fun morph_n2m_sugar phi (fp_sugars, (lfp_sugar_thms_opt, gfp_sugar_thms_opt)) = |
|
51 |
(map (morph_fp_sugar phi) fp_sugars, |
|
52 |
(Option.map (morph_lfp_sugar_thms phi) lfp_sugar_thms_opt, |
|
53 |
Option.map (morph_gfp_sugar_thms phi) gfp_sugar_thms_opt)); |
|
54 |
||
55 |
val transfer_n2m_sugar = |
|
56 |
morph_n2m_sugar o Morphism.thm_morphism o Thm.transfer o Proof_Context.theory_of; |
|
57 |
||
58 |
fun n2m_sugar_of ctxt = |
|
59 |
Typtab.lookup (Data.get (Context.Proof ctxt)) |
|
60 |
#> Option.map (transfer_n2m_sugar ctxt); |
|
61 |
||
62 |
fun register_n2m_sugar key n2m_sugar = |
|
63 |
Local_Theory.declaration {syntax = false, pervasive = false} |
|
64 |
(fn phi => Data.map (Typtab.default (key, morph_n2m_sugar phi n2m_sugar))); |
|
65 |
||
54243 | 66 |
fun unfold_let (Const (@{const_name Let}, _) $ arg1 $ arg2) = unfold_let (betapply (arg2, arg1)) |
67 |
| unfold_let (Const (@{const_name prod_case}, _) $ t) = |
|
68 |
(case unfold_let t of |
|
69 |
t' as Abs (s1, T1, Abs (s2, T2, _)) => |
|
70 |
let |
|
71 |
val x = (s1 ^ s2, Term.maxidx_of_term t + 1); |
|
72 |
val v = Var (x, HOLogic.mk_prodT (T1, T2)); |
|
73 |
in |
|
74 |
lambda v (unfold_let (betapplys (t', [HOLogic.mk_fst v, HOLogic.mk_snd v]))) |
|
75 |
end |
|
76 |
| _ => t) |
|
77 |
| unfold_let (t $ u) = betapply (unfold_let t, unfold_let u) |
|
78 |
| unfold_let (Abs (s, T, t)) = Abs (s, T, unfold_let t) |
|
79 |
| unfold_let t = t; |
|
80 |
||
81 |
fun mk_map_pattern ctxt s = |
|
82 |
let |
|
83 |
val bnf = the (bnf_of ctxt s); |
|
84 |
val mapx = map_of_bnf bnf; |
|
85 |
val live = live_of_bnf bnf; |
|
86 |
val (f_Ts, _) = strip_typeN live (fastype_of mapx); |
|
54265
3e1d230f1c00
make local theory operations non-pervasive (makes more intuitive sense)
blanchet
parents:
54256
diff
changeset
|
87 |
val fs = map_index (fn (i, T) => Var (("?f", i), T)) f_Ts; |
54243 | 88 |
in |
89 |
(mapx, betapplys (mapx, fs)) |
|
90 |
end; |
|
91 |
||
92 |
fun dest_map ctxt s call = |
|
93 |
let |
|
94 |
val (map0, pat) = mk_map_pattern ctxt s; |
|
95 |
val (_, tenv) = fo_match ctxt call pat; |
|
96 |
in |
|
97 |
(map0, Vartab.fold_rev (fn (_, (_, f)) => cons f) tenv []) |
|
98 |
end; |
|
99 |
||
54276 | 100 |
fun dest_abs_or_applied_map _ _ (Abs (_, _, t)) = (Term.dummy, [t]) |
101 |
| dest_abs_or_applied_map ctxt s (t1 $ _) = dest_map ctxt s t1; |
|
54239 | 102 |
|
54245 | 103 |
fun map_partition f xs = |
104 |
fold_rev (fn x => fn (ys, (good, bad)) => |
|
105 |
case f x of SOME y => (y :: ys, (x :: good, bad)) | NONE => (ys, (good, x :: bad))) |
|
106 |
xs ([], ([], [])); |
|
107 |
||
54256 | 108 |
fun key_of_fp_eqs fp fpTs fp_eqs = |
54267 | 109 |
Type (fp_case fp "l" "g", fpTs @ maps (fn (x, T) => [TFree x, T]) fp_eqs); |
54256 | 110 |
|
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
111 |
(* TODO: test with sort constraints on As *) |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
112 |
(* TODO: use right sorting order for "fp_sort" w.r.t. original BNFs (?) -- treat new variables |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
113 |
as deads? *) |
54245 | 114 |
fun mutualize_fp_sugars has_nested fp bs fpTs get_indices callssss fp_sugars0 no_defs_lthy0 = |
54253 | 115 |
if has_nested then |
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
116 |
let |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
117 |
val thy = Proof_Context.theory_of no_defs_lthy0; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
118 |
|
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
119 |
val qsotm = quote o Syntax.string_of_term no_defs_lthy0; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
120 |
|
54245 | 121 |
fun incompatible_calls t1 t2 = |
122 |
error ("Incompatible " ^ co_prefix fp ^ "recursive calls: " ^ qsotm t1 ^ " vs. " ^ |
|
123 |
qsotm t2); |
|
124 |
||
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
125 |
val b_names = map Binding.name_of bs; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
126 |
val fp_b_names = map base_name_of_typ fpTs; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
127 |
|
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
128 |
val nn = length fpTs; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
129 |
|
53974 | 130 |
fun target_ctr_sugar_of_fp_sugar fpT ({T, index, ctr_sugars, ...} : fp_sugar) = |
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
131 |
let |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
132 |
val rho = Vartab.fold (cons o apsnd snd) (Sign.typ_match thy (T, fpT) Vartab.empty) []; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
133 |
val phi = Morphism.term_morphism (Term.subst_TVars rho); |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
134 |
in |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
135 |
morph_ctr_sugar phi (nth ctr_sugars index) |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
136 |
end; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
137 |
|
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
138 |
val ctr_defss = map (of_fp_sugar #ctr_defss) fp_sugars0; |
53476
eb3865c3ee58
include map theorems in datastructure for "primcorec"
blanchet
parents:
53475
diff
changeset
|
139 |
val mapss = map (of_fp_sugar #mapss) fp_sugars0; |
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
140 |
val ctr_sugars0 = map2 target_ctr_sugar_of_fp_sugar fpTs fp_sugars0; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
141 |
|
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
142 |
val ctrss = map #ctrs ctr_sugars0; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
143 |
val ctr_Tss = map (map fastype_of) ctrss; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
144 |
|
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
145 |
val As' = fold (fold Term.add_tfreesT) ctr_Tss []; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
146 |
val As = map TFree As'; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
147 |
|
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
148 |
val ((Cs, Xs), no_defs_lthy) = |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
149 |
no_defs_lthy0 |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
150 |
|> fold Variable.declare_typ As |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
151 |
|> mk_TFrees nn |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
152 |
||>> variant_tfrees fp_b_names; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
153 |
|
54245 | 154 |
fun check_call_dead live_call call = |
155 |
if null (get_indices call) then () else incompatible_calls live_call call; |
|
156 |
||
54255 | 157 |
fun freeze_fpTs_simple (T as Type (s, Ts)) = |
54253 | 158 |
(case find_index (curry (op =) T) fpTs of |
54255 | 159 |
~1 => Type (s, map freeze_fpTs_simple Ts) |
54253 | 160 |
| kk => nth Xs kk) |
54255 | 161 |
| freeze_fpTs_simple T = T; |
54253 | 162 |
|
54255 | 163 |
fun freeze_fpTs_map (callss, (live_call :: _, dead_calls)) s Ts = |
54245 | 164 |
(List.app (check_call_dead live_call) dead_calls; |
54255 | 165 |
Type (s, map2 freeze_fpTs (flatten_type_args_of_bnf (the (bnf_of no_defs_lthy s)) [] |
54245 | 166 |
(transpose callss)) Ts)) |
54255 | 167 |
and freeze_fpTs calls (T as Type (s, Ts)) = |
54245 | 168 |
(case map_partition (try (snd o dest_map no_defs_lthy s)) calls of |
169 |
([], _) => |
|
54276 | 170 |
(case map_partition (try (snd o dest_abs_or_applied_map no_defs_lthy s)) calls of |
54255 | 171 |
([], _) => freeze_fpTs_simple T |
172 |
| callsp => freeze_fpTs_map callsp s Ts) |
|
173 |
| callsp => freeze_fpTs_map callsp s Ts) |
|
174 |
| freeze_fpTs _ T = T; |
|
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
175 |
|
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
176 |
val ctr_Tsss = map (map binder_types) ctr_Tss; |
54255 | 177 |
val ctrXs_Tsss = map2 (map2 (map2 freeze_fpTs)) callssss ctr_Tsss; |
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
178 |
val ctrXs_sum_prod_Ts = map (mk_sumTN_balanced o map HOLogic.mk_tupleT) ctrXs_Tsss; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
179 |
val Ts = map (body_type o hd) ctr_Tss; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
180 |
|
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
181 |
val ns = map length ctr_Tsss; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
182 |
val kss = map (fn n => 1 upto n) ns; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
183 |
val mss = map (map length) ctr_Tsss; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
184 |
|
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
185 |
val fp_eqs = map dest_TFree Xs ~~ ctrXs_sum_prod_Ts; |
54256 | 186 |
val key = key_of_fp_eqs fp fpTs fp_eqs; |
187 |
in |
|
188 |
(case n2m_sugar_of no_defs_lthy key of |
|
189 |
SOME n2m_sugar => (n2m_sugar, no_defs_lthy) |
|
190 |
| NONE => |
|
191 |
let |
|
192 |
val base_fp_names = Name.variant_list [] fp_b_names; |
|
193 |
val fp_bs = map2 (fn b_name => fn base_fp_name => |
|
194 |
Binding.qualify true b_name (Binding.name (n2mN ^ base_fp_name))) |
|
195 |
b_names base_fp_names; |
|
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
196 |
|
54256 | 197 |
val (pre_bnfs, (fp_res as {xtor_co_iterss = xtor_co_iterss0, xtor_co_induct, |
198 |
dtor_injects, dtor_ctors, xtor_co_iter_thmss, ...}, lthy)) = |
|
199 |
fp_bnf (construct_mutualized_fp fp fpTs fp_sugars0) fp_bs As' fp_eqs no_defs_lthy; |
|
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
200 |
|
54256 | 201 |
val nesting_bnfs = nesty_bnfs lthy ctrXs_Tsss As; |
202 |
val nested_bnfs = nesty_bnfs lthy ctrXs_Tsss Xs; |
|
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
203 |
|
54256 | 204 |
val ((xtor_co_iterss, iters_args_types, coiters_args_types), _) = |
205 |
mk_co_iters_prelims fp ctr_Tsss fpTs Cs ns mss xtor_co_iterss0 lthy; |
|
206 |
||
207 |
fun mk_binding b suf = Binding.suffix_name ("_" ^ suf) b; |
|
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
208 |
|
54256 | 209 |
val ((co_iterss, co_iter_defss), lthy) = |
210 |
fold_map2 (fn b => |
|
211 |
(if fp = Least_FP then define_iters [foldN, recN] (the iters_args_types) |
|
212 |
else define_coiters [unfoldN, corecN] (the coiters_args_types)) |
|
213 |
(mk_binding b) fpTs Cs) fp_bs xtor_co_iterss lthy |
|
214 |
|>> split_list; |
|
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
215 |
|
54256 | 216 |
val rho = tvar_subst thy Ts fpTs; |
217 |
val ctr_sugar_phi = |
|
218 |
Morphism.compose (Morphism.typ_morphism (Term.typ_subst_TVars rho)) |
|
219 |
(Morphism.term_morphism (Term.subst_TVars rho)); |
|
220 |
val inst_ctr_sugar = morph_ctr_sugar ctr_sugar_phi; |
|
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
221 |
|
54256 | 222 |
val ctr_sugars = map inst_ctr_sugar ctr_sugars0; |
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
223 |
|
54256 | 224 |
val ((co_inducts, un_fold_thmss, co_rec_thmss, disc_unfold_thmss, disc_corec_thmss, |
225 |
sel_unfold_thmsss, sel_corec_thmsss), fp_sugar_thms) = |
|
226 |
if fp = Least_FP then |
|
227 |
derive_induct_iters_thms_for_types pre_bnfs (the iters_args_types) xtor_co_induct |
|
228 |
xtor_co_iter_thmss nesting_bnfs nested_bnfs fpTs Cs Xs ctrXs_Tsss ctrss ctr_defss |
|
229 |
co_iterss co_iter_defss lthy |
|
230 |
|> `(fn ((_, induct, _), (fold_thmss, rec_thmss, _)) => |
|
231 |
([induct], fold_thmss, rec_thmss, [], [], [], [])) |
|
232 |
||> (fn info => (SOME info, NONE)) |
|
233 |
else |
|
234 |
derive_coinduct_coiters_thms_for_types pre_bnfs (the coiters_args_types) |
|
235 |
xtor_co_induct dtor_injects dtor_ctors xtor_co_iter_thmss nesting_bnfs fpTs Cs Xs |
|
236 |
ctrXs_Tsss kss mss ns ctr_defss ctr_sugars co_iterss co_iter_defss |
|
237 |
(Proof_Context.export lthy no_defs_lthy) lthy |
|
238 |
|> `(fn ((coinduct_thms_pairs, _), (unfold_thmss, corec_thmss, _), |
|
239 |
(disc_unfold_thmss, disc_corec_thmss, _), _, |
|
240 |
(sel_unfold_thmsss, sel_corec_thmsss, _)) => |
|
241 |
(map snd coinduct_thms_pairs, unfold_thmss, corec_thmss, disc_unfold_thmss, |
|
242 |
disc_corec_thmss, sel_unfold_thmsss, sel_corec_thmsss)) |
|
243 |
||> (fn info => (NONE, SOME info)); |
|
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
244 |
|
54256 | 245 |
val phi = Proof_Context.export_morphism no_defs_lthy no_defs_lthy0; |
246 |
||
247 |
fun mk_target_fp_sugar (kk, T) = |
|
248 |
{T = T, fp = fp, index = kk, pre_bnfs = pre_bnfs, nested_bnfs = nested_bnfs, |
|
249 |
nesting_bnfs = nesting_bnfs, fp_res = fp_res, ctr_defss = ctr_defss, |
|
250 |
ctr_sugars = ctr_sugars, co_iterss = co_iterss, mapss = mapss, co_inducts = co_inducts, |
|
251 |
co_iter_thmsss = transpose [un_fold_thmss, co_rec_thmss], |
|
252 |
disc_co_itersss = transpose [disc_unfold_thmss, disc_corec_thmss], |
|
253 |
sel_co_iterssss = transpose [sel_unfold_thmsss, sel_corec_thmsss]} |
|
254 |
|> morph_fp_sugar phi; |
|
255 |
||
256 |
val n2m_sugar = (map_index mk_target_fp_sugar fpTs, fp_sugar_thms); |
|
257 |
in |
|
258 |
(n2m_sugar, lthy |> register_n2m_sugar key n2m_sugar) |
|
259 |
end) |
|
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
260 |
end |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
261 |
else |
53746
bd038e48526d
have "datatype_new_compat" register induction and recursion theorems in nested case
blanchet
parents:
53678
diff
changeset
|
262 |
((fp_sugars0, (NONE, NONE)), no_defs_lthy0); |
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
263 |
|
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
264 |
fun indexify_callsss fp_sugar callsss = |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
265 |
let |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
266 |
val {ctrs, ...} = of_fp_sugar #ctr_sugars fp_sugar; |
54283
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
267 |
fun indexify_ctr ctr = |
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
268 |
(case AList.lookup Term.aconv_untyped callsss ctr of |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
269 |
NONE => replicate (num_binder_types (fastype_of ctr)) [] |
54243 | 270 |
| SOME callss => map (map (Envir.beta_eta_contract o unfold_let)) callss); |
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
271 |
in |
54283
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
272 |
map indexify_ctr ctrs |
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
273 |
end; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
274 |
|
54283
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
275 |
fun retypargs tyargs (Type (s, _)) = Type (s, tyargs); |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
276 |
|
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
277 |
fun fold_subtype_pairs f (T as Type (s, Ts), U as Type (s', Us)) = |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
278 |
f (T, U) #> (if s = s' then fold (fold_subtype_pairs f) (Ts ~~ Us) else I) |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
279 |
| fold_subtype_pairs f TU = f TU; |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
280 |
|
54009 | 281 |
fun nested_to_mutual_fps fp actual_bs actual_Ts get_indices actual_callssss0 lthy = |
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
282 |
let |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
283 |
val qsoty = quote o Syntax.string_of_typ lthy; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
284 |
val qsotys = space_implode " or " o map qsoty; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
285 |
|
54253 | 286 |
fun duplicate_datatype T = error (qsoty T ^ " is not mutually recursive with itself"); |
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
287 |
fun not_co_datatype0 T = error (qsoty T ^ " is not a " ^ co_prefix fp ^ "datatype"); |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
288 |
fun not_co_datatype (T as Type (s, _)) = |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
289 |
if fp = Least_FP andalso |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
290 |
is_some (Datatype_Data.get_info (Proof_Context.theory_of lthy) s) then |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
291 |
error (qsoty T ^ " is not a new-style datatype (cf. \"datatype_new\")") |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
292 |
else |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
293 |
not_co_datatype0 T |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
294 |
| not_co_datatype T = not_co_datatype0 T; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
295 |
|
54253 | 296 |
val _ = (case Library.duplicates (op =) actual_Ts of [] => () | T :: _ => duplicate_datatype T); |
297 |
||
54273 | 298 |
val perm_actual_Ts as Type (_, tyargs0) :: _ = |
54266
4e0738356ac9
stronger normalization, to increase n2m cache effectiveness
blanchet
parents:
54265
diff
changeset
|
299 |
sort (prod_ord int_ord Term_Ord.typ_ord o pairself (`Term.size_of_typ)) actual_Ts; |
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
300 |
|
54283
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
301 |
fun the_ctrs_of (Type (s, Ts)) = map (mk_ctr Ts) (#ctrs (the (ctr_sugar_of lthy s))); |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
302 |
|
54282 | 303 |
fun the_fp_sugar_of (T as Type (T_name, _)) = |
304 |
(case fp_sugar_of lthy T_name of |
|
305 |
SOME (fp_sugar as {fp = fp', ...}) => if fp = fp' then fp_sugar else not_co_datatype T |
|
306 |
| NONE => not_co_datatype T); |
|
307 |
||
54283
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
308 |
fun gen_rhss_in gen_Ts rho subTs = |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
309 |
let |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
310 |
fun maybe_insert (T, Type (_, gen_tyargs)) = |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
311 |
if member (op =) subTs T then insert (op =) gen_tyargs else I |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
312 |
| maybe_insert _ = I; |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
313 |
|
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
314 |
val ctrs = maps the_ctrs_of gen_Ts; |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
315 |
val gen_ctr_Ts = maps (binder_types o fastype_of) ctrs; |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
316 |
val ctr_Ts = map (Term.typ_subst_atomic rho) gen_ctr_Ts; |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
317 |
in |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
318 |
fold (fold_subtype_pairs maybe_insert) (ctr_Ts ~~ gen_ctr_Ts) [] |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
319 |
end; |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
320 |
|
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
321 |
fun check_enrich_with_mutuals _ _ seen gen_seen [] = (seen, gen_seen) |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
322 |
| check_enrich_with_mutuals lthy rho seen gen_seen ((T as Type (_, tyargs)) :: Ts) = |
54282 | 323 |
let |
54283
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
324 |
val {fp_res = {Ts = mutual_Ts0, ...}, ...} = the_fp_sugar_of T; |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
325 |
val mutual_Ts = map (retypargs tyargs) mutual_Ts0; |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
326 |
|
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
327 |
fun fresh_tyargs () = |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
328 |
let |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
329 |
(* The name "'z" is unlikely to clash with the context, yielding more cache hits. *) |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
330 |
val (gen_tyargs, lthy') = |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
331 |
variant_tfrees (replicate (length tyargs) "z") lthy |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
332 |
|>> map Logic.varifyT_global; |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
333 |
val rho' = (gen_tyargs ~~ tyargs) @ rho; |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
334 |
in |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
335 |
(rho', gen_tyargs, gen_seen, lthy') |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
336 |
end; |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
337 |
|
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
338 |
val (rho', gen_tyargs, gen_seen', lthy') = |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
339 |
if exists (exists_subtype_in seen) mutual_Ts then |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
340 |
(case gen_rhss_in gen_seen rho mutual_Ts of |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
341 |
[] => fresh_tyargs () |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
342 |
| gen_tyargss as gen_tyargs :: gen_tyargss_tl => |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
343 |
let |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
344 |
val unify_pairs = split_list (maps (curry (op ~~) gen_tyargs) gen_tyargss_tl); |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
345 |
val mgu = Type.raw_unifys unify_pairs Vartab.empty; |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
346 |
val gen_tyargs' = map (Envir.subst_type mgu) gen_tyargs; |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
347 |
val gen_seen' = map (Envir.subst_type mgu) gen_seen; |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
348 |
in |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
349 |
(rho, gen_tyargs', gen_seen', lthy) |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
350 |
end) |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
351 |
else |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
352 |
fresh_tyargs (); |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
353 |
|
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
354 |
val gen_mutual_Ts = map (retypargs gen_tyargs) mutual_Ts0; |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
355 |
val Ts' = filter_out (member (op =) mutual_Ts) Ts; |
54282 | 356 |
in |
54283
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
357 |
check_enrich_with_mutuals lthy' rho' (seen @ mutual_Ts) (gen_seen' @ gen_mutual_Ts) Ts' |
54282 | 358 |
end |
54283
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
359 |
| check_enrich_with_mutuals _ _ _ _ (T :: _) = not_co_datatype T; |
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
360 |
|
54283
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
361 |
val (perm_Ts, perm_gen_Ts) = check_enrich_with_mutuals lthy [] [] [] perm_actual_Ts; |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
362 |
val perm_frozen_gen_Ts = map Logic.unvarifyT_global perm_gen_Ts; |
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
363 |
|
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
364 |
val missing_Ts = perm_Ts |> subtract (op =) actual_Ts; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
365 |
val Ts = actual_Ts @ missing_Ts; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
366 |
|
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
367 |
val nn = length Ts; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
368 |
val kks = 0 upto nn - 1; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
369 |
|
54267 | 370 |
val callssss0 = pad_list [] nn actual_callssss0; |
371 |
||
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
372 |
val common_name = mk_common_name (map Binding.name_of actual_bs); |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
373 |
val bs = pad_list (Binding.name common_name) nn actual_bs; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
374 |
|
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
375 |
fun permute xs = permute_like (op =) Ts perm_Ts xs; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
376 |
fun unpermute perm_xs = permute_like (op =) perm_Ts Ts perm_xs; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
377 |
|
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
378 |
val perm_bs = permute bs; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
379 |
val perm_kks = permute kks; |
54267 | 380 |
val perm_callssss0 = permute callssss0; |
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
381 |
val perm_fp_sugars0 = map (the o fp_sugar_of lthy o fst o dest_Type) perm_Ts; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
382 |
|
54273 | 383 |
val has_nested = exists (fn Type (_, tyargs) => tyargs <> tyargs0) Ts; |
54267 | 384 |
val perm_callssss = map2 indexify_callsss perm_fp_sugars0 perm_callssss0; |
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
385 |
|
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
386 |
val get_perm_indices = map (fn kk => find_index (curry (op =) kk) perm_kks) o get_indices; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
387 |
|
53746
bd038e48526d
have "datatype_new_compat" register induction and recursion theorems in nested case
blanchet
parents:
53678
diff
changeset
|
388 |
val ((perm_fp_sugars, fp_sugar_thms), lthy) = |
54283
6f0a49ed1bb1
fourth attempt at generalizing N2M types (to leverage caching)
blanchet
parents:
54282
diff
changeset
|
389 |
mutualize_fp_sugars has_nested fp perm_bs perm_frozen_gen_Ts get_perm_indices perm_callssss |
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
390 |
perm_fp_sugars0 lthy; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
391 |
|
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
392 |
val fp_sugars = unpermute perm_fp_sugars; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
393 |
in |
53746
bd038e48526d
have "datatype_new_compat" register induction and recursion theorems in nested case
blanchet
parents:
53678
diff
changeset
|
394 |
((missing_Ts, perm_kks, fp_sugars, fp_sugar_thms), lthy) |
53303
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
395 |
end; |
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
396 |
|
ae49b835ca01
moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff
changeset
|
397 |
end; |