| author | ballarin | 
| Wed, 10 Dec 2008 10:12:44 +0100 | |
| changeset 29034 | 3dc51c01f9f3 | 
| parent 28965 | 1de908189869 | 
| child 29524 | 941ad06c7f9c | 
| 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 | ID: $Id$ | 
| 
dd3d3d6467db
axiomatic type class 'package' for Pure (alpha version);
 wenzelm parents: diff
changeset | 3 | Author: Markus Wenzel, TU Muenchen | 
| 
dd3d3d6467db
axiomatic type class 'package' for Pure (alpha version);
 wenzelm parents: diff
changeset | 4 | |
| 24964 | 5 | Type classes defined as predicates, associated with a record of | 
| 6 | parameters. | |
| 404 
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 | |
| 
dd3d3d6467db
axiomatic type class 'package' for Pure (alpha version);
 wenzelm parents: diff
changeset | 9 | signature AX_CLASS = | 
| 3938 | 10 | sig | 
| 24589 | 11 | val define_class: bstring * class list -> string list -> | 
| 28965 | 12 | ((Binding.T * attribute list) * term list) list -> theory -> class * theory | 
| 24589 | 13 | val add_classrel: thm -> theory -> theory | 
| 14 | val add_arity: thm -> theory -> theory | |
| 15 | val prove_classrel: class * class -> tactic -> theory -> theory | |
| 16 | val prove_arity: string * sort list * sort -> tactic -> theory -> theory | |
| 24964 | 17 | val get_info: theory -> class -> | 
| 18 |     {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 | 19 | val class_intros: theory -> thm list | 
| 20107 | 20 | val class_of_param: theory -> string -> class option | 
| 19405 | 21 | val cert_classrel: theory -> class * class -> class * class | 
| 22 | val read_classrel: theory -> xstring * xstring -> class * class | |
| 24929 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 23 | val axiomatize_class: bstring * class list -> theory -> theory | 
| 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 24 | val axiomatize_class_cmd: bstring * xstring list -> theory -> theory | 
| 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 25 | val axiomatize_classrel: (class * class) list -> theory -> theory | 
| 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 26 | val axiomatize_classrel_cmd: (xstring * xstring) list -> theory -> theory | 
| 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 27 | val axiomatize_arity: arity -> theory -> theory | 
| 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 28 | val axiomatize_arity_cmd: xstring * string list * string -> theory -> theory | 
| 25486 | 29 | val instance_name: string * class -> string | 
| 25597 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 30 | val declare_overloaded: string * typ -> theory -> term * theory | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 31 | val define_overloaded: string -> string * term -> theory -> thm * theory | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 32 | val inst_tyco_of: theory -> string * typ -> string option | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 33 | val unoverload: theory -> thm -> thm | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 34 | val overload: theory -> thm -> thm | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 35 | val unoverload_conv: theory -> conv | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 36 | val overload_conv: theory -> conv | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 37 | val unoverload_const: theory -> string * typ -> string | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 38 | val param_of_inst: theory -> string * string -> string | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 39 | val inst_of_param: theory -> string -> (string * string) option | 
| 27497 | 40 | val arity_property: theory -> class * string -> string -> string list | 
| 19574 | 41 | type cache | 
| 24929 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 42 | val of_sort: theory -> typ * sort -> cache -> thm list * cache (*exception Sorts.CLASS_ERROR*) | 
| 19574 | 43 | val cache: cache | 
| 26246 | 44 | val introN: string | 
| 25617 | 45 | val axiomsN: string | 
| 3938 | 46 | end; | 
| 404 
dd3d3d6467db
axiomatic type class 'package' for Pure (alpha version);
 wenzelm parents: diff
changeset | 47 | |
| 15801 | 48 | structure AxClass: AX_CLASS = | 
| 404 
dd3d3d6467db
axiomatic type class 'package' for Pure (alpha version);
 wenzelm parents: diff
changeset | 49 | struct | 
| 
dd3d3d6467db
axiomatic type class 'package' for Pure (alpha version);
 wenzelm parents: diff
changeset | 50 | |
| 19405 | 51 | (** theory data **) | 
| 423 | 52 | |
| 19405 | 53 | (* class parameters (canonical order) *) | 
| 423 | 54 | |
| 19405 | 55 | type param = string * class; | 
| 423 | 56 | |
| 19405 | 57 | fun add_param pp ((x, c): param) params = | 
| 58 | (case AList.lookup (op =) params x of | |
| 59 | NONE => (x, c) :: params | |
| 60 |   | SOME c' => error ("Duplicate class parameter " ^ quote x ^
 | |
| 61 | " for " ^ Pretty.string_of_sort pp [c] ^ | |
| 62 | (if c = c' then "" else " and " ^ Pretty.string_of_sort pp [c']))); | |
| 423 | 63 | |
| 19405 | 64 | fun merge_params _ ([], qs) = qs | 
| 65 | | merge_params pp (ps, qs) = | |
| 66 | fold_rev (fn q => if member (op =) ps q then I else add_param pp q) qs ps; | |
| 423 | 67 | |
| 68 | ||
| 19511 | 69 | (* axclasses *) | 
| 6379 | 70 | |
| 19243 
5dcb899a8486
moved read_class, read/cert_classrel/arity to sign.ML;
 wenzelm parents: 
