| author | immler@in.tum.de | 
| Fri, 20 Feb 2009 11:04:18 +0100 | |
| changeset 30015 | 1baeda435aa6 | 
| parent 29579 | cb520b766e00 | 
| child 30211 | 556d1810cdad | 
| child 30243 | 09d5944e224e | 
| permissions | -rw-r--r-- | 
| 404 
dd3d3d6467db
axiomatic type class 'package' for Pure (alpha version);
 wenzelm parents: diff
changeset | 1 | (* Title: Pure/axclass.ML | 
| 
dd3d3d6467db
axiomatic type class 'package' for Pure (alpha version);
 wenzelm parents: diff
changeset | 2 | Author: Markus Wenzel, TU Muenchen | 
| 
dd3d3d6467db
axiomatic type class 'package' for Pure (alpha version);
 wenzelm parents: diff
changeset | 3 | |
| 24964 | 4 | Type classes defined as predicates, associated with a record of | 
| 5 | parameters. | |
| 404 
dd3d3d6467db
axiomatic type class 'package' for Pure (alpha version);
 wenzelm parents: diff
changeset | 6 | *) | 
| 
dd3d3d6467db
axiomatic type class 'package' for Pure (alpha version);
 wenzelm parents: diff
changeset | 7 | |
| 
dd3d3d6467db
axiomatic type class 'package' for Pure (alpha version);
 wenzelm parents: diff
changeset | 8 | signature AX_CLASS = | 
| 3938 | 9 | sig | 
| 24589 | 10 | val define_class: bstring * class list -> string list -> | 
| 29579 | 11 | ((binding * attribute list) * term list) list -> theory -> class * theory | 
| 24589 | 12 | val add_classrel: thm -> theory -> theory | 
| 13 | val add_arity: thm -> theory -> theory | |
| 14 | val prove_classrel: class * class -> tactic -> theory -> theory | |
| 15 | val prove_arity: string * sort list * sort -> tactic -> theory -> theory | |
| 24964 | 16 | val get_info: theory -> class -> | 
| 17 |     {def: thm, intro: thm, axioms: thm list, params: (string * typ) list}
 | |
| 19243 
5dcb899a8486
moved read_class, read/cert_classrel/arity to sign.ML;
 wenzelm parents: 
19134diff
changeset | 18 | val class_intros: theory -> thm list | 
| 20107 | 19 | val class_of_param: theory -> string -> class option | 
| 19405 | 20 | val cert_classrel: theory -> class * class -> class * class | 
| 21 | val read_classrel: theory -> xstring * xstring -> class * class | |
| 24929 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 22 | val axiomatize_class: bstring * class list -> theory -> theory | 
| 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 23 | val axiomatize_class_cmd: bstring * xstring list -> theory -> theory | 
| 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 24 | val axiomatize_classrel: (class * class) list -> theory -> theory | 
| 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 25 | val axiomatize_classrel_cmd: (xstring * xstring) list -> theory -> theory | 
| 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 26 | val axiomatize_arity: arity -> theory -> theory | 
| 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 27 | val axiomatize_arity_cmd: xstring * string list * string -> theory -> theory | 
| 25486 | 28 | val instance_name: string * class -> string | 
| 25597 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 29 | val declare_overloaded: string * typ -> theory -> term * theory | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 30 | val define_overloaded: string -> string * term -> theory -> thm * theory | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 31 | val inst_tyco_of: theory -> string * typ -> string option | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 32 | val unoverload: theory -> thm -> thm | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 33 | val overload: theory -> thm -> thm | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 34 | val unoverload_conv: theory -> conv | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 35 | val overload_conv: theory -> conv | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 36 | val unoverload_const: theory -> string * typ -> string | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 37 | val param_of_inst: theory -> string * string -> string | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 38 | val inst_of_param: theory -> string -> (string * string) option | 
| 27497 | 39 | val arity_property: theory -> class * string -> string -> string list | 
| 19574 | 40 | type cache | 
| 24929 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 41 | val of_sort: theory -> typ * sort -> cache -> thm list * cache (*exception Sorts.CLASS_ERROR*) | 
| 19574 | 42 | val cache: cache | 
| 26246 | 43 | val introN: string | 
| 25617 | 44 | val axiomsN: string | 
| 3938 | 45 | end; | 
| 404 
dd3d3d6467db
axiomatic type class 'package' for Pure (alpha version);
 wenzelm parents: diff
changeset | 46 | |
| 15801 | 47 | structure AxClass: AX_CLASS = | 
| 404 
dd3d3d6467db
axiomatic type class 'package' for Pure (alpha version);
 wenzelm parents: diff
changeset | 48 | struct | 
| 
dd3d3d6467db
axiomatic type class 'package' for Pure (alpha version);
 wenzelm parents: diff
changeset | 49 | |
| 19405 | 50 | (** theory data **) | 
| 423 | 51 | |
| 19405 | 52 | (* class parameters (canonical order) *) | 
| 423 | 53 | |
| 19405 | 54 | type param = string * class; | 
| 423 | 55 | |
| 19405 | 56 | fun add_param pp ((x, c): param) params = | 
| 57 | (case AList.lookup (op =) params x of | |
| 58 | NONE => (x, c) :: params | |
| 59 |   | SOME c' => error ("Duplicate class parameter " ^ quote x ^
 | |
| 60 | " for " ^ Pretty.string_of_sort pp [c] ^ | |
| 61 | (if c = c' then "" else " and " ^ Pretty.string_of_sort pp [c']))); | |
| 423 | 62 | |
| 19405 | 63 | fun merge_params _ ([], qs) = qs | 
| 64 | | merge_params pp (ps, qs) = | |
| 65 | fold_rev (fn q => if member (op =) ps q then I else add_param pp q) qs ps; | |
| 423 | 66 | |
| 67 | ||
| 19511 | 68 | (* axclasses *) | 
| 6379 | 69 | |
| 19243 
5dcb899a8486
moved read_class, read/cert_classrel/arity to sign.ML;
 wenzelm parents: 
