src/Pure/Tools/class_package.ML
author haftmann
Fri, 02 Dec 2005 16:05:31 +0100
changeset 18335 99baddf6b0d0
parent 18330 444f16d232a2
child 18360 a2c9506b62a7
permissions -rw-r--r--
various improvements
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
     1
(*  Title:      Pure/Tools/class_package.ML
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
     2
    ID:         $Id$
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
     3
    Author:     Florian Haftmann, TU Muenchen
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
     4
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
     5
Haskell98-like operational view on type classes.
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
     6
*)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
     7
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
     8
signature CLASS_PACKAGE =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
     9
sig
18335
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
    10
  val add_classentry: class -> string list -> string list -> theory -> theory
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    11
  val the_consts: theory -> class -> string list
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    12
  val the_tycos: theory -> class -> (string * string) list
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    13
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    14
  val is_class: theory -> class -> bool
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    15
  val get_arities: theory -> sort -> string -> sort list
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    16
  val get_superclasses: theory -> class -> class list
18304
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
    17
  val get_const_sign: theory -> string -> string -> typ
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    18
  val get_inst_consts_sign: theory -> string * class -> (string * typ) list
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    19
  val lookup_const_class: theory -> string -> class option
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    20
  val get_classtab: theory -> (string list * (string * string) list) Symtab.table
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    21
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    22
  type sortcontext = (string * sort) list
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    23
  datatype sortlookup = Instance of (class * string) * sortlookup list list
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    24
                      | Lookup of class list * (string * int)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    25
  val extract_sortctxt: theory -> typ -> sortcontext
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    26
  val extract_sortlookup: theory -> typ * typ -> sortlookup list list
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    27
end;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    28
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    29
structure ClassPackage: CLASS_PACKAGE =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    30
struct
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    31
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    32
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    33
(* data kind 'Pure/classes' *)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    34
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    35
type class_data = {
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    36
  locale_name: string,
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    37
  axclass_name: string,
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    38
  consts: string list,
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    39
  tycos: (string * string) list
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    40
};
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    41
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    42
structure ClassesData = TheoryDataFun (
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    43
  struct
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    44
    val name = "Pure/classes";
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    45
    type T = class_data Symtab.table * class Symtab.table;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    46
    val empty = (Symtab.empty, Symtab.empty);
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    47
    val copy = I;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    48
    val extend = I;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    49
    fun merge _ ((t1, r1), (t2, r2))=
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    50
      (Symtab.merge (op =) (t1, t2),
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    51
       Symtab.merge (op =) (r1, r2));
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    52
    fun print _ (tab, _) = (Pretty.writeln o Pretty.chunks) (map Pretty.str (Symtab.keys tab));
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    53
  end
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    54
);
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    55
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    56
val lookup_class_data = Symtab.lookup o fst o ClassesData.get;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    57
val lookup_const_class = Symtab.lookup o snd o ClassesData.get;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    58
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    59
fun get_class_data thy class =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    60
  case lookup_class_data thy class
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    61
    of NONE => error ("undeclared class " ^ quote class)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    62
     | SOME data => data;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    63
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    64
fun put_class_data class data =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    65
  ClassesData.map (apfst (Symtab.update (class, data)));
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    66
fun add_const class const =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    67
  ClassesData.map (apsnd (Symtab.update (const, class)));
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    68
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    69
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    70
(* name mangling *)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    71
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    72
fun get_locale_for_class thy class =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    73
  #locale_name (get_class_data thy class);
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    74
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    75
fun get_axclass_for_class thy class =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    76
  #axclass_name (get_class_data thy class);
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    77
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    78
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    79
(* assign consts to type classes *)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    80
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    81
local
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    82
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    83
fun gen_add_consts prep_class prep_const (raw_class, raw_consts_new) thy =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    84
  let
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    85
    val class = prep_class thy raw_class;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    86
    val consts_new = map (prep_const thy) raw_consts_new;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    87
    val {locale_name, axclass_name, consts, tycos} =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    88
      get_class_data thy class;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    89
  in
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    90
    thy
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    91
    |> put_class_data class {
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    92
         locale_name = locale_name,
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    93
         axclass_name = axclass_name,
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    94
         consts = consts @ consts_new,
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    95
         tycos = tycos
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    96
       }
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    97
    |> fold (add_const class) consts_new
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    98
  end;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    99
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   100
in
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   101
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   102
val add_consts = gen_add_consts Sign.intern_class Sign.intern_const;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   103
val add_consts_i = gen_add_consts (K I) (K I);
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   104
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   105
end; (* local *)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   106
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   107
val the_consts = #consts oo get_class_data;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   108
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   109
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   110
(* assign type constructors to type classes *)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   111
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   112
local
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   113
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   114
fun gen_add_tycos prep_class prep_type (raw_class, raw_tycos_new) thy =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   115
  let
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   116
    val class = prep_class thy raw_class
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   117
    val tycos_new = map (prep_type thy) raw_tycos_new
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   118
    val {locale_name, axclass_name, consts, tycos} =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   119
      get_class_data thy class
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   120
  in
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   121
    thy
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   122
    |> put_class_data class {
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   123
         locale_name = locale_name,
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   124
         axclass_name = axclass_name,
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   125
         consts = consts,
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   126
         tycos = tycos @ tycos_new
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   127
       }
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   128
  end;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   129
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   130
in
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   131
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   132
fun add_tycos xs thy =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   133
  gen_add_tycos Sign.intern_class (rpair (Context.theory_name thy) oo Sign.intern_type) xs thy;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   134
