src/Pure/Tools/class_package.ML
author haftmann
Wed, 04 Jan 2006 17:04:11 +0100
changeset 18575 9ccfd1d1e874
parent 18550 59b89f625d68
child 18593 4ce4dba4af07
permissions -rw-r--r--
substantial additions using locales
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
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
    10
  val add_class: bstring -> Locale.expr -> Element.context list -> theory
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
    11
    -> ProofContext.context * theory
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
    12
  val add_class_i: bstring -> Locale.expr -> Element.context_i list -> theory
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
    13
    -> ProofContext.context * theory
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    14
  val add_instance_arity: (xstring * string list) * string
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    15
    -> ((bstring * string) * Attrib.src list) list
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    16
    -> theory -> Proof.state
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    17
  val add_instance_arity_i: (string * sort list) * sort
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    18
    -> ((bstring * term) * theory attribute list) list
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    19
    -> theory -> Proof.state
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
    20
  val add_classentry: class -> xstring list -> xstring list -> theory -> theory
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    21
  val the_consts: theory -> class -> string list
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    22
  val the_tycos: theory -> class -> (string * string) list
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    23
  val print_classes: theory -> unit
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    24
18360
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
    25
  val syntactic_sort_of: theory -> sort -> sort
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    26
  val get_arities: theory -> sort -> string -> sort list
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    27
  val get_superclasses: theory -> class -> class list
18304
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
    28
  val get_const_sign: theory -> string -> string -> typ
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    29
  val get_inst_consts_sign: theory -> string * class -> (string * typ) list
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    30
  val lookup_const_class: theory -> string -> class option
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    31
  val get_classtab: theory -> (string list * (string * string) list) Symtab.table
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
  type sortcontext = (string * sort) list
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    34
  datatype sortlookup = Instance of (class * string) * sortlookup list list
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    35
                      | Lookup of class list * (string * int)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    36
  val extract_sortctxt: theory -> typ -> sortcontext
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    37
  val extract_sortlookup: theory -> typ * typ -> sortlookup list list
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    38
end;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    39
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    40
structure ClassPackage: CLASS_PACKAGE =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    41
struct
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    42
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    43
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    44
(* data kind 'Pure/classes' *)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    45
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    46
type class_data = {
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    47
  superclasses: class list,
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    48
  name_locale: string,
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    49
  name_axclass: string,
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    50
  var: string,
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    51
  consts: (string * typ) list,
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    52
  insts: (string * string) list
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    53
};
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    54
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    55
structure ClassData = TheoryDataFun (
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    56
  struct
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    57
    val name = "Pure/classes";
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    58
    type T = class_data Symtab.table * class Symtab.table;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    59
    val empty = (Symtab.empty, Symtab.empty);
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    60
    val copy = I;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    61
    val extend = I;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    62
    fun merge _ ((t1, r1), (t2, r2))=
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    63
      (Symtab.merge (op =) (t1, t2),
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    64
       Symtab.merge (op =) (r1, r2));
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    65
    fun print thy (tab, _) =
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    66
      let
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    67
        fun pretty_class (name, {superclasses, name_locale, name_axclass, var, consts, insts}) =
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    68
          (Pretty.block o Pretty.fbreaks) [
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    69
            Pretty.str ("class " ^ name ^ ":"),
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    70
            (Pretty.block o Pretty.fbreaks) (
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    71
              Pretty.str "superclasses: "
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    72
              :: map Pretty.str superclasses
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    73
            ),
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    74
            Pretty.str ("locale: " ^ name_locale),
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    75
            Pretty.str ("axclass: " ^ name_axclass),
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    76
            Pretty.str ("class variable: " ^ var),
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    77
            (Pretty.block o Pretty.fbreaks) (
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    78
              Pretty.str "constants: "
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    79
              :: map (fn (c, ty) => Pretty.str (c ^ " :: " ^ Sign.string_of_typ thy ty)) consts
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    80
            ),
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    81
            (Pretty.block o Pretty.fbreaks) (
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    82
              Pretty.str "instances: "
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    83
              :: map (fn (tyco, thyname) => Pretty.str (tyco ^ ", in theory " ^ thyname)) insts
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    84
            )
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    85
          ]
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    86
      in
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    87
        (Pretty.writeln o Pretty.chunks o map pretty_class o Symtab.dest) tab
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    88
      end;
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    89
  end
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    90
);
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    91
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    92
val print_classes = ClassData.print;
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    93
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    94
val lookup_class_data = Symtab.lookup o fst o ClassData.get;
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
    95
