src/Pure/Tools/class_package.ML
changeset 19456 b5bfd2d17dd3
parent 19434 87cbbe045ea5
child 19468 0afdd5023bfc
equal deleted inserted replaced
19455:d828bfab05af 19456:b5bfd2d17dd3
    58 struct
    58 struct
    59 
    59 
    60 
    60 
    61 (* theory data *)
    61 (* theory data *)
    62 
    62 
    63 type class_data = {
    63 datatype class_data = ClassData of {
    64   name_locale: string,
    64   name_locale: string,
    65   name_axclass: string,
    65   name_axclass: string,
    66   intro: thm option,
    66   intro: thm option,
    67   var: string,
    67   var: string,
    68   consts: (string * (string * typ)) list
    68   consts: (string * (string * typ)) list
    69     (*locale parameter ~> toplevel const*)
    69     (*locale parameter ~> toplevel const*)
    70 };
    70 };
    71 
    71 
       
    72 fun rep_classdata (ClassData c) = c;
       
    73 fun eq_classdata (ClassData {
       
    74   name_locale = name_locale1, name_axclass = name_axclass1, intro = intro1,
       
    75     var = var1, consts = consts1}, ClassData {
       
    76   name_locale = name_locale2, name_axclass = name_axclass2, intro = intro2,
       
    77     var = var2, consts = consts2}) =
       
    78   name_locale1 = name_locale2 andalso name_axclass1 = name_axclass2
       
    79   andalso eq_opt eq_thm (intro1, intro2) andalso var1 = var2
       
    80   andalso eq_list (eq_pair (op =) (eq_pair (op =) (Type.eq_type Vartab.empty)))
       
    81     (consts1, consts2);
       
    82 
    72 structure ClassData = TheoryDataFun (
    83 structure ClassData = TheoryDataFun (
    73   struct
    84   struct
    74     val name = "Pure/classes";
    85     val name = "Pure/classes";
    75     type T = (class_data Graph.T
    86     type T = (class_data Graph.T
    76       * (string * (sort list * string)) list Symtab.table)
    87       * (string * (sort list * string)) list Symtab.table)
    77         (* class ~> tyco ~> (arity, thyname) *)
    88         (*class ~> tyco ~> (arity, thyname)*)
    78       * class Symtab.table;
    89       * class Symtab.table;
    79     val empty = ((Graph.empty, Symtab.empty), Symtab.empty);
    90     val empty = ((Graph.empty, Symtab.empty), Symtab.empty);
    80     val copy = I;
    91     val copy = I;
    81     val extend = I;
    92     val extend = I;
    82     fun merge _ (((g1, c1), f1), ((g2, c2), f2)) =
    93     fun merge _ (((g1, c1), f1) : T, ((g2, c2), f2)) =
    83       ((Graph.merge (op =) (g1, g2), Symtab.join (fn _ => AList.merge (op =) (op =)) (c1, c2)),
    94       ((Graph.merge eq_classdata (g1, g2), Symtab.join (fn _ => AList.merge (op =) (op =)) (c1, c2)),
    84        Symtab.merge (op =) (f1, f2));
    95        Symtab.merge (op =) (f1, f2));
    85     fun print thy ((gr, _), _) =
    96     fun print thy ((gr, _), _) =
    86       let
    97       let
    87         fun pretty_class gr (name, {name_locale, name_axclass, intro, var, consts}) =
    98         fun pretty_class gr (name, ClassData {name_locale, name_axclass, intro, var, consts}) =
    88           (Pretty.block o Pretty.fbreaks) [
    99           (Pretty.block o Pretty.fbreaks) [
    89             Pretty.str ("class " ^ name ^ ":"),
   100             Pretty.str ("class " ^ name ^ ":"),
    90             (Pretty.block o Pretty.fbreaks) (
   101             (Pretty.block o Pretty.fbreaks) (
    91               Pretty.str "superclasses: "
   102               Pretty.str "superclasses: "
    92               :: (map Pretty.str o Graph.imm_succs gr) name
   103               :: (map Pretty.str o Graph.imm_succs gr) name
   110 val print_classes = ClassData.print;
   121 val print_classes = ClassData.print;
   111 
   122 
   112 
   123 
   113 (* queries *)
   124 (* queries *)
   114 
   125 
   115 val lookup_class_data = try o Graph.get_node o fst o fst o ClassData.get;
   126 val lookup_class_data = Option.map rep_classdata oo try o Graph.get_node o fst o fst o ClassData.get;
   116 val the_instances = these oo Symtab.lookup o snd o fst o ClassData.get;
   127 val the_instances = these oo Symtab.lookup o snd o fst o ClassData.get;
   117 val lookup_const_class = Symtab.lookup o snd o ClassData.get;
   128 val lookup_const_class = Symtab.lookup o snd o ClassData.get;
   118 
   129 
   119 fun the_class_data thy class =
   130 fun the_class_data thy class =
   120   case lookup_class_data thy class
   131   case lookup_class_data thy class
   164   in fold ancestry classes [] end;
   175   in fold ancestry classes [] end;
   165 
   176 
   166 fun the_intros thy =
   177 fun the_intros thy =
   167   let
   178   let
   168     val gr = (fst o fst o ClassData.get) thy;
   179     val gr = (fst o fst o ClassData.get) thy;
   169   in (List.mapPartial (#intro o Graph.get_node gr) o Graph.keys) gr end;
   180   in (List.mapPartial (#intro o rep_classdata o Graph.get_node gr) o Graph.keys) gr end;
   170 
   181 
   171 fun subst_clsvar v ty_subst =
   182 fun subst_clsvar v ty_subst =
   172   map_type_tfree (fn u as (w, _) =>
   183   map_type_tfree (fn u as (w, _) =>
   173     if w = v then ty_subst else TFree u);
   184     if w = v then ty_subst else TFree u);
   174 
   185 
   212 (* updaters *)
   223 (* updaters *)
   213 
   224 
   214 fun add_class_data (class, (superclasses, name_locale, name_axclass, intro, var, consts)) =
   225 fun add_class_data (class, (superclasses, name_locale, name_axclass, intro, var, consts)) =
   215   ClassData.map (fn ((gr, tab), consttab) => ((
   226   ClassData.map (fn ((gr, tab), consttab) => ((
   216     gr
   227     gr
   217     |> Graph.new_node (class, {
   228     |> Graph.new_node (class, ClassData {
   218          name_locale = name_locale,
   229          name_locale = name_locale,
   219          name_axclass = name_axclass,
   230          name_axclass = name_axclass,
   220          intro = intro,
   231          intro = intro,
   221          var = var,
   232          var = var,
   222          consts = consts
   233          consts = consts