src/HOL/Tools/BNF/bnf_fp_n2m_sugar.ML
changeset 55343 5ebf832b58a1
parent 55336 1401434a7e83
child 55394 d5ebe055b599
equal deleted inserted replaced
55342:1bd9e637ac9f 55343:5ebf832b58a1
     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);