val lookup_const_class = Symtab.lookup o snd o ClassData.get;
18168
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
fun get_class_data thy class =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    98
  case lookup_class_data thy class
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
    99
    of NONE => error ("undeclared class " ^ quote class)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   100
     | SOME data => data;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   101
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   102
fun add_class_data (class, (superclasses, name_locale, name_axclass, classvar, consts)) =
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   103
  ClassData.map (fn (classtab, consttab) => (
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   104
    classtab 
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   105
    |> Symtab.update (class, {
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   106
         superclasses = superclasses,
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   107
         name_locale = name_locale,
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   108
         name_axclass = name_axclass,
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   109
         var = classvar,
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   110
         consts = consts,
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   111
         insts = []
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   112
       }),
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   113
    consttab
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   114
    |> fold (fn (c, _) => Symtab.update (c, class)) consts
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   115
  ));
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   116
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   117
fun add_inst_data (class, inst) =
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   118
  (ClassData.map o apfst o Symtab.map_entry class)
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   119
    (fn {superclasses, name_locale, name_axclass, var, consts, insts}
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   120
      => {
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   121
           superclasses = superclasses,
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   122
           name_locale = name_locale,
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   123
           name_axclass = name_axclass,
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   124
           var = var,
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   125
           consts = consts,
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   126
           insts = insts @ [inst]
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   127
          });
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   128
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   129
val the_consts = map fst o #consts oo get_class_data;
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   130
val the_tycos = #insts oo get_class_data;
18168
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
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   133
(* classes and instances *)
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   134
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   135
local
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   136
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   137
open Element
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   138
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   139
fun gen_add_class add_locale bname raw_import raw_body thy =
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   140
  let
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   141
    fun subst_clsvar v ty_subst =
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   142
      map_type_tfree (fn u as (w, _) =>
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   143
        if w = v then ty_subst else TFree u);
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   144
    fun extract_assumes c_adds elems =
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   145
      let
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   146
        fun subst_free ts =
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   147
          let
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   148
            val get_ty = the o AList.lookup (op =) (fold Term.add_frees ts []);
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   149
            val subst_map = map (fn (c, (c', _)) =>
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   150
              (Free (c, get_ty c), Const (c', get_ty c))) c_adds;
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   151
          in map (subst_atomic subst_map) ts end;
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   152
      in
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   153
        elems
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   154
        |> (map o List.mapPartial)
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   155
            (fn (Assumes asms) => (SOME o map (map fst o snd)) asms
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   156
              | _ => NONE)
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   157
        |> Library.flat o Library.flat o Library.flat
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   158
        |> subst_free
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   159
      end;
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   160
    fun extract_tyvar_name thy tys =
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   161
      fold (curry add_typ_tfrees) tys []
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   162
      |> (fn [(v, sort)] =>
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   163
                if Sorts.sort_eq (Sign.classes_of thy) (Sign.defaultS thy, sort)
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   164
                then v 
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   165
                else error ("illegal sort constraint on class type variable: " ^ Sign.string_of_sort thy sort)
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   166
           | [] => error ("no class type variable")
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   167
           | vs => error ("more than one type variable: " ^ (commas o map (Sign.string_of_typ thy o TFree)) vs))
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   168
    fun extract_tyvar_consts thy elems =
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   169
      elems
18550
59b89f625d68 add_local_context now yields imported and body elements seperatly; additional slight clenup in code
haftmann
parents: 18515
diff changeset
   170
      |> Library.flat
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   171
      |> List.mapPartial
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   172
           (fn (Fixes consts) => SOME consts
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   173
             | _ => NONE)
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   174
      |> Library.flat
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   175
      |> map (fn (c, ty, syn) =>
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   176
           ((c, the ty), (Syntax.unlocalize_mixfix o Syntax.fix_mixfix c o the) syn))
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   177
      |> `(fn consts => extract_tyvar_name thy (map (snd o fst) consts))
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   178
      |-> (fn v => map ((apfst o apsnd) (subst_clsvar v (TFree (v, []))))
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   179
         #> pair v);
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   180
    fun add_global_const v ((c, ty), syn) thy =
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   181
      thy
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   182
      |> Sign.add_consts_i [(c, ty |> subst_clsvar v (TFree (v, Sign.defaultS thy)), syn)]
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   183
      |> `(fn thy => (c, (Sign.intern_const thy c, ty)))
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   184
    fun add_global_constraint v class (_, (c, ty)) thy =
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   185
      thy
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   186
      |> Sign.add_const_constraint_i (c, subst_clsvar v (TVar ((v, 0), [class])) ty);
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   187
    fun print_ctxt ctxt elem = 
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   188
      map Pretty.writeln (Element.pretty_ctxt ctxt elem)
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   189
  in
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   190
    thy
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   191
    |> add_locale bname raw_import raw_body
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   192
    |-> (fn ((import_elems, body_elems), ctxt) =>
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   193
       `(fn thy => Locale.intern thy bname)
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   194
    #-> (fn name_locale =>
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   195
          `(fn thy => extract_tyvar_consts thy body_elems)
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   196
    #-> (fn (v, c_defs) =>
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   197
          fold_map (add_global_const v) c_defs
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   198
    #-> (fn c_adds =>
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   199
          AxClass.add_axclass_i (bname, Sign.defaultS thy)
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   200
            (map (Thm.no_attributes o pair "") (extract_assumes c_adds (import_elems @ body_elems)))
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   201
    #-> (fn _ =>
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   202
          `(fn thy => Sign.intern_class thy bname)
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   203
    #-> (fn name_axclass =>
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   204
          fold (add_global_constraint v name_axclass) c_adds
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   205
    #> add_class_data (name_locale, ([], name_locale, name_axclass, v, map snd c_adds))
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   206
    #> tap (fn _ => (map o map) (print_ctxt ctxt) import_elems)
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   207
    #> tap (fn _ => (map o map) (print_ctxt ctxt) body_elems)
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   208
    #> pair ctxt
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   209
    ))))))
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   210
  end;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   211
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   212
in
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   213
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   214
val add_class = gen_add_class (Locale.add_locale_context true);
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   215
val add_class_i = gen_add_class (Locale.add_locale_context_i true);
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   216
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   217
end; (* local *)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   218
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   219
fun gen_instance_arity prep_arity add_defs tap_def raw_arity raw_defs thy = 
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   220
  let
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   221
    val dest_def = Theory.dest_def (Sign.pp thy) handle TERM (msg, _) => error msg;
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   222
    val arity as (tyco, asorts, sort) = prep_arity thy ((fn ((x, y), z) => (x, y, z)) raw_arity);
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   223
    val ty_inst = Type (tyco, map2 (curry TVar o rpair 0) (Term.invent_names [] "'a" (length asorts)) asorts)
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   224
    fun get_c_req class =
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   225
      let
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   226
        val data = get_class_data thy class;
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   227
        val subst_ty = map_type_tfree (fn (var as (v, _)) =>
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   228
          if #var data = v then ty_inst else TFree var)
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   229
      in (map (apsnd subst_ty) o #consts) data end;
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   230
    val c_req = (Library.flat o map get_c_req) sort;
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   231
    fun get_remove_contraint c thy =
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   232
      let
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   233
        val ty1 = Sign.the_const_constraint thy c;
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   234
        val ty2 = Sign.the_const_type thy c;
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   235
      in
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   236
        thy
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   237
        |> Sign.add_const_constraint_i (c, ty2)
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   238
        |> pair (c, ty1)
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   239
      end;
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   240
    fun get_c_given thy = map (fst o dest_def o snd o tap_def thy o fst) raw_defs;
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   241
    fun check_defs c_given c_req thy =
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   242
      let
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   243
        fun eq_c ((c1, ty1), (c2, ty2)) = c1 = c2 andalso Sign.typ_instance thy (ty1, ty2)
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   244
        val _ = case fold (remove eq_c) c_given c_req
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   245
         of [] => ()
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   246
          | cs => error ("no definition(s) given for"
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   247
                    ^ (commas o map (fn (c, ty) => quote (c ^ "::" ^ Sign.string_of_typ thy ty))) cs);
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   248
        val _ = case fold (remove eq_c) c_req c_given
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   249
         of [] => ()
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   250
          | cs => error ("superfluous definition(s) given for"
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   251
                    ^ (commas o map (fn (c, ty) => quote (c ^ "::" ^ Sign.string_of_typ thy ty))) cs);
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   252
      in thy end;
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   253
  in
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   254
    thy
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   255
    |> fold_map get_remove_contraint (map fst c_req)
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   256
    ||> tap (fn thy => check_defs (get_c_given thy) c_req)
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   257
    ||> add_defs (true, raw_defs)
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   258
    |-> (fn cs => fold Sign.add_const_constraint_i cs)
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   259
    |> AxClass.instance_arity_i arity
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   260
  end;
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   261
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   262
val add_instance_arity = fn x => gen_instance_arity (AxClass.read_arity) IsarThy.add_defs read_axm x;
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   263
val add_instance_arity_i = fn x => gen_instance_arity (AxClass.cert_arity) IsarThy.add_defs_i (K I) x;
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   264
18168
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
(* class queries *)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   267
18360
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   268
fun is_class thy cls = lookup_class_data thy cls |> Option.map (not o null o #consts) |> the_default false;
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   269
18360
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   270
fun syntactic_sort_of thy sort =
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   271
  let
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   272
    val classes = Sign.classes_of thy;
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   273
    fun get_sort cls =
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   274
      if is_class thy cls
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   275
      then [cls]
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   276
      else syntactic_sort_of thy (Sorts.superclasses classes cls);
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   277
  in
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   278
    map get_sort sort
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   279
    |> Library.flat
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   280
    |> Sorts.norm_sort classes
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   281
  end;
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   282
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   283
fun get_arities thy sort tycon =
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   284
  Sorts.mg_domain (Sign.classes_arities_of thy) tycon (syntactic_sort_of thy sort)
18360
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   285
  |> map (syntactic_sort_of thy);
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   286
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   287
fun get_superclasses thy class =
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   288
  if is_class thy class
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   289
  then
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   290
    Sorts.superclasses (Sign.classes_of thy) class
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   291
    |> syntactic_sort_of thy
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   292
  else
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   293
    error ("no syntactic class: " ^ class);
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   294
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   295
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   296
(* instance queries *)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   297
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   298
fun mk_const_sign thy class tvar ty =
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   299
  let
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   300
    val (ty', thaw) = Type.freeze_thaw_type ty;
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   301
    val tvars_used = Term.add_tfreesT ty' [];
18304
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   302
    val tvar_rename = hd (Term.invent_names (map fst tvars_used) tvar 1);
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   303
  in
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   304
    ty'
18304
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   305
    |> map_type_tfree (fn (tvar', sort) =>
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   306
          if Sorts.sort_eq (Sign.classes_of thy) ([class], sort)
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   307
          then TFree (tvar, [])
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   308
          else if tvar' = tvar
18335
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   309
          then TVar ((tvar_rename, 0), sort)
18304
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   310
          else TFree (tvar', sort))
18335
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   311
    |> thaw
18304
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   312
  end;
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   313
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   314
fun get_const_sign thy tvar const =
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   315
  let
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   316
    val class = (the o lookup_const_class thy) const;
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   317
    val ty = Sign.the_const_constraint thy const;
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   318
  in mk_const_sign thy class tvar ty end;
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   319
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   320
fun get_inst_consts_sign thy (tyco, class) =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   321
  let
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   322
    val consts = the_consts thy class;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   323
    val arities = get_arities thy [class] tyco;
18304
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   324
    val const_signs = map (get_const_sign thy "'a") consts;
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   325
    val vars_used = fold (fn ty => curry (gen_union (op =))
684832c9fa62 minor improvements
haftmann
parents: 18168
diff changeset
   326
      (map fst (typ_tfrees ty) |> remove (op =) "'a")) const_signs [];
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   327
    val vars_new = Term.invent_names vars_used "'a" (length arities);
18330
444f16d232a2 introduced new map2, fold
haftmann
parents: 18304
diff changeset
   328
    val typ_arity = Type (tyco, map2 (curry TFree) vars_new arities);
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   329
    val instmem_signs =
18335
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   330
      map (typ_subst_TVars [(("'a", 0), typ_arity)]) const_signs;
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   331
  in consts ~~ instmem_signs end;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   332
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   333
fun get_classtab thy =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   334
  Symtab.fold
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   335
    (fn (class, { consts = consts, insts = insts, ... }) =>
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   336
      Symtab.update_new (class, (map fst consts, insts)))
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   337
       (fst (ClassData.get thy)) Symtab.empty;
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   338
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   339
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   340
(* extracting dictionary obligations from types *)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   341
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   342
type sortcontext = (string * sort) list;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   343
18335
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   344
fun extract_sortctxt thy ty =
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   345
  (typ_tfrees o Type.no_tvars) ty
18360
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   346
  |> map (apsnd (syntactic_sort_of thy))
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   347
  |> filter (not o null o snd);
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   348
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   349
datatype sortlookup = Instance of (class * string) * sortlookup list list
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   350
                    | Lookup of class list * (string * int)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   351
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   352
fun extract_sortlookup thy (raw_typ_def, raw_typ_use) =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   353
  let
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   354
    val typ_def = Type.varifyT raw_typ_def;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   355
    val typ_use = Type.varifyT raw_typ_use;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   356
    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
   357
    fun tab_lookup vname = (the o Vartab.lookup match_tab) (vname, 0);
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   358
    fun get_superclass_derivation (subclasses, superclass) =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   359
      (the oo get_first) (fn subclass =>
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   360
        Sorts.class_le_path (Sign.classes_of thy) (subclass, superclass)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   361
      ) subclasses;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   362
    fun mk_class_deriv thy subclasses superclass =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   363
      case get_superclass_derivation (subclasses, superclass)
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   364
      of (subclass::deriv) =>
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   365
        ((rev o filter (is_class thy)) deriv, find_index_eq subclass subclasses);
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   366
    fun mk_lookup (sort_def, (Type (tycon, tys))) =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   367
          let
18330
444f16d232a2 introduced new map2, fold
haftmann
parents: 18304
diff changeset
   368
            val arity_lookup = map2 (curry mk_lookup)
18360
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   369
              (map (syntactic_sort_of 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
   370
          in map (fn class => Instance ((class, tycon), arity_lookup)) sort_def end
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   371
      | mk_lookup (sort_def, TVar ((vname, _), sort_use)) =
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   372
          let
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   373
            fun mk_look class =
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   374
              let val (deriv, classindex) = mk_class_deriv thy (syntactic_sort_of thy sort_use) class
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   375
              in Lookup (deriv, (vname, classindex)) end;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   376
          in map mk_look sort_def end;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   377
  in
18335
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   378
    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
   379
    |> map (tab_lookup o fst)
18360
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   380
    |> map (apfst (syntactic_sort_of thy))
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   381
    |> filter (not o null o fst)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   382
    |> map mk_lookup
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   383
  end;
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   384
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   385
18335
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   386
(* intermediate auxiliary *)
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   387
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   388
fun add_classentry raw_class raw_cs raw_insts thy =
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   389
  let
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   390
    val class = Sign.intern_class thy raw_class;
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   391
    val cs = raw_cs |> map (Sign.intern_const thy);
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   392
    val insts = map (rpair (Context.theory_name thy) o Sign.intern_type thy) raw_insts;
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   393
  in
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   394
    thy
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   395
    |> add_class_data (class, ([], "", class, "", map (rpair dummyT) cs))
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   396
    |> fold (curry add_inst_data class) insts
18335
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   397
  end;
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   398
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   399
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   400
(* toplevel interface *)
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   401
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   402
local
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   403
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   404
structure P = OuterParse
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   405
and K = OuterKeyword
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   406
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   407
in
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   408
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   409
val (classK, instanceK) = ("class", "class_instance")
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   410
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   411
val locale_val =
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   412
  (P.locale_expr --
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   413
    Scan.optional (P.$$$ "+" |-- P.!!! (Scan.repeat1 P.context_element)) [] ||
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   414
  Scan.repeat1 P.context_element >> pair Locale.empty);
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   415
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   416
val classP =
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   417
  OuterSyntax.command classK "operational type classes" K.thy_decl
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   418
    (P.name -- Scan.optional (P.$$$ "=" |-- P.!!! locale_val) (Locale.empty, [])
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   419
      >> (Toplevel.theory_context
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   420
          o (fn f => swap o f) o (fn (bname, (expr, elems)) => add_class bname expr elems)));
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   421
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   422
val instanceP =
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   423
  OuterSyntax.command instanceK "" K.thy_goal
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   424
    (P.xname -- (P.$$$ "::" |-- P.!!! P.arity)
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   425
      -- Scan.repeat1 P.spec_name
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   426
      >> (Toplevel.theory_theory_to_proof
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   427
          o (fn ((tyco, (asorts, sort)), defs) => add_instance_arity ((tyco, asorts), sort) defs)));
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   428
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   429
val _ = OuterSyntax.add_parsers [classP, instanceP];
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   430
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   431
end; (* local *)
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18380
diff changeset
   432
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   433
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   434
(* setup *)
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   435
18575
9ccfd1d1e874 substantial additions using locales
haftmann
parents: 18550
diff changeset
   436
val _ = Context.add_setup [ClassData.init];
18168
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   437
d35daf321b8a class_package - operational view on type classes
haftmann
parents:
diff changeset
   438
end; (* struct *)