19134diff
changeset | 70 | val introN = "intro"; | 
| 19511 | 71 | val superN = "super"; | 
| 19243 
5dcb899a8486
moved read_class, read/cert_classrel/arity to sign.ML;
 wenzelm parents: 
19134diff
changeset | 72 | val axiomsN = "axioms"; | 
| 
5dcb899a8486
moved read_class, read/cert_classrel/arity to sign.ML;
 wenzelm parents: 
19134diff
changeset | 73 | |
| 19392 | 74 | datatype axclass = AxClass of | 
| 19460 | 75 |  {def: thm,
 | 
| 19392 | 76 | intro: thm, | 
| 21463 
42dd50268c8b
completed class parameter handling in axclass.ML
 haftmann parents: 
20628diff
changeset | 77 | axioms: thm list, | 
| 21925 | 78 | params: (string * typ) list}; | 
| 19392 | 79 | |
| 19460 | 80 | type axclasses = axclass Symtab.table * param list; | 
| 19392 | 81 | |
| 27397 | 82 | fun make_axclass ((def, intro, axioms), params) = AxClass | 
| 83 |   {def = def, intro = intro, axioms = axioms, params = params};
 | |
| 19405 | 84 | |
| 85 | fun merge_axclasses pp ((tab1, params1), (tab2, params2)) : axclasses = | |
| 86 | (Symtab.merge (K true) (tab1, tab2), merge_params pp (params1, params2)); | |
| 87 | ||
| 19392 | 88 | |
| 89 | (* instances *) | |
| 90 | ||
| 20628 | 91 | val classrel_prefix = "classrel_"; | 
| 92 | val arity_prefix = "arity_"; | |
| 19511 | 93 | |
| 19574 | 94 | type instances = | 
| 95 | ((class * class) * thm) list * | |
| 96 | ((class * sort list) * thm) list Symtab.table; | |
| 6379 | 97 | |
| 19574 | 98 | fun merge_instances ((classrel1, arities1): instances, (classrel2, arities2)) = | 
| 99 | (merge (eq_fst op =) (classrel1, classrel2), | |
| 100 | Symtab.join (K (merge (eq_fst op =))) (arities1, arities2)); | |
| 19392 | 101 | |
| 102 | ||
| 25597 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 103 | (* instance parameters *) | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 104 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 105 | type inst_params = | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 106 | (string * thm) Symtab.table Symtab.table | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 107 | (*constant name ~> type constructor ~> (constant name, equation)*) | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 108 | * (string * string) Symtab.table; (*constant name ~> (constant name, type constructor)*) | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 109 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 110 | fun merge_inst_params ((const_param1, param_const1), (const_param2, param_const2)) = | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 111 | (Symtab.join (K (Symtab.merge (K true))) (const_param1, const_param2), | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 112 | Symtab.merge (K true) (param_const1, param_const2)); | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 113 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 114 | |
| 19511 | 115 | (* setup data *) | 
| 19392 | 116 | |
| 117 | structure AxClassData = TheoryDataFun | |
| 22846 | 118 | ( | 
| 25597 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 119 | type T = axclasses * (instances * inst_params); | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 120 | val empty = ((Symtab.empty, []), (([], Symtab.empty), (Symtab.empty, Symtab.empty))); | 
| 19574 | 121 | val copy = I; | 
| 122 | val extend = I; | |
| 25597 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 123 | fun merge pp ((axclasses1, (instances1, inst_params1)), (axclasses2, (instances2, inst_params2))) = | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 124 | (merge_axclasses pp (axclasses1, axclasses2), | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 125 | (merge_instances (instances1, instances2), merge_inst_params (inst_params1, inst_params2))); | 
| 22846 | 126 | ); | 
| 6379 | 127 | |
| 128 | ||
| 19574 | 129 | (* maintain axclasses *) | 
| 19392 | 130 | |
| 19574 | 131 | val get_axclasses = #1 o AxClassData.get; | 
| 25597 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 132 | val map_axclasses = AxClassData.map o apfst; | 
| 19574 | 133 | |
| 134 | val lookup_def = Symtab.lookup o #1 o get_axclasses; | |
| 6379 | 135 | |
| 24929 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 136 | fun get_info thy c = | 
| 19511 | 137 | (case lookup_def thy c of | 
| 19392 | 138 | SOME (AxClass info) => info | 
| 21919 | 139 |   | NONE => error ("No such axclass: " ^ quote c));
 | 
| 6379 | 140 | |
| 19123 | 141 | fun class_intros thy = | 
| 19392 | 142 | let | 
| 143 | fun add_intro c = | |
| 19511 | 144 |       (case lookup_def thy c of SOME (AxClass {intro, ...}) => cons intro | _ => I);
 | 
| 21931 
314f9e2a442c
replaced Sign.classes by Sign.all_classes (topologically sorted);
 wenzelm parents: 
21925diff
changeset | 145 | val classes = Sign.all_classes thy; | 
| 19392 | 146 | in map (Thm.class_triv thy) classes @ fold add_intro classes [] end; | 
| 15876 
a67343c6ab2a
sane interfaces for tactical instance proofs (do not expand defs of theory, proper handling of sort instances);
 wenzelm parents: 
