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 |
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 |