src/Pure/Isar/new_locale.ML
author ballarin
Fri, 14 Nov 2008 16:49:52 +0100
changeset 28795 6891e273c33b
child 28818 249e394e5b8e
permissions -rw-r--r--
Initial part of locale reimplementation.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28795
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
     1
(*  Title:      Pure/Isar/expression.ML
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
     2
    ID:         $Id$
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
     3
    Author:     Clemens Ballarin, TU Muenchen
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
     4
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
     5
New locale development --- experimental.
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
     6
*)
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
     7
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
     8
signature NEW_LOCALE =
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
     9
sig
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    10
  type locale
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    11
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    12
  val test_locale: theory -> string -> bool
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    13
  val register_locale: string ->
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    14
    (string * sort) list * (Name.binding * typ option * mixfix) list ->
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    15
    term option * term list ->
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    16
    (declaration * stamp) list * (declaration * stamp) list ->
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    17
    ((string * (Attrib.binding * (thm list * Attrib.src list) list) list) * stamp) list ->
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    18
    ((string * Morphism.morphism) * stamp) list -> theory -> theory
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    19
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    20
  (* Locale name space *)
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    21
  val intern: theory -> xstring -> string
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    22
  val extern: theory -> string -> xstring
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    23
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    24
  (* Specification *)
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    25
  val params_of: theory -> string -> (Name.binding * typ option * mixfix) list
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    26
  val declarations_of: theory -> string -> declaration list * declaration list;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    27
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    28
  (* Evaluate locales *)
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    29
  val init: string -> theory -> Proof.context
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    30
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    31
  (* Diagnostic *)
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    32
  val print_locales: theory -> unit
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    33
  val print_locale: theory -> bool -> bstring -> unit
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    34
end;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    35
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    36
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    37
structure NewLocale: NEW_LOCALE =
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    38
struct
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    39
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    40
datatype ctxt = datatype Element.ctxt;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    41
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    42
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    43
(*** Basics ***)
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    44
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    45
datatype locale = Loc of {
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    46
  (* extensible lists are in reverse order: decls, notes, dependencies *)
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    47
  parameters: (string * sort) list * (Name.binding * typ option * mixfix) list,
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    48
    (* type and term parameters *)
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    49
  spec: term option * term list,
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    50
    (* assumptions (as a single predicate expression) and defines *)
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    51
  decls: (declaration * stamp) list * (declaration * stamp) list,
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    52
    (* type and term syntax declarations *)
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    53
  notes: ((string * (Attrib.binding * (thm list * Attrib.src list) list) list) * stamp) list,
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    54
    (* theorem declarations *)
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    55
  dependencies: ((string * Morphism.morphism) * stamp) list
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    56
    (* locale dependencies (sublocale relation) *)
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    57
}
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    58
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    59
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    60
(*** Theory data ***)
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    61
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    62
structure LocalesData = TheoryDataFun
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    63
(
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    64
  type T = NameSpace.T * locale Symtab.table;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    65
    (* locale namespace and locales of the theory *)
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    66
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    67
  val empty = (NameSpace.empty, Symtab.empty);
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    68
  val copy = I;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    69
  val extend = I;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    70
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    71
  fun join_locales _
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    72
    (Loc {parameters, spec, decls = (decls1, decls2), notes, dependencies},
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    73
      Loc {decls = (decls1', decls2'), notes = notes',
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    74
        dependencies = dependencies', ...}) =
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    75
        let fun s_merge x = merge (eq_snd (op =)) x in
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    76
          Loc {parameters = parameters,
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    77
            spec = spec,
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    78
            decls = (s_merge (decls1, decls1'), s_merge (decls2, decls2')),
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    79
            notes = s_merge (notes, notes'),
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    80
            dependencies = s_merge (dependencies, dependencies')
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    81
          }          
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    82
        end;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    83
  fun merge _ ((space1, locs1), (space2, locs2)) =
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    84
    (NameSpace.merge (space1, space2), Symtab.join join_locales (locs1, locs2));
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    85
);
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    86
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    87
val intern = NameSpace.intern o #1 o LocalesData.get;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    88
val extern = NameSpace.extern o #1 o LocalesData.get;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    89
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    90
fun get_locale thy name = Symtab.lookup (#2 (LocalesData.get thy)) name;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    91
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    92
fun the_locale thy name = case get_locale thy name
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    93
 of SOME loc => loc
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    94
  | NONE => error ("Unknown locale " ^ quote name);
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    95
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    96
fun test_locale thy name = case get_locale thy name
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    97
 of SOME _ => true | NONE => false;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    98
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
    99
fun register_locale name parameters spec decls notes dependencies thy =
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   100
  thy |> LocalesData.map (fn (space, locs) =>
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   101
    (Sign.declare_name thy name space, Symtab.update (name,
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   102
      Loc {parameters = parameters, spec = spec, decls = decls, notes = notes,
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   103
        dependencies = dependencies}) locs));
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   104
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   105
fun change_locale name f thy =
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   106
  let
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   107
    val Loc {parameters, spec, decls, notes, dependencies} =
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   108
        the_locale thy name;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   109
    val (parameters', spec', decls', notes', dependencies') =
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   110
      f (parameters, spec, decls, notes, dependencies);
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   111
  in
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   112
    thy
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   113
    |> (LocalesData.map o apsnd) (Symtab.update (name, Loc {parameters = parameters',
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   114
      spec = spec', decls = decls', notes = notes', dependencies = dependencies'}))
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   115
  end;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   116
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   117
fun print_locales thy =
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   118
  let val (space, locs) = LocalesData.get thy in
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   119
    Pretty.strs ("locales:" :: map #1 (NameSpace.extern_table (space, locs)))
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   120
    |> Pretty.writeln
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   121
  end;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   122
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   123
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   124
(*** Primitive operations ***)
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   125
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   126
fun params_of thy name =
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   127
  let
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   128
    val Loc {parameters = (_, params), ...} = the_locale thy name
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   129
  in params end;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   130
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   131
fun declarations_of thy loc =
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   132
  let
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   133
    val Loc {decls, ...} = the_locale thy loc
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   134
  in
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   135
    decls |> apfst (map fst) |> apsnd (map fst)
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   136
  end;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   137
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   138
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   139
(*** Target context ***)
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   140
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   141
(* round up locale dependencies in a depth-first fashion *)
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   142
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   143
local
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   144
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   145
structure Idtab = TableFun(type key = string * term list
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   146
  val ord = prod_ord string_ord (list_ord Term.fast_term_ord));
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   147
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   148
in
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   149
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   150
fun roundup thy deps =
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   151
  let
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   152
    fun add (name, morph) (deps, marked) =
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   153
      let
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   154
        val Loc {parameters = (_, params), dependencies, ...} = the_locale thy name;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   155
        val instance = params |>
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   156
          map ((fn (b, T, _) => Free (Name.name_of b, the T)) #> Morphism.term morph);
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   157
      in
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   158
        if Idtab.defined marked (name, instance)
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   159
        then (deps, marked)
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   160
        else
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   161
          let
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   162
            val dependencies' =
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   163
              map (fn ((name, morph'), _) => (name, morph' $>  morph)) dependencies;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   164
            val marked' = Idtab.insert (op =) ((name, instance), ()) marked;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   165
            val (deps', marked'') = fold_rev add dependencies' ([], marked');
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   166
          in
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   167
            (cons (name, morph) deps' @ deps, marked'')
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   168
          end
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   169
      end
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   170
  in fold_rev add deps ([], Idtab.empty) |> fst end;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   171
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   172
end;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   173
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   174
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   175
(* full context *)
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   176
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   177
fun make_asms NONE = []
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   178
  | make_asms (SOME asm) = [((Name.no_binding, []), [(asm, [])])];
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   179
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   180
fun make_defs [] = []
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   181
  | make_defs defs = [((Name.no_binding, []), map (fn def => (def, [])) defs)];
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   182
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   183
fun note_notes (name, morph) ctxt =
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   184
  let
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   185
    val thy = ProofContext.theory_of ctxt;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   186
    val Loc {notes, ...} = the_locale (ProofContext.theory_of ctxt) name;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   187
    fun activate ((kind, facts), _) ctxt =
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   188
      let
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   189
        val facts' = facts |> Element.facts_map (Element.morph_ctxt morph) |>
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   190
          Attrib.map_facts (Attrib.attribute_i thy);
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   191
      in fold (fn args => Locale.local_note_prefix kind args #> snd) facts' ctxt end;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   192
  in
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   193
    fold_rev activate notes ctxt
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   194
  end;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   195
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   196
fun init name thy =
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   197
  let
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   198
    val Loc {parameters = (_, params), spec = (asm, defs), dependencies, ...} =
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   199
      the_locale thy name;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   200
    val dependencies' =
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   201
      (intern thy name, Morphism.identity) :: roundup thy (map fst dependencies);
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   202
  in
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   203
    thy |> ProofContext.init |>
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   204
      ProofContext.add_fixes_i params |> snd |>
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   205
      (* FIXME type parameters *)
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   206
      fold Variable.auto_fixes (the_list asm) |>
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   207
      ProofContext.add_assms_i Assumption.assume_export (make_asms asm) |> snd |>
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   208
      fold Variable.auto_fixes defs |>
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   209
      ProofContext.add_assms_i LocalDefs.def_export (make_defs defs) |> snd |>
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   210
      fold_rev note_notes dependencies'
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   211
  end;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   212
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   213
fun print_locale thy show_facts name =
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   214
  let
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   215
    val Loc {parameters = (tparams, params), spec = (asm, defs), notes, ...} =
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   216
      the_locale thy (intern thy name);
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   217
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   218
    val fixes = [Fixes params];
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   219
    val assumes = case asm of NONE => [] |
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   220
      SOME spec => [Assumes [(Attrib.no_binding, [(spec, [])])]];
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   221
    val defines = case defs of [] => [] |
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   222
      defs => [Defines (map (fn def => (Attrib.no_binding, (def, []))) defs)];
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   223
    val notes = if show_facts then map (Notes o fst) notes else [];
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   224
    val ctxt = ProofContext.init thy;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   225
  in
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   226
    Pretty.big_list "locale elements:"
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   227
      (fixes @ assumes @ defines @ notes |> map (Element.pretty_ctxt ctxt) |>
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   228
        map Pretty.chunks) |> Pretty.writeln
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   229
  end;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   230
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   231
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   232
end;
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   233
6891e273c33b Initial part of locale reimplementation.
ballarin
parents:
diff changeset
   234