5 Suggared flattening of nested to mutual (co)recursion. |
5 Suggared flattening of nested to mutual (co)recursion. |
6 *) |
6 *) |
7 |
7 |
8 signature BNF_FP_N2M_SUGAR = |
8 signature BNF_FP_N2M_SUGAR = |
9 sig |
9 sig |
10 val unfold_let: term -> term |
10 val unfold_lets_splits: term -> term |
11 val dest_map: Proof.context -> string -> term -> term * term list |
11 val dest_map: Proof.context -> string -> term -> term * term list |
12 |
12 |
13 val mutualize_fp_sugars: BNF_FP_Util.fp_kind -> binding list -> typ list -> (term -> int list) -> |
13 val mutualize_fp_sugars: BNF_FP_Util.fp_kind -> binding list -> typ list -> (term -> int list) -> |
14 term list list list list -> BNF_FP_Def_Sugar.fp_sugar list -> local_theory -> |
14 term list list list list -> BNF_FP_Def_Sugar.fp_sugar list -> local_theory -> |
15 (BNF_FP_Def_Sugar.fp_sugar list |
15 (BNF_FP_Def_Sugar.fp_sugar list |
60 |
60 |
61 fun register_n2m_sugar key n2m_sugar = |
61 fun register_n2m_sugar key n2m_sugar = |
62 Local_Theory.declaration {syntax = false, pervasive = false} |
62 Local_Theory.declaration {syntax = false, pervasive = false} |
63 (fn phi => Data.map (Typtab.default (key, morph_n2m_sugar phi n2m_sugar))); |
63 (fn phi => Data.map (Typtab.default (key, morph_n2m_sugar phi n2m_sugar))); |
64 |
64 |
65 fun unfold_let (Const (@{const_name Let}, _) $ arg1 $ arg2) = unfold_let (betapply (arg2, arg1)) |
65 fun unfold_lets_splits (Const (@{const_name Let}, _) $ arg1 $ arg2) = |
66 | unfold_let (t as Const (@{const_name prod_case}, _) $ u) = |
66 unfold_lets_splits (betapply (arg2, arg1)) |
67 (case unfold_let u of |
67 | unfold_lets_splits (t as Const (@{const_name prod_case}, _) $ u) = |
|
68 (case unfold_lets_splits u of |
68 u' as Abs (s1, T1, Abs (s2, T2, _)) => |
69 u' as Abs (s1, T1, Abs (s2, T2, _)) => |
69 let val v = Var ((s1 ^ s2, Term.maxidx_of_term u' + 1), HOLogic.mk_prodT (T1, T2)) in |
70 let val v = Var ((s1 ^ s2, Term.maxidx_of_term u' + 1), HOLogic.mk_prodT (T1, T2)) in |
70 lambda v (incr_boundvars 1 (betapplys (u', [HOLogic.mk_fst v, HOLogic.mk_snd v]))) |
71 lambda v (incr_boundvars 1 (betapplys (u', [HOLogic.mk_fst v, HOLogic.mk_snd v]))) |
71 end |
72 end |
72 | _ => t) |
73 | _ => t) |
73 | unfold_let (t $ u) = betapply (unfold_let t, unfold_let u) |
74 | unfold_lets_splits (t $ u) = betapply (pairself unfold_lets_splits (t, u)) |
74 | unfold_let (Abs (s, T, t)) = Abs (s, T, unfold_let t) |
75 | unfold_lets_splits (Abs (s, T, t)) = Abs (s, T, unfold_lets_splits t) |
75 | unfold_let t = t; |
76 | unfold_lets_splits t = t; |
76 |
77 |
77 fun mk_map_pattern ctxt s = |
78 fun mk_map_pattern ctxt s = |
78 let |
79 let |
79 val bnf = the (bnf_of ctxt s); |
80 val bnf = the (bnf_of ctxt s); |
80 val mapx = map_of_bnf bnf; |
81 val mapx = map_of_bnf bnf; |
253 let |
254 let |
254 val {ctrs, ...} = of_fp_sugar #ctr_sugars fp_sugar; |
255 val {ctrs, ...} = of_fp_sugar #ctr_sugars fp_sugar; |
255 fun indexify_ctr ctr = |
256 fun indexify_ctr ctr = |
256 (case AList.lookup Term.aconv_untyped callsss ctr of |
257 (case AList.lookup Term.aconv_untyped callsss ctr of |
257 NONE => replicate (num_binder_types (fastype_of ctr)) [] |
258 NONE => replicate (num_binder_types (fastype_of ctr)) [] |
258 | SOME callss => map (map (Envir.beta_eta_contract o unfold_let)) callss); |
259 | SOME callss => map (map (Envir.beta_eta_contract o unfold_lets_splits)) callss); |
259 in |
260 in |
260 map indexify_ctr ctrs |
261 map indexify_ctr ctrs |
261 end; |
262 end; |
262 |
263 |
263 fun retypargs tyargs (Type (s, _)) = Type (s, tyargs); |
264 fun retypargs tyargs (Type (s, _)) = Type (s, tyargs); |