src/HOL/Tools/Ctr_Sugar/ctr_sugar.ML
changeset 58116 1a9ac371e5a0
parent 58115 bfde04fc5190
child 58151 414deb2ef328
equal deleted inserted replaced
58115:bfde04fc5190 58116:1a9ac371e5a0
    36      case_eq_ifs: thm list};
    36      case_eq_ifs: thm list};
    37 
    37 
    38   val morph_ctr_sugar: morphism -> ctr_sugar -> ctr_sugar
    38   val morph_ctr_sugar: morphism -> ctr_sugar -> ctr_sugar
    39   val transfer_ctr_sugar: theory -> ctr_sugar -> ctr_sugar
    39   val transfer_ctr_sugar: theory -> ctr_sugar -> ctr_sugar
    40   val ctr_sugar_of: Proof.context -> string -> ctr_sugar option
    40   val ctr_sugar_of: Proof.context -> string -> ctr_sugar option
       
    41   val ctr_sugar_of_global: theory -> string -> ctr_sugar option
    41   val ctr_sugars_of: Proof.context -> ctr_sugar list
    42   val ctr_sugars_of: Proof.context -> ctr_sugar list
       
    43   val ctr_sugars_of_global: theory -> ctr_sugar list
    42   val ctr_sugar_of_case: Proof.context -> string -> ctr_sugar option
    44   val ctr_sugar_of_case: Proof.context -> string -> ctr_sugar option
       
    45   val ctr_sugar_of_case_global: theory -> string -> ctr_sugar option
    43   val ctr_sugar_interpretation: (ctr_sugar -> theory -> theory) -> theory -> theory
    46   val ctr_sugar_interpretation: (ctr_sugar -> theory -> theory) -> theory -> theory
    44   val register_ctr_sugar: string -> ctr_sugar -> local_theory -> local_theory
    47   val register_ctr_sugar: string -> ctr_sugar -> local_theory -> local_theory
    45   val default_register_ctr_sugar_global: string -> ctr_sugar -> theory -> theory
    48   val default_register_ctr_sugar_global: string -> ctr_sugar -> theory -> theory
    46 
    49 
    47   val mk_half_pairss: 'a list * 'a list -> ('a * 'a) list list
    50   val mk_half_pairss: 'a list * 'a list -> ('a * 'a) list list
   146   val empty = Symtab.empty;
   149   val empty = Symtab.empty;
   147   val extend = I;
   150   val extend = I;
   148   fun merge data : T = Symtab.merge (K true) data;
   151   fun merge data : T = Symtab.merge (K true) data;
   149 );
   152 );
   150 
   153 
   151 fun ctr_sugar_of ctxt =
   154 fun ctr_sugar_of_generic context =
   152   Symtab.lookup (Data.get (Context.Proof ctxt))
   155   Option.map (transfer_ctr_sugar (Context.theory_of context)) o Symtab.lookup (Data.get context);
   153   #> Option.map (transfer_ctr_sugar (Proof_Context.theory_of ctxt));
   156 
   154 
   157 fun ctr_sugars_of_generic context =
   155 fun ctr_sugars_of ctxt =
   158   Symtab.fold (cons o transfer_ctr_sugar (Context.theory_of context) o snd) (Data.get context) [];
   156   Symtab.fold (cons o transfer_ctr_sugar (Proof_Context.theory_of ctxt) o snd)
   159 
   157     (Data.get (Context.Proof ctxt)) [];
   160 fun ctr_sugar_of_case_generic context s =
   158 
   161   find_first (fn {casex = Const (s', _), ...} => s' = s | _ => false)
   159 fun ctr_sugar_of_case ctxt s =
   162     (ctr_sugars_of_generic context);
   160   find_first (fn {casex = Const (s', _), ...} => s' = s | _ => false) (ctr_sugars_of ctxt);
   163 
       
   164 val ctr_sugar_of = ctr_sugar_of_generic o Context.Proof;
       
   165 val ctr_sugar_of_global = ctr_sugar_of_generic o Context.Theory;
       
   166 
       
   167 val ctr_sugars_of = ctr_sugars_of_generic o Context.Proof;
       
   168 val ctr_sugars_of_global = ctr_sugars_of_generic o Context.Theory;
       
   169 
       
   170 val ctr_sugar_of_case = ctr_sugar_of_case_generic o Context.Proof;
       
   171 val ctr_sugar_of_case_global = ctr_sugar_of_case_generic o Context.Theory;
   161 
   172 
   162 structure Ctr_Sugar_Interpretation = Interpretation
   173 structure Ctr_Sugar_Interpretation = Interpretation
   163 (
   174 (
   164   type T = ctr_sugar;
   175   type T = ctr_sugar;
   165   val eq: T * T -> bool = op = o pairself #ctrs;
   176   val eq: T * T -> bool = op = o pairself #ctrs;