src/Pure/locale.ML
author paulson
Thu, 01 Oct 1998 18:30:05 +0200
changeset 5601 b6456ccd9e3e
parent 5244 5313f781efe0
child 5729 5d66410cceae
permissions -rw-r--r--
revised for new treatment of integers
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5244
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/locale.ML
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
     3
    Author:     Florian Kammueller, University of Cambridge
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
     4
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
     5
Locales. (* FIXME description *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
     6
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
     7
TODO:
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
     8
  - cleanup this TODO list;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
     9
  - read_cterm, pretty_cterm etc. wrt. current scope: collect defaults;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    10
  - inner locale name space for rules / defs (?!);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    11
  - attributes for assumptions (??!);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    12
  - logical aspects of locales:
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    13
      . unfold / fold defs for in/out (use simplifier);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    14
      . discharge assumptions and eliminate defs for result;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    15
  - improve error msgs: more checks, at very beginning;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    16
*)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    17
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    18
signature BASIC_LOCALE =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    19
sig
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    20
  val print_locales: theory -> unit
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    21
  val print_goals: int -> thm -> unit
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    22
end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    23
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    24
signature LOCALE =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    25
sig
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    26
  include BASIC_LOCALE
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    27
  val get_thm: theory -> xstring -> thm
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    28
  val get_thms: theory -> xstring -> thm list
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    29
  type locale
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    30
  val add_locale: bstring -> (string * string * mixfix) list ->
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    31
    (string * string) list -> (string * string) list -> theory -> theory
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    32
  val add_locale_i: bstring -> (string * typ * mixfix) list ->
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    33
    (string * term) list -> (string * term) list -> theory -> theory
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    34
  val open_locale: xstring -> theory -> theory
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    35
  val close_locale: theory -> theory
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    36
  val in_locale: term list -> Sign.sg -> bool
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    37
  val is_open_loc_sg: Sign.sg -> bool
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    38
  val is_open_loc: theory -> bool
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    39
  val read_cterm: Sign.sg -> string * typ -> cterm
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    40
  val get_scope: theory -> (string * locale) list
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    41
  val get_scope_sg: Sign.sg -> (string * locale) list
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    42
  val collect_consts: Sign.sg -> string list
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    43
  val setup: (theory -> theory) list
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    44
end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    45
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    46
structure Locale: LOCALE =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    47
struct
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    48
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    49
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    50
(** type locale **)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    51
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    52
type locale =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    53
 {consts: (string * typ) list,
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    54
  nosyn: string list,
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    55
  rules: (string * term) list,
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    56
  defs: (string * term) list,
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    57
  thms: (string * thm) list,
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    58
  defaults: (string * sort) list * (string * typ) list * string list};
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    59
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    60
fun make_locale consts nosyn rules defs thms defaults =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    61
  {consts = consts, nosyn = nosyn, rules = rules, defs = defs,
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    62
    thms = thms, defaults = defaults}: locale;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    63
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    64
fun pretty_locale sg (name, {consts, rules, defs, nosyn = _, thms = _, defaults = _}) =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    65
  let
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    66
    val prt_typ = Pretty.quote o Sign.pretty_typ sg;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    67
    val prt_term = Pretty.quote o Sign.pretty_term sg;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    68
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    69
    fun pretty_const (c, T) = Pretty.block
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    70
      [Pretty.str (c ^ " ::"), Pretty.brk 1, prt_typ T];
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    71
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    72
    fun pretty_axiom (a, t) = Pretty.block
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    73
      [Pretty.str (a ^ ":"), Pretty.brk 1, prt_term t];
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    74
  in
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    75
    Pretty.big_list (name ^ " =")
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    76
     [Pretty.big_list "consts:" (map pretty_const consts),
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    77
      Pretty.big_list "rules:" (map pretty_axiom rules),
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    78
      Pretty.big_list "defs:" (map pretty_axiom defs)]
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    79
  end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    80
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    81
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    82
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    83
(** theory data **)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    84
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    85
(* data kind 'Pure/locales' *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    86
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    87
type locale_data =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    88
  {space: NameSpace.T,
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    89
    locales: locale Symtab.table,
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    90
    scope: (string * locale) list ref};
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    91
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    92
fun make_locale_data space locales scope =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    93
  {space = space, locales = locales, scope = scope}: locale_data;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    94
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    95
structure LocalesArgs =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    96
struct
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    97
  val name = "Pure/locales";
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    98
  type T = locale_data;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
    99
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   100
  val empty = make_locale_data NameSpace.empty Symtab.empty (ref []);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   101
  fun prep_ext {space, locales, scope = _} = make_locale_data space locales (ref []);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   102
  fun merge ({space = space1, locales = locales1, scope = _},
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   103
    {space = space2, locales = locales2, scope = _}) =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   104
      make_locale_data (NameSpace.merge (space1, space2))
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   105
        (Symtab.merge (K true) (locales1, locales2))
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   106
        (ref []);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   107
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   108
  fun print sg {space, locales, scope} =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   109
    let
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   110
      fun extrn name =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   111
        if ! long_names then name else NameSpace.extern space name;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   112
      val locs = map (apfst extrn) (Symtab.dest locales);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   113
      val scope_names = rev (map (extrn o fst) (! scope));
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   114
    in
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   115
      Pretty.writeln (Display.pretty_name_space ("locale name space", space));
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   116
      Pretty.writeln (Pretty.big_list "locales:" (map (pretty_locale sg) locs));
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   117
      Pretty.writeln (Pretty.strs ("current scope:" :: scope_names))
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   118
    end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   119
end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   120
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   121
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   122
structure LocalesData = TheoryDataFun(LocalesArgs);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   123
val print_locales = LocalesData.print;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   124
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   125
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   126
(* access locales *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   127
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   128
fun get_locale_sg sg name = Symtab.lookup (#locales (LocalesData.get_sg sg), name);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   129
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   130
val get_locale = get_locale_sg o Theory.sign_of;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   131
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   132
fun put_locale (name, locale) thy =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   133
  let
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   134
    val {space, locales, scope} = LocalesData.get thy;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   135
    val space' = NameSpace.extend (space, [name]);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   136
    val locales' = Symtab.update ((name, locale), locales);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   137
  in thy |> LocalesData.put (make_locale_data space' locales' scope) end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   138
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   139
fun lookup_locale thy xname =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   140
  let
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   141
    val {space, locales, ...} = LocalesData.get thy;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   142
    val name = NameSpace.intern space xname;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   143
  in apsome (pair name) (get_locale thy name) end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   144
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   145
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   146
(* access scope *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   147
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   148
val get_scope_sg = ! o #scope o LocalesData.get_sg;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   149
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   150
val get_scope = get_scope_sg o Theory.sign_of;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   151
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   152
fun change_scope f thy =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   153
  let val {scope, ...} = LocalesData.get thy
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   154
  in scope := f (! scope) end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   155
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   156
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   157
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   158
(** scope operations **)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   159
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   160
(* change scope *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   161
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   162
fun the_locale thy xname =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   163
  (case lookup_locale thy xname of
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   164
    Some loc => loc
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   165
  | None => error ("Unknown locale " ^ quote xname));
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   166
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   167
fun open_locale xname thy =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   168
  (change_scope (cons (the_locale thy xname)) thy; thy);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   169
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   170
fun pop_locale [] = error "Currently no open locales"
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   171
  | pop_locale (_ :: locs) = locs;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   172
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   173
fun close_locale thy = (change_scope pop_locale thy; thy);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   174
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   175
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   176
(** functions for goals.ML **)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   177
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   178
(* in_locale: check if hyps (: term list) of a proof are contained in the
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   179
   (current) scope. This function is needed in prepare_proof. It needs to
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   180
   refer to the signature, because theory is not available in prepare_proof. *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   181
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   182
fun in_locale hyps sg =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   183
    let val cur_sc = get_scope_sg sg;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   184
        val rule_lists = map (#rules o snd) cur_sc;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   185
        val def_lists = map (#defs o snd) cur_sc;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   186
        val rules = map snd (foldr (op union) (rule_lists, []));
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   187
        val defs = map snd (foldr (op union) (def_lists, []));
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   188
        val defnrules = rules @ defs;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   189
    in
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   190
        hyps subset defnrules
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   191
    end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   192
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   193
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   194
(* is_open_loc: check if any locale is open, i.e. in the scope of the current thy *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   195
fun is_open_loc_sg sign =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   196
    let val cur_sc = get_scope_sg sign
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   197
    in not(null(cur_sc)) end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   198
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   199
val is_open_loc = is_open_loc_sg o Theory.sign_of;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   200
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   201
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   202
(* get theorems *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   203
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   204
fun get_thm_locale name ((_, {thms, ...}: locale)) = assoc (thms, name);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   205
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   206
fun get_thmx f get thy name =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   207
  (case get_first (get_thm_locale name) (get_scope thy) of
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   208
    Some thm => f thm
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   209
  | None => get thy name);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   210
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   211
val get_thm = get_thmx I PureThy.get_thm;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   212
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   213
val get_thms = get_thmx (fn x => [x]) PureThy.get_thms;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   214
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   215
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   216
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   217
(** define locales **)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   218
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   219
(* prepare types *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   220
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   221
fun read_typ sg (envT, s) =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   222
  let
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   223
    fun def_sort (x, ~1) = assoc (envT, x)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   224
      | def_sort _ = None;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   225
    val T = Type.no_tvars (Sign.read_typ (sg, def_sort) s) handle TYPE (msg, _, _) => error msg;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   226
  in (Term.add_typ_tfrees (T, envT), T) end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   227
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   228
fun cert_typ sg (envT, raw_T) =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   229
  let val T = Type.no_tvars (Sign.certify_typ sg raw_T) handle TYPE (msg, _, _) => error msg
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   230
  in (Term.add_typ_tfrees (T, envT), T) end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   231
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   232
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   233
(* prepare props *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   234
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   235
val add_frees = foldl_aterms (fn (vs, Free v) => v ins vs | (vs, _) => vs);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   236
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   237
fun enter_term t (envS, envT, used) =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   238
  (Term.add_term_tfrees (t, envS), add_frees (envT, t), Term.add_term_tfree_names (t, used));
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   239
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   240
fun read_axm sg ((envS, envT, used), (name, s)) =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   241
  let
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   242
    fun def_sort (x, ~1) = assoc (envS, x)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   243
      | def_sort _ = None;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   244
    fun def_type (x, ~1) = assoc (envT, x)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   245
      | def_type _ = None;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   246
    val (_, t) = Theory.read_def_axm (sg, def_type, def_sort) used (name, s);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   247
  in
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   248
    (enter_term t (envS, envT, used), t)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   249
  end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   250
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   251
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   252
fun cert_axm sg ((envS, envT, used), (name, raw_t)) =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   253
  let val (_, t) = Theory.cert_axm sg (name, raw_t)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   254
  in (enter_term t (envS, envT, used), t) end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   255
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   256
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   257
(* Locale.read_cterm: read in a string as a certified term, and respect the bindings
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   258
   that already exist for subterms. If no locale is open, this function is equal to
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   259
   Thm.read_cterm  *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   260
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   261
fun read_cterm sign =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   262
    let val cur_sc = get_scope_sg sign;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   263
        val defaults = map (#defaults o snd) cur_sc;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   264
        val envS = flat (map #1 defaults);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   265
        val envT = flat (map #2 defaults);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   266
        val used = flat (map #3 defaults);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   267
        fun def_sort (x, ~1) = assoc (envS, x)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   268
          | def_sort _ = None;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   269
        fun def_type (x, ~1) = assoc (envT, x)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   270
          | def_type _ = None;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   271
    in (if (is_open_loc_sg sign)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   272
        then (#1 o read_def_cterm (sign, def_type, def_sort) used true)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   273
        else Thm.read_cterm sign)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   274
    end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   275
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   276
(* basic functions needed for definitions and display *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   277
(* collect all locale constants of a scope, i.e. a list of locales *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   278
fun collect_consts sg =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   279
    let val cur_sc = get_scope_sg sg;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   280
        val locale_list = map snd cur_sc;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   281
        val const_list = flat (map #consts locale_list)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   282
    in map fst const_list end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   283
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   284
(* filter out the Free's in a term *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   285
fun list_frees t =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   286
    case t of Const(c,T) => []
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   287
  | Var(v,T) => []
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   288
  | Free(v,T)=> [Free(v,T)]
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   289
  | Bound x  => []
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   290
  | Abs(a,T,u) => list_frees u
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   291
  | t1 $ t2  => (list_frees t1)  @ (list_frees t2);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   292
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   293
(* filter out all Free's in a term that are not contained
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   294
   in a list of strings. Used to prepare definitions. The list of strings
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   295
   will be the consts of the scope. We filter out the "free" Free's to be
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   296
   able to bind them *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   297
fun difflist term clist =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   298
    let val flist = list_frees term;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   299
        fun builddiff [] sl = []
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   300
          | builddiff (t :: tl) sl =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   301
            let val Free(v,T) = t
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   302
            in
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   303
                if (v mem sl)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   304
                then builddiff tl sl
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   305
                else t :: (builddiff tl sl)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   306
            end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   307
    in distinct(builddiff flist clist) end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   308
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   309
(* Bind a term with !! over a list of "free" Free's *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   310
fun abs_over_free clist term =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   311
    let val diffl = rev(difflist term clist);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   312
        fun abs_o (t, (x as Free(v,T))) = all(T) $ Abs(v, T, abstract_over (x,t))
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   313
          | abs_o (_ , _) = error ("Can't be: abs_over_free");
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   314
    in foldl abs_o (term, diffl) end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   315
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   316
(* assume a definition, i.e assume the cterm of a definiton term and then eliminate
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   317
   the binding !!, so that the def can be applied as rewrite. The meta hyp will still contain !! *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   318
fun prep_def clist sg = forall_elim_vars(0) o assume o (cterm_of sg);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   319
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   320
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   321
(* concrete syntax *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   322
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   323
fun mark_syn c = "\\<^locale>" ^ c;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   324
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   325
fun mk_loc_tr c ts = list_comb (Free (c, dummyT), ts);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   326
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   327
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   328
(* add_locale *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   329
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   330
fun gen_add_locale prep_typ prep_term bname raw_consts raw_rules raw_defs thy =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   331
  let val sign = Theory.sign_of thy;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   332
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   333
    val name = Sign.full_name sign bname;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   334
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   335
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   336
    (* prepare locale consts *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   337
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   338
    fun prep_const (envS, (raw_c, raw_T, raw_mx)) =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   339
      let
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   340
        val c = Syntax.const_name raw_c raw_mx;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   341
        val c_syn = mark_syn c;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   342
        val mx = Syntax.fix_mixfix raw_c raw_mx;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   343
        val (envS', T) = prep_typ sign (envS, raw_T) handle ERROR =>
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   344
          error ("The error(s) above occured in locale constant " ^ quote c);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   345
        val trfun = if mx = Syntax.NoSyn then None else Some (c_syn, mk_loc_tr c);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   346
      in (envS', ((c, T), (c_syn, T, mx), trfun)) end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   347
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   348
    val (envS0, loc_consts_syn) = foldl_map prep_const ([], raw_consts);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   349
    val loc_consts = map #1 loc_consts_syn;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   350
    val loc_syn = map #2 loc_consts_syn;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   351
    val nosyn = map (#1 o #1) (filter (fn x => (#3(#2 x)) = NoSyn) loc_consts_syn);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   352
    val loc_trfuns = mapfilter #3 loc_consts_syn;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   353
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   354
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   355
    (* 1st stage: syntax_thy *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   356
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   357
    val syntax_thy =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   358
      thy
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   359
      |> Theory.add_modesyntax_i ("", true) loc_syn
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   360
      |> Theory.add_trfuns ([], loc_trfuns, [], []);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   361
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   362
    val syntax_sign = Theory.sign_of syntax_thy;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   363
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   364
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   365
    (* prepare rules and defs *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   366
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   367
    fun prep_axiom (env, (a, raw_t)) =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   368
      let
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   369
        val (env', t) = prep_term syntax_sign (env, (a, raw_t)) handle ERROR =>
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   370
          error ("The error(s) above occured in locale rule / definition " ^ quote a);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   371
      in (env', (a, t)) end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   372
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   373
    val ((envS1, envT1, used1), loc_rules) =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   374
      foldl_map prep_axiom ((envS0, loc_consts, map fst envS0), raw_rules);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   375
    val (defaults, loc_defs) = foldl_map prep_axiom ((envS1, envT1, used1), raw_defs);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   376
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   377
    val old_loc_consts = collect_consts syntax_sign;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   378
    val new_loc_consts = (map #1 loc_consts);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   379
    val all_loc_consts = old_loc_consts @ new_loc_consts;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   380
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   381
    val loc_defs_terms = map (apsnd (abs_over_free (all_loc_consts))) loc_defs;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   382
    val loc_defs_thms = map (apsnd (prep_def (map #1 loc_consts) syntax_sign)) loc_defs_terms;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   383
    val loc_thms = (map (apsnd (Thm.assume o Thm.cterm_of syntax_sign)) (loc_rules)) @ loc_defs_thms;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   384
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   385
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   386
    (* error messages *)        (* FIXME improve *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   387
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   388
    val err_dup_locale =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   389
      if is_none (get_locale thy name) then []
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   390
      else ["Duplicate definition of locale " ^ quote name];
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   391
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   392
    val errs = err_dup_locale;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   393
  in
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   394
    if null errs then ()
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   395
    else error (cat_lines errs);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   396
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   397
    syntax_thy
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   398
    |> put_locale (name, make_locale loc_consts nosyn loc_rules loc_defs_terms loc_thms defaults)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   399
  end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   400
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   401
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   402
val add_locale = gen_add_locale read_typ read_axm;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   403
val add_locale_i = gen_add_locale cert_typ cert_axm;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   404
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   405
(** print functions **)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   406
(* idea: substitute all locale contants (Free's) that are syntactical by their
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   407
         "real" constant representation (i.e. \\<^locale>constname).
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   408
   - function const_ssubst does this substitution
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   409
   - function Locale.pretty_term:
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   410
             if locale is open then do this substitution & then call Sign.pretty_term
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   411
             else call Sign.pretty_term
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   412
*)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   413
(* substitutes all Free variables s in t by Const's s *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   414
fun const_ssubst t s =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   415
    case t  of
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   416
        Free(v,T) => if v = s then Const("\\<^locale>" ^ s,T) else Free(v,T)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   417
      | Const(c,T) => Const(c,T)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   418
      | Var(v,T) => Var(v,T)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   419
      | Bound x  => Bound x
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   420
      | Abs(a,T,u) => Abs(a,T, const_ssubst u s)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   421
      | t1 $ t2  => const_ssubst t1 s $ const_ssubst t2 s;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   422
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   423
(* FIXME: improve: can be expressed with foldl *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   424
fun const_ssubst_list [] t = t
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   425
  | const_ssubst_list (s :: l) t = const_ssubst_list l (const_ssubst t s);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   426
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   427
(* Locale.pretty_term *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   428
fun pretty_term sign =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   429
    if (is_open_loc_sg sign) then
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   430
        let val locale_list = map snd(get_scope_sg sign);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   431
            val nosyn = flat (map #nosyn locale_list);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   432
            val str_list = (collect_consts sign) \\ nosyn
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   433
        in Sign.pretty_term sign o (const_ssubst_list str_list)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   434
        end
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   435
    else Sign.pretty_term sign;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   436
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   437
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   438
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   439
(** print_goals **)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   440
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   441
(*print thm A1,...,An/B in "goal style" -- premises as numbered subgoals*)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   442
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   443
local
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   444
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   445
  (* utils *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   446
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   447
  fun ins_entry (x, y) [] = [(x, [y])]
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   448
    | ins_entry (x, y) ((pair as (x', ys')) :: pairs) =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   449
        if x = x' then (x', y ins ys') :: pairs
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   450
        else pair :: ins_entry (x, y) pairs;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   451
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   452
  fun add_consts (Const (c, T), env) = ins_entry (T, (c, T)) env
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   453
    | add_consts (t $ u, env) = add_consts (u, add_consts (t, env))
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   454
    | add_consts (Abs (_, _, t), env) = add_consts (t, env)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   455
    | add_consts (_, env) = env;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   456
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   457
  fun add_vars (Free (x, T), env) = ins_entry (T, (x, ~1)) env
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   458
    | add_vars (Var (xi, T), env) = ins_entry (T, xi) env
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   459
    | add_vars (Abs (_, _, t), env) = add_vars (t, env)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   460
    | add_vars (t $ u, env) = add_vars (u, add_vars (t, env))
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   461
    | add_vars (_, env) = env;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   462
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   463
  fun add_varsT (Type (_, Ts), env) = foldr add_varsT (Ts, env)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   464
    | add_varsT (TFree (x, S), env) = ins_entry (S, (x, ~1)) env
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   465
    | add_varsT (TVar (xi, S), env) = ins_entry (S, xi) env;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   466
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   467
  fun sort_idxs vs = map (apsnd (sort (prod_ord string_ord int_ord))) vs;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   468
  fun sort_cnsts cs = map (apsnd (sort_wrt fst)) cs;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   469
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   470
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   471
  (* prepare atoms *)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   472
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   473
  fun consts_of t = sort_cnsts (add_consts (t, []));
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   474
  fun vars_of t = sort_idxs (add_vars (t, []));
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   475
  fun varsT_of t = rev (sort_idxs (it_term_types add_varsT (t, [])));
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   476
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   477
in
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   478
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   479
  fun print_goals maxgoals state =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   480
    let
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   481
      val {sign, ...} = rep_thm state;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   482
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   483
      val prt_term = pretty_term sign;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   484
      val prt_typ = Sign.pretty_typ sign;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   485
      val prt_sort = Sign.pretty_sort sign;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   486
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   487
      fun prt_atoms prt prtT (X, xs) = Pretty.block
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   488
        [Pretty.block (Pretty.commas (map prt xs)), Pretty.str " ::",
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   489
          Pretty.brk 1, prtT X];
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   490
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   491
      fun prt_var (x, ~1) = prt_term (Syntax.free x)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   492
        | prt_var xi = prt_term (Syntax.var xi);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   493
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   494
      fun prt_varT (x, ~1) = prt_typ (TFree (x, []))
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   495
        | prt_varT xi = prt_typ (TVar (xi, []));
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   496
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   497
      val prt_consts = prt_atoms (prt_term o Const) prt_typ;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   498
      val prt_vars = prt_atoms prt_var prt_typ;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   499
      val prt_varsT = prt_atoms prt_varT prt_sort;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   500
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   501
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   502
      fun print_list _ _ [] = ()
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   503
        | print_list name prt lst = (writeln "";
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   504
            Pretty.writeln (Pretty.big_list name (map prt lst)));
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   505
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   506
      fun print_subgoals (_, []) = ()
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   507
        | print_subgoals (n, A :: As) = (Pretty.writeln (Pretty.blk (0,
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   508
            [Pretty.str (" " ^ string_of_int n ^ ". "), prt_term A]));
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   509
              print_subgoals (n + 1, As));
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   510
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   511
      val print_ffpairs =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   512
        print_list "Flex-flex pairs:" (prt_term o Logic.mk_flexpair);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   513
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   514
      val print_consts = print_list "Constants:" prt_consts o consts_of;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   515
      val print_vars = print_list "Variables:" prt_vars o vars_of;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   516
      val print_varsT = print_list "Type variables:" prt_varsT o varsT_of;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   517
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   518
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   519
      val {prop, ...} = rep_thm state;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   520
      val (tpairs, As, B) = Logic.strip_horn prop;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   521
      val ngoals = length As;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   522
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   523
      fun print_gs (types, sorts) =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   524
       (Pretty.writeln (prt_term B);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   525
        if ngoals = 0 then writeln "No subgoals!"
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   526
        else if ngoals > maxgoals then
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   527
          (print_subgoals (1, take (maxgoals, As));
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   528
            writeln ("A total of " ^ string_of_int ngoals ^ " subgoals..."))
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   529
        else print_subgoals (1, As);
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   530
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   531
        print_ffpairs tpairs;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   532
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   533
        if types andalso ! show_consts then print_consts prop else ();
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   534
        if types then print_vars prop else ();
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   535
        if sorts then print_varsT prop else ());
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   536
    in
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   537
      setmp show_no_free_types true
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   538
        (setmp show_types (! show_types orelse ! show_sorts)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   539
          (setmp show_sorts false print_gs))
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   540
     (! show_types orelse ! show_sorts, ! show_sorts)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   541
  end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   542
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   543
end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   544
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   545
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   546
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   547
(** locale theory setup **)
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   548
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   549
val setup =
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   550
 [LocalesData.init];
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   551
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   552
end;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   553
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   554
structure BasicLocale: BASIC_LOCALE = Locale;
5313f781efe0 added locale.ML;
wenzelm
parents:
diff changeset
   555
open BasicLocale;