19134diff
changeset | 71 | val introN = "intro"; | 
| 19511 | 72 | val superN = "super"; | 
| 19243 
5dcb899a8486
moved read_class, read/cert_classrel/arity to sign.ML;
 wenzelm parents: 
19134diff
changeset | 73 | val axiomsN = "axioms"; | 
| 
5dcb899a8486
moved read_class, read/cert_classrel/arity to sign.ML;
 wenzelm parents: 
19134diff
changeset | 74 | |
| 19392 | 75 | datatype axclass = AxClass of | 
| 19460 | 76 |  {def: thm,
 | 
| 19392 | 77 | intro: thm, | 
| 21463 
42dd50268c8b
completed class parameter handling in axclass.ML
 haftmann parents: 
20628diff
changeset | 78 | axioms: thm list, | 
| 21925 | 79 | params: (string * typ) list}; | 
| 19392 | 80 | |
| 19460 | 81 | type axclasses = axclass Symtab.table * param list; | 
| 19392 | 82 | |
| 27397 | 83 | fun make_axclass ((def, intro, axioms), params) = AxClass | 
| 84 |   {def = def, intro = intro, axioms = axioms, params = params};
 | |
| 19405 | 85 | |
| 86 | fun merge_axclasses pp ((tab1, params1), (tab2, params2)) : axclasses = | |
| 87 | (Symtab.merge (K true) (tab1, tab2), merge_params pp (params1, params2)); | |
| 88 | ||
| 19392 | 89 | |
| 90 | (* instances *) | |
| 91 | ||
| 20628 | 92 | val classrel_prefix = "classrel_"; | 
| 93 | val arity_prefix = "arity_"; | |
| 19511 | 94 | |
| 19574 | 95 | type instances = | 
| 96 | ((class * class) * thm) list * | |
| 97 | ((class * sort list) * thm) list Symtab.table; | |
| 6379 | 98 | |
| 19574 | 99 | fun merge_instances ((classrel1, arities1): instances, (classrel2, arities2)) = | 
| 100 | (merge (eq_fst op =) (classrel1, classrel2), | |
| 101 | Symtab.join (K (merge (eq_fst op =))) (arities1, arities2)); | |
| 19392 | 102 | |
| 103 | ||
| 25597 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 104 | (* instance parameters *) | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 105 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 106 | type inst_params = | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 107 | (string * thm) Symtab.table Symtab.table | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 108 | (*constant name ~> type constructor ~> (constant name, equation)*) | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 109 | * (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 | 110 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 111 | 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 | 112 | (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 | 113 | Symtab.merge (K true) (param_const1, param_const2)); | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 114 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 115 | |
| 19511 | 116 | (* setup data *) | 
| 19392 | 117 | |
| 118 | structure AxClassData = TheoryDataFun | |
| 22846 | 119 | ( | 
| 25597 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 120 | type T = axclasses * (instances * inst_params); | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 121 | val empty = ((Symtab.empty, []), (([], Symtab.empty), (Symtab.empty, Symtab.empty))); | 
| 19574 | 122 | val copy = I; | 
| 123 | val extend = I; | |
| 25597 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 124 | 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 | 125 | (merge_axclasses pp (axclasses1, axclasses2), | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 126 | (merge_instances (instances1, instances2), merge_inst_params (inst_params1, inst_params2))); | 
| 22846 | 127 | ); | 
| 6379 | 128 | |
| 129 | ||
| 19574 | 130 | (* maintain axclasses *) | 
| 19392 | 131 | |
| 19574 | 132 | val get_axclasses = #1 o AxClassData.get; | 
| 25597 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 133 | val map_axclasses = AxClassData.map o apfst; | 
| 19574 | 134 | |
| 135 | val lookup_def = Symtab.lookup o #1 o get_axclasses; | |
| 6379 | 136 | |
| 24929 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 137 | fun get_info thy c = | 
| 19511 | 138 | (case lookup_def thy c of | 
| 19392 | 139 | SOME (AxClass info) => info | 
| 21919 | 140 |   | NONE => error ("No such axclass: " ^ quote c));
 | 
| 6379 | 141 | |
| 19123 | 142 | fun class_intros thy = | 
| 19392 | 143 | let | 
| 144 | fun add_intro c = | |
| 19511 | 145 |       (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 | 146 | val classes = Sign.all_classes thy; | 
| 19392 | 147 | 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 | 148 | |
| 
a67343c6ab2a
sane interfaces for tactical instance proofs (do not expand defs of theory, proper handling of sort instances);
 wenzelm parents: 
15853diff
changeset | 149 | |
| 19460 | 150 | fun get_params thy pred = | 
| 19574 | 151 | let val params = #2 (get_axclasses thy); | 
| 19460 | 152 | in fold (fn (x, c) => if pred c then cons x else I) params [] end; | 
| 153 | ||
| 154 | fun params_of thy c = get_params thy (fn c' => c' = c); | |
| 155 | fun all_params_of thy S = get_params thy (fn c => Sign.subsort thy (S, [c])); | |
| 156 | ||
| 24964 | 157 | fun class_of_param thy = AList.lookup (op =) (#2 (get_axclasses thy)); | 
| 19460 | 158 | |
| 21919 | 159 | |
| 19511 | 160 | (* maintain instances *) | 
| 19503 | 161 | |
| 25486 | 162 | fun instance_name (a, c) = NameSpace.base c ^ "_" ^ NameSpace.base a; | 
| 163 | ||
| 25597 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 164 | val get_instances = #1 o #2 o AxClassData.get; | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 165 | val map_instances = AxClassData.map o apsnd o apfst; | 
| 19528 | 166 | |
| 167 | ||
| 19574 | 168 | fun the_classrel thy (c1, c2) = | 
| 169 | (case AList.lookup (op =) (#1 (get_instances thy)) (c1, c2) of | |
| 170 | SOME th => Thm.transfer thy th | |
| 24920 | 171 |   | NONE => error ("Unproven class relation " ^
 | 
| 172 | Syntax.string_of_classrel (ProofContext.init thy) [c1, c2])); | |
| 19574 | 173 | |
| 174 | fun put_classrel arg = map_instances (fn (classrel, arities) => | |
| 175 | (insert (eq_fst op =) arg classrel, arities)); | |
| 19503 | 176 | |
| 177 | ||
| 19574 | 178 | fun the_arity thy a (c, Ss) = | 
| 24929 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 179 | (case AList.lookup (op =) (Symtab.lookup_list (#2 (get_instances thy)) a) (c, Ss) of | 
| 19574 | 180 | SOME th => Thm.transfer thy th | 
| 24920 | 181 |   | NONE => error ("Unproven type arity " ^
 | 
| 182 | Syntax.string_of_arity (ProofContext.init thy) (a, Ss, [c]))); | |
| 19503 | 183 | |
| 27497 | 184 | fun arity_property thy (c, a) x = | 
| 27547 | 185 | Symtab.lookup_list (snd (get_instances thy)) a | 
| 27497 | 186 | |> map_filter (fn ((c', _), th) => if c = c' | 
| 27547 | 187 | then AList.lookup (op =) (Thm.get_tags th) x else NONE) | 
| 27497 | 188 | |> rev; | 
| 27397 | 189 | |
| 27547 | 190 | fun insert_arity_completions thy (t, ((c, Ss), th)) arities = | 
| 191 | let | |
| 192 | val algebra = Sign.classes_of thy; | |
| 193 | val super_class_completions = Sign.super_classes thy c | |
| 194 | |> filter_out (fn c1 => exists (fn ((c2, Ss2), _) => c1 = c2 | |
| 195 | andalso Sorts.sorts_le algebra (Ss2, Ss)) (Symtab.lookup_list arities t)) | |
| 196 | val tags = Thm.get_tags th; | |
| 27554 | 197 | val completions = map (fn c1 => (Sorts.weaken algebra | 
| 27547 | 198 | (fn (th, c2) => fn c3 => th RS the_classrel thy (c2, c3)) (th, c) c1 | 
| 199 | |> Thm.map_tags (K tags) |> Thm.close_derivation, c1)) super_class_completions; | |
| 200 | val arities' = fold (fn (th1, c1) => Symtab.cons_list (t, ((c1, Ss), th1))) | |
| 201 | completions arities; | |
| 202 | in (completions, arities') end; | |
| 19503 | 203 | |
| 27547 | 204 | fun put_arity ((t, Ss, c), th) thy = | 
| 205 | let | |
| 206 | val th' = (Thm.map_tags o AList.default (op =)) | |
| 207 | (Markup.theory_nameN, Context.theory_name thy) th; | |
| 208 | val arity' = (t, ((c, Ss), th')); | |
| 209 | in | |
| 210 | thy | |
| 211 | |> map_instances (fn (classrel, arities) => (classrel, | |
| 212 | arities | |
| 213 | |> Symtab.insert_list (eq_fst op =) arity' | |
| 214 | |> insert_arity_completions thy arity' | |
| 215 | |> snd)) | |
| 216 | end; | |
| 19503 | 217 | |
| 27547 | 218 | fun complete_arities thy = | 
| 219 | let | |
| 220 | val arities = snd (get_instances thy); | |
| 221 | val (completions, arities') = arities | |
| 222 | |> fold_map (insert_arity_completions thy) (Symtab.dest_list arities) | |
| 223 | |>> flat; | |
| 224 | in if null completions | |
| 225 | then NONE | |
| 226 | else SOME (thy |> map_instances (fn (classrel, _) => (classrel, arities'))) | |
| 227 | end; | |
| 228 | ||
| 229 | val _ = Context.>> (Context.map_theory (Theory.at_begin complete_arities)); | |
| 27397 | 230 | |
| 231 | ||
| 25597 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 232 | (* maintain instance parameters *) | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 233 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 234 | 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 | 235 | 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 | 236 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 237 | fun get_inst_param thy (c, tyco) = | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 238 | (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 | 239 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 240 | 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 | 241 | 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 | 242 | #> (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 | 243 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 244 | 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 | 245 | val param_of_inst = fst oo get_inst_param; | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 246 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 247 | 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 | 248 | (get_inst_params thy) []; | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 249 | |
| 25863 | 250 | 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 | 251 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 252 | fun unoverload thy = MetaSimplifier.simplify true (inst_thms thy); | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 253 | 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 | 254 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 255 | 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 | 256 | 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 | 257 | |
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 258 | fun unoverload_const thy (c_ty as (c, _)) = | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 259 | case class_of_param thy c | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 260 | 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 | 261 | 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 | 262 | | NONE => c) | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 263 | | NONE => c; | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 264 | |
| 404 
dd3d3d6467db
axiomatic type class 'package' for Pure (alpha version);
 wenzelm parents: diff
changeset | 265 | |
| 19511 | 266 | (** instances **) | 
| 19418 
03b01c9314fc
reworded add_axclass(_i): canonical specification format,
 wenzelm parents: 
19405diff
changeset | 267 | |
| 
03b01c9314fc
reworded add_axclass(_i): canonical specification format,
 wenzelm parents: 
19405diff
changeset | 268 | (* class relations *) | 
| 
03b01c9314fc
reworded add_axclass(_i): canonical specification format,
 wenzelm parents: 
19405diff
changeset | 269 | |
| 19405 | 270 | 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 | 271 | let | 
| 26939 
1035c89b4c02
moved global pretty/string_of functions from Sign to Syntax;
 wenzelm parents: 
26516diff
changeset | 272 | val string_of_sort = Syntax.string_of_sort_global thy; | 
| 19405 | 273 | val (c1, c2) = pairself (Sign.certify_class thy) raw_rel; | 
| 24271 | 274 | val _ = Sign.primitive_classrel (c1, c2) (Theory.copy thy); | 
| 19405 | 275 | val _ = | 
| 19460 | 276 | (case subtract (op =) (all_params_of thy [c1]) (all_params_of thy [c2]) of | 
| 19405 | 277 | [] => () | 
| 26939 
1035c89b4c02
moved global pretty/string_of functions from Sign to Syntax;
 wenzelm parents: 
26516diff
changeset | 278 |       | 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 | 279 | commas_quote xs ^ " of " ^ string_of_sort [c2], [], [])); | 
| 19405 | 280 | in (c1, c2) end; | 
| 281 | ||
| 282 | fun read_classrel thy raw_rel = | |
| 283 | cert_classrel thy (pairself (Sign.read_class thy) raw_rel) | |
| 284 | handle TYPE (msg, _, _) => error msg; | |
| 285 | ||
| 286 | ||
| 287 | (* primitive rules *) | |
| 288 | ||
| 289 | fun add_classrel th thy = | |
| 290 | let | |
| 291 |     fun err () = raise THM ("add_classrel: malformed class relation", 0, [th]);
 | |
| 22691 | 292 | val prop = Thm.plain_prop_of (Thm.transfer thy th); | 
| 19405 | 293 | val rel = Logic.dest_classrel prop handle TERM _ => err (); | 
| 294 | val (c1, c2) = cert_classrel thy rel handle TYPE _ => err (); | |
| 19574 | 295 | in | 
| 296 | thy | |
| 297 | |> Sign.primitive_classrel (c1, c2) | |
| 298 | |> put_classrel ((c1, c2), Drule.unconstrainTs th) | |
| 28014 | 299 | |> perhaps complete_arities | 
| 19574 | 300 | end; | 
| 15876 
a67343c6ab2a
sane interfaces for tactical instance proofs (do not expand defs of theory, proper handling of sort instances);
 wenzelm parents: 
15853diff
changeset | 301 | |
| 19405 | 302 | 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 | 303 | let | 
| 19528 | 304 |     fun err () = raise THM ("add_arity: malformed type arity", 0, [th]);
 | 
| 22691 | 305 | val prop = Thm.plain_prop_of (Thm.transfer thy th); | 
| 19528 | 306 | val (t, Ss, c) = Logic.dest_arity prop handle TERM _ => err (); | 
| 24731 | 307 | val _ = map (Sign.certify_sort thy) Ss = Ss orelse err (); | 
| 26516 | 308 | val _ = case filter_out (fn c => can (get_inst_param thy) (c, t)) (params_of thy c) | 
| 309 | of [] => () | |
| 310 | | cs => Output.legacy_feature | |
| 311 |           ("Missing specifications for overloaded parameters " ^ commas_quote cs)
 | |
| 27547 | 312 | val th' = Drule.unconstrainTs th; | 
| 19574 | 313 | in | 
| 314 | thy | |
| 315 | |> Sign.primitive_arity (t, Ss, [c]) | |
| 27397 | 316 | |> put_arity ((t, Ss, c), th') | 
| 19574 | 317 | end; | 
| 404 
dd3d3d6467db
axiomatic type class 'package' for Pure (alpha version);
 wenzelm parents: diff
changeset | 318 | |
| 
dd3d3d6467db
axiomatic type class 'package' for Pure (alpha version);
 wenzelm parents: diff
changeset | 319 | |
| 19243 
5dcb899a8486
moved read_class, read/cert_classrel/arity to sign.ML;
 wenzelm parents: 
19134diff
changeset | 320 | (* 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 | 321 | |
| 19405 | 322 | 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 | 323 | let | 
| 24920 | 324 | val ctxt = ProofContext.init thy; | 
| 19405 | 325 | val (c1, c2) = cert_classrel thy raw_rel; | 
| 24920 | 326 | val th = Goal.prove ctxt [] [] | 
| 20049 | 327 | (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 | 328 |       cat_error msg ("The error(s) above occurred while trying to prove class relation " ^
 | 
| 24920 | 329 | quote (Syntax.string_of_classrel ctxt [c1, c2])); | 
| 19511 | 330 | in | 
| 331 | thy | |
| 20628 | 332 | |> PureThy.add_thms [((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 | |
| 20628 | 348 | |> PureThy.add_thms (map (rpair []) (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 | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 375 | (Thm.def_name c', Logic.mk_equals (Const (c, T'), const')) | 
| 
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) | 
| 27865 
27a8ad9612a3
moved basic thm operations from structure PureThy to Thm (cf. more_thm.ML);
 wenzelm parents: 
27691diff
changeset | 378 | #> PureThy.add_thm ((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 | 
| 
34860182b250
moved instance parameter management from class.ML to axclass.ML
 haftmann parents: 
25486diff
changeset | 394 | |> Thm.add_def false false (name', prop) | 
| 
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) | |
| 27691 
ce171cbd4b93
PureThy: dropped note_thmss_qualified, dropped _i suffix
 haftmann parents: 
27683diff
changeset | 472 | |> PureThy.add_defs false [((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; | |
| 27691 
ce171cbd4b93
PureThy: dropped note_thmss_qualified, dropped _i suffix
 haftmann parents: 
27683diff
changeset | 518 | in thy |> PureThy.add_axioms (map (rpair []) (names ~~ specs)) |-> fold add end; | 
| 19511 | 519 | |
| 520 | fun ax_classrel prep = | |
| 20628 | 521 | axiomatize (map o prep) (map Logic.mk_classrel) | 
| 522 | (map (prefix classrel_prefix o Logic.name_classrel)) add_classrel; | |
| 19511 | 523 | |
| 524 | fun ax_arity prep = | |
| 20628 | 525 | axiomatize prep Logic.mk_arities | 
| 526 | (map (prefix arity_prefix) o Logic.name_arities) add_arity; | |
| 19511 | 527 | |
| 19706 | 528 | fun class_const c = | 
| 529 | (Logic.const_of_class c, Term.itselfT (Term.aT []) --> propT); | |
| 530 | ||
| 19511 | 531 | fun ax_class prep_class prep_classrel (bclass, raw_super) thy = | 
| 532 | let | |
| 28965 | 533 | val class = Sign.full_bname thy bclass; | 
| 24731 | 534 | val super = map (prep_class thy) raw_super |> Sign.minimize_sort thy; | 
| 19511 | 535 | in | 
| 536 | thy | |
| 537 | |> Sign.primitive_class (bclass, super) | |
| 538 | |> ax_classrel prep_classrel (map (fn c => (class, c)) super) | |
| 19706 | 539 | |> Theory.add_deps "" (class_const class) (map class_const super) | 
| 19511 | 540 | end; | 
| 541 | ||
| 542 | in | |
| 543 | ||
| 24929 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 544 | val axiomatize_class = ax_class Sign.certify_class cert_classrel; | 
| 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 545 | 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 | 546 | val axiomatize_classrel = ax_classrel cert_classrel; | 
| 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 547 | val axiomatize_classrel_cmd = ax_classrel read_classrel; | 
| 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 548 | val axiomatize_arity = ax_arity Sign.cert_arity; | 
| 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 549 | val axiomatize_arity_cmd = ax_arity Sign.read_arity; | 
| 19511 | 550 | |
| 551 | end; | |
| 552 | ||
| 553 | ||
| 554 | ||
| 555 | (** explicit derivations -- cached **) | |
| 556 | ||
| 19574 | 557 | datatype cache = Types of (class * thm) list Typtab.table; | 
| 558 | ||
| 19511 | 559 | local | 
| 19503 | 560 | |
| 19574 | 561 | fun lookup_type (Types cache) = AList.lookup (op =) o Typtab.lookup_list cache; | 
| 562 | fun insert_type T der (Types cache) = Types (Typtab.insert_list (eq_fst op =) (T, der) cache); | |
| 19503 | 563 | |
| 19522 | 564 | fun derive_type _ (_, []) = [] | 
| 565 | | derive_type thy (typ, sort) = | |
| 566 | let | |
| 19528 | 567 | val vars = Term.fold_atyps | 
| 19522 | 568 | (fn T as TFree (_, S) => insert (eq_fst op =) (T, S) | 
| 569 | | T as TVar (_, S) => insert (eq_fst op =) (T, S) | |
| 19528 | 570 | | _ => I) typ []; | 
| 19574 | 571 | val hyps = vars | 
| 572 | |> 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 | 573 | val ths = (typ, sort) | 
| 
1035c89b4c02
moved global pretty/string_of functions from Sign to Syntax;
 wenzelm parents: 
26516diff
changeset | 574 | |> 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 | 575 |            {class_relation =
 | 
| 19574 | 576 | 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 | 577 | type_constructor = | 
| 19574 | 578 | fn a => fn dom => fn c => | 
| 579 | let val Ss = map (map snd) dom and ths = maps (map fst) dom | |
| 580 | 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 | 581 | type_variable = | 
| 19574 | 582 | the_default [] o AList.lookup (op =) hyps}; | 
| 583 | in ths end; | |
| 19503 | 584 | |
| 19511 | 585 | in | 
| 586 | ||
| 19574 | 587 | fun of_sort thy (typ, sort) cache = | 
| 588 | let | |
| 589 | val sort' = filter (is_none o lookup_type cache typ) sort; | |
| 590 | val ths' = derive_type thy (typ, sort') | |
| 591 |       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 | 592 | Syntax.string_of_typ_global thy typ ^ " :: " ^ Syntax.string_of_sort_global thy sort'); | 
| 19574 | 593 | val cache' = cache |> fold (insert_type typ) (sort' ~~ ths'); | 
| 594 | val ths = | |
| 595 | sort |> map (fn c => | |
| 596 | Goal.finish (the (lookup_type cache' typ c) RS | |
| 597 | Goal.init (Thm.cterm_of thy (Logic.mk_inclass (typ, c)))) | |
| 20260 | 598 | |> Thm.adjust_maxidx_thm ~1); | 
| 19574 | 599 | in (ths, cache') end; | 
| 19503 | 600 | |
| 19511 | 601 | end; | 
| 19418 
03b01c9314fc
reworded add_axclass(_i): canonical specification format,
 wenzelm parents: 
19405diff
changeset | 602 | |
| 24929 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 603 | val cache = Types Typtab.empty; | 
| 
408becab067e
renamed AxClass.get_definition to AxClass.get_info (again);
 wenzelm parents: 
24920diff
changeset | 604 | |
| 15876 
a67343c6ab2a
sane interfaces for tactical instance proofs (do not expand defs of theory, proper handling of sort instances);
 wenzelm parents: 
15853diff
changeset | 605 | end; |