val add_tycos_i = gen_add_tycos (K I) (K I);
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   135
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   136
end; (* local *)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   137
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   138
val the_tycos = #tycos oo get_class_data;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   139
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   140
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   141
(* class queries *)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   142
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   143
fun is_class thy = is_some o lookup_class_data thy;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   144
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   145
fun filter_class thy = filter (is_class thy);
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   146
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   147
fun assert_class thy class =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   148
  if is_class thy class then class
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   149
  else error ("not a class: " ^ quote class);
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   150
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   151
fun get_arities thy sort tycon =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   152
  Sorts.mg_domain (Sign.classes_arities_of thy) tycon sort
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   153
  |> (map o map) (assert_class thy);
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   154
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   155
fun get_superclasses thy class =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   156
  Sorts.superclasses (Sign.classes_of thy) class
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   157
  |> filter_class thy;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   158
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   159
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   160
(* instance queries *)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   161
18304
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   162
fun get_const_sign thy tvar const =
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   163
  let
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   164
    val class = (the o lookup_const_class thy) const;
18335
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   165
    val (ty, thaw) = (Type.freeze_thaw_type o Sign.the_const_constraint thy) const;
18304
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   166
    val tvars_used = Term.add_tfreesT ty [];
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   167
    val tvar_rename = hd (Term.invent_names (map fst tvars_used) tvar 1);
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   168
  in
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   169
    ty
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   170
    |> map_type_tfree (fn (tvar', sort) =>
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   171
          if Sorts.sort_eq (Sign.classes_of thy) ([class], sort)
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   172
          then TFree (tvar, [])
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   173
          else if tvar' = tvar
18335
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   174
          then TVar ((tvar_rename, 0), sort)
18304
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   175
          else TFree (tvar', sort))
18335
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   176
    |> thaw
18304
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   177
  end;
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   178
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   179
fun get_inst_consts_sign thy (tyco, class) =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   180
  let
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   181
    val consts = the_consts thy class;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   182
    val arities = get_arities thy [class] tyco;
18304
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   183
    val const_signs = map (get_const_sign thy "'a") consts;
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   184
    val vars_used = fold (fn ty => curry (gen_union (op =))
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   185
      (map fst (typ_tfrees ty) |> remove (op =) "'a")) const_signs [];
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   186
    val vars_new = Term.invent_names vars_used "'a" (length arities);
18330
444f16d232a2 introduced new map2, fold
haftmann
parents: 18304
diff changeset
   187
    val typ_arity = Type (tyco, map2 (curry TFree) vars_new arities);
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   188
    val instmem_signs =
18335
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   189
      map (typ_subst_TVars [(("'a", 0), typ_arity)]) const_signs;
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   190
  in consts ~~ instmem_signs end;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   191
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   192
fun get_classtab thy =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   193
  Symtab.fold
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   194
    (fn (class, { consts = consts, tycos = tycos, ... }) =>
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   195
      Symtab.update_new (class, (consts, tycos)))
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   196
       (fst (ClassesData.get thy)) Symtab.empty;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   197
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   198
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   199
(* extracting dictionary obligations from types *)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   200
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   201
type sortcontext = (string * sort) list;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   202
18335
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   203
fun extract_sortctxt thy ty =
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   204
  (typ_tfrees o Type.no_tvars) ty
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   205
  |> map (apsnd (filter_class thy))
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   206
  |> filter (not o null o snd);
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   207
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   208
datatype sortlookup = Instance of (class * string) * sortlookup list list
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   209
                    | Lookup of class list * (string * int)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   210
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   211
fun extract_sortlookup thy (raw_typ_def, raw_typ_use) =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   212
  let
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   213
    val typ_def = Type.varifyT raw_typ_def;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   214
    val typ_use = Type.varifyT raw_typ_use;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   215
    val match_tab = Sign.typ_match thy (typ_def, typ_use) Vartab.empty;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   216
    fun tab_lookup vname = (the o Vartab.lookup match_tab) (vname, 0);
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   217
    fun get_superclass_derivation (subclasses, superclass) =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   218
      (the oo get_first) (fn subclass =>
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   219
        Sorts.class_le_path (Sign.classes_of thy) (subclass, superclass)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   220
      ) subclasses;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   221
    fun mk_class_deriv thy subclasses superclass =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   222
      case get_superclass_derivation (subclasses, superclass)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   223
      of (subclass::deriv) => (rev deriv, find_index_eq subclass subclasses);
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   224
    fun mk_lookup (sort_def, (Type (tycon, tys))) =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   225
          let
18330
444f16d232a2 introduced new map2, fold
haftmann
parents: 18304
diff changeset
   226
            val arity_lookup = map2 (curry mk_lookup)
444f16d232a2 introduced new map2, fold
haftmann
parents: 18304
diff changeset
   227
              (map (filter_class thy) (Sorts.mg_domain (Sign.classes_arities_of thy) tycon sort_def)) tys
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   228
          in map (fn class => Instance ((class, tycon), arity_lookup)) sort_def end
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   229
      | mk_lookup (sort_def, TVar ((vname, _), sort_use)) =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   230
          let
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   231
            fun mk_look class =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   232
              let val (deriv, classindex) = mk_class_deriv thy sort_use class
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   233
              in Lookup (deriv, (vname, classindex)) end;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   234
          in map mk_look sort_def end;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   235
  in
18335
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   236
    extract_sortctxt thy ((fst o Type.freeze_thaw_type) raw_typ_def)
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   237
    |> map (tab_lookup o fst)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   238
    |> map (apfst (filter_class thy))
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   239
    |> filter (not o null o fst)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   240
    |> map mk_lookup
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   241
  end;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   242
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   243
18335
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   244
(* intermediate auxiliary *)
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   245
18335
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   246
fun add_classentry raw_class raw_consts raw_tycos thy =
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   247
  let
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   248
    val class = Sign.intern_class thy raw_class;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   249
  in
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   250
    thy
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   251
    |> put_class_data class {
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   252
         locale_name = "",
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   253
         axclass_name = class,
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   254
         consts = [],
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   255
         tycos = []
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   256
       }
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   257
    |> add_consts (class, raw_consts)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   258
    |> add_tycos (class, raw_tycos)
18335
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   259
  end;
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   260
  
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   261
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   262
(* setup *)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   263
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   264
val _ = Context.add_setup [ClassesData.init];
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   265
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   266
end; (* struct *)