15853diff
changeset | 147 | |
| 
a67343c6ab2a
sane interfaces for tactical instance proofs (do not expand defs of theory, proper handling of sort instances);
 wenzelm parents: 
15853diff
changeset | 148 | |
| 19460 | 149 | fun get_params thy pred = | 
| 19574 | 150 | let val params = #2 (get_axclasses thy); | 
| 19460 | 151 | in fold (fn (x, c) => if pred c then cons x else I) params [] end; | 
| 152 | ||
| 153 | fun params_of thy c = get_params thy (fn c' => c' = c); | |
| 154 | fun all_params_of thy S = get_params thy (fn c => Sign.subsort thy (S, [c])); | |
| 155 | ||
| 24964 | 156 | fun class_of_param thy = AList.lookup (op =) (#2 (get_axclasses thy)); | 
| 19460 | 157 | |
| 21919 | 158 | |
| 19511 | 159 | (* maintain instances *) | 
| 19503 | 160 | |
| 25486 | 161 | fun instance_name (a, c) = NameSpace.base c ^ "_" ^ NameSpace.base a; | 
| 162 | ||
| 25597 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 163 | val get_instances = #1 o #2 o AxClassData.get; | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 164 | val map_instances = AxClassData.map o apsnd o apfst; | 
| 19528 | 165 | |
| 166 | ||
| 19574 | 167 | fun the_classrel thy (c1, c2) = | 
| 168 | (case AList.lookup (op =) (#1 (get_instances thy)) (c1, c2) of | |
| 169 | SOME th => Thm.transfer thy th | |
| 24920 | 170 |   | NONE => error ("Unproven class relation " ^
 | 
| 171 | Syntax.string_of_classrel (ProofContext.init thy) [c1, c2])); | |
| 19574 | 172 | |
| 173 | fun put_classrel arg = map_instances (fn (classrel, arities) => | |
| 174 | (insert (eq_fst op =) arg classrel, arities)); | |
| 19503 | 175 | |
| 176 | ||
| 19574 | 177 | fun the_arity thy a (c, Ss) = | 
| 24929 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 178 | (case AList.lookup (op =) (Symtab.lookup_list (#2 (get_instances thy)) a) (c, Ss) of | 
| 19574 | 179 | SOME th => Thm.transfer thy th | 
| 24920 | 180 |   | NONE => error ("Unproven type arity " ^
 | 
| 181 | Syntax.string_of_arity (ProofContext.init thy) (a, Ss, [c]))); | |
| 19503 | 182 | |
| 27497 | 183 | fun arity_property thy (c, a) x = | 
| 27547 | 184 | Symtab.lookup_list (snd (get_instances thy)) a | 
| 27497 | 185 | |> map_filter (fn ((c', _), th) => if c = c' | 
| 27547 | 186 | then AList.lookup (op =) (Thm.get_tags th) x else NONE) | 
| 27497 | 187 | |> rev; | 
| 27397 | 188 | |
| 27547 | 189 | fun insert_arity_completions thy (t, ((c, Ss), th)) arities = | 
| 190 | let | |
| 191 | val algebra = Sign.classes_of thy; | |
| 192 | val super_class_completions = Sign.super_classes thy c | |
| 193 | |> filter_out (fn c1 => exists (fn ((c2, Ss2), _) => c1 = c2 | |
| 194 | andalso Sorts.sorts_le algebra (Ss2, Ss)) (Symtab.lookup_list arities t)) | |
| 195 | val tags = Thm.get_tags th; | |
| 27554 | 196 | val completions = map (fn c1 => (Sorts.weaken algebra | 
| 27547 | 197 | (fn (th, c2) => fn c3 => th RS the_classrel thy (c2, c3)) (th, c) c1 | 
| 198 | |> Thm.map_tags (K tags) |> Thm.close_derivation, c1)) super_class_completions; | |
| 199 | val arities' = fold (fn (th1, c1) => Symtab.cons_list (t, ((c1, Ss), th1))) | |
| 200 | completions arities; | |
| 201 | in (completions, arities') end; | |
| 19503 | 202 | |
| 27547 | 203 | fun put_arity ((t, Ss, c), th) thy = | 
| 204 | let | |
| 205 | val th' = (Thm.map_tags o AList.default (op =)) | |
| 206 | (Markup.theory_nameN, Context.theory_name thy) th; | |
| 207 | val arity' = (t, ((c, Ss), th')); | |
| 208 | in | |
| 209 | thy | |
| 210 | |> map_instances (fn (classrel, arities) => (classrel, | |
| 211 | arities | |
| 212 | |> Symtab.insert_list (eq_fst op =) arity' | |
| 213 | |> insert_arity_completions thy arity' | |
| 214 | |> snd)) | |
| 215 | end; | |
| 19503 | 216 | |
| 27547 | 217 | fun complete_arities thy = | 
| 218 | let | |
| 219 | val arities = snd (get_instances thy); | |
| 220 | val (completions, arities') = arities | |
| 221 | |> fold_map (insert_arity_completions thy) (Symtab.dest_list arities) | |
| 222 | |>> flat; | |
| 223 | in if null completions | |
| 224 | then NONE | |
| 225 | else SOME (thy |> map_instances (fn (classrel, _) => (classrel, arities'))) | |
| 226 | end; | |
| 227 | ||
| 228 | val _ = Context.>> (Context.map_theory (Theory.at_begin complete_arities)); | |
| 27397 | 229 | |
| 230 | ||
| 25597 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 231 | (* maintain instance parameters *) | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 232 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 233 | val get_inst_params = #2 o #2 o AxClassData.get; | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 234 | val map_inst_params = AxClassData.map o apsnd o apsnd; | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 235 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 236 | fun get_inst_param thy (c, tyco) = | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 237 | (the o Symtab.lookup ((the o Symtab.lookup (fst (get_inst_params thy))) c)) tyco; | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 238 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 239 | fun add_inst_param (c, tyco) inst = (map_inst_params o apfst | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 240 | o Symtab.map_default (c, Symtab.empty)) (Symtab.update_new (tyco, inst)) | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 241 | #> (map_inst_params o apsnd) (Symtab.update_new (fst inst, (c, tyco))); | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 242 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 243 | val inst_of_param = Symtab.lookup o snd o get_inst_params; | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 244 | val param_of_inst = fst oo get_inst_param; | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 245 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 246 | fun inst_thms thy = (Symtab.fold (Symtab.fold (cons o snd o snd) o snd) o fst) | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 247 | (get_inst_params thy) []; | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 248 | |
| 25863 | 249 | fun inst_tyco_of thy = try (fst o dest_Type o the_single o Sign.const_typargs thy); | 
| 25597 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 250 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 251 | fun unoverload thy = MetaSimplifier.simplify true (inst_thms thy); | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 252 | fun overload thy = MetaSimplifier.simplify true (map Thm.symmetric (inst_thms thy)); | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 253 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 254 | fun unoverload_conv thy = MetaSimplifier.rewrite true (inst_thms thy); | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 255 | fun overload_conv thy = MetaSimplifier.rewrite true (map Thm.symmetric (inst_thms thy)); | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 256 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 257 | fun unoverload_const thy (c_ty as (c, _)) = | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 258 | case class_of_param thy c | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 259 | of SOME class => (case inst_tyco_of thy c_ty | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 260 | of SOME tyco => try (param_of_inst thy) (c, tyco) |> the_default c | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 261 | | NONE => c) | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 262 | | NONE => c; | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 263 | |
| 404 
dd3d3d6467db
axiomatic type class 'package' for Pure (alpha version);
 wenzelm parents: diff
changeset | 264 | |
| 19511 | 265 | (** instances **) | 
| 19418 
03b01c9314fc
reworded add_axclass(_i): canonical specification format,
 wenzelm parents: 
19405diff
changeset | 266 | |
| 
03b01c9314fc
reworded add_axclass(_i): canonical specification format,
 wenzelm parents: 
19405diff
changeset | 267 | (* class relations *) | 
| 
03b01c9314fc
reworded add_axclass(_i): canonical specification format,
 wenzelm parents: 
19405diff
changeset | 268 | |
| 19405 | 269 | fun cert_classrel thy raw_rel = | 
| 15876 
a67343c6ab2a
sane interfaces for tactical instance proofs (do not expand defs of theory, proper handling of sort instances);
 wenzelm parents: 
15853diff
changeset | 270 | let | 
| 26939 
1035c89b4c02
moved global pretty/string_of functions from Sign to Syntax;
 wenzelm parents: 
26516diff
changeset | 271 | val string_of_sort = Syntax.string_of_sort_global thy; | 
| 19405 | 272 | val (c1, c2) = pairself (Sign.certify_class thy) raw_rel; | 
| 24271 | 273 | val _ = Sign.primitive_classrel (c1, c2) (Theory.copy thy); | 
| 19405 | 274 | val _ = | 
| 19460 | 275 | (case subtract (op =) (all_params_of thy [c1]) (all_params_of thy [c2]) of | 
| 19405 | 276 | [] => () | 
| 26939 
1035c89b4c02
moved global pretty/string_of functions from Sign to Syntax;
 wenzelm parents: 
26516diff
changeset | 277 |       | xs => raise TYPE ("Class " ^ string_of_sort [c1] ^ " lacks parameter(s) " ^
 | 
| 
1035c89b4c02
moved global pretty/string_of functions from Sign to Syntax;
 wenzelm parents: 
26516diff
changeset | 278 | commas_quote xs ^ " of " ^ string_of_sort [c2], [], [])); | 
| 19405 | 279 | in (c1, c2) end; | 
| 280 | ||
| 281 | fun read_classrel thy raw_rel = | |
| 282 | cert_classrel thy (pairself (Sign.read_class thy) raw_rel) | |
| 283 | handle TYPE (msg, _, _) => error msg; | |
| 284 | ||
| 285 | ||
| 286 | (* primitive rules *) | |
| 287 | ||
| 288 | fun add_classrel th thy = | |
| 289 | let | |
| 290 |     fun err () = raise THM ("add_classrel: malformed class relation", 0, [th]);
 | |
| 22691 | 291 | val prop = Thm.plain_prop_of (Thm.transfer thy th); | 
| 19405 | 292 | val rel = Logic.dest_classrel prop handle TERM _ => err (); | 
| 293 | val (c1, c2) = cert_classrel thy rel handle TYPE _ => err (); | |
| 19574 | 294 | in | 
| 295 | thy | |
| 296 | |> Sign.primitive_classrel (c1, c2) | |
| 29524 | 297 | |> put_classrel ((c1, c2), Thm.close_derivation (Drule.unconstrainTs th)) | 
| 28014 | 298 | |> perhaps complete_arities | 
| 19574 | 299 | end; | 
| 15876 
a67343c6ab2a
sane interfaces for tactical instance proofs (do not expand defs of theory, proper handling of sort instances);
 wenzelm parents: 
15853diff
changeset | 300 | |
| 19405 | 301 | fun add_arity th thy = | 
| 15876 
a67343c6ab2a
sane interfaces for tactical instance proofs (do not expand defs of theory, proper handling of sort instances);
 wenzelm parents: 
15853diff
changeset | 302 | let | 
| 19528 | 303 |     fun err () = raise THM ("add_arity: malformed type arity", 0, [th]);
 | 
| 22691 | 304 | val prop = Thm.plain_prop_of (Thm.transfer thy th); | 
| 19528 | 305 | val (t, Ss, c) = Logic.dest_arity prop handle TERM _ => err (); | 
| 24731 | 306 | val _ = map (Sign.certify_sort thy) Ss = Ss orelse err (); | 
| 26516 | 307 | val _ = case filter_out (fn c => can (get_inst_param thy) (c, t)) (params_of thy c) | 
| 308 | of [] => () | |
| 309 | | cs => Output.legacy_feature | |
| 310 |           ("Missing specifications for overloaded parameters " ^ commas_quote cs)
 | |
| 27547 | 311 | val th' = Drule.unconstrainTs th; | 
| 19574 | 312 | in | 
| 313 | thy | |
| 314 | |> Sign.primitive_arity (t, Ss, [c]) | |
| 27397 | 315 | |> put_arity ((t, Ss, c), th') | 
| 19574 | 316 | end; | 
| 404 
dd3d3d6467db
axiomatic type class 'package' for Pure (alpha version);
 wenzelm parents: diff
changeset | 317 | |
| 
dd3d3d6467db
axiomatic type class 'package' for Pure (alpha version);
 wenzelm parents: diff
changeset | 318 | |
| 19243 
5dcb899a8486
moved read_class, read/cert_classrel/arity to sign.ML;
 wenzelm parents: 
19134diff
changeset | 319 | (* tactical proofs *) | 
| 15876 
a67343c6ab2a
sane interfaces for tactical instance proofs (do not expand defs of theory, proper handling of sort instances);
 wenzelm parents: 
15853diff
changeset | 320 | |
| 19405 | 321 | fun prove_classrel raw_rel tac thy = | 
| 15876 
a67343c6ab2a
sane interfaces for tactical instance proofs (do not expand defs of theory, proper handling of sort instances);
 wenzelm parents: 
15853diff
changeset | 322 | let | 
| 24920 | 323 | val ctxt = ProofContext.init thy; | 
| 19405 | 324 | val (c1, c2) = cert_classrel thy raw_rel; | 
| 24920 | 325 | val th = Goal.prove ctxt [] [] | 
| 20049 | 326 | (Logic.mk_classrel (c1, c2)) (fn _ => tac) handle ERROR msg => | 
| 19243 
5dcb899a8486
moved read_class, read/cert_classrel/arity to sign.ML;
 wenzelm parents: 
19134diff
changeset | 327 |       cat_error msg ("The error(s) above occurred while trying to prove class relation " ^
 | 
| 24920 | 328 | quote (Syntax.string_of_classrel ctxt [c1, c2])); | 
| 19511 | 329 | in | 
| 330 | thy | |
| 29579 | 331 | |> PureThy.add_thms [((Binding.name | 
| 332 | (prefix classrel_prefix (Logic.name_classrel (c1, c2))), th), [])] | |
| 19511 | 333 | |-> (fn [th'] => add_classrel th') | 
| 334 | end; | |
| 404 
dd3d3d6467db
axiomatic type class 'package' for Pure (alpha version);
 wenzelm parents: diff
changeset | 335 | |
| 19243 
5dcb899a8486
moved read_class, read/cert_classrel/arity to sign.ML;
 wenzelm parents: 
19134diff
changeset | 336 | fun prove_arity raw_arity tac thy = | 
| 15876 
a67343c6ab2a
sane interfaces for tactical instance proofs (do not expand defs of theory, proper handling of sort instances);
 wenzelm parents: 
15853diff
changeset | 337 | let | 
| 24920 | 338 | val ctxt = ProofContext.init thy; | 
| 19243 
5dcb899a8486
moved read_class, read/cert_classrel/arity to sign.ML;
 wenzelm parents: 
19134diff
changeset | 339 | val arity = Sign.cert_arity thy raw_arity; | 
| 20628 | 340 | val names = map (prefix arity_prefix) (Logic.name_arities arity); | 
| 19405 | 341 | val props = Logic.mk_arities arity; | 
| 24920 | 342 | val ths = Goal.prove_multi ctxt [] [] props | 
| 21687 | 343 | (fn _ => Goal.precise_conjunction_tac (length props) 1 THEN tac) handle ERROR msg => | 
| 19243 
5dcb899a8486
moved read_class, read/cert_classrel/arity to sign.ML;
 wenzelm parents: 
19134diff
changeset | 344 |         cat_error msg ("The error(s) above occurred while trying to prove type arity " ^
 | 
| 24920 | 345 | quote (Syntax.string_of_arity ctxt arity)); | 
| 19511 | 346 | in | 
| 347 | thy | |
| 29579 | 348 | |> PureThy.add_thms (map (rpair []) (map Binding.name names ~~ ths)) | 
| 19511 | 349 | |-> fold add_arity | 
| 350 | end; | |
| 351 | ||
| 352 | ||
| 25597 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 353 | (* instance parameters and overloaded definitions *) | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 354 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 355 | (* declaration and definition of instances of overloaded constants *) | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 356 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 357 | fun declare_overloaded (c, T) thy = | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 358 | let | 
| 25605 | 359 | val class = case class_of_param thy c | 
| 360 | of SOME class => class | |
| 361 |       | NONE => error ("Not a class parameter: " ^ quote c);
 | |
| 362 | val tyco = case inst_tyco_of thy (c, T) | |
| 363 | of SOME tyco => tyco | |
| 364 |       | NONE => error ("Illegal type for instantiation of class parameter: "
 | |
| 26939 
1035c89b4c02
moved global pretty/string_of functions from Sign to Syntax;
 wenzelm parents: 
26516diff
changeset | 365 | ^ quote (c ^ " :: " ^ Syntax.string_of_typ_global thy T)); | 
| 25597 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 366 | val name_inst = instance_name (tyco, class) ^ "_inst"; | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 367 | val c' = NameSpace.base c ^ "_" ^ NameSpace.base tyco; | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 368 | val T' = Type.strip_sorts T; | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 369 | in | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 370 | thy | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 371 | |> Sign.sticky_prefix name_inst | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 372 | |> Sign.no_base_names | 
| 28965 | 373 | |> Sign.declare_const [] ((Binding.name c', T'), NoSyn) | 
| 25597 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 374 | |-> (fn const' as Const (c'', _) => Thm.add_def false true | 
| 29579 | 375 | (Binding.name (Thm.def_name c'), Logic.mk_equals (Const (c, T'), const')) | 
| 25597 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 376 | #>> Thm.varifyT | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 377 | #-> (fn thm => add_inst_param (c, tyco) (c'', thm) | 
| 29579 | 378 | #> PureThy.add_thm ((Binding.name c', thm), [Thm.kind_internal]) | 
| 25597 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 379 | #> snd | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 380 | #> Sign.restore_naming thy | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 381 | #> pair (Const (c, T)))) | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 382 | end; | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 383 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 384 | fun define_overloaded name (c, t) thy = | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 385 | let | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 386 | val T = Term.fastype_of t; | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 387 | val SOME tyco = inst_tyco_of thy (c, T); | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 388 | val (c', eq) = get_inst_param thy (c, tyco); | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 389 | val prop = Logic.mk_equals (Const (c', T), t); | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 390 | val name' = Thm.def_name_optional | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 391 | (NameSpace.base c ^ "_" ^ NameSpace.base tyco) name; | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 392 | in | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 393 | thy | 
| 29579 | 394 | |> Thm.add_def false false (Binding.name name', prop) | 
| 25597 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 395 | |>> (fn thm => Drule.transitive_thm OF [eq, thm]) | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 396 | end; | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 397 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 398 | |
| 19511 | 399 | |
| 400 | (** class definitions **) | |
| 401 | ||
| 23421 | 402 | fun split_defined n eq = | 
| 403 | let | |
| 404 | val intro = | |
| 405 | (eq RS Drule.equal_elim_rule2) | |
| 406 | |> Conjunction.curry_balanced n | |
| 407 | |> n = 0 ? Thm.eq_assumption 1; | |
| 408 | val dests = | |
| 409 | if n = 0 then [] | |
| 410 | else | |
| 411 | (eq RS Drule.equal_elim_rule1) | |
| 412 | |> BalancedTree.dest (fn th => | |
| 413 | (th RS Conjunction.conjunctionD1, th RS Conjunction.conjunctionD2)) n; | |
| 414 | in (intro, dests) end; | |
| 415 | ||
| 24964 | 416 | fun define_class (bclass, raw_super) raw_params raw_specs thy = | 
| 19511 | 417 | let | 
| 418 | val ctxt = ProofContext.init thy; | |
| 24964 | 419 | val pp = Syntax.pp ctxt; | 
| 19511 | 420 | |
| 421 | ||
| 24964 | 422 | (* class *) | 
| 19511 | 423 | |
| 424 | val bconst = Logic.const_of_class bclass; | |
| 28965 | 425 | val class = Sign.full_bname thy bclass; | 
| 24731 | 426 | val super = Sign.minimize_sort thy (Sign.certify_sort thy raw_super); | 
| 19511 | 427 | |
| 24964 | 428 | fun check_constraint (a, S) = | 
| 429 | if Sign.subsort thy (super, S) then () | |
| 430 |       else error ("Sort constraint of type variable " ^
 | |
| 431 | setmp show_sorts true (Pretty.string_of_typ pp) (TFree (a, S)) ^ | |
| 432 | " needs to be weaker than " ^ Pretty.string_of_sort pp super); | |
| 433 | ||
| 434 | ||
| 435 | (* params *) | |
| 436 | ||
| 437 | val params = raw_params |> map (fn p => | |
| 438 | let | |
| 439 | val T = Sign.the_const_type thy p; | |
| 440 | val _ = | |
| 441 | (case Term.add_tvarsT T [] of | |
| 442 | [((a, _), S)] => check_constraint (a, S) | |
| 443 |           | _ => error ("Exactly one type variable expected in class parameter " ^ quote p));
 | |
| 444 | val T' = Term.map_type_tvar (fn _ => TFree (Name.aT, [class])) T; | |
| 445 | in (p, T') end); | |
| 446 | ||
| 447 | ||
| 448 | (* axioms *) | |
| 449 | ||
| 19511 | 450 | fun prep_axiom t = | 
| 451 | (case Term.add_tfrees t [] of | |
| 24964 | 452 | [(a, S)] => check_constraint (a, S) | 
| 453 | | [] => () | |
| 454 |       | _ => error ("Multiple type variables in class axiom:\n" ^ Pretty.string_of_term pp t);
 | |
| 455 | t | |
| 456 | |> Term.map_types (Term.map_atyps (fn TFree _ => Term.aT [] | U => U)) | |
| 457 | |> Logic.close_form); | |
| 19511 | 458 | |
| 24681 | 459 | val axiomss = map (map (prep_axiom o Sign.cert_prop thy) o snd) raw_specs; | 
| 22745 | 460 | val name_atts = map fst raw_specs; | 
| 19511 | 461 | |
| 462 | ||
| 463 | (* definition *) | |
| 464 | ||
| 465 | val conjs = map (curry Logic.mk_inclass (Term.aT [])) super @ flat axiomss; | |
| 466 | val class_eq = | |
| 23421 | 467 | Logic.mk_equals (Logic.mk_inclass (Term.aT [], class), Logic.mk_conjunction_balanced conjs); | 
| 19511 | 468 | |
| 469 | val ([def], def_thy) = | |
| 470 | thy | |
| 471 | |> Sign.primitive_class (bclass, super) | |
| 29579 | 472 | |> PureThy.add_defs false [((Binding.name (Thm.def_name bconst), class_eq), [])]; | 
| 19511 | 473 | val (raw_intro, (raw_classrel, raw_axioms)) = | 
| 23421 | 474 | split_defined (length conjs) def ||> chop (length super); | 
| 19392 | 475 | |
| 19418 
03b01c9314fc
reworded add_axclass(_i): canonical specification format,
 wenzelm parents: 
19405diff
changeset | 476 | |
| 19511 | 477 | (* facts *) | 
| 478 | ||
| 479 | val class_triv = Thm.class_triv def_thy class; | |
| 480 | val ([(_, [intro]), (_, classrel), (_, axioms)], facts_thy) = | |
| 481 | def_thy | |
| 27691 
ce171cbd4b93
PureThy: dropped note_thmss_qualified, dropped _i suffix
 haftmann parents: 
27683diff
changeset | 482 | |> Sign.add_path bconst | 
| 
ce171cbd4b93
PureThy: dropped note_thmss_qualified, dropped _i suffix
 haftmann parents: 
27683diff
changeset | 483 | |> Sign.no_base_names | 
| 
ce171cbd4b93
PureThy: dropped note_thmss_qualified, dropped _i suffix
 haftmann parents: 
27683diff
changeset | 484 | |> PureThy.note_thmss "" | 
| 28965 | 485 | [((Binding.name introN, []), [([Drule.standard raw_intro], [])]), | 
| 486 | ((Binding.name superN, []), [(map Drule.standard raw_classrel, [])]), | |
| 487 | ((Binding.name axiomsN, []), | |
| 28083 
103d9282a946
explicit type Name.binding for higher-specification elements;
 wenzelm parents: 
28014diff
changeset | 488 | [(map (fn th => Drule.standard (class_triv RS th)) raw_axioms, [])])] | 
| 27691 
ce171cbd4b93
PureThy: dropped note_thmss_qualified, dropped _i suffix
 haftmann parents: 
27683diff
changeset | 489 | ||> Sign.restore_naming def_thy; | 
| 19511 | 490 | |
| 24847 | 491 | |
| 19511 | 492 | (* result *) | 
| 493 | ||
| 24964 | 494 | val axclass = make_axclass ((def, intro, axioms), params); | 
| 19511 | 495 | val result_thy = | 
| 496 | facts_thy | |
| 19574 | 497 | |> fold put_classrel (map (pair class) super ~~ classrel) | 
| 19511 | 498 | |> Sign.add_path bconst | 
| 27691 
ce171cbd4b93
PureThy: dropped note_thmss_qualified, dropped _i suffix
 haftmann parents: 
27683diff
changeset | 499 | |> PureThy.note_thmss "" (name_atts ~~ map Thm.simple_fact (unflat axiomss axioms)) |> snd | 
| 19511 | 500 | |> Sign.restore_naming facts_thy | 
| 19574 | 501 | |> map_axclasses (fn (axclasses, parameters) => | 
| 21919 | 502 | (Symtab.update (class, axclass) axclasses, | 
| 24964 | 503 | fold (fn (x, _) => add_param pp (x, class)) params parameters)); | 
| 19511 | 504 | |
| 505 | in (class, result_thy) end; | |
| 506 | ||
| 507 | ||
| 19531 | 508 | |
| 19511 | 509 | (** axiomatizations **) | 
| 510 | ||
| 511 | local | |
| 512 | ||
| 20628 | 513 | fun axiomatize prep mk name add raw_args thy = | 
| 514 | let | |
| 515 | val args = prep thy raw_args; | |
| 516 | val specs = mk args; | |
| 517 | val names = name args; | |
| 29579 | 518 | in | 
| 519 | thy | |
| 520 | |> PureThy.add_axioms (map (rpair []) (map Binding.name names ~~ specs)) | |
| 521 | |-> fold add | |
| 522 | end; | |
| 19511 | 523 | |
| 524 | fun ax_classrel prep = | |
| 20628 | 525 | axiomatize (map o prep) (map Logic.mk_classrel) | 
| 526 | (map (prefix classrel_prefix o Logic.name_classrel)) add_classrel; | |
| 19511 | 527 | |
| 528 | fun ax_arity prep = | |
| 20628 | 529 | axiomatize prep Logic.mk_arities | 
| 530 | (map (prefix arity_prefix) o Logic.name_arities) add_arity; | |
| 19511 | 531 | |
| 19706 | 532 | fun class_const c = | 
| 533 | (Logic.const_of_class c, Term.itselfT (Term.aT []) --> propT); | |
| 534 | ||
| 19511 | 535 | fun ax_class prep_class prep_classrel (bclass, raw_super) thy = | 
| 536 | let | |
| 28965 | 537 | val class = Sign.full_bname thy bclass; | 
| 24731 | 538 | val super = map (prep_class thy) raw_super |> Sign.minimize_sort thy; | 
| 19511 | 539 | in | 
| 540 | thy | |
| 541 | |> Sign.primitive_class (bclass, super) | |
| 542 | |> ax_classrel prep_classrel (map (fn c => (class, c)) super) | |
| 19706 | 543 | |> Theory.add_deps "" (class_const class) (map class_const super) | 
| 19511 | 544 | end; | 
| 545 | ||
| 546 | in | |
| 547 | ||
| 24929 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 548 | val axiomatize_class = ax_class Sign.certify_class cert_classrel; | 
| 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 549 | val axiomatize_class_cmd = ax_class Sign.read_class read_classrel; | 
| 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 550 | val axiomatize_classrel = ax_classrel cert_classrel; | 
| 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 551 | val axiomatize_classrel_cmd = ax_classrel read_classrel; | 
| 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 552 | val axiomatize_arity = ax_arity Sign.cert_arity; | 
| 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 553 | val axiomatize_arity_cmd = ax_arity Sign.read_arity; | 
| 19511 | 554 | |
| 555 | end; | |
| 556 | ||
| 557 | ||
| 558 | ||
| 559 | (** explicit derivations -- cached **) | |
| 560 | ||
| 19574 | 561 | datatype cache = Types of (class * thm) list Typtab.table; | 
| 562 | ||
| 19511 | 563 | local | 
| 19503 | 564 | |
| 19574 | 565 | fun lookup_type (Types cache) = AList.lookup (op =) o Typtab.lookup_list cache; | 
| 566 | fun insert_type T der (Types cache) = Types (Typtab.insert_list (eq_fst op =) (T, der) cache); | |
| 19503 | 567 | |
| 19522 | 568 | fun derive_type _ (_, []) = [] | 
| 569 | | derive_type thy (typ, sort) = | |
| 570 | let | |
| 19528 | 571 | val vars = Term.fold_atyps | 
| 19522 | 572 | (fn T as TFree (_, S) => insert (eq_fst op =) (T, S) | 
| 573 | | T as TVar (_, S) => insert (eq_fst op =) (T, S) | |
| 19528 | 574 | | _ => I) typ []; | 
| 19574 | 575 | val hyps = vars | 
| 576 | |> map (fn (T, S) => (T, Drule.sort_triv thy (T, S) ~~ S)); | |
| 26939 
1035c89b4c02
moved global pretty/string_of functions from Sign to Syntax;
 wenzelm parents: 
26516diff
changeset | 577 | val ths = (typ, sort) | 
| 
1035c89b4c02
moved global pretty/string_of functions from Sign to Syntax;
 wenzelm parents: 
26516diff
changeset | 578 | |> Sorts.of_sort_derivation (Syntax.pp_global thy) (Sign.classes_of thy) | 
| 22570 
f166a5416b3f
renamed of_sort_derivation record fields (avoid clash with Alice keywords);
 wenzelm parents: 
22385diff
changeset | 579 |            {class_relation =
 | 
| 19574 | 580 | fn (th, c1) => fn c2 => th RS the_classrel thy (c1, c2), | 
| 22570 
f166a5416b3f
renamed of_sort_derivation record fields (avoid clash with Alice keywords);
 wenzelm parents: 
22385diff
changeset | 581 | type_constructor = | 
| 19574 | 582 | fn a => fn dom => fn c => | 
| 583 | let val Ss = map (map snd) dom and ths = maps (map fst) dom | |
| 584 | in ths MRS the_arity thy a (c, Ss) end, | |
| 22570 
f166a5416b3f
renamed of_sort_derivation record fields (avoid clash with Alice keywords);
 wenzelm parents: 
22385diff
changeset | 585 | type_variable = | 
| 19574 | 586 | the_default [] o AList.lookup (op =) hyps}; | 
| 587 | in ths end; | |
| 19503 | 588 | |
| 19511 | 589 | in | 
| 590 | ||
| 19574 | 591 | fun of_sort thy (typ, sort) cache = | 
| 592 | let | |
| 593 | val sort' = filter (is_none o lookup_type cache typ) sort; | |
| 594 | val ths' = derive_type thy (typ, sort') | |
| 595 |       handle ERROR msg => cat_error msg ("The error(s) above occurred for sort derivation: " ^
 | |
| 26939 
1035c89b4c02
moved global pretty/string_of functions from Sign to Syntax;
 wenzelm parents: 
26516diff
changeset | 596 | Syntax.string_of_typ_global thy typ ^ " :: " ^ Syntax.string_of_sort_global thy sort'); | 
| 19574 | 597 | val cache' = cache |> fold (insert_type typ) (sort' ~~ ths'); | 
| 598 | val ths = | |
| 599 | sort |> map (fn c => | |
| 600 | Goal.finish (the (lookup_type cache' typ c) RS | |
| 601 | Goal.init (Thm.cterm_of thy (Logic.mk_inclass (typ, c)))) | |
| 20260 | 602 | |> Thm.adjust_maxidx_thm ~1); | 
| 19574 | 603 | in (ths, cache') end; | 
| 19503 | 604 | |
| 19511 | 605 | end; | 
| 19418 
03b01c9314fc
reworded add_axclass(_i): canonical specification format,
 wenzelm parents: 
19405diff
changeset | 606 | |
| 24929 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 607 | val cache = Types Typtab.empty; | 
| 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 608 | |
| 15876 
a67343c6ab2a
sane interfaces for tactical instance proofs (do not expand defs of theory, proper handling of sort instances);
 wenzelm parents: 
15853diff
changeset | 609 | end; |