src/Pure/Isar/locale.ML
author wenzelm
Tue, 13 Sep 2005 22:19:39 +0200
changeset 17355 5b31131c0365
parent 17316 fc7cc8137b97
child 17384 c01de5939f5b
permissions -rw-r--r--
load late, after proof.ML; added goal commands: theorem, interpretation etc.; tuned some warnings -- single line only;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12014
035ab884b9e0 beginnings of new locales (not yet functional);
wenzelm
parents: 11896
diff changeset
     1
(*  Title:      Pure/Isar/locale.ML
11896
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
     3
    Author:     Clemens Ballarin, TU Muenchen; Markus Wenzel, LMU/TU Muenchen
11896
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
     4
12058
cc182b43dd55 fixes: optional typ;
wenzelm
parents: 12046
diff changeset
     5
Locales -- Isar proof contexts as meta-level predicates, with local
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
     6
syntax and implicit structures.
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
     7
14215
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
     8
Draws some basic ideas from Florian Kammueller's original version of
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
     9
locales, but uses the richer infrastructure of Isar instead of the raw
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
    10
meta-logic.  Furthermore, we provide structured import of contexts
14215
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
    11
(with merge and rename operations), as well as type-inference of the
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
    12
signature parts, and predicate definitions of the specification text.
14446
0bc2519e9990 *** empty log message ***
ballarin
parents: 14291
diff changeset
    13
0bc2519e9990 *** empty log message ***
ballarin
parents: 14291
diff changeset
    14
See also:
0bc2519e9990 *** empty log message ***
ballarin
parents: 14291
diff changeset
    15
0bc2519e9990 *** empty log message ***
ballarin
parents: 14291
diff changeset
    16
[1] Clemens Ballarin. Locales and Locale Expressions in Isabelle/Isar.
0bc2519e9990 *** empty log message ***
ballarin
parents: 14291
diff changeset
    17
    In Stefano Berardi et al., Types for Proofs and Programs: International
15099
6d8619440ea0 Some comments added.
ballarin
parents: 14981
diff changeset
    18
    Workshop, TYPES 2003, Torino, Italy, LNCS 3085, pages 34-50, 2004.
11896
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
    19
*)
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
    20
16169
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
    21
(* TODO:
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
    22
- beta-eta normalisation of interpretation parameters
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
    23
- dangling type frees in locales
16620
2a7f46324218 Proper treatment of beta-redexes in witness theorems.
ballarin
parents: 16458
diff changeset
    24
- test subsumption of interpretations when merging theories
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
    25
- var vs. fixes in locale to be interpreted (interpretation in locale)
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
    26
  (implicit locale expressions generated by multiple registrations)
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
    27
- current finish_global adds unwanted lemmas to theory/locale
16169
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
    28
*)
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
    29
11896
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
    30
signature LOCALE =
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
    31
sig
17355
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
    32
  type context = Proof.context
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
    33
  datatype ('typ, 'term, 'fact) elem =
12058
cc182b43dd55 fixes: optional typ;
wenzelm
parents: 12046
diff changeset
    34
    Fixes of (string * 'typ option * mixfix option) list |
16169
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
    35
    Constrains of (string * 'typ) list |
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
    36
    Assumes of ((string * Attrib.src list) * ('term * ('term list * 'term list)) list) list |
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
    37
    Defines of ((string * Attrib.src list) * ('term * 'term list)) list |
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
    38
    Notes of ((string * Attrib.src list) * ('fact * Attrib.src list) list) list
17355
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
    39
  type element = (string, string, thmref) elem
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
    40
  type element_i = (typ, term, thm list) elem
12273
7fb9840d358d beginnings of actual locale expressions;
wenzelm
parents: 12263
diff changeset
    41
  datatype expr =
7fb9840d358d beginnings of actual locale expressions;
wenzelm
parents: 12263
diff changeset
    42
    Locale of string |
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
    43
    Rename of expr * (string * mixfix option) option list |
12273
7fb9840d358d beginnings of actual locale expressions;
wenzelm
parents: 12263
diff changeset
    44
    Merge of expr list
7fb9840d358d beginnings of actual locale expressions;
wenzelm
parents: 12263
diff changeset
    45
  val empty: expr
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
    46
  datatype 'a elem_expr = Elem of 'a | Expr of expr
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
    47
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
    48
  (* Abstract interface to locales *)
12046
a404358fd965 locale elements;
wenzelm
parents: 12014
diff changeset
    49
  type locale
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
    50
  val intern: theory -> xstring -> string
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
    51
  val extern: theory -> string -> xstring
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
    52
  val the_locale: theory -> string -> locale
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
    53
  val intern_attrib_elem: theory ->
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
    54
    ('typ, 'term, 'fact) elem -> ('typ, 'term, 'fact) elem
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
    55
  val intern_attrib_elem_expr: theory ->
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
    56
    ('typ, 'term, 'fact) elem elem_expr -> ('typ, 'term, 'fact) elem elem_expr
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
    57
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
    58
  (* Processing of locale statements *)
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
    59
  val read_context_statement: xstring option -> element elem_expr list ->
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
    60
    (string * (string list * string list)) list list -> context ->
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
    61
    string option * (cterm list * cterm list) * context * context * 
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
    62
      (term * (term list * term list)) list list
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
    63
  val cert_context_statement: string option -> element_i elem_expr list ->
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
    64
    (term * (term list * term list)) list list -> context ->
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
    65
    string option * (cterm list * cterm list) * context * context *
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
    66
      (term * (term list * term list)) list list
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
    67
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
    68
  (* Diagnostic functions *)
12758
f6aceb9d4b8e print_locale: allow full body specification;
wenzelm
parents: 12730
diff changeset
    69
  val print_locales: theory -> unit
17228
19b460b39dad print_locale omits facts by default
ballarin
parents: 17221
diff changeset
    70
  val print_locale: theory -> bool -> expr -> element list -> unit
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
    71
  val print_global_registrations: bool -> string -> theory -> unit
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
    72
  val print_local_registrations': bool -> string -> context -> unit
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
    73
  val print_local_registrations: bool -> string -> context -> unit
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
    74
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
    75
  (* Storing results *)
17109
606c269d1e26 added add_locale_context(_i), which returns the body context for presentation;
wenzelm
parents: 17096
diff changeset
    76
  val add_locale_context: bool -> bstring -> expr -> element list -> theory
17142
76a5a2cc3171 add_locale_context(_i) now exporting elements (still some refinements to be done)
haftmann
parents: 17138
diff changeset
    77
    -> (element_i list * ProofContext.context) * theory
17109
606c269d1e26 added add_locale_context(_i), which returns the body context for presentation;
wenzelm
parents: 17096
diff changeset
    78
  val add_locale_context_i: bool -> bstring -> expr -> element_i list -> theory
17142
76a5a2cc3171 add_locale_context(_i) now exporting elements (still some refinements to be done)
haftmann
parents: 17138
diff changeset
    79
    -> (element_i list * ProofContext.context) * theory
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
    80
  val add_locale: bool -> bstring -> expr -> element list -> theory -> theory
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
    81
  val add_locale_i: bool -> bstring -> expr -> element_i list -> theory -> theory
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
    82
  val smart_note_thmss: string -> string option ->
12958
99f5c4a37b29 added smart_have_thmss (global storage);
wenzelm
parents: 12862
diff changeset
    83
    ((bstring * theory attribute list) * (thm list * theory attribute list) list) list ->
99f5c4a37b29 added smart_have_thmss (global storage);
wenzelm
parents: 12862
diff changeset
    84
    theory -> theory * (bstring * thm list) list
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
    85
  val note_thmss: string -> xstring ->
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
    86
    ((bstring * Attrib.src list) * (thmref * Attrib.src list) list) list ->
17109
606c269d1e26 added add_locale_context(_i), which returns the body context for presentation;
wenzelm
parents: 17096
diff changeset
    87
    theory -> (theory * ProofContext.context) * (bstring * thm list) list
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
    88
  val note_thmss_i: string -> string ->
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
    89
    ((bstring * Attrib.src list) * (thm list * Attrib.src list) list) list ->
17109
606c269d1e26 added add_locale_context(_i), which returns the body context for presentation;
wenzelm
parents: 17096
diff changeset
    90
    theory -> (theory * ProofContext.context) * (bstring * thm list) list
17355
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
    91
  val theorem: string -> (context * thm list -> thm list list -> theory -> theory) ->
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
    92
    string * Attrib.src list -> element elem_expr list ->
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
    93
    ((string * Attrib.src list) * (string * (string list * string list)) list) list ->
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
    94
    theory -> Proof.state
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
    95
  val theorem_i: string -> (context * thm list -> thm list list -> theory -> theory) ->
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
    96
    string * theory attribute list -> element_i elem_expr list ->
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
    97
    ((string * theory attribute list) * (term * (term list * term list)) list) list ->
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
    98
    theory -> Proof.state
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
    99
  val theorem_in_locale: string ->
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
   100
    ((context * context) * thm list -> thm list list -> theory -> theory) ->
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
   101
    xstring -> string * Attrib.src list -> element elem_expr list ->
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
   102
    ((string * Attrib.src list) * (string * (string list * string list)) list) list ->
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
   103
    theory -> Proof.state
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
   104
  val theorem_in_locale_i: string ->
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
   105
    ((context * context) * thm list -> thm list list -> theory -> theory) ->
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
   106
    string -> string * Attrib.src list -> element_i elem_expr list ->
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
   107
    ((string * Attrib.src list) * (term * (term list * term list)) list) list ->
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
   108
    theory -> Proof.state
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
   109
  val smart_theorem: string -> xstring option ->
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
   110
    string * Attrib.src list -> element elem_expr list ->
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
   111
    ((string * Attrib.src list) * (string * (string list * string list)) list) list ->
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
   112
    theory -> Proof.state
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
   113
  val interpretation: string * Attrib.src list -> expr -> string option list ->
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
   114
    theory -> Proof.state
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
   115
  val interpretation_in_locale: xstring * expr -> theory -> Proof.state
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
   116
  val interpret: string * Attrib.src list -> expr -> string option list ->
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
   117
    bool -> Proof.state -> Proof.state
11896
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
   118
end;
12839
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
   119
12289
ec2dafd0a6a9 clarified locale operations (rename, merge);
wenzelm
parents: 12277
diff changeset
   120
structure Locale: LOCALE =
11896
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
   121
struct
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
   122
12273
7fb9840d358d beginnings of actual locale expressions;
wenzelm
parents: 12263
diff changeset
   123
(** locale elements and expressions **)
11896
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
   124
12014
035ab884b9e0 beginnings of new locales (not yet functional);
wenzelm
parents: 11896
diff changeset
   125
type context = ProofContext.context;
11896
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
   126
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   127
datatype ('typ, 'term, 'fact) elem =
12058
cc182b43dd55 fixes: optional typ;
wenzelm
parents: 12046
diff changeset
   128
  Fixes of (string * 'typ option * mixfix option) list |
16169
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
   129
  Constrains of (string * 'typ) list |
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   130
  Assumes of ((string * Attrib.src list) * ('term * ('term list * 'term list)) list) list |
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   131
  Defines of ((string * Attrib.src list) * ('term * 'term list)) list |
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   132
  Notes of ((string * Attrib.src list) * ('fact * Attrib.src list) list) list;
12273
7fb9840d358d beginnings of actual locale expressions;
wenzelm
parents: 12263
diff changeset
   133
17355
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
   134
type element = (string, string, thmref) elem;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
   135
type element_i = (typ, term, thm list) elem;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
   136
12273
7fb9840d358d beginnings of actual locale expressions;
wenzelm
parents: 12263
diff changeset
   137
datatype expr =
7fb9840d358d beginnings of actual locale expressions;
wenzelm
parents: 12263
diff changeset
   138
  Locale of string |
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   139
  Rename of expr * (string * mixfix option) option list |
12273
7fb9840d358d beginnings of actual locale expressions;
wenzelm
parents: 12263
diff changeset
   140
  Merge of expr list;
11896
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
   141
12273
7fb9840d358d beginnings of actual locale expressions;
wenzelm
parents: 12263
diff changeset
   142
val empty = Merge [];
7fb9840d358d beginnings of actual locale expressions;
wenzelm
parents: 12263
diff changeset
   143
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   144
datatype 'a elem_expr =
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   145
  Elem of 'a | Expr of expr;
12273
7fb9840d358d beginnings of actual locale expressions;
wenzelm
parents: 12263
diff changeset
   146
12070
c72fe1edc9e7 proper treatment of local syntax;
wenzelm
parents: 12063
diff changeset
   147
type locale =
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   148
 {predicate: cterm list * thm list,
16736
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
   149
    (* CB: For locales with "(open)" this entry is ([], []).
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   150
       For new-style locales, which declare predicates, if the locale declares
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   151
       no predicates, this is also ([], []).
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   152
       If the locale declares predicates, the record field is
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   153
       ([statement], axioms), where statement is the locale predicate applied
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   154
       to the (assumed) locale parameters.  Axioms contains the projections
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   155
       from the locale predicate to the normalised assumptions of the locale
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   156
       (cf. [1], normalisation of locale expressions.)
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   157
    *)
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   158
  import: expr,                                       (*dynamic import*)
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   159
  elems: (element_i * stamp) list,                    (*static content*)
16736
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
   160
  params: ((string * typ) * mixfix option) list * string list,
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   161
                                                      (*all/local params*)
16736
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
   162
  regs: ((string * string list) * thm list) list}
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
   163
    (* Registrations: indentifiers and witness theorems of locales interpreted
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
   164
       in the locale.
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
   165
    *)
12063
4c16bdee47d4 added add_locale(_i) and store_thm;
wenzelm
parents: 12058
diff changeset
   166
11896
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
   167
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   168
(* CB: an internal (Int) locale element was either imported or included,
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   169
   an external (Ext) element appears directly in the locale text. *)
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   170
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   171
datatype ('a, 'b) int_ext = Int of 'a | Ext of 'b;
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   172
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   173
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   174
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   175
(** term and type instantiation, using symbol tables **)
16620
2a7f46324218 Proper treatment of beta-redexes in witness theorems.
ballarin
parents: 16458
diff changeset
   176
(** functions for term instantiation beta-reduce the result
2a7f46324218 Proper treatment of beta-redexes in witness theorems.
ballarin
parents: 16458
diff changeset
   177
    unless the instantiation table is empty (inst_tab_term)
2a7f46324218 Proper treatment of beta-redexes in witness theorems.
ballarin
parents: 16458
diff changeset
   178
    or the instantiation has no effect (inst_tab_thm) **)
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   179
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   180
(* instantiate TFrees *)
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   181
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   182
fun tinst_tab_type tinst T = if Symtab.is_empty tinst
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   183
      then T
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   184
      else Term.map_type_tfree
17221
6cd180204582 curried_lookup/update;
wenzelm
parents: 17203
diff changeset
   185
        (fn (v as (x, _)) => getOpt (Symtab.curried_lookup tinst x, (TFree v))) T;
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   186
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   187
fun tinst_tab_term tinst t = if Symtab.is_empty tinst
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   188
      then t
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   189
      else Term.map_term_types (tinst_tab_type tinst) t;
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   190
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   191
fun tinst_tab_thm thy tinst thm = if Symtab.is_empty tinst
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   192
      then thm
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   193
      else let
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   194
          val cert = Thm.cterm_of thy;
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   195
          val certT = Thm.ctyp_of thy;
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   196
          val {hyps, prop, ...} = Thm.rep_thm thm;
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   197
          val tfrees = foldr Term.add_term_tfree_names [] (prop :: hyps);
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   198
          val tinst' = Symtab.dest tinst |>
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   199
                List.filter (fn (a, _) => a mem_string tfrees);
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   200
        in
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   201
          if null tinst' then thm
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   202
          else thm |> Drule.implies_intr_list (map cert hyps)
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   203
            |> Drule.tvars_intr_list (map #1 tinst')
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   204
            |> (fn (th, al) => th |> Thm.instantiate
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   205
                ((map (fn (a, T) => (certT (TVar (valOf (assoc (al, a)))), certT T)) tinst'),
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   206
                  []))
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   207
            |> (fn th => Drule.implies_elim_list th
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   208
                 (map (Thm.assume o cert o tinst_tab_term tinst) hyps))
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   209
        end;
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   210
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   211
(* instantiate TFrees and Frees *)
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   212
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   213
fun inst_tab_term (inst, tinst) = if Symtab.is_empty inst
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   214
      then tinst_tab_term tinst
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   215
      else (* instantiate terms and types simultaneously *)
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   216
        let
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   217
          fun instf (Const (x, T)) = Const (x, tinst_tab_type tinst T)
17221
6cd180204582 curried_lookup/update;
wenzelm
parents: 17203
diff changeset
   218
            | instf (Free (x, T)) = (case Symtab.curried_lookup inst x of
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   219
                 NONE => Free (x, tinst_tab_type tinst T)
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   220
               | SOME t => t)
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   221
            | instf (Var (xi, T)) = Var (xi, tinst_tab_type tinst T)
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   222
            | instf (b as Bound _) = b
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   223
            | instf (Abs (x, T, t)) = Abs (x, tinst_tab_type tinst T, instf t)
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   224
            | instf (s $ t) = instf s $ instf t
16620
2a7f46324218 Proper treatment of beta-redexes in witness theorems.
ballarin
parents: 16458
diff changeset
   225
        in Envir.beta_norm o instf end;
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   226
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   227
fun inst_tab_thm thy (inst, tinst) thm = if Symtab.is_empty inst
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   228
      then tinst_tab_thm thy tinst thm
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   229
      else let
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   230
          val cert = Thm.cterm_of thy;
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   231
          val certT = Thm.ctyp_of thy;
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   232
          val {hyps, prop, ...} = Thm.rep_thm thm;
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   233
          (* type instantiations *)
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   234
          val tfrees = foldr Term.add_term_tfree_names [] (prop :: hyps);
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   235
          val tinst' = Symtab.dest tinst |>
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   236
                List.filter (fn (a, _) => a mem_string tfrees);
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   237
          (* term instantiations;
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   238
             note: lhss are type instantiated, because
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   239
                   type insts will be done first*)
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   240
          val frees = foldr Term.add_term_frees [] (prop :: hyps);
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   241
          val inst' = Symtab.dest inst |>
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   242
                List.mapPartial (fn (a, t) =>
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   243
                  get_first (fn (Free (x, T)) => 
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   244
                    if a = x then SOME (Free (x, tinst_tab_type tinst T), t)
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   245
                    else NONE) frees);
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   246
        in
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   247
          if null tinst' andalso null inst' then tinst_tab_thm thy tinst thm
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   248
          else thm |> Drule.implies_intr_list (map cert hyps)
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   249
            |> Drule.tvars_intr_list (map #1 tinst')
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   250
            |> (fn (th, al) => th |> Thm.instantiate
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   251
                ((map (fn (a, T) => (certT (TVar (valOf (assoc (al, a)))), certT T)) tinst'),
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   252
                  []))
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   253
            |> Drule.forall_intr_list (map (cert o #1) inst')
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   254
            |> Drule.forall_elim_list (map (cert o #2) inst') 
16620
2a7f46324218 Proper treatment of beta-redexes in witness theorems.
ballarin
parents: 16458
diff changeset
   255
            |> Drule.fconv_rule (Thm.beta_conversion true)
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   256
            |> (fn th => Drule.implies_elim_list th
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   257
                 (map (Thm.assume o cert o inst_tab_term (inst, tinst)) hyps))
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   258
        end;
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   259
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   260
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
   261
fun inst_tab_att thy (inst as (_, tinst)) =
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
   262
    Args.map_values I (tinst_tab_type tinst)
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
   263
    (inst_tab_term inst) (inst_tab_thm thy inst);
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
   264
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
   265
fun inst_tab_atts thy inst = map (inst_tab_att thy inst);
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
   266
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
   267
16736
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
   268
(** management of registrations in theories and proof contexts **)
11896
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
   269
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   270
structure Registrations :
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   271
  sig
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   272
    type T
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   273
    val empty: T
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   274
    val join: T * T -> T
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   275
    val dest: T -> (term list * ((string * Attrib.src list) * thm list)) list
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   276
    val lookup: theory -> T * term list ->
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   277
      ((string * Attrib.src list) * thm list) option
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   278
    val insert: theory -> term list * (string * Attrib.src list) -> T ->
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   279
      T * (term list * ((string * Attrib.src list) * thm list)) list
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   280
    val add_witness: term list -> thm -> T -> T
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   281
  end =
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   282
struct
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   283
  (* a registration consists of theorems instantiating locale assumptions
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   284
     and prefix and attributes, indexed by parameter instantiation *)
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   285
  type T = ((string * Attrib.src list) * thm list) Termtab.table;
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   286
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   287
  val empty = Termtab.empty;
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   288
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   289
  (* term list represented as single term, for simultaneous matching *)
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   290
  fun termify ts =
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   291
    Library.foldl (op $) (Const ("", map fastype_of ts ---> propT), ts);
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   292
  fun untermify t =
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   293
    let fun ut (Const _) ts = ts
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   294
          | ut (s $ t) ts = ut s (t::ts)
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   295
    in ut t [] end;
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   296
16620
2a7f46324218 Proper treatment of beta-redexes in witness theorems.
ballarin
parents: 16458
diff changeset
   297
  (* joining of registrations: prefix and attributes of left theory,
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   298
     thms are equal, no attempt to subsumption testing *)
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   299
  fun join (r1, r2) = Termtab.join (fn _ => fn (reg, _) => SOME reg) (r1, r2);
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   300
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   301
  fun dest regs = map (apfst untermify) (Termtab.dest regs);
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   302
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   303
  (* registrations that subsume t *)
17203
29b2563f5c11 refer to theory instead of low-level tsig;
wenzelm
parents: 17142
diff changeset
   304
  fun subsumers thy t regs =
29b2563f5c11 refer to theory instead of low-level tsig;
wenzelm
parents: 17142
diff changeset
   305
    List.filter (fn (t', _) => Pattern.matches thy (t', t)) (Termtab.dest regs);
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   306
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   307
  (* look up registration, pick one that subsumes the query *)
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   308
  fun lookup sign (regs, ts) =
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   309
    let
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   310
      val t = termify ts;
17203
29b2563f5c11 refer to theory instead of low-level tsig;
wenzelm
parents: 17142
diff changeset
   311
      val subs = subsumers sign t regs;
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   312
    in (case subs of
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   313
        [] => NONE
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   314
      | ((t', (attn, thms)) :: _) => let
17203
29b2563f5c11 refer to theory instead of low-level tsig;
wenzelm
parents: 17142
diff changeset
   315
            val (tinst, inst) = Pattern.match sign (t', t);
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   316
            (* thms contain Frees, not Vars *)
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   317
            val tinst' = tinst |> Vartab.dest
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   318
                 |> map (fn ((x, 0), (_, T)) => (x, Type.unvarifyT T))
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   319
                 |> Symtab.make;
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   320
            val inst' = inst |> Vartab.dest
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   321
                 |> map (fn ((x, 0), (_, t)) => (x, Logic.unvarify t))
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   322
                 |> Symtab.make;
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   323
          in
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   324
            SOME (attn, map (inst_tab_thm sign (inst', tinst')) thms)
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   325
          end)
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   326
    end;
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   327
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   328
  (* add registration if not subsumed by ones already present,
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   329
     additionally returns registrations that are strictly subsumed *)
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   330
  fun insert sign (ts, attn) regs =
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   331
    let
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   332
      val t = termify ts;
17203
29b2563f5c11 refer to theory instead of low-level tsig;
wenzelm
parents: 17142
diff changeset
   333
      val subs = subsumers sign t regs ;
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   334
    in (case subs of
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   335
        [] => let
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   336
                val sups =
17203
29b2563f5c11 refer to theory instead of low-level tsig;
wenzelm
parents: 17142
diff changeset
   337
                  List.filter (fn (t', _) => Pattern.matches sign (t, t')) (Termtab.dest regs);
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   338
                val sups' = map (apfst untermify) sups
17221
6cd180204582 curried_lookup/update;
wenzelm
parents: 17203
diff changeset
   339
              in (Termtab.curried_update (t, (attn, [])) regs, sups') end
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   340
      | _ => (regs, []))
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   341
    end;
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   342
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   343
  (* add witness theorem to registration,
16169
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
   344
     only if instantiation is exact, otherwise exception Option raised *)
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   345
  fun add_witness ts thm regs =
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   346
    let
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   347
      val t = termify ts;
17221
6cd180204582 curried_lookup/update;
wenzelm
parents: 17203
diff changeset
   348
      val (x, thms) = valOf (Termtab.curried_lookup regs t);
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   349
    in
17221
6cd180204582 curried_lookup/update;
wenzelm
parents: 17203
diff changeset
   350
      Termtab.curried_update (t, (x, thm::thms)) regs
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   351
    end;
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   352
end;
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   353
16736
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
   354
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   355
(** theory data **)
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   356
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   357
structure GlobalLocalesData = TheoryDataFun
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   358
(struct
12014
035ab884b9e0 beginnings of new locales (not yet functional);
wenzelm
parents: 11896
diff changeset
   359
  val name = "Isar/locales";
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   360
  type T = NameSpace.T * locale Symtab.table * Registrations.T Symtab.table;
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   361
    (* 1st entry: locale namespace,
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   362
       2nd entry: locales of the theory,
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   363
       3rd entry: registrations, indexed by locale name *)
11896
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
   364
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   365
  val empty = (NameSpace.empty, Symtab.empty, Symtab.empty);
12063
4c16bdee47d4 added add_locale(_i) and store_thm;
wenzelm
parents: 12058
diff changeset
   366
  val copy = I;
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   367
  val extend = I;
12289
ec2dafd0a6a9 clarified locale operations (rename, merge);
wenzelm
parents: 12277
diff changeset
   368
16736
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
   369
  fun join_locs _ ({predicate, import, elems, params, regs}: locale,
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
   370
      {elems = elems', regs = regs', ...}: locale) =
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   371
    SOME {predicate = predicate, import = import,
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   372
      elems = gen_merge_lists eq_snd elems elems',
16736
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
   373
      params = params,
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
   374
      regs = merge_alists regs regs'};
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   375
  fun merge _ ((space1, locs1, regs1), (space2, locs2, regs2)) =
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   376
    (NameSpace.merge (space1, space2), Symtab.join join_locs (locs1, locs2),
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   377
     Symtab.join (K (SOME o Registrations.join)) (regs1, regs2));
12289
ec2dafd0a6a9 clarified locale operations (rename, merge);
wenzelm
parents: 12277
diff changeset
   378
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   379
  fun print _ (space, locs, _) =
16346
baa7b5324fc1 NameSpace.extern_table;
wenzelm
parents: 16325
diff changeset
   380
    Pretty.strs ("locales:" :: map #1 (NameSpace.extern_table (space, locs)))
12014
035ab884b9e0 beginnings of new locales (not yet functional);
wenzelm
parents: 11896
diff changeset
   381
    |> Pretty.writeln;
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   382
end);
11896
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
   383
15801
d2f5ca3c048d superceded by Pure.thy and CPure.thy;
wenzelm
parents: 15798
diff changeset
   384
val _ = Context.add_setup [GlobalLocalesData.init];
d2f5ca3c048d superceded by Pure.thy and CPure.thy;
wenzelm
parents: 15798
diff changeset
   385
d2f5ca3c048d superceded by Pure.thy and CPure.thy;
wenzelm
parents: 15798
diff changeset
   386
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   387
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   388
(** context data **)
11896
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
   389
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   390
structure LocalLocalesData = ProofDataFun
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   391
(struct
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   392
  val name = "Isar/locales";
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   393
  type T = Registrations.T Symtab.table;
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   394
    (* registrations, indexed by locale name *)
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   395
  fun init _ = Symtab.empty;
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   396
  fun print _ _ = ();
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   397
end);
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   398
15801
d2f5ca3c048d superceded by Pure.thy and CPure.thy;
wenzelm
parents: 15798
diff changeset
   399
val _ = Context.add_setup [LocalLocalesData.init];
12289
ec2dafd0a6a9 clarified locale operations (rename, merge);
wenzelm
parents: 12277
diff changeset
   400
12277
2b28d7dd91f5 improved ordering of evaluated elements;
wenzelm
parents: 12273
diff changeset
   401
2b28d7dd91f5 improved ordering of evaluated elements;
wenzelm
parents: 12273
diff changeset
   402
(* access locales *)
2b28d7dd91f5 improved ordering of evaluated elements;
wenzelm
parents: 12273
diff changeset
   403
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   404
val print_locales = GlobalLocalesData.print;
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   405
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   406
val intern = NameSpace.intern o #1 o GlobalLocalesData.get;
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   407
val extern = NameSpace.extern o #1 o GlobalLocalesData.get;
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   408
16144
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
   409
fun declare_locale name thy =
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
   410
  thy |> GlobalLocalesData.map (fn (space, locs, regs) =>
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   411
    (Sign.declare_name thy name space, locs, regs));
11896
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
   412
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   413
fun put_locale name loc =
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   414
  GlobalLocalesData.map (fn (space, locs, regs) =>
17221
6cd180204582 curried_lookup/update;
wenzelm
parents: 17203
diff changeset
   415
    (space, Symtab.curried_update (name, loc) locs, regs));
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   416
17221
6cd180204582 curried_lookup/update;
wenzelm
parents: 17203
diff changeset
   417
fun get_locale thy name = Symtab.curried_lookup (#2 (GlobalLocalesData.get thy)) name;
11896
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
   418
12014
035ab884b9e0 beginnings of new locales (not yet functional);
wenzelm
parents: 11896
diff changeset
   419
fun the_locale thy name =
035ab884b9e0 beginnings of new locales (not yet functional);
wenzelm
parents: 11896
diff changeset
   420
  (case get_locale thy name of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15456
diff changeset
   421
    SOME loc => loc
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15456
diff changeset
   422
  | NONE => error ("Unknown locale " ^ quote name));
11896
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
   423
12046
a404358fd965 locale elements;
wenzelm
parents: 12014
diff changeset
   424
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   425
(* access registrations *)
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   426
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
   427
(* Ids of global registrations are varified,
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
   428
   Ids of local registrations are not.
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
   429
   Thms of registrations are never varified. *)
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
   430
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   431
(* retrieve registration from theory or context *)
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   432
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
   433
fun gen_get_registrations get thy_ctxt name =
17221
6cd180204582 curried_lookup/update;
wenzelm
parents: 17203
diff changeset
   434
  case Symtab.curried_lookup (get thy_ctxt) name of
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
   435
      NONE => []
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   436
    | SOME reg => Registrations.dest reg;
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
   437
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
   438
val get_global_registrations =
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
   439
     gen_get_registrations (#3 o GlobalLocalesData.get);
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
   440
val get_local_registrations =
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
   441
     gen_get_registrations LocalLocalesData.get;
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
   442
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   443
fun gen_get_registration get thy_of thy_ctxt (name, ps) =
17221
6cd180204582 curried_lookup/update;
wenzelm
parents: 17203
diff changeset
   444
  case Symtab.curried_lookup (get thy_ctxt) name of
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   445
      NONE => NONE
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   446
    | SOME reg => Registrations.lookup (thy_of thy_ctxt) (reg, ps);
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   447
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   448
val get_global_registration =
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   449
     gen_get_registration (#3 o GlobalLocalesData.get) I;
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   450
val get_local_registration =
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   451
     gen_get_registration LocalLocalesData.get ProofContext.theory_of;
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   452
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   453
val test_global_registration = isSome oo get_global_registration;
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   454
val test_local_registration = isSome oo get_local_registration;
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   455
fun smart_test_registration ctxt id =
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   456
  let
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   457
    val thy = ProofContext.theory_of ctxt;
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   458
  in
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   459
    test_global_registration thy id orelse test_local_registration ctxt id
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   460
  end;
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   461
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   462
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   463
(* add registration to theory or context, ignored if subsumed *)
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   464
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   465
fun gen_put_registration map_data thy_of (name, ps) attn thy_ctxt =
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   466
  map_data (fn regs =>
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   467
    let
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   468
      val thy = thy_of thy_ctxt;
17221
6cd180204582 curried_lookup/update;
wenzelm
parents: 17203
diff changeset
   469
      val reg = getOpt (Symtab.curried_lookup regs name, Registrations.empty);
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   470
      val (reg', sups) = Registrations.insert thy (ps, attn) reg;
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   471
      val _ = if not (null sups) then warning
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   472
                ("Subsumed interpretation(s) of locale " ^
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   473
                 quote (extern thy name) ^
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   474
                 "\nby interpretation(s) with the following prefix(es):\n" ^
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   475
                  commas_quote (map (fn (_, ((s, _), _)) => s) sups))
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   476
              else ();
17221
6cd180204582 curried_lookup/update;
wenzelm
parents: 17203
diff changeset
   477
    in Symtab.curried_update (name, reg') regs end) thy_ctxt;
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   478
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   479
val put_global_registration =
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   480
     gen_put_registration (fn f =>
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   481
       GlobalLocalesData.map (fn (space, locs, regs) => (space, locs, f regs))) I;
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   482
val put_local_registration =
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   483
     gen_put_registration LocalLocalesData.map ProofContext.theory_of;
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   484
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   485
fun put_registration_in_locale name id thy =
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   486
    let
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   487
      val {predicate, import, elems, params, regs} = the_locale thy name;
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   488
    in
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   489
      put_locale name {predicate = predicate, import = import,
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   490
        elems = elems, params = params, regs = regs @ [(id, [])]} thy
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   491
    end;
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   492
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   493
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   494
(* add witness theorem to registration in theory or context,
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   495
   ignored if registration not present *)
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   496
17221
6cd180204582 curried_lookup/update;
wenzelm
parents: 17203
diff changeset
   497
fun gen_add_witness map_regs (name, ps) thm =
6cd180204582 curried_lookup/update;
wenzelm
parents: 17203
diff changeset
   498
  map_regs (Symtab.map_entry name (Registrations.add_witness ps thm));
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   499
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   500
val add_global_witness =
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   501
     gen_add_witness (fn f =>
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   502
       GlobalLocalesData.map (fn (space, locs, regs) =>
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   503
         (space, locs, f regs)));
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   504
val add_local_witness = gen_add_witness LocalLocalesData.map;
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   505
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   506
fun add_witness_in_locale name id thm thy =
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   507
    let
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   508
      val {predicate, import, elems, params, regs} = the_locale thy name;
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   509
      fun add (id', thms) =
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   510
          if id = id' then (id', thm :: thms) else (id', thms);
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   511
    in
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   512
      put_locale name {predicate = predicate, import = import,
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   513
	elems = elems, params = params, regs = map add regs} thy
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   514
    end;
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   515
14215
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
   516
(* import hierarchy
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
   517
   implementation could be more efficient, eg. by maintaining a database
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
   518
   of dependencies *)
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
   519
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
   520
fun imports thy (upper, lower) =
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
   521
  let
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
   522
    fun imps (Locale name) low = (name = low) orelse
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
   523
      (case get_locale thy name of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15456
diff changeset
   524
           NONE => false
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15456
diff changeset
   525
         | SOME {import, ...} => imps import low)
14215
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
   526
      | imps (Rename (expr, _)) low = imps expr low
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
   527
      | imps (Merge es) low = exists (fn e => imps e low) es;
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
   528
  in
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   529
    imps (Locale (intern thy upper)) (intern thy lower)
14215
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
   530
  end;
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
   531
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
   532
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   533
(* printing of registrations *)
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   534
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
   535
fun gen_print_registrations get_regs mk_ctxt msg show_wits loc thy_ctxt =
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   536
  let
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   537
    val ctxt = mk_ctxt thy_ctxt;
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   538
    val thy = ProofContext.theory_of ctxt;
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   539
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   540
    val prt_term = Pretty.quote o ProofContext.pretty_term ctxt;
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   541
    fun prt_inst ts =
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   542
        Pretty.enclose "(" ")" (Pretty.breaks (map prt_term ts));
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   543
    fun prt_attn (prfx, atts) =
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   544
        Pretty.breaks (Pretty.str prfx :: Args.pretty_attribs ctxt atts);
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   545
    val prt_thm = Pretty.quote o ProofContext.pretty_thm ctxt;
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   546
    fun prt_thms thms =
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   547
        Pretty.enclose "[" "]" (Pretty.breaks (map prt_thm thms));
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   548
    fun prt_reg (ts, (("", []), thms)) =
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
   549
        if show_wits
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   550
          then Pretty.block [prt_inst ts, Pretty.fbrk, prt_thms thms]
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   551
          else prt_inst ts
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   552
      | prt_reg (ts, (attn, thms)) =
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
   553
        if show_wits
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   554
          then Pretty.block ((prt_attn attn @
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   555
            [Pretty.str ":", Pretty.brk 1, prt_inst ts, Pretty.fbrk,
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   556
              prt_thms thms]))
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   557
          else Pretty.block ((prt_attn attn @
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   558
            [Pretty.str ":", Pretty.brk 1, prt_inst ts]));
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   559
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   560
    val loc_int = intern thy loc;
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   561
    val regs = get_regs thy_ctxt;
17221
6cd180204582 curried_lookup/update;
wenzelm
parents: 17203
diff changeset
   562
    val loc_regs = Symtab.curried_lookup regs loc_int;
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   563
  in
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   564
    (case loc_regs of
17355
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
   565
        NONE => Pretty.str ("no interpretations in " ^ msg)
15763
b901a127ac73 Interpretation supports statically scoped attributes; documentation.
ballarin
parents: 15749
diff changeset
   566
      | SOME r => let
15837
7a567dcd4cda Subsumption of locale interpretations.
ballarin
parents: 15801
diff changeset
   567
            val r' = Registrations.dest r;
15763
b901a127ac73 Interpretation supports statically scoped attributes; documentation.
ballarin
parents: 15749
diff changeset
   568
            val r'' = Library.sort_wrt (fn (_, ((prfx, _), _)) => prfx) r';
17355
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
   569
          in Pretty.big_list ("interpretations in " ^ msg ^ ":")
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   570
            (map prt_reg r'')
15763
b901a127ac73 Interpretation supports statically scoped attributes; documentation.
ballarin
parents: 15749
diff changeset
   571
          end)
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   572
    |> Pretty.writeln
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   573
  end;
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   574
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   575
val print_global_registrations =
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   576
     gen_print_registrations (#3 o GlobalLocalesData.get)
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   577
       ProofContext.init "theory";
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   578
val print_local_registrations' =
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   579
     gen_print_registrations LocalLocalesData.get
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   580
       I "context";
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
   581
fun print_local_registrations show_wits loc ctxt =
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
   582
  (print_global_registrations show_wits loc (ProofContext.theory_of ctxt);
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
   583
   print_local_registrations' show_wits loc ctxt);
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
   584
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   585
12277
2b28d7dd91f5 improved ordering of evaluated elements;
wenzelm
parents: 12273
diff changeset
   586
(* diagnostics *)
12273
7fb9840d358d beginnings of actual locale expressions;
wenzelm
parents: 12263
diff changeset
   587
12277
2b28d7dd91f5 improved ordering of evaluated elements;
wenzelm
parents: 12273
diff changeset
   588
fun err_in_locale ctxt msg ids =
2b28d7dd91f5 improved ordering of evaluated elements;
wenzelm
parents: 12273
diff changeset
   589
  let
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   590
    val thy = ProofContext.theory_of ctxt;
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   591
    fun prt_id (name, parms) =
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   592
      [Pretty.block (Pretty.breaks (map Pretty.str (extern thy name :: parms)))];
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   593
    val prt_ids = List.concat (separate [Pretty.str " +", Pretty.brk 1] (map prt_id ids));
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   594
    val err_msg =
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   595
      if forall (equal "" o #1) ids then msg
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   596
      else msg ^ "\n" ^ Pretty.string_of (Pretty.block
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   597
        (Pretty.str "The error(s) above occurred in locale:" :: Pretty.brk 1 :: prt_ids));
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   598
  in raise ProofContext.CONTEXT (err_msg, ctxt) end;
12063
4c16bdee47d4 added add_locale(_i) and store_thm;
wenzelm
parents: 12058
diff changeset
   599
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   600
(* Version for identifiers with axioms *)
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   601
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   602
fun err_in_locale' ctxt msg ids' = err_in_locale ctxt msg (map fst ids');
12277
2b28d7dd91f5 improved ordering of evaluated elements;
wenzelm
parents: 12273
diff changeset
   603
2b28d7dd91f5 improved ordering of evaluated elements;
wenzelm
parents: 12273
diff changeset
   604
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   605
(** primitives **)
12046
a404358fd965 locale elements;
wenzelm
parents: 12014
diff changeset
   606
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   607
(* map elements *)
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   608
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   609
fun map_elem {name, var, typ, term, fact, attrib} =
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   610
  fn Fixes fixes => Fixes (fixes |> map (fn (x, T, mx) =>
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   611
       let val (x', mx') = var (x, mx) in (x', Option.map typ T, mx') end))
16169
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
   612
   | Constrains csts => Constrains (csts |> map (fn (x, T) =>
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
   613
       let val (x', _) = var (x, SOME Syntax.NoSyn) in (x', typ T) end))
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   614
   | Assumes asms => Assumes (asms |> map (fn ((a, atts), propps) =>
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   615
      ((name a, map attrib atts), propps |> map (fn (t, (ps, qs)) =>
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   616
        (term t, (map term ps, map term qs))))))
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   617
   | Defines defs => Defines (defs |> map (fn ((a, atts), (t, ps)) =>
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   618
      ((name a, map attrib atts), (term t, map term ps))))
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   619
   | Notes facts => Notes (facts |> map (fn ((a, atts), bs) =>
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   620
      ((name a, map attrib atts), bs |> map (fn (ths, btts) => (fact ths, map attrib btts)))));
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   621
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   622
fun map_values typ term thm = map_elem
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   623
  {name = I, var = I, typ = typ, term = term, fact = map thm,
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   624
    attrib = Args.map_values I typ term thm};
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   625
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   626
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   627
(* map attributes *)
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   628
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   629
fun map_attrib_elem f = map_elem {name = I, var = I, typ = I, term = I, fact = I, attrib = f};
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   630
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   631
fun intern_attrib_elem thy = map_attrib_elem (Attrib.intern_src thy);
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   632
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   633
fun intern_attrib_elem_expr thy (Elem elem) = Elem (intern_attrib_elem thy elem)
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   634
  | intern_attrib_elem_expr _ (Expr expr) = Expr expr;
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   635
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   636
12277
2b28d7dd91f5 improved ordering of evaluated elements;
wenzelm
parents: 12273
diff changeset
   637
(* renaming *)
12263
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   638
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   639
(* ren maps names to (new) names and syntax; represented as association list *)
12263
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   640
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   641
fun rename_var ren (x, mx) =
17271
2756a73f63a5 introduced some new-style AList operations
haftmann
parents: 17257
diff changeset
   642
  case AList.lookup (op =) ren x of
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   643
      NONE => (x, mx)
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   644
    | SOME (x', NONE) =>
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   645
        (x', if mx = NONE then mx else SOME Syntax.NoSyn)     (*drop syntax*)
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   646
    | SOME (x', SOME mx') =>
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   647
        if mx = NONE then raise ERROR_MESSAGE
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   648
          ("Attempt to change syntax of structure parameter " ^ quote x)
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   649
        else (x', SOME mx');                                (*change syntax*)
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   650
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   651
fun rename ren x =
17271
2756a73f63a5 introduced some new-style AList operations
haftmann
parents: 17257
diff changeset
   652
  case AList.lookup (op =) ren x of
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   653
      NONE => x
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   654
    | SOME (x', _) => x';                                   (*ignore syntax*)
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   655
12263
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   656
fun rename_term ren (Free (x, T)) = Free (rename ren x, T)
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   657
  | rename_term ren (t $ u) = rename_term ren t $ rename_term ren u
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   658
  | rename_term ren (Abs (x, T, t)) = Abs (x, T, rename_term ren t)
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   659
  | rename_term _ a = a;
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   660
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   661
fun rename_thm ren th =
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   662
  let
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   663
    val {thy, hyps, prop, maxidx, ...} = Thm.rep_thm th;
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   664
    val cert = Thm.cterm_of thy;
16861
7446b4be013b tuned fold on terms;
wenzelm
parents: 16850
diff changeset
   665
    val (xs, Ts) = Library.split_list (fold Term.add_frees (prop :: hyps) []);
12263
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   666
    val xs' = map (rename ren) xs;
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   667
    fun cert_frees names = map (cert o Free) (names ~~ Ts);
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   668
    fun cert_vars names = map (cert o Var o apfst (rpair (maxidx + 1))) (names ~~ Ts);
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   669
  in
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   670
    if xs = xs' then th
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   671
    else
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   672
      th
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   673
      |> Drule.implies_intr_list (map cert hyps)
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   674
      |> Drule.forall_intr_list (cert_frees xs)
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   675
      |> Drule.forall_elim_list (cert_vars xs)
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   676
      |> Thm.instantiate ([], cert_vars xs ~~ cert_frees xs')
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   677
      |> (fn th' => Drule.implies_elim_list th' (map (Thm.assume o cert o rename_term ren) hyps))
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   678
  end;
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   679
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   680
fun rename_elem ren =
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   681
  map_values I (rename_term ren) (rename_thm ren) o
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   682
  map_elem {name = I, typ = I, term = I, fact = I, attrib = I, var = rename_var ren};
12263
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   683
16144
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
   684
fun rename_facts prfx =
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
   685
  map_elem {var = I, typ = I, term = I, fact = I, attrib = I, name = NameSpace.qualified prfx};
12307
459aa05af6be qualify imported facts;
wenzelm
parents: 12289
diff changeset
   686
12263
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   687
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   688
(* type instantiation *)
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   689
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   690
fun inst_type [] T = T
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   691
  | inst_type env T = Term.map_type_tfree (fn v => getOpt (assoc (env, v), TFree v)) T;
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   692
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   693
fun inst_term [] t = t
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   694
  | inst_term env t = Term.map_term_types (inst_type env) t;
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   695
13211
aabdb4b33625 BUG FIX in inst_thm: use current context instead of that of thm!!!
wenzelm
parents: 12958
diff changeset
   696
fun inst_thm _ [] th = th
aabdb4b33625 BUG FIX in inst_thm: use current context instead of that of thm!!!
wenzelm
parents: 12958
diff changeset
   697
  | inst_thm ctxt env th =
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   698
      let
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   699
        val thy = ProofContext.theory_of ctxt;
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   700
        val cert = Thm.cterm_of thy;
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   701
        val certT = Thm.ctyp_of thy;
13211
aabdb4b33625 BUG FIX in inst_thm: use current context instead of that of thm!!!
wenzelm
parents: 12958
diff changeset
   702
        val {hyps, prop, maxidx, ...} = Thm.rep_thm th;
15574
b1d1b5bfc464 Removed practically all references to Library.foldr.
skalberg
parents: 15570
diff changeset
   703
        val tfrees = foldr Term.add_term_tfree_names [] (prop :: hyps);
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   704
        val env' = List.filter (fn ((a, _), _) => a mem_string tfrees) env;
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   705
      in
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   706
        if null env' then th
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   707
        else
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   708
          th
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   709
          |> Drule.implies_intr_list (map cert hyps)
12575
34985eee55b1 fixed inst_thm: proper domain of env;
wenzelm
parents: 12546
diff changeset
   710
          |> Drule.tvars_intr_list (map (#1 o #1) env')
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   711
          |> (fn (th', al) => th' |>
15798
016f3be5a5ec Adapted to new interface of instantiation and unification / matching functions.
berghofe
parents: 15763
diff changeset
   712
            Thm.instantiate ((map (fn ((a, _), T) =>
016f3be5a5ec Adapted to new interface of instantiation and unification / matching functions.
berghofe
parents: 15763
diff changeset
   713
              (certT (TVar (valOf (assoc (al, a)))), certT T)) env'), []))
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   714
          |> (fn th'' => Drule.implies_elim_list th''
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   715
              (map (Thm.assume o cert o inst_term env') hyps))
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   716
      end;
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   717
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   718
fun inst_elem ctxt env =
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
   719
  map_values (inst_type env) (inst_term env) (inst_thm ctxt env);
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   720
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   721
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
   722
(* term and type instantiation, variant using symbol tables *)
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
   723
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
   724
(* instantiate TFrees *)
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
   725
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   726
fun tinst_tab_elem thy tinst =
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   727
  map_values (tinst_tab_type tinst) (tinst_tab_term tinst) (tinst_tab_thm thy tinst);
15749
b57bff155e79 tuned (t)inst_tab_elem;
wenzelm
parents: 15721
diff changeset
   728
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
   729
(* instantiate TFrees and Frees *)
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
   730
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   731
fun inst_tab_elem thy (inst as (_, tinst)) =
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   732
  map_values (tinst_tab_type tinst) (inst_tab_term inst) (inst_tab_thm thy inst);
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
   733
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   734
fun inst_tab_elems thy inst ((n, ps), elems) =
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   735
      ((n, map (inst_tab_term inst) ps), map (inst_tab_elem thy inst) elems);
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
   736
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   737
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   738
(** structured contexts: rename + merge + implicit type instantiation **)
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   739
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   740
(* parameter types *)
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   741
14508
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
   742
(* CB: frozen_tvars has the following type:
15798
016f3be5a5ec Adapted to new interface of instantiation and unification / matching functions.
berghofe
parents: 15763
diff changeset
   743
  ProofContext.context -> Term.typ list -> (Term.indexname * (sort * Term.typ)) list *)
14508
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
   744
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   745
fun frozen_tvars ctxt Ts =
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   746
  let
16861
7446b4be013b tuned fold on terms;
wenzelm
parents: 16850
diff changeset
   747
    val tvars = rev (fold Term.add_tvarsT Ts []);
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   748
    val tfrees = map TFree
14695
9c78044b99c3 improved Term.invent_names;
wenzelm
parents: 14643
diff changeset
   749
      (Term.invent_names (ProofContext.used_types ctxt) "'a" (length tvars) ~~ map #2 tvars);
15798
016f3be5a5ec Adapted to new interface of instantiation and unification / matching functions.
berghofe
parents: 15763
diff changeset
   750
  in map (fn ((x, S), y) => (x, (S, y))) (tvars ~~ tfrees) end;
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   751
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   752
fun unify_frozen ctxt maxidx Ts Us =
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   753
  let
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15456
diff changeset
   754
    fun paramify (i, NONE) = (i, NONE)
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15456
diff changeset
   755
      | paramify (i, SOME T) = apsnd SOME (TypeInfer.paramify_dummies (i, T));
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   756
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   757
    val (maxidx', Ts') = foldl_map paramify (maxidx, Ts);
12727
330cb92aaea3 unify_frozen: proper use of maxidx';
wenzelm
parents: 12711
diff changeset
   758
    val (maxidx'', Us') = foldl_map paramify (maxidx', Us);
16947
c6a90f04924e Sign.typ_unify;
wenzelm
parents: 16861
diff changeset
   759
    val thy = ProofContext.theory_of ctxt;
14215
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
   760
16947
c6a90f04924e Sign.typ_unify;
wenzelm
parents: 16861
diff changeset
   761
    fun unify (env, (SOME T, SOME U)) = (Sign.typ_unify thy (U, T) env
14215
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
   762
          handle Type.TUNIFY =>
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
   763
            raise TYPE ("unify_frozen: failed to unify types", [U, T], []))
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
   764
      | unify (env, _) = env;
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   765
    val (unifier, _) = Library.foldl unify ((Vartab.empty, maxidx''), Ts' ~~ Us');
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   766
    val Vs = map (Option.map (Envir.norm_type unifier)) Us';
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   767
    val unifier' = Vartab.extend (unifier, frozen_tvars ctxt (List.mapPartial I Vs));
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   768
  in map (Option.map (Envir.norm_type unifier')) Vs end;
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   769
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   770
fun params_of elemss = gen_distinct eq_fst (List.concat (map (snd o fst) elemss));
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   771
fun params_of' elemss = gen_distinct eq_fst (List.concat (map (snd o fst o fst) elemss));
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   772
fun params_syn_of syn elemss =
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   773
  gen_distinct eq_fst (List.concat (map (snd o fst) elemss)) |>
17221
6cd180204582 curried_lookup/update;
wenzelm
parents: 17203
diff changeset
   774
    map (apfst (fn x => (x, valOf (Symtab.curried_lookup syn x))));
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   775
14508
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
   776
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
   777
(* CB: param_types has the following type:
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15456
diff changeset
   778
  ('a * 'b option) list -> ('a * 'b) list *)
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   779
fun param_types ps = List.mapPartial (fn (_, NONE) => NONE | (x, SOME T) => SOME (x, T)) ps;
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   780
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   781
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   782
fun merge_syntax ctxt ids ss = Symtab.merge (op =) ss
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   783
  handle Symtab.DUPS xs => err_in_locale ctxt
16105
a44801c499cb SML/NJ compatibility.
ballarin
parents: 16103
diff changeset
   784
    ("Conflicting syntax for parameter(s): " ^ commas_quote xs) (map fst ids);
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   785
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   786
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   787
(* Distinction of assumed vs. derived identifiers.
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   788
   The former may have axioms relating assumptions of the context to
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   789
   assumptions of the specification fragment (for locales with
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   790
   predicates).  The latter have witness theorems relating assumptions of the
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   791
   specification fragment to assumptions of other (assumed) specification
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   792
   fragments. *)
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   793
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   794
datatype 'a mode = Assumed of 'a | Derived of 'a;
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   795
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   796
fun map_mode f (Assumed x) = Assumed (f x)
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   797
  | map_mode f (Derived x) = Derived (f x);
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   798
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   799
(* flatten expressions *)
11896
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
   800
12510
172d18ec3b54 proper treatment of internal parameters;
wenzelm
parents: 12502
diff changeset
   801
local
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   802
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   803
(* CB: OUTDATED unique_parms has the following type:
14508
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
   804
     'a ->
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
   805
     (('b * (('c * 'd) list * Symtab.key list)) * 'e) list ->
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
   806
     (('b * ('c * 'd) list) * 'e) list  *)
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
   807
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   808
fun unique_parms ctxt elemss =
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   809
  let
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   810
    val param_decls =
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   811
      List.concat (map (fn (((name, (ps, qs)), _), _) => map (rpair (name, ps)) qs) elemss)
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   812
      |> Symtab.make_multi |> Symtab.dest;
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   813
  in
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   814
    (case find_first (fn (_, ids) => length ids > 1) param_decls of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15456
diff changeset
   815
      SOME (q, ids) => err_in_locale ctxt ("Multiple declaration of parameter " ^ quote q)
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   816
          (map (apsnd (map fst)) ids)
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15456
diff changeset
   817
    | NONE => map (apfst (apfst (apsnd #1))) elemss)
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   818
  end;
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   819
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   820
fun unify_parms ctxt (fixed_parms : (string * typ) list)
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   821
  (raw_parmss : (string * typ option) list list) =
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   822
  let
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   823
    val thy = ProofContext.theory_of ctxt;
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   824
    val maxidx = length raw_parmss;
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   825
    val idx_parmss = (0 upto maxidx - 1) ~~ raw_parmss;
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   826
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   827
    fun varify i = Term.map_type_tfree (fn (a, S) => TVar ((a, i), S));
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   828
    fun varify_parms (i, ps) = map (apsnd (varify i)) (param_types ps);
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   829
    val parms = fixed_parms @ List.concat (map varify_parms idx_parmss);
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   830
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   831
    fun unify T ((env, maxidx), U) =
16947
c6a90f04924e Sign.typ_unify;
wenzelm
parents: 16861
diff changeset
   832
      Sign.typ_unify thy (U, T) (env, maxidx)
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   833
      handle Type.TUNIFY =>
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
   834
        let val prt = Sign.string_of_typ thy
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   835
        in raise TYPE ("unify_parms: failed to unify types " ^
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   836
          prt U ^ " and " ^ prt T, [U, T], [])
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   837
        end
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   838
    fun unify_list (envir, T :: Us) = Library.foldl (unify T) (envir, Us)
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   839
      | unify_list (envir, []) = envir;
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   840
    val (unifier, _) = Library.foldl unify_list
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   841
      ((Vartab.empty, maxidx), map #2 (Symtab.dest (Symtab.make_multi parms)));
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   842
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   843
    val parms' = map (apsnd (Envir.norm_type unifier)) (gen_distinct eq_fst parms);
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   844
    val unifier' = Vartab.extend (unifier, frozen_tvars ctxt (map #2 parms'));
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   845
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   846
    fun inst_parms (i, ps) =
15574
b1d1b5bfc464 Removed practically all references to Library.foldr.
skalberg
parents: 15570
diff changeset
   847
      foldr Term.add_typ_tfrees [] (List.mapPartial snd ps)
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   848
      |> List.mapPartial (fn (a, S) =>
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   849
          let val T = Envir.norm_type unifier' (TVar ((a, i), S))
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15456
diff changeset
   850
          in if T = TFree (a, S) then NONE else SOME ((a, S), T) end)
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   851
  in map inst_parms idx_parmss end : ((string * Term.sort) * Term.typ) list list;
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   852
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   853
in
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   854
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   855
fun unify_elemss _ _ [] = []
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   856
  | unify_elemss _ [] [elems] = [elems]
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
   857
  | unify_elemss ctxt fixed_parms elemss =
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   858
      let
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   859
        val envs = unify_parms ctxt fixed_parms (map (#2 o #1 o #1) elemss);
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   860
        fun inst ((((name, ps), mode), elems), env) =
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   861
          (((name, map (apsnd (Option.map (inst_type env))) ps), 
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   862
              map_mode (map (inst_thm ctxt env)) mode),
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   863
            map (inst_elem ctxt env) elems);
12839
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
   864
      in map inst (elemss ~~ envs) end;
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
   865
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   866
(* like unify_elemss, but does not touch mode, additional
16736
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
   867
   parameter c_parms for enforcing further constraints (eg. syntax) *)
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   868
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   869
fun unify_elemss' _ _ [] [] = []
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   870
  | unify_elemss' _ [] [elems] [] = [elems]
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   871
  | unify_elemss' ctxt fixed_parms elemss c_parms =
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   872
      let
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   873
        val envs = unify_parms ctxt fixed_parms (map (#2 o #1 o #1) elemss @ map single c_parms);
17033
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
   874
        fun inst ((((name, ps), (ps', mode)), elems), env) =
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
   875
          (((name, map (apsnd (Option.map (inst_type env))) ps),
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
   876
              (ps', mode)),
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   877
           map (inst_elem ctxt env) elems);
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   878
      in map inst (elemss ~~ (Library.take (length elemss, envs))) end;
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   879
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   880
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   881
(* flatten_expr:
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   882
   Extend list of identifiers by those new in locale expression expr.
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   883
   Compute corresponding list of lists of locale elements (one entry per
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   884
   identifier).
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   885
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   886
   Identifiers represent locale fragments and are in an extended form:
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   887
     ((name, ps), (ax_ps, axs))
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   888
   (name, ps) is the locale name with all its parameters.
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   889
   (ax_ps, axs) is the locale axioms with its parameters;
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   890
     axs are always taken from the top level of the locale hierarchy,
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   891
     hence axioms may contain additional parameters from later fragments:
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   892
     ps subset of ax_ps.  axs is either singleton or empty.
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   893
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   894
   Elements are enriched by identifier-like information:
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   895
     (((name, ax_ps), axs), elems)
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   896
   The parameters in ax_ps are the axiom parameters, but enriched by type
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   897
   info: now each entry is a pair of string and typ option.  Axioms are
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   898
   type-instantiated.
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   899
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   900
*)
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   901
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   902
fun flatten_expr ctxt ((prev_idents, prev_syntax), expr) =
12014
035ab884b9e0 beginnings of new locales (not yet functional);
wenzelm
parents: 11896
diff changeset
   903
  let
035ab884b9e0 beginnings of new locales (not yet functional);
wenzelm
parents: 11896
diff changeset
   904
    val thy = ProofContext.theory_of ctxt;
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   905
    (* thy used for retrieval of locale info,
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   906
       ctxt for error messages, parameter unification and instantiation
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   907
       of axioms *)
12263
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   908
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15456
diff changeset
   909
    fun renaming (SOME x :: xs) (y :: ys) = (y, x) :: renaming xs ys
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15456
diff changeset
   910
      | renaming (NONE :: xs) (y :: ys) = renaming xs ys
12273
7fb9840d358d beginnings of actual locale expressions;
wenzelm
parents: 12263
diff changeset
   911
      | renaming [] _ = []
12289
ec2dafd0a6a9 clarified locale operations (rename, merge);
wenzelm
parents: 12277
diff changeset
   912
      | renaming xs [] = raise ERROR_MESSAGE ("Too many arguments in renaming: " ^
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   913
          commas (map (fn NONE => "_" | SOME x => quote (fst x)) xs));
12289
ec2dafd0a6a9 clarified locale operations (rename, merge);
wenzelm
parents: 12277
diff changeset
   914
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   915
    fun rename_parms top ren ((name, ps), (parms, mode)) =
12289
ec2dafd0a6a9 clarified locale operations (rename, merge);
wenzelm
parents: 12277
diff changeset
   916
      let val ps' = map (rename ren) ps in
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   917
        (case duplicates ps' of
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   918
          [] => ((name, ps'),
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   919
                 if top then (map (rename ren) parms,
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   920
                   map_mode (map (rename_thm ren)) mode)
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   921
                 else (parms, mode))
12289
ec2dafd0a6a9 clarified locale operations (rename, merge);
wenzelm
parents: 12277
diff changeset
   922
        | dups => err_in_locale ctxt ("Duplicate parameters: " ^ commas_quote dups) [(name, ps')])
ec2dafd0a6a9 clarified locale operations (rename, merge);
wenzelm
parents: 12277
diff changeset
   923
      end;
12263
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
   924
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   925
    (* add registrations of (name, ps), recursively;
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   926
       adjust hyps of witness theorems *)
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   927
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   928
    fun add_regs (name, ps) (ths, ids) =
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   929
        let
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   930
          val {params, regs, ...} = the_locale thy name;
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   931
          val ps' = map #1 (#1 params);
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   932
          val ren = map #1 ps' ~~ map (fn (x, _) => (x, NONE)) ps;
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   933
            (* dummy syntax, since required by rename *)
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   934
          val ps'' = map (fn ((p, _), (_, T)) => (p, T)) (ps ~~ ps');
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   935
          val [env] = unify_parms ctxt ps [map (apsnd SOME) ps''];
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   936
            (* propagate parameter types, to keep them consistent *)
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   937
          val regs' = map (fn ((name, ps), ths) =>
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   938
              ((name, map (rename ren) ps), ths)) regs;
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   939
          val new_regs = gen_rems eq_fst (regs', ids);
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   940
          val new_ids = map fst new_regs;
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   941
          val new_idTs = map (apsnd (map (fn p => (p, valOf (assoc (ps, p)))))) new_ids;
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   942
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   943
          val new_ths = map (fn (_, ths') =>
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   944
              map (Drule.satisfy_hyps ths o rename_thm ren o inst_thm ctxt env) ths') new_regs;
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   945
          val new_ids' = map (fn (id, ths) =>
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   946
              (id, ([], Derived ths))) (new_ids ~~ new_ths);
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   947
        in
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   948
          fold add_regs new_idTs (ths @ List.concat new_ths, ids @ new_ids')
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   949
        end;
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   950
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   951
    (* distribute top-level axioms over assumed ids *)
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   952
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   953
    fun axiomify all_ps ((name, parms), (_, Assumed _)) axioms =
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   954
        let
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   955
          val {elems, ...} = the_locale thy name;
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   956
          val ts = List.concat (map
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   957
            (fn (Assumes asms, _) => List.concat (map (map #1 o #2) asms)
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   958
              | _ => [])
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   959
            elems);
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   960
          val (axs1, axs2) = splitAt (length ts, axioms);
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   961
        in (((name, parms), (all_ps, Assumed axs1)), axs2) end
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   962
      | axiomify all_ps (id, (_, Derived ths)) axioms =
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   963
          ((id, (all_ps, Derived ths)), axioms);
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   964
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   965
    (* identifiers of an expression *)
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   966
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   967
    fun identify top (Locale name) =
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
   968
    (* CB: ids_ax is a list of tuples of the form ((name, ps), axs),
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   969
       where name is a locale name, ps a list of parameter names and axs
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   970
       a list of axioms relating to the identifier, axs is empty unless
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   971
       identify at top level (top = true);
14215
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
   972
       parms is accumulated list of parameters *)
12289
ec2dafd0a6a9 clarified locale operations (rename, merge);
wenzelm
parents: 12277
diff changeset
   973
          let
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   974
            val {predicate = (_, axioms), import, params, ...} =
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   975
              the_locale thy name;
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   976
            val ps = map (#1 o #1) (#1 params);
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   977
            val (ids', parms', _) = identify false import;
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   978
                (* acyclic import dependencies *)
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   979
            val ids'' = ids' @ [((name, ps), ([], Assumed []))];
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   980
            val (_, ids''') = add_regs (name, map #1 (#1 params)) ([], ids'');
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   981
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   982
            val ids_ax = if top then fst
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   983
                 (fold_map (axiomify ps) ids''' axioms)
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
   984
              else ids''';
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   985
            val syn = Symtab.make (map (apfst fst) (#1 params));
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   986
            in (ids_ax, merge_lists parms' ps, syn) end
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   987
      | identify top (Rename (e, xs)) =
12273
7fb9840d358d beginnings of actual locale expressions;
wenzelm
parents: 12263
diff changeset
   988
          let
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   989
            val (ids', parms', syn') = identify top e;
12839
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
   990
            val ren = renaming xs parms'
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   991
              handle ERROR_MESSAGE msg => err_in_locale' ctxt msg ids';
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   992
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   993
            val ids'' = gen_distinct eq_fst (map (rename_parms top ren) ids');
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   994
            val parms'' = distinct (List.concat (map (#2 o #1) ids''));
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   995
            val syn'' = syn' |> Symtab.dest |> map (rename_var ren) |>
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   996
                  Symtab.make;
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
   997
            (* check for conflicting syntax? *)
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
   998
          in (ids'', parms'', syn'') end
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
   999
      | identify top (Merge es) =
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
  1000
          fold (fn e => fn (ids, parms, syn) =>
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1001
                   let
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
  1002
                     val (ids', parms', syn') = identify top e
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1003
                   in
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1004
                     (merge_alists ids ids',
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1005
                      merge_lists parms parms',
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
  1006
                      merge_syntax ctxt ids' (syn, syn'))
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1007
                   end)
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
  1008
            es ([], [], Symtab.empty);
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1009
12014
035ab884b9e0 beginnings of new locales (not yet functional);
wenzelm
parents: 11896
diff changeset
  1010
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1011
    (* CB: enrich identifiers by parameter types and 
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1012
       the corresponding elements (with renamed parameters),
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1013
       also takes care of parameter syntax *)
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1014
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1015
    fun eval syn ((name, xs), axs) =
12273
7fb9840d358d beginnings of actual locale expressions;
wenzelm
parents: 12263
diff changeset
  1016
      let
13308
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1017
        val {params = (ps, qs), elems, ...} = the_locale thy name;
16620
2a7f46324218 Proper treatment of beta-redexes in witness theorems.
ballarin
parents: 16458
diff changeset
  1018
        val ps' = map (apsnd SOME o #1) ps;
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1019
        val ren = map #1 ps' ~~
17221
6cd180204582 curried_lookup/update;
wenzelm
parents: 17203
diff changeset
  1020
              map (fn x => (x, valOf (Symtab.curried_lookup syn x))) xs;
13308
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1021
        val (params', elems') =
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1022
          if null ren then ((ps', qs), map #1 elems)
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1023
          else ((map (apfst (rename ren)) ps', map (rename ren) qs),
13308
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1024
            map (rename_elem ren o #1) elems);
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1025
        val elems'' = map (rename_facts (space_implode "_" xs)) elems';
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1026
      in (((name, params'), axs), elems'') end;
12307
459aa05af6be qualify imported facts;
wenzelm
parents: 12289
diff changeset
  1027
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1028
    (* type constraint for renamed parameter with syntax *)
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1029
    fun type_syntax NONE = NONE
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1030
      | type_syntax (SOME mx) = let
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1031
            val Ts = map (fn x => TFree (x, [])) (Term.invent_names [] "'mxa"
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1032
              (Syntax.mixfix_args mx + 1))
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1033
          in Ts |> Library.split_last |> op ---> |> SOME end;
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1034
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1035
    (* compute identifiers and syntax, merge with previous ones *)
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
  1036
    val (ids, _, syn) = identify true expr;
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1037
    val idents = gen_rems eq_fst (ids, prev_idents);
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1038
    val syntax = merge_syntax ctxt ids (syn, prev_syntax);
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1039
    (* add types to params, check for unique params and unify them *)
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1040
    val raw_elemss = unique_parms ctxt (map (eval syntax) idents);
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1041
    val elemss = unify_elemss' ctxt [] raw_elemss
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1042
         (map (apsnd type_syntax) (Symtab.dest syntax));
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1043
    (* replace params in ids by params from axioms,
17033
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  1044
       adjust types in mode *)
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1045
    val all_params' = params_of' elemss;
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1046
    val all_params = param_types all_params';
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1047
    val elemss' = map (fn (((name, _), (ps, mode)), elems) =>
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1048
         (((name, map (fn p => (p, assoc (all_params, p))) ps), mode), elems))
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1049
         elemss;
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1050
    fun inst_th th = let
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1051
         val {hyps, prop, ...} = Thm.rep_thm th;
16861
7446b4be013b tuned fold on terms;
wenzelm
parents: 16850
diff changeset
  1052
         val ps = map (apsnd SOME) (fold Term.add_frees (prop :: hyps) []);
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1053
         val [env] = unify_parms ctxt all_params [ps];
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1054
         val th' = inst_thm ctxt env th;
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1055
       in th' end;
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1056
    val final_elemss = map (fn ((id, mode), elems) =>
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1057
         ((id, map_mode (map inst_th) mode), elems)) elemss';
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1058
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1059
  in ((prev_idents @ idents, syntax), final_elemss) end;
12046
a404358fd965 locale elements;
wenzelm
parents: 12014
diff changeset
  1060
12510
172d18ec3b54 proper treatment of internal parameters;
wenzelm
parents: 12502
diff changeset
  1061
end;
172d18ec3b54 proper treatment of internal parameters;
wenzelm
parents: 12502
diff changeset
  1062
12070
c72fe1edc9e7 proper treatment of local syntax;
wenzelm
parents: 12063
diff changeset
  1063
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1064
(* activate elements *)
12273
7fb9840d358d beginnings of actual locale expressions;
wenzelm
parents: 12263
diff changeset
  1065
12510
172d18ec3b54 proper treatment of internal parameters;
wenzelm
parents: 12502
diff changeset
  1066
local
172d18ec3b54 proper treatment of internal parameters;
wenzelm
parents: 12502
diff changeset
  1067
13399
c136276dc847 support locale ``views'' (for cumulative predicates);
wenzelm
parents: 13394
diff changeset
  1068
fun export_axioms axs _ hyps th =
c136276dc847 support locale ``views'' (for cumulative predicates);
wenzelm
parents: 13394
diff changeset
  1069
  th |> Drule.satisfy_hyps axs
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1070
     (* CB: replace meta-hyps, using axs, by a single meta-hyp. *)
13399
c136276dc847 support locale ``views'' (for cumulative predicates);
wenzelm
parents: 13394
diff changeset
  1071
  |> Drule.implies_intr_list (Library.drop (length axs, hyps))
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1072
     (* CB: turn remaining hyps into assumptions. *)
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1073
  |> Seq.single
12263
6f2acf10e2a2 locale expressions;
wenzelm
parents: 12143
diff changeset
  1074
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1075
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1076
(* NB: derived ids contain only facts at this stage *)
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1077
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1078
fun activate_elem _ ((ctxt, mode), Fixes fixes) =
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1079
      ((ctxt |> ProofContext.add_fixes fixes, mode), [])
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1080
  | activate_elem _ ((ctxt, mode), Constrains _) =
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1081
      ((ctxt, mode), [])
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1082
  | activate_elem _ ((ctxt, Assumed axs), Assumes asms) =
13399
c136276dc847 support locale ``views'' (for cumulative predicates);
wenzelm
parents: 13394
diff changeset
  1083
      let
17109
606c269d1e26 added add_locale_context(_i), which returns the body context for presentation;
wenzelm
parents: 17096
diff changeset
  1084
        val asms' = Attrib.map_specs (Attrib.context_attribute_i ctxt) asms;
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1085
        val ts = List.concat (map (map #1 o #2) asms');
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1086
        val (ps, qs) = splitAt (length ts, axs);
13420
39fca1e5818a removed unused locale_facts(_i);
wenzelm
parents: 13415
diff changeset
  1087
        val (ctxt', _) =
13399
c136276dc847 support locale ``views'' (for cumulative predicates);
wenzelm
parents: 13394
diff changeset
  1088
          ctxt |> ProofContext.fix_frees ts
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1089
          |> ProofContext.assume_i (export_axioms ps) asms';
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1090
      in ((ctxt', Assumed qs), []) end
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1091
  | activate_elem _ ((ctxt, Derived ths), Assumes asms) =
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1092
      ((ctxt, Derived ths), [])
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1093
  | activate_elem _ ((ctxt, Assumed axs), Defines defs) =
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  1094
      let
17109
606c269d1e26 added add_locale_context(_i), which returns the body context for presentation;
wenzelm
parents: 17096
diff changeset
  1095
        val defs' = Attrib.map_specs (Attrib.context_attribute_i ctxt) defs;
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  1096
        val (ctxt', _) =
13399
c136276dc847 support locale ``views'' (for cumulative predicates);
wenzelm
parents: 13394
diff changeset
  1097
        ctxt |> ProofContext.assume_i ProofContext.export_def
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1098
          (defs' |> map (fn ((name, atts), (t, ps)) =>
13399
c136276dc847 support locale ``views'' (for cumulative predicates);
wenzelm
parents: 13394
diff changeset
  1099
            let val (c, t') = ProofContext.cert_def ctxt t
c136276dc847 support locale ``views'' (for cumulative predicates);
wenzelm
parents: 13394
diff changeset
  1100
            in ((if name = "" then Thm.def_name c else name, atts), [(t', (ps, []))]) end))
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1101
      in ((ctxt', Assumed axs), []) end
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1102
  | activate_elem _ ((ctxt, Derived ths), Defines defs) =
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1103
      ((ctxt, Derived ths), [])
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1104
  | activate_elem is_ext ((ctxt, mode), Notes facts) =
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  1105
      let
17109
606c269d1e26 added add_locale_context(_i), which returns the body context for presentation;
wenzelm
parents: 17096
diff changeset
  1106
        val facts' = Attrib.map_facts (Attrib.context_attribute_i ctxt) facts;
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1107
        val (ctxt', res) = ctxt |> ProofContext.note_thmss_i facts';
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1108
      in ((ctxt', mode), if is_ext then res else []) end;
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
  1109
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1110
fun activate_elems (((name, ps), mode), elems) ctxt =
17033
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  1111
  let
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  1112
    val ((ctxt', _), res) =
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  1113
        foldl_map (activate_elem (name = "")) ((ProofContext.qualified_names ctxt, mode), elems)
13399
c136276dc847 support locale ``views'' (for cumulative predicates);
wenzelm
parents: 13394
diff changeset
  1114
      handle ProofContext.CONTEXT (msg, ctxt) => err_in_locale ctxt msg [(name, map fst ps)]
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1115
    val ctxt'' = if name = "" then ctxt'
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1116
          else let
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1117
              val ps' = map (fn (n, SOME T) => Free (n, T)) ps;
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1118
              val ctxt'' = put_local_registration (name, ps') ("", []) ctxt'
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1119
            in case mode of
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1120
                   Assumed axs => fold (fn ax => fn ctxt =>
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1121
                      add_local_witness (name, ps')
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1122
                       (Thm.assume (Thm.cprop_of ax)) ctxt) axs ctxt''
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1123
                 | Derived ths => fold (fn th => fn ctxt =>
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1124
                     add_local_witness (name, ps') th ctxt) ths ctxt''
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1125
            end
16144
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1126
  in (ProofContext.restore_naming ctxt ctxt'', res) end;
13399
c136276dc847 support locale ``views'' (for cumulative predicates);
wenzelm
parents: 13394
diff changeset
  1127
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1128
fun activate_elemss prep_facts =
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1129
    fold_map (fn (((name, ps), mode), raw_elems) => fn ctxt =>
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1130
      let
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1131
        val elems = map (prep_facts ctxt) raw_elems;
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1132
        val (ctxt', res) = apsnd List.concat
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1133
            (activate_elems (((name, ps), mode), elems) ctxt);
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1134
        val elems' = map (map_attrib_elem Args.closure) elems;
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1135
      in ((((name, ps), elems'), res), ctxt') end);
12834
e5bec3268932 added locale_facts(_i) interface (useful for simple ML proof tools);
wenzelm
parents: 12806
diff changeset
  1136
12546
wenzelm
parents: 12532
diff changeset
  1137
in
wenzelm
parents: 12532
diff changeset
  1138
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1139
(* CB: activate_facts prep_facts (ctxt, elemss),
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1140
   where elemss is a list of pairs consisting of identifiers and
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1141
   context elements, extends ctxt by the context elements yielding
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1142
   ctxt' and returns (ctxt', (elemss', facts)).
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1143
   Identifiers in the argument are of the form ((name, ps), axs) and
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1144
   assumptions use the axioms in the identifiers to set up exporters
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1145
   in ctxt'.  elemss' does not contain identifiers and is obtained
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1146
   from elemss and the intermediate context with prep_facts.
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1147
   If read_facts or cert_facts is used for prep_facts, these also remove
14508
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1148
   the internal/external markers from elemss. *)
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1149
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1150
fun activate_facts prep_facts (ctxt, args) =
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1151
    let
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1152
      val (res, ctxt') = activate_elemss prep_facts args ctxt;
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1153
    in
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1154
      (ctxt', apsnd List.concat (split_list res))
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1155
    end;
12546
wenzelm
parents: 12532
diff changeset
  1156
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1157
fun activate_note prep_facts (ctxt, args) =
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1158
  let
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1159
    val (ctxt', ([(_, [Notes args'])], facts)) =
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1160
      activate_facts prep_facts (ctxt, [((("", []), Assumed []), [Ext (Notes args)])]);
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1161
  in (ctxt', (args', facts)) end;
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1162
12510
172d18ec3b54 proper treatment of internal parameters;
wenzelm
parents: 12502
diff changeset
  1163
end;
172d18ec3b54 proper treatment of internal parameters;
wenzelm
parents: 12502
diff changeset
  1164
12307
459aa05af6be qualify imported facts;
wenzelm
parents: 12289
diff changeset
  1165
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1166
(* register elements *)
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1167
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1168
(* not used
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1169
fun register_elems (((_, ps), (((name, ax_ps), axs), _)), ctxt) =
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1170
  if name = "" then ctxt
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1171
      else let val ps' = map (fn (n, SOME T) => Free (n, T)) ax_ps
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1172
          val ctxt' = put_local_registration (name, ps') ("", []) ctxt
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1173
        in foldl (fn (ax, ctxt) =>
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1174
          add_local_witness (name, ps') ax ctxt) ctxt' axs
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1175
        end;
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1176
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1177
fun register_elemss id_elemss ctxt = 
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1178
  foldl register_elems ctxt id_elemss;
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1179
*)
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1180
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1181
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1182
(** prepare context elements **)
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1183
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1184
(* expressions *)
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1185
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1186
fun intern_expr thy (Locale xname) = Locale (intern thy xname)
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1187
  | intern_expr thy (Merge exprs) = Merge (map (intern_expr thy) exprs)
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1188
  | intern_expr thy (Rename (expr, xs)) = Rename (intern_expr thy expr, xs);
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1189
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1190
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1191
(* parameters *)
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
  1192
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
  1193
local
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
  1194
16169
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1195
fun prep_parms prep_vars ctxt parms =
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1196
  let val vars = snd (foldl_map prep_vars (ctxt, map (fn (x, T) => ([x], T)) parms))
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1197
  in map (fn ([x'], T') => (x', T')) vars end;
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1198
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1199
in
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1200
16169
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1201
fun read_parms x = prep_parms ProofContext.read_vars x;
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1202
fun cert_parms x = prep_parms ProofContext.cert_vars x;
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1203
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1204
end;
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1205
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1206
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1207
(* propositions and bindings *)
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1208
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1209
(* flatten (ctxt, prep_expr) ((ids, syn), expr)
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1210
   normalises expr (which is either a locale
14508
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1211
   expression or a single context element) wrt.
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1212
   to the list ids of already accumulated identifiers.
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1213
   It returns (ids', syn', elemss) where ids' is an extension of ids
14508
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1214
   with identifiers generated for expr, and elemss is the list of
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1215
   context elements generated from expr.
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1216
   syn and syn' are symtabs mapping parameter names to their syntax.  syn'
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1217
   is an extension of syn.
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1218
   For details, see flatten_expr.
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1219
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  1220
   Additionally, for a locale expression, the elems are grouped into a single
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  1221
   Int; individual context elements are marked Ext.  In this case, the
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  1222
   identifier-like information of the element is as follows:
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  1223
   - for Fixes: (("", ps), []) where the ps have type info NONE
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  1224
   - for other elements: (("", []), []).
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1225
   The implementation of activate_facts relies on identifier names being
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1226
   empty strings for external elements.
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  1227
*)
14508
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1228
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1229
fun flatten (ctxt, _) ((ids, syn), Elem (Fixes fixes)) = let
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1230
	val ids' = ids @ [(("", map #1 fixes), ([], Assumed []))]
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1231
      in
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1232
	((ids',
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1233
	 merge_syntax ctxt ids'
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1234
	   (syn, Symtab.make (map (fn fx => (#1 fx, #3 fx)) fixes))
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1235
	   handle Symtab.DUPS xs => err_in_locale ctxt
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1236
	     ("Conflicting syntax for parameters: " ^ commas_quote xs)
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1237
             (map #1 ids')),
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1238
	 [((("", map (rpair NONE o #1) fixes), Assumed []), Ext (Fixes fixes))])
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1239
      end
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1240
  | flatten _ ((ids, syn), Elem elem) =
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1241
      ((ids @ [(("", []), ([], Assumed []))], syn), [((("", []), Assumed []), Ext elem)])
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1242
  | flatten (ctxt, prep_expr) ((ids, syn), Expr expr) =
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1243
      apsnd (map (apsnd Int)) (flatten_expr ctxt ((ids, syn), prep_expr expr));
14508
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1244
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1245
local
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1246
12839
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1247
local
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1248
12727
330cb92aaea3 unify_frozen: proper use of maxidx';
wenzelm
parents: 12711
diff changeset
  1249
fun declare_int_elem (ctxt, Fixes fixes) =
12575
34985eee55b1 fixed inst_thm: proper domain of env;
wenzelm
parents: 12546
diff changeset
  1250
      (ctxt |> ProofContext.add_fixes (map (fn (x, T, mx) =>
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
  1251
        (x, Option.map (Term.map_type_tfree (TypeInfer.param 0)) T, mx)) fixes), [])
12727
330cb92aaea3 unify_frozen: proper use of maxidx';
wenzelm
parents: 12711
diff changeset
  1252
  | declare_int_elem (ctxt, _) = (ctxt, []);
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1253
16169
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1254
fun declare_ext_elem prep_parms (ctxt, Fixes fixes) =
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1255
      let
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1256
        val parms = map (fn (x, T, _) => (x, T)) fixes;
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1257
        val parms' = prep_parms ctxt parms;
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1258
        val fixes' = map (fn ((x, T), (_, _, mx)) => (x, T, mx)) (parms' ~~ fixes);
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1259
      in (ctxt |> ProofContext.add_fixes fixes', []) end
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1260
  | declare_ext_elem prep_parms (ctxt, Constrains csts) =
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1261
      let
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1262
        val parms = map (fn (x, T) => (x, SOME T)) csts;
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1263
        val parms' = prep_parms ctxt parms;
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1264
        val ts = map (fn (x, SOME T) => Free (x, T)) parms';
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1265
      in (Library.fold ProofContext.declare_term ts ctxt, []) end
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1266
  | declare_ext_elem _ (ctxt, Assumes asms) = (ctxt, map #2 asms)
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1267
  | declare_ext_elem _ (ctxt, Defines defs) = (ctxt, map (fn (_, (t, ps)) => [(t, (ps, []))]) defs)
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1268
  | declare_ext_elem _ (ctxt, Notes facts) = (ctxt, []);
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1269
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1270
fun declare_elems prep_parms (ctxt, (((name, ps), Assumed _), elems)) =
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1271
    let val (ctxt', propps) =
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1272
      (case elems of
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1273
        Int es => foldl_map declare_int_elem (ctxt, es)
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1274
      | Ext e => foldl_map (declare_ext_elem prep_parms) (ctxt, [e]))
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1275
      handle ProofContext.CONTEXT (msg, ctxt) =>
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1276
        err_in_locale ctxt msg [(name, map fst ps)]
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1277
    in (ctxt', propps) end
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1278
  | declare_elems _ (ctxt, ((_, Derived _), elems)) = (ctxt, []);
12727
330cb92aaea3 unify_frozen: proper use of maxidx';
wenzelm
parents: 12711
diff changeset
  1279
12839
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1280
in
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1281
14215
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
  1282
(* CB: only called by prep_elemss. *)
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
  1283
16169
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1284
fun declare_elemss prep_parms fixed_params raw_elemss ctxt =
12727
330cb92aaea3 unify_frozen: proper use of maxidx';
wenzelm
parents: 12711
diff changeset
  1285
  let
14215
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
  1286
    (* CB: fix of type bug of goal in target with context elements.
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
  1287
       Parameters new in context elements must receive types that are
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
  1288
       distinct from types of parameters in target (fixed_params).  *)
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
  1289
    val ctxt_with_fixed =
16028
a2c790d145ba fold ProofContext.declare_term;
wenzelm
parents: 15842
diff changeset
  1290
      fold ProofContext.declare_term (map Free fixed_params) ctxt;
12727
330cb92aaea3 unify_frozen: proper use of maxidx';
wenzelm
parents: 12711
diff changeset
  1291
    val int_elemss =
330cb92aaea3 unify_frozen: proper use of maxidx';
wenzelm
parents: 12711
diff changeset
  1292
      raw_elemss
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
  1293
      |> List.mapPartial (fn (id, Int es) => SOME (id, es) | _ => NONE)
14215
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
  1294
      |> unify_elemss ctxt_with_fixed fixed_params;
12727
330cb92aaea3 unify_frozen: proper use of maxidx';
wenzelm
parents: 12711
diff changeset
  1295
    val (_, raw_elemss') =
330cb92aaea3 unify_frozen: proper use of maxidx';
wenzelm
parents: 12711
diff changeset
  1296
      foldl_map (fn ((_, es) :: elemss, (id, Int _)) => (elemss, (id, Int es)) | x => x)
330cb92aaea3 unify_frozen: proper use of maxidx';
wenzelm
parents: 12711
diff changeset
  1297
        (int_elemss, raw_elemss);
16169
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1298
  in foldl_map (declare_elems prep_parms) (ctxt, raw_elemss') end;
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1299
12839
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1300
end;
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1301
12839
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1302
local
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1303
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  1304
(* CB: normalise Assumes and Defines wrt. previous definitions *)
14508
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1305
12839
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1306
val norm_term = Envir.beta_norm oo Term.subst_atomic;
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1307
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1308
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  1309
(* CB: following code (abstract_term, abstract_thm, bind_def)
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  1310
   used in eval_text for Defines elements. *)
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  1311
13336
1bd21b082466 tuned add_thmss;
wenzelm
parents: 13308
diff changeset
  1312
fun abstract_term eq =    (*assumes well-formedness according to ProofContext.cert_def*)
12839
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1313
  let
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1314
    val body = Term.strip_all_body eq;
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1315
    val vars = map Free (Term.rename_wrt_term body (Term.strip_all_vars eq));
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1316
    val (lhs, rhs) = Logic.dest_equals (Term.subst_bounds (vars, body));
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1317
    val (f, xs) = Term.strip_comb lhs;
13336
1bd21b082466 tuned add_thmss;
wenzelm
parents: 13308
diff changeset
  1318
    val eq' = Term.list_abs_free (map Term.dest_Free xs, rhs);
1bd21b082466 tuned add_thmss;
wenzelm
parents: 13308
diff changeset
  1319
  in (Term.dest_Free f, eq') end;
1bd21b082466 tuned add_thmss;
wenzelm
parents: 13308
diff changeset
  1320
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1321
fun abstract_thm thy eq =
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1322
  Thm.assume (Thm.cterm_of thy eq) |> Drule.gen_all |> Drule.abs_def;
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
  1323
13336
1bd21b082466 tuned add_thmss;
wenzelm
parents: 13308
diff changeset
  1324
fun bind_def ctxt (name, ps) ((xs, env, ths), eq) =
12839
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1325
  let
13336
1bd21b082466 tuned add_thmss;
wenzelm
parents: 13308
diff changeset
  1326
    val ((y, T), b) = abstract_term eq;
13308
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1327
    val b' = norm_term env b;
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1328
    val th = abstract_thm (ProofContext.theory_of ctxt) eq;
13308
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1329
    fun err msg = err_in_locale ctxt (msg ^ ": " ^ quote y) [(name, map fst ps)];
12839
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1330
  in
13308
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1331
    conditional (exists (equal y o #1) xs) (fn () =>
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1332
      err "Attempt to define previously specified variable");
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1333
    conditional (exists (fn (Free (y', _), _) => y = y' | _ => false) env) (fn () =>
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1334
      err "Attempt to redefine variable");
16861
7446b4be013b tuned fold on terms;
wenzelm
parents: 16850
diff changeset
  1335
    (Term.add_frees b' xs, (Free (y, T), b') :: env, th :: ths)
12839
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1336
  end;
12575
34985eee55b1 fixed inst_thm: proper domain of env;
wenzelm
parents: 12546
diff changeset
  1337
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1338
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1339
(* CB: for finish_elems (Int and Ext),
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1340
   extracts specification, only of assumed elements *)
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1341
13308
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1342
fun eval_text _ _ _ (text, Fixes _) = text
16169
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1343
  | eval_text _ _ _ (text, Constrains _) = text
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1344
  | eval_text _ (_, Assumed _) is_ext ((((exts, exts'), (ints, ints')), (xs, env, defs)), Assumes asms) =
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1345
      let
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
  1346
        val ts = List.concat (map (map #1 o #2) asms);
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1347
        val ts' = map (norm_term env) ts;
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1348
        val spec' =
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1349
          if is_ext then ((exts @ ts, exts' @ ts'), (ints, ints'))
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1350
          else ((exts, exts'), (ints @ ts, ints' @ ts'));
16861
7446b4be013b tuned fold on terms;
wenzelm
parents: 16850
diff changeset
  1351
      in (spec', (fold Term.add_frees ts' xs, env, defs)) end
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1352
  | eval_text _ (_, Derived _) _ (text, Assumes _) = text
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1353
  | eval_text ctxt (id, Assumed _) _ ((spec, binds), Defines defs) =
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
  1354
      (spec, Library.foldl (bind_def ctxt id) (binds, map (#1 o #2) defs))
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1355
  | eval_text _ (_, Derived _) _ (text, Defines _) = text
13308
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1356
  | eval_text _ _ _ (text, Notes _) = text;
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1357
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1358
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1359
(* for finish_elems (Int),
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1360
   remove redundant elements of derived identifiers,
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1361
   turn assumptions and definitions into facts,
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1362
   adjust hypotheses of facts using witness theorems *)
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1363
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
  1364
fun finish_derived _ wits _ (Notes facts) = (Notes facts)
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
  1365
      |> map_values I I (Drule.satisfy_hyps wits) |> SOME;
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
  1366
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
  1367
fun finish_derived _ _ (Assumed _) (Fixes fixes) = SOME (Fixes fixes)
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
  1368
  | finish_derived _ _ (Assumed _) (Constrains csts) = SOME (Constrains csts)
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
  1369
  | finish_derived _ _ (Assumed _) (Assumes asms) = SOME (Assumes asms)
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
  1370
  | finish_derived _ _ (Assumed _) (Defines defs) = SOME (Defines defs)
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
  1371
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1372
  | finish_derived _ _ (Derived _) (Fixes _) = NONE
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1373
  | finish_derived _ _ (Derived _) (Constrains _) = NONE
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1374
  | finish_derived sign wits (Derived _) (Assumes asms) = asms
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
  1375
      |> map (apsnd (map (fn (a, _) => ([Thm.assume (cterm_of sign a)], []))))
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
  1376
      |> Notes |> map_values I I (Drule.satisfy_hyps wits) |> SOME
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1377
  | finish_derived sign wits (Derived _) (Defines defs) = defs
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
  1378
      |> map (apsnd (fn (d, _) => [([Thm.assume (cterm_of sign d)], [])]))
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
  1379
      |> Notes |> map_values I I (Drule.satisfy_hyps wits) |> SOME
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1380
17096
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
  1381
  | finish_derived _ wits _ (Notes facts) = (Notes facts)
8327b71282ce Improved generation of witnesses in interpretation.
ballarin
parents: 17033
diff changeset
  1382
      |> map_values I I (Drule.satisfy_hyps wits) |> SOME;
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1383
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1384
(* CB: for finish_elems (Ext) *)
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1385
13308
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1386
fun closeup _ false elem = elem
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1387
  | closeup ctxt true elem =
12839
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1388
      let
13308
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1389
        fun close_frees t =
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1390
          let val frees = rev (filter_out (ProofContext.is_fixed ctxt o #1)
16861
7446b4be013b tuned fold on terms;
wenzelm
parents: 16850
diff changeset
  1391
            (Term.add_frees t []))
13308
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1392
          in Term.list_all_free (frees, t) end;
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1393
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1394
        fun no_binds [] = []
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1395
          | no_binds _ =
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1396
              raise ProofContext.CONTEXT ("Illegal term bindings in locale element", ctxt);
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1397
      in
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1398
        (case elem of
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1399
          Assumes asms => Assumes (asms |> map (fn (a, propps) =>
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1400
            (a, map (fn (t, (ps, qs)) => (close_frees t, (no_binds ps, no_binds qs))) propps)))
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1401
        | Defines defs => Defines (defs |> map (fn (a, (t, ps)) =>
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1402
            (a, (close_frees (#2 (ProofContext.cert_def ctxt t)), no_binds ps))))
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1403
        | e => e)
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1404
      end;
12839
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1405
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
  1406
12839
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1407
fun finish_ext_elem parms _ (Fixes fixes, _) = Fixes (map (fn (x, _, mx) =>
17271
2756a73f63a5 introduced some new-style AList operations
haftmann
parents: 17257
diff changeset
  1408
      (x, AList.lookup (op =) parms x, mx)) fixes)
16169
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1409
  | finish_ext_elem parms _ (Constrains csts, _) =
17271
2756a73f63a5 introduced some new-style AList operations
haftmann
parents: 17257
diff changeset
  1410
      Constrains (map (fn (x, _) => (x, (the o AList.lookup (op =) parms) x)) csts)
12839
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1411
  | finish_ext_elem _ close (Assumes asms, propp) =
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1412
      close (Assumes (map #1 asms ~~ propp))
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1413
  | finish_ext_elem _ close (Defines defs, propp) =
12727
330cb92aaea3 unify_frozen: proper use of maxidx';
wenzelm
parents: 12711
diff changeset
  1414
      close (Defines (map #1 defs ~~ map (fn [(t, (ps, []))] => (t, ps)) propp))
12839
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1415
  | finish_ext_elem _ _ (Notes facts, _) = Notes facts;
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1416
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1417
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1418
(* CB: finish_parms introduces type info from parms to identifiers *)
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15456
diff changeset
  1419
(* CB: only needed for types that have been NONE so far???
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1420
   If so, which are these??? *)
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1421
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1422
fun finish_parms parms (((name, ps), mode), elems) =
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1423
  (((name, map (fn (x, _) => (x, assoc (parms, x))) ps), mode), elems);
12839
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1424
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1425
fun finish_elems ctxt parms _ ((text, wits), ((id, Int e), _)) =
12839
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1426
      let
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1427
        val [(id' as (_, mode), es)] = unify_elemss ctxt parms [(id, e)];
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1428
        val wits' = case mode of Assumed _ => wits | Derived ths => wits @ ths;
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
  1429
        val text' = Library.foldl (eval_text ctxt id' false) (text, es);
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1430
        val es' = List.mapPartial
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1431
              (finish_derived (ProofContext.theory_of ctxt) wits' mode) es;
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1432
      in ((text', wits'), (id', map Int es')) end
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1433
  | finish_elems ctxt parms do_close ((text, wits), ((id, Ext e), [propp])) =
13308
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1434
      let
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1435
        val e' = finish_ext_elem parms (closeup ctxt do_close) (e, propp);
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1436
        val text' = eval_text ctxt id true (text, e');
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1437
      in ((text', wits), (id, [Ext e'])) end
12839
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1438
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1439
in
12510
172d18ec3b54 proper treatment of internal parameters;
wenzelm
parents: 12502
diff changeset
  1440
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1441
(* CB: only called by prep_elemss *)
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1442
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1443
fun finish_elemss ctxt parms do_close =
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1444
  foldl_map (apsnd (finish_parms parms) o finish_elems ctxt parms do_close);
12839
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1445
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1446
end;
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1447
16736
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
  1448
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
  1449
(* CB: type inference and consistency checks for locales.
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
  1450
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
  1451
   Works by building a context (through declare_elemss), extracting the
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
  1452
   required information and adjusting the context elements (finish_elemss).
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
  1453
   Can also universally close free vars in assms and defs.  This is only
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1454
   needed for Ext elements and controlled by parameter do_close.
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1455
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1456
   Only elements of assumed identifiers are considered.
16736
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
  1457
*)
15127
2550a5578d39 Disallowed "includes" in locale declarations.
ballarin
parents: 15104
diff changeset
  1458
16169
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1459
fun prep_elemss prep_parms prepp do_close context fixed_params raw_elemss raw_concl =
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1460
  let
15127
2550a5578d39 Disallowed "includes" in locale declarations.
ballarin
parents: 15104
diff changeset
  1461
    (* CB: contexts computed in the course of this function are discarded.
2550a5578d39 Disallowed "includes" in locale declarations.
ballarin
parents: 15104
diff changeset
  1462
       They are used for type inference and consistency checks only. *)
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1463
    (* CB: fixed_params are the parameters (with types) of the target locale,
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1464
       empty list if there is no target. *)
14508
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1465
    (* CB: raw_elemss are list of pairs consisting of identifiers and
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1466
       context elements, the latter marked as internal or external. *)
16169
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1467
    val (raw_ctxt, raw_proppss) = declare_elemss prep_parms fixed_params raw_elemss context;
14508
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1468
    (* CB: raw_ctxt is context with additional fixed variables derived from
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1469
       the fixes elements in raw_elemss,
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1470
       raw_proppss contains assumptions and definitions from the
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1471
       external elements in raw_elemss. *)
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
  1472
    val raw_propps = map List.concat raw_proppss;
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
  1473
    val raw_propp = List.concat raw_propps;
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1474
16028
a2c790d145ba fold ProofContext.declare_term;
wenzelm
parents: 15842
diff changeset
  1475
    (* CB: add type information from fixed_params to context (declare_term) *)
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1476
    (* CB: process patterns (conclusion and external elements only) *)
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1477
    val (ctxt, all_propp) =
16028
a2c790d145ba fold ProofContext.declare_term;
wenzelm
parents: 15842
diff changeset
  1478
      prepp (fold ProofContext.declare_term (map Free fixed_params) raw_ctxt, raw_concl @ raw_propp);
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1479
    (* CB: add type information from conclusion and external elements
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1480
       to context *)
16028
a2c790d145ba fold ProofContext.declare_term;
wenzelm
parents: 15842
diff changeset
  1481
    val ctxt = fold ProofContext.declare_term (List.concat (map (map fst) all_propp)) ctxt;
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
  1482
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1483
    (* CB: resolve schematic variables (patterns) in conclusion and external
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1484
       elements. *)
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1485
    val all_propp' = map2 (op ~~)
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1486
      (#1 (#2 (ProofContext.bind_propp_schematic_i (ctxt, all_propp))), map (map snd) all_propp);
13629
a46362d2b19b take/drop -> splitAt
nipkow
parents: 13460
diff changeset
  1487
    val (concl, propp) = splitAt(length raw_concl, all_propp');
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1488
    val propps = unflat raw_propps propp;
12839
584a3e0b00f2 reorganized code for predicate text;
wenzelm
parents: 12834
diff changeset
  1489
    val proppss = map (uncurry unflat) (raw_proppss ~~ propps);
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
  1490
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1491
    (* CB: obtain all parameters from identifier part of raw_elemss *)
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1492
    val xs = map #1 (params_of' raw_elemss);
12727
330cb92aaea3 unify_frozen: proper use of maxidx';
wenzelm
parents: 12711
diff changeset
  1493
    val typing = unify_frozen ctxt 0
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1494
      (map (ProofContext.default_type raw_ctxt) xs)
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1495
      (map (ProofContext.default_type ctxt) xs);
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1496
    val parms = param_types (xs ~~ typing);
14508
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1497
    (* CB: parms are the parameters from raw_elemss, with correct typing. *)
12273
7fb9840d358d beginnings of actual locale expressions;
wenzelm
parents: 12263
diff changeset
  1498
14508
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1499
    (* CB: extract information from assumes and defines elements
16169
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1500
       (fixes, constrains and notes in raw_elemss don't have an effect on
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1501
       text and elemss), compute final form of context elements. *)
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1502
    val ((text, _), elemss) = finish_elemss ctxt parms do_close
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1503
      ((((([], []), ([], [])), ([], [], [])), []), raw_elemss ~~ proppss);
14508
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1504
    (* CB: text has the following structure:
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1505
           (((exts, exts'), (ints, ints')), (xs, env, defs))
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1506
       where
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1507
         exts: external assumptions (terms in external assumes elements)
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1508
         exts': dito, normalised wrt. env
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1509
         ints: internal assumptions (terms in internal assumes elements)
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1510
         ints': dito, normalised wrt. env
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1511
         xs: the free variables in exts' and ints' and rhss of definitions,
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1512
           this includes parameters except defined parameters
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1513
         env: list of term pairs encoding substitutions, where the first term
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1514
           is a free variable; substitutions represent defines elements and
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1515
           the rhs is normalised wrt. the previous env
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1516
         defs: theorems representing the substitutions from defines elements
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1517
           (thms are normalised wrt. env).
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1518
       elemss is an updated version of raw_elemss:
16169
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1519
         - type info added to Fixes and modified in Constrains
14508
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1520
         - axiom and definition statement replaced by corresponding one
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1521
           from proppss in Assumes and Defines
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1522
         - Facts unchanged
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1523
       *)
13308
1dbed9ea764b clarified text content of locale body;
wenzelm
parents: 13297
diff changeset
  1524
  in ((parms, elemss, concl), text) end;
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
  1525
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
  1526
in
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
  1527
16169
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1528
fun read_elemss x = prep_elemss read_parms ProofContext.read_propp_schematic x;
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1529
fun cert_elemss x = prep_elemss cert_parms ProofContext.cert_propp_schematic x;
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1530
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1531
end;
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1532
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1533
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1534
(* facts and attributes *)
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1535
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1536
local
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1537
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1538
fun prep_name ctxt name =
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1539
  (* CB: reject qualified theorem names in locale declarations *)
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1540
  if NameSpace.is_qualified name then
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1541
    raise ProofContext.CONTEXT ("Illegal qualified name: " ^ quote name, ctxt)
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1542
  else name;
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1543
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1544
fun prep_facts _ _ ctxt (Int elem) =
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1545
      map_values I I (Thm.transfer (ProofContext.theory_of ctxt)) elem
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1546
  | prep_facts get intern ctxt (Ext elem) = elem |> map_elem
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1547
     {var = I, typ = I, term = I,
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1548
      name = prep_name ctxt,
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1549
      fact = get ctxt,
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1550
      attrib = Args.assignable o intern (ProofContext.theory_of ctxt)};
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1551
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1552
in
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1553
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1554
fun read_facts x = prep_facts ProofContext.get_thms Attrib.intern_src x;
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1555
fun cert_facts x = prep_facts (K I) (K I) x;
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1556
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1557
end;
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1558
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1559
12546
wenzelm
parents: 12532
diff changeset
  1560
(* full context statements: import + elements + conclusion *)
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1561
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1562
local
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1563
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1564
fun prep_context_statement prep_expr prep_elemss prep_facts
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1565
    do_close fixed_params import elements raw_concl context =
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1566
  let
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1567
    val thy = ProofContext.theory_of context;
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1568
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1569
    val ((import_ids, import_syn), raw_import_elemss) =
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1570
      flatten (context, prep_expr thy) (([], Symtab.empty), Expr import);
14215
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
  1571
    (* CB: normalise "includes" among elements *)
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1572
    val ((ids, syn), raw_elemsss) = foldl_map (flatten (context, prep_expr thy))
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1573
      ((import_ids, import_syn), elements);
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1574
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1575
    val raw_elemss = List.concat raw_elemsss;
14508
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1576
    (* CB: raw_import_elemss @ raw_elemss is the normalised list of
859b11514537 Experimental command for instantiation of locales in proof contexts:
ballarin
parents: 14446
diff changeset
  1577
       context elements obtained from import and elements. *)
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1578
    val ((parms, all_elemss, concl), (spec, (_, _, defs))) = prep_elemss do_close
13336
1bd21b082466 tuned add_thmss;
wenzelm
parents: 13308
diff changeset
  1579
      context fixed_params (raw_import_elemss @ raw_elemss) raw_concl;
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1580
    (* replace extended ids (for axioms) by ids *)
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1581
    val all_elemss' = map (fn (((_, ps), _), (((n, ps'), mode), elems)) =>
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1582
        (((n, map (fn p => (p, assoc (ps', p) |> valOf)) ps), mode), elems))
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1583
      (ids ~~ all_elemss);
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1584
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1585
    (* CB: all_elemss and parms contain the correct parameter types *)
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1586
    val (ps,qs) = splitAt(length raw_import_elemss, all_elemss')
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1587
    val (import_ctxt, (import_elemss, _)) =
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1588
      activate_facts prep_facts (context, ps);
14215
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
  1589
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1590
    val (ctxt, (elemss, _)) =
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1591
      activate_facts prep_facts (import_ctxt, qs);
15212
eb4343a0d571 Bug fixes.
ballarin
parents: 15206
diff changeset
  1592
    val stmt = gen_distinct Term.aconv
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1593
       (List.concat (map (fn ((_, Assumed axs), _) =>
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1594
         List.concat (map (#hyps o Thm.rep_thm) axs)
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  1595
                           | ((_, Derived _), _) => []) qs));
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1596
    val cstmt = map (cterm_of thy) stmt;
12834
e5bec3268932 added locale_facts(_i) interface (useful for simple ML proof tools);
wenzelm
parents: 12806
diff changeset
  1597
  in
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1598
    ((((import_ctxt, import_elemss), (ctxt, elemss, syn)), (parms, spec, defs)), (cstmt, concl))
12834
e5bec3268932 added locale_facts(_i) interface (useful for simple ML proof tools);
wenzelm
parents: 12806
diff changeset
  1599
  end;
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1600
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1601
val gen_context = prep_context_statement intern_expr read_elemss read_facts;
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1602
val gen_context_i = prep_context_statement (K I) cert_elemss cert_facts;
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1603
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1604
fun gen_statement prep_locale prep_ctxt raw_locale elems concl ctxt =
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1605
  let
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1606
    val thy = ProofContext.theory_of ctxt;
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1607
    val locale = Option.map (prep_locale thy) raw_locale;
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1608
    val (target_stmt, fixed_params, import) =
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15456
diff changeset
  1609
      (case locale of NONE => ([], [], empty)
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15456
diff changeset
  1610
      | SOME name =>
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1611
          let val {predicate = (stmt, _), params = (ps, _), ...} =
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1612
            the_locale thy name
16620
2a7f46324218 Proper treatment of beta-redexes in witness theorems.
ballarin
parents: 16458
diff changeset
  1613
          in (stmt, map fst ps, Locale name) end);
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1614
    val ((((locale_ctxt, locale_elemss), (elems_ctxt, _, _)), _), (elems_stmt, concl')) =
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1615
      prep_ctxt false fixed_params import elems concl ctxt;
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1616
  in (locale, (target_stmt, elems_stmt), locale_ctxt, elems_ctxt, concl') end;
13399
c136276dc847 support locale ``views'' (for cumulative predicates);
wenzelm
parents: 13394
diff changeset
  1617
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1618
in
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1619
15127
2550a5578d39 Disallowed "includes" in locale declarations.
ballarin
parents: 15104
diff changeset
  1620
(* CB: processing of locales for add_locale(_i) and print_locale *)
2550a5578d39 Disallowed "includes" in locale declarations.
ballarin
parents: 15104
diff changeset
  1621
  (* CB: arguments are: x->import, y->body (elements), z->context *)
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1622
fun read_context x y z = #1 (gen_context true [] x (map Elem y) [] z);
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1623
fun cert_context x y z = #1 (gen_context_i true [] x (map Elem y) [] z);
14215
ebf291f3b449 Improvements to Isar/Locales: premises generated by "includes" elements
ballarin
parents: 13629
diff changeset
  1624
15127
2550a5578d39 Disallowed "includes" in locale declarations.
ballarin
parents: 15104
diff changeset
  1625
(* CB: processing of locales for note_thmss(_i),
2550a5578d39 Disallowed "includes" in locale declarations.
ballarin
parents: 15104
diff changeset
  1626
   Proof.multi_theorem(_i) and antiquotations with option "locale" *)
12529
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1627
val read_context_statement = gen_statement intern gen_context;
d99716a53f59 simultaneous type-inference of complete context/statement specifications;
wenzelm
parents: 12514
diff changeset
  1628
val cert_context_statement = gen_statement (K I) gen_context_i;
12502
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
  1629
9e7f72e25022 beginning support for type instantiation;
wenzelm
parents: 12323
diff changeset
  1630
end;
11896
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
  1631
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
  1632
13336
1bd21b082466 tuned add_thmss;
wenzelm
parents: 13308
diff changeset
  1633
(** define locales **)
1bd21b082466 tuned add_thmss;
wenzelm
parents: 13308
diff changeset
  1634
1bd21b082466 tuned add_thmss;
wenzelm
parents: 13308
diff changeset
  1635
(* print locale *)
12070
c72fe1edc9e7 proper treatment of local syntax;
wenzelm
parents: 12063
diff changeset
  1636
17228
19b460b39dad print_locale omits facts by default
ballarin
parents: 17221
diff changeset
  1637
fun print_locale thy show_facts import body =
12070
c72fe1edc9e7 proper treatment of local syntax;
wenzelm
parents: 12063
diff changeset
  1638
  let
12289
ec2dafd0a6a9 clarified locale operations (rename, merge);
wenzelm
parents: 12277
diff changeset
  1639
    val thy_ctxt = ProofContext.init thy;
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  1640
    val (((_, import_elemss), (ctxt, elemss, _)), _) = read_context import body thy_ctxt;
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
  1641
    val all_elems = List.concat (map #2 (import_elemss @ elemss));
12070
c72fe1edc9e7 proper treatment of local syntax;
wenzelm
parents: 12063
diff changeset
  1642
12307
459aa05af6be qualify imported facts;
wenzelm
parents: 12289
diff changeset
  1643
    val prt_typ = Pretty.quote o ProofContext.pretty_typ ctxt;
459aa05af6be qualify imported facts;
wenzelm
parents: 12289
diff changeset
  1644
    val prt_term = Pretty.quote o ProofContext.pretty_term ctxt;
459aa05af6be qualify imported facts;
wenzelm
parents: 12289
diff changeset
  1645
    val prt_thm = Pretty.quote o ProofContext.pretty_thm ctxt;
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1646
    val prt_atts = Args.pretty_attribs ctxt;
12070
c72fe1edc9e7 proper treatment of local syntax;
wenzelm
parents: 12063
diff changeset
  1647
c72fe1edc9e7 proper treatment of local syntax;
wenzelm
parents: 12063
diff changeset
  1648
    fun prt_syn syn =
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15456
diff changeset
  1649
      let val s = (case syn of NONE => "(structure)" | SOME mx => Syntax.string_of_mixfix mx)
12575
34985eee55b1 fixed inst_thm: proper domain of env;
wenzelm
parents: 12546
diff changeset
  1650
      in if s = "" then [] else [Pretty.brk 2, Pretty.str s] end;
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15456
diff changeset
  1651
    fun prt_fix (x, SOME T, syn) = Pretty.block (Pretty.str (x ^ " ::") :: Pretty.brk 1 ::
12070
c72fe1edc9e7 proper treatment of local syntax;
wenzelm
parents: 12063
diff changeset
  1652
          prt_typ T :: Pretty.brk 1 :: prt_syn syn)
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15456
diff changeset
  1653
      | prt_fix (x, NONE, syn) = Pretty.block (Pretty.str x :: Pretty.brk 1 :: prt_syn syn);
16169
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1654
    fun prt_cst (x, T) = Pretty.block [Pretty.str (x ^ " ::"), prt_typ T];
12070
c72fe1edc9e7 proper treatment of local syntax;
wenzelm
parents: 12063
diff changeset
  1655
16346
baa7b5324fc1 NameSpace.extern_table;
wenzelm
parents: 16325
diff changeset
  1656
    fun prt_name name = Pretty.str (ProofContext.extern_thm ctxt name);
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1657
    fun prt_name_atts (name, atts) =
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1658
      if name = "" andalso null atts then []
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1659
      else [Pretty.block (Pretty.breaks (prt_name name :: prt_atts atts @ [Pretty.str ":"]))];
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1660
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1661
    fun prt_asm (a, ts) =
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1662
      Pretty.block (Pretty.breaks (prt_name_atts a @ map (prt_term o fst) ts));
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1663
    fun prt_def (a, (t, _)) =
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1664
      Pretty.block (Pretty.breaks (prt_name_atts a @ [prt_term t]));
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1665
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1666
    fun prt_fact (ths, []) = map prt_thm ths
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1667
      | prt_fact (ths, atts) =
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1668
          Pretty.enclose "(" ")" (Pretty.breaks (map prt_thm ths)) :: prt_atts atts;
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1669
    fun prt_note (a, ths) =
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1670
      Pretty.block (Pretty.breaks (List.concat (prt_name_atts a :: map prt_fact ths)));
12070
c72fe1edc9e7 proper treatment of local syntax;
wenzelm
parents: 12063
diff changeset
  1671
12289
ec2dafd0a6a9 clarified locale operations (rename, merge);
wenzelm
parents: 12277
diff changeset
  1672
    fun items _ [] = []
ec2dafd0a6a9 clarified locale operations (rename, merge);
wenzelm
parents: 12277
diff changeset
  1673
      | items prfx (x :: xs) = Pretty.block [Pretty.str prfx, Pretty.brk 1, x] :: items "  and" xs;
ec2dafd0a6a9 clarified locale operations (rename, merge);
wenzelm
parents: 12277
diff changeset
  1674
    fun prt_elem (Fixes fixes) = items "fixes" (map prt_fix fixes)
16169
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  1675
      | prt_elem (Constrains csts) = items "constrains" (map prt_cst csts)
12289
ec2dafd0a6a9 clarified locale operations (rename, merge);
wenzelm
parents: 12277
diff changeset
  1676
      | prt_elem (Assumes asms) = items "assumes" (map prt_asm asms)
ec2dafd0a6a9 clarified locale operations (rename, merge);
wenzelm
parents: 12277
diff changeset
  1677
      | prt_elem (Defines defs) = items "defines" (map prt_def defs)
17316
fc7cc8137b97 fixed printing of locales
ballarin
parents: 17271
diff changeset
  1678
      | prt_elem (Notes facts) = items "notes" (map prt_note facts);
12277
2b28d7dd91f5 improved ordering of evaluated elements;
wenzelm
parents: 12273
diff changeset
  1679
  in
17316
fc7cc8137b97 fixed printing of locales
ballarin
parents: 17271
diff changeset
  1680
    Pretty.big_list "context elements:" (all_elems
fc7cc8137b97 fixed printing of locales
ballarin
parents: 17271
diff changeset
  1681
      |> (if show_facts then I else filter (fn Notes _ => false | _ => true))
fc7cc8137b97 fixed printing of locales
ballarin
parents: 17271
diff changeset
  1682
      |> map (Pretty.chunks o prt_elem))
13336
1bd21b082466 tuned add_thmss;
wenzelm
parents: 13308
diff changeset
  1683
    |> Pretty.writeln
12277
2b28d7dd91f5 improved ordering of evaluated elements;
wenzelm
parents: 12273
diff changeset
  1684
  end;
12070
c72fe1edc9e7 proper treatment of local syntax;
wenzelm
parents: 12063
diff changeset
  1685
c72fe1edc9e7 proper treatment of local syntax;
wenzelm
parents: 12063
diff changeset
  1686
12706
05fa6a8a6320 removed add_thmss;
wenzelm
parents: 12702
diff changeset
  1687
16144
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1688
(** store results **)
12702
721b622d8967 add_thmss_hybrid;
wenzelm
parents: 12680
diff changeset
  1689
16144
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1690
(* note_thmss_qualified *)
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1691
17355
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  1692
fun theory_qualified name =
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  1693
  Theory.add_path (Sign.base_name name)
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  1694
  #> Theory.no_base_names;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  1695
14564
3667b4616e9a renamed have_thms to note_thms;
wenzelm
parents: 14528
diff changeset
  1696
fun note_thmss_qualified kind name args thy =
12706
05fa6a8a6320 removed add_thmss;
wenzelm
parents: 12702
diff changeset
  1697
  thy
17355
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  1698
  |> theory_qualified name
14564
3667b4616e9a renamed have_thms to note_thms;
wenzelm
parents: 14528
diff changeset
  1699
  |> PureThy.note_thmss_i (Drule.kind kind) args
16144
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1700
  |>> Theory.restore_naming thy;
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1701
12706
05fa6a8a6320 removed add_thmss;
wenzelm
parents: 12702
diff changeset
  1702
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1703
(* accesses of interpreted theorems *)
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1704
16144
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1705
local
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1706
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1707
(*fully qualified name in theory is T.p.r.n where
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1708
  T: theory name, p: interpretation prefix, r: renaming prefix, n: name*)
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1709
fun global_accesses _ [] = []
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1710
  | global_accesses "" [T, n] = [[T, n], [n]]
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1711
  | global_accesses "" [T, r, n] = [[T, r, n], [T, n], [r, n], [n]]
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1712
  | global_accesses _ [T, p, n] = [[T, p, n], [p, n]]
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1713
  | global_accesses _ [T, p, r, n] = [[T, p, r, n], [T, p, n], [p, r, n], [p, n]]
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1714
  | global_accesses _ names = error ("Bad name declaration " ^ quote (NameSpace.pack names));
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1715
16144
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1716
(*fully qualified name in context is p.r.n where
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1717
  p: interpretation prefix, r: renaming prefix, n: name*)
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1718
fun local_accesses _ [] = []
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1719
  | local_accesses "" [n] = [[n]]
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1720
  | local_accesses "" [r, n] = [[r, n], [n]]
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1721
  | local_accesses _ [p, n] = [[p, n]]
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1722
  | local_accesses _ [p, r, n] = [[p, r, n], [p, n]]
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1723
  | local_accesses _ names = error ("Bad name declaration " ^ quote (NameSpace.pack names));
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1724
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1725
in
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1726
16144
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1727
fun global_note_accesses_i kind prfx args thy =
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1728
  thy
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1729
  |> Theory.qualified_names
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1730
  |> Theory.custom_accesses (global_accesses prfx)
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1731
  |> PureThy.note_thmss_i kind args
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1732
  |>> Theory.restore_naming thy;
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1733
16144
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1734
fun local_note_accesses_i prfx args ctxt =
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1735
  ctxt
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1736
  |> ProofContext.qualified_names
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1737
  |> ProofContext.custom_accesses (local_accesses prfx)
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1738
  |> ProofContext.note_thmss_i args
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1739
  |>> ProofContext.restore_naming ctxt;
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1740
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1741
end;
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1742
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1743
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1744
(* collect witness theorems for global registration;
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1745
   requires parameters and flattened list of (assumed!) identifiers
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1746
   instead of recomputing it from the target *)
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1747
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1748
fun collect_global_witnesses thy parms ids vts = let
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1749
    val ts = map Logic.unvarify vts;
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1750
    val (parms, parmTs) = split_list parms;
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1751
    val parmvTs = map Type.varifyT parmTs;
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1752
    val vtinst = fold (Sign.typ_match thy) (parmvTs ~~ map Term.fastype_of ts) Vartab.empty;
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1753
    val tinst = Vartab.dest vtinst |> map (fn ((x, 0), (_, T)) => (x, T))
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1754
        |> Symtab.make;            
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1755
    (* replace parameter names in ids by instantiations *)
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1756
    val vinst = Symtab.make (parms ~~ vts);
17221
6cd180204582 curried_lookup/update;
wenzelm
parents: 17203
diff changeset
  1757
    fun vinst_names ps = map (the o Symtab.curried_lookup vinst) ps;
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1758
    val inst = Symtab.make (parms ~~ ts);
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1759
    val ids' = map (apsnd vinst_names) ids;
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1760
    val wits = List.concat (map (snd o valOf o get_global_registration thy) ids');
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1761
  in ((inst, tinst), wits) end;
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1762
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1763
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1764
(* store instantiations of args for all registered interpretations
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1765
   of the theory *)
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1766
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1767
fun note_thmss_registrations kind target args thy =
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  1768
  let
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1769
    val parms = the_locale thy target |> #params |> fst |> map fst;
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1770
    val ids = flatten (ProofContext.init thy, intern_expr thy)
17033
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  1771
      (([], Symtab.empty), Expr (Locale target)) |> fst |> fst
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  1772
      |> List.mapPartial (fn (id, (_, Assumed _)) => SOME id | _ => NONE)
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1773
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1774
    val regs = get_global_registrations thy target;
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1775
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1776
    (* add args to thy for all registrations *)
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  1777
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1778
    fun activate (thy, (vts, ((prfx, atts2), _))) =
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1779
      let
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1780
        val ((inst, tinst), prems) = collect_global_witnesses thy parms ids vts;
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1781
        val args' = map (fn ((n, atts), [(ths, [])]) =>
17033
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  1782
            ((NameSpace.qualified prfx n,
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1783
              map (Attrib.global_attribute_i thy)
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1784
                  (inst_tab_atts thy (inst, tinst) atts @ atts2)),
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1785
             [(map (Drule.standard o Drule.satisfy_hyps prems o
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  1786
                inst_tab_thm thy (inst, tinst)) ths, [])]))
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1787
          args;
16144
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  1788
      in global_note_accesses_i (Drule.kind kind) prfx args' thy |> fst end;
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1789
  in Library.foldl activate (thy, regs) end;
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  1790
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  1791
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15456
diff changeset
  1792
fun smart_note_thmss kind NONE = PureThy.note_thmss_i (Drule.kind kind)
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1793
  | smart_note_thmss kind (SOME loc) = note_thmss_qualified kind loc;
12958
99f5c4a37b29 added smart_have_thmss (global storage);
wenzelm
parents: 12862
diff changeset
  1794
99f5c4a37b29 added smart_have_thmss (global storage);
wenzelm
parents: 12862
diff changeset
  1795
99f5c4a37b29 added smart_have_thmss (global storage);
wenzelm
parents: 12862
diff changeset
  1796
local
99f5c4a37b29 added smart_have_thmss (global storage);
wenzelm
parents: 12862
diff changeset
  1797
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1798
(* add facts to locale in theory *)
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1799
12958
99f5c4a37b29 added smart_have_thmss (global storage);
wenzelm
parents: 12862
diff changeset
  1800
fun put_facts loc args thy =
99f5c4a37b29 added smart_have_thmss (global storage);
wenzelm
parents: 12862
diff changeset
  1801
  let
16736
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
  1802
    val {predicate, import, elems, params, regs} = the_locale thy loc;
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1803
    val note = Notes (map (fn ((a, atts), bs) =>
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1804
      ((a, atts), map (apfst (map (curry Thm.name_thm a))) bs)) args);
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1805
  in
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1806
    thy |> put_locale loc {predicate = predicate, import = import,
16736
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
  1807
      elems = elems @ [(note, stamp ())], params = params, regs = regs}
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1808
  end;
12958
99f5c4a37b29 added smart_have_thmss (global storage);
wenzelm
parents: 12862
diff changeset
  1809
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1810
(* add theorem to locale and theory,
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1811
   base for theorems (in loc) and declare (in loc) *)
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  1812
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1813
fun gen_note_thmss prep_locale prep_facts kind raw_loc args thy =
12706
05fa6a8a6320 removed add_thmss;
wenzelm
parents: 12702
diff changeset
  1814
  let
05fa6a8a6320 removed add_thmss;
wenzelm
parents: 12702
diff changeset
  1815
    val thy_ctxt = ProofContext.init thy;
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1816
    val loc = prep_locale thy raw_loc;
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1817
    val (_, (stmt, _), loc_ctxt, _, _) = cert_context_statement (SOME loc) [] [] thy_ctxt;
17355
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  1818
    val export = ProofContext.export_standard_view stmt loc_ctxt thy_ctxt;
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1819
17109
606c269d1e26 added add_locale_context(_i), which returns the body context for presentation;
wenzelm
parents: 17096
diff changeset
  1820
    val (ctxt', (args', facts)) = activate_note prep_facts (loc_ctxt, args);
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1821
    val facts' =
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1822
      map (rpair [] o #1 o #1) args' ~~
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1823
      map (single o Thm.no_attributes o map export o #2) facts;
17109
606c269d1e26 added add_locale_context(_i), which returns the body context for presentation;
wenzelm
parents: 17096
diff changeset
  1824
606c269d1e26 added add_locale_context(_i), which returns the body context for presentation;
wenzelm
parents: 17096
diff changeset
  1825
    val (thy', result) =
606c269d1e26 added add_locale_context(_i), which returns the body context for presentation;
wenzelm
parents: 17096
diff changeset
  1826
      thy
606c269d1e26 added add_locale_context(_i), which returns the body context for presentation;
wenzelm
parents: 17096
diff changeset
  1827
      |> put_facts loc args'
606c269d1e26 added add_locale_context(_i), which returns the body context for presentation;
wenzelm
parents: 17096
diff changeset
  1828
      |> note_thmss_registrations kind loc args'
606c269d1e26 added add_locale_context(_i), which returns the body context for presentation;
wenzelm
parents: 17096
diff changeset
  1829
      |> note_thmss_qualified kind loc facts';
606c269d1e26 added add_locale_context(_i), which returns the body context for presentation;
wenzelm
parents: 17096
diff changeset
  1830
  in ((thy', ctxt'), result) end;
12706
05fa6a8a6320 removed add_thmss;
wenzelm
parents: 12702
diff changeset
  1831
05fa6a8a6320 removed add_thmss;
wenzelm
parents: 12702
diff changeset
  1832
in
05fa6a8a6320 removed add_thmss;
wenzelm
parents: 12702
diff changeset
  1833
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1834
val note_thmss = gen_note_thmss intern read_facts;
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1835
val note_thmss_i = gen_note_thmss (K I) cert_facts;
12711
6a9412dd7d24 have_thmss vs. have_thmss_i;
wenzelm
parents: 12706
diff changeset
  1836
17355
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  1837
fun add_thmss kind loc args (ctxt, thy) =
12958
99f5c4a37b29 added smart_have_thmss (global storage);
wenzelm
parents: 12862
diff changeset
  1838
  let
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1839
    val (ctxt', (args', facts)) = activate_note cert_facts
17355
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  1840
      (ctxt, map (apsnd Thm.simple_fact) args);
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1841
    val thy' =
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1842
      thy
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1843
      |> put_facts loc args'
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1844
      |> note_thmss_registrations kind loc args';
17355
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  1845
  in (facts, (ctxt', thy')) end;
12702
721b622d8967 add_thmss_hybrid;
wenzelm
parents: 12680
diff changeset
  1846
12706
05fa6a8a6320 removed add_thmss;
wenzelm
parents: 12702
diff changeset
  1847
end;
12063
4c16bdee47d4 added add_locale(_i) and store_thm;
wenzelm
parents: 12058
diff changeset
  1848
11896
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
  1849
13336
1bd21b082466 tuned add_thmss;
wenzelm
parents: 13308
diff changeset
  1850
(* predicate text *)
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  1851
(* CB: generate locale predicates and delta predicates *)
13336
1bd21b082466 tuned add_thmss;
wenzelm
parents: 13308
diff changeset
  1852
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1853
local
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1854
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1855
(* introN: name of theorems for introduction rules of locale and
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1856
     delta predicates;
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1857
   axiomsN: name of theorem set with destruct rules for locale predicates,
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1858
     also name suffix of delta predicates. *)
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1859
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1860
val introN = "intro";
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1861
val axiomsN = "axioms";
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1862
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1863
fun atomize_spec thy ts =
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1864
  let
15574
b1d1b5bfc464 Removed practically all references to Library.foldr.
skalberg
parents: 15570
diff changeset
  1865
    val t = foldr1 Logic.mk_conjunction ts;
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1866
    val body = ObjectLogic.atomize_term thy t;
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1867
    val bodyT = Term.fastype_of body;
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1868
  in
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1869
    if bodyT = propT then (t, propT, Thm.reflexive (Thm.cterm_of thy t))
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1870
    else (body, bodyT, ObjectLogic.atomize_rule thy (Thm.cterm_of thy t))
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1871
  end;
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1872
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1873
fun aprop_tr' n c = (c, fn args =>
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1874
  if length args = n then Syntax.const "_aprop" $ Term.list_comb (Syntax.free c, args)
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1875
  else raise Match);
13336
1bd21b082466 tuned add_thmss;
wenzelm
parents: 13308
diff changeset
  1876
15104
ballarin
parents: 15099
diff changeset
  1877
(* CB: define one predicate including its intro rule and axioms
ballarin
parents: 15099
diff changeset
  1878
   - bname: predicate name
ballarin
parents: 15099
diff changeset
  1879
   - parms: locale parameters
ballarin
parents: 15099
diff changeset
  1880
   - defs: thms representing substitutions from defines elements
ballarin
parents: 15099
diff changeset
  1881
   - ts: terms representing locale assumptions (not normalised wrt. defs)
ballarin
parents: 15099
diff changeset
  1882
   - norm_ts: terms representing locale assumptions (normalised wrt. defs)
ballarin
parents: 15099
diff changeset
  1883
   - thy: the theory
ballarin
parents: 15099
diff changeset
  1884
*)
ballarin
parents: 15099
diff changeset
  1885
13420
39fca1e5818a removed unused locale_facts(_i);
wenzelm
parents: 13415
diff changeset
  1886
fun def_pred bname parms defs ts norm_ts thy =
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1887
  let
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1888
    val name = Sign.full_name thy bname;
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1889
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1890
    val (body, bodyT, body_eq) = atomize_spec thy norm_ts;
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1891
    val env = Term.add_term_free_names (body, []);
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
  1892
    val xs = List.filter (fn (x, _) => x mem_string env) parms;
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1893
    val Ts = map #2 xs;
15574
b1d1b5bfc464 Removed practically all references to Library.foldr.
skalberg
parents: 15570
diff changeset
  1894
    val extraTs = (Term.term_tfrees body \\ foldr Term.add_typ_tfrees [] Ts)
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1895
      |> Library.sort_wrt #1 |> map TFree;
13399
c136276dc847 support locale ``views'' (for cumulative predicates);
wenzelm
parents: 13394
diff changeset
  1896
    val predT = map Term.itselfT extraTs ---> Ts ---> bodyT;
13336
1bd21b082466 tuned add_thmss;
wenzelm
parents: 13308
diff changeset
  1897
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1898
    val args = map Logic.mk_type extraTs @ map Free xs;
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1899
    val head = Term.list_comb (Const (name, predT), args);
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1900
    val statement = ObjectLogic.assert_propT thy head;
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1901
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1902
    val (defs_thy, [pred_def]) =
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1903
      thy
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1904
      |> (if bodyT <> propT then I else
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1905
        Theory.add_trfuns ([], [], map (aprop_tr' (length args)) (NameSpace.accesses' name), []))
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1906
      |> Theory.add_consts_i [(bname, predT, Syntax.NoSyn)]
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1907
      |> PureThy.add_defs_i false [((Thm.def_name bname, Logic.mk_equals (head, body)), [])];
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1908
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1909
    val cert = Thm.cterm_of defs_thy;
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1910
16947
c6a90f04924e Sign.typ_unify;
wenzelm
parents: 16861
diff changeset
  1911
    val intro = Drule.standard (Tactic.prove defs_thy [] norm_ts statement (fn _ =>
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1912
      Tactic.rewrite_goals_tac [pred_def] THEN
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1913
      Tactic.compose_tac (false, body_eq RS Drule.equal_elim_rule1, 1) 1 THEN
16947
c6a90f04924e Sign.typ_unify;
wenzelm
parents: 16861
diff changeset
  1914
      Tactic.compose_tac (false, Drule.conj_intr_list (map (Thm.assume o cert) norm_ts), 0) 1));
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1915
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1916
    val conjuncts =
17257
0ab67cb765da introduced binding priority 1 for linear combinators etc.
haftmann
parents: 17228
diff changeset
  1917
      (Drule.equal_elim_rule1 OF [Thm.symmetric body_eq,
0ab67cb765da introduced binding priority 1 for linear combinators etc.
haftmann
parents: 17228
diff changeset
  1918
        Tactic.rewrite_rule [pred_def] (Thm.assume (cert statement))])
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1919
      |> Drule.conj_elim_precise (length ts);
17257
0ab67cb765da introduced binding priority 1 for linear combinators etc.
haftmann
parents: 17228
diff changeset
  1920
    val axioms = ts ~~ conjuncts |> map (fn (t, ax) =>
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1921
      Tactic.prove_plain defs_thy [] [] t (fn _ =>
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1922
        Tactic.rewrite_goals_tac defs THEN
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1923
        Tactic.compose_tac (false, ax, 0) 1));
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1924
  in (defs_thy, (statement, intro, axioms)) end;
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1925
15104
ballarin
parents: 15099
diff changeset
  1926
(* CB: modify the locale elements:
15623
8b40f741597c *** empty log message ***
ballarin
parents: 15598
diff changeset
  1927
   - assumes elements become notes elements,
15104
ballarin
parents: 15099
diff changeset
  1928
   - notes elements are lifted
ballarin
parents: 15099
diff changeset
  1929
*)
ballarin
parents: 15099
diff changeset
  1930
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1931
fun change_elem (axms, Assumes asms) =
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1932
      apsnd Notes ((axms, asms) |> foldl_map (fn (axs, (a, spec)) =>
13629
a46362d2b19b take/drop -> splitAt
nipkow
parents: 13460
diff changeset
  1933
        let val (ps,qs) = splitAt(length spec, axs)
a46362d2b19b take/drop -> splitAt
nipkow
parents: 13460
diff changeset
  1934
        in (qs, (a, [(ps, [])])) end))
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1935
  | change_elem e = e;
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1936
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1937
(* CB: changes only "new" elems, these have identifier ("", _). *)
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1938
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1939
fun change_elemss axioms elemss = (axioms, elemss) |> foldl_map
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1940
  (fn (axms, (id as ("", _), es)) =>
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1941
    foldl_map change_elem (axms, map (map_values I I (Drule.satisfy_hyps axioms)) es)
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  1942
    |> apsnd (pair id)
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1943
  | x => x) |> #2;
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1944
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1945
in
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1946
15104
ballarin
parents: 15099
diff changeset
  1947
(* CB: main predicate definition function *)
ballarin
parents: 15099
diff changeset
  1948
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1949
fun define_preds bname (parms, ((exts, exts'), (ints, ints')), defs) elemss thy =
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1950
  let
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1951
    val (thy', (elemss', more_ts)) =
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15456
diff changeset
  1952
      if null exts then (thy, (elemss, []))
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1953
      else
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1954
        let
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15456
diff changeset
  1955
          val aname = if null ints then bname else bname ^ "_" ^ axiomsN;
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1956
          val (def_thy, (statement, intro, axioms)) =
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1957
            thy |> def_pred aname parms defs exts exts';
16325
a6431098a929 Fixed "axiom" generation for mixed locales with and without predicates.
ballarin
parents: 16169
diff changeset
  1958
          val elemss' = change_elemss (map (Drule.zero_var_indexes o Drule.gen_all) axioms) elemss @
13420
39fca1e5818a removed unused locale_facts(_i);
wenzelm
parents: 13415
diff changeset
  1959
            [(("", []), [Assumes [((bname ^ "_" ^ axiomsN, []), [(statement, ([], []))])]])];
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1960
        in
14564
3667b4616e9a renamed have_thms to note_thms;
wenzelm
parents: 14528
diff changeset
  1961
          def_thy |> note_thmss_qualified "" aname
14254
342634f38451 Isar/Locales: <loc>.intro and <loc>.axioms no longer intro? and elim? by
ballarin
parents: 14216
diff changeset
  1962
            [((introN, []), [([intro], [])])]
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1963
          |> #1 |> rpair (elemss', [statement])
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1964
        end;
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1965
    val (thy'', predicate) =
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15456
diff changeset
  1966
      if null ints then (thy', ([], []))
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1967
      else
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1968
        let
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1969
          val (def_thy, (statement, intro, axioms)) =
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1970
            thy' |> def_pred bname parms defs (ints @ more_ts) (ints' @ more_ts);
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1971
          val cstatement = Thm.cterm_of def_thy statement;
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1972
        in
14564
3667b4616e9a renamed have_thms to note_thms;
wenzelm
parents: 14528
diff changeset
  1973
          def_thy |> note_thmss_qualified "" bname
14254
342634f38451 Isar/Locales: <loc>.intro and <loc>.axioms no longer intro? and elim? by
ballarin
parents: 14216
diff changeset
  1974
            [((introN, []), [([intro], [])]),
342634f38451 Isar/Locales: <loc>.intro and <loc>.axioms no longer intro? and elim? by
ballarin
parents: 14216
diff changeset
  1975
             ((axiomsN, []), [(map Drule.standard axioms, [])])]
13415
63462ccc6fac tuned view;
wenzelm
parents: 13399
diff changeset
  1976
          |> #1 |> rpair ([cstatement], axioms)
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1977
        end;
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  1978
  in (thy'', (elemss', predicate)) end;
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1979
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1980
end;
13336
1bd21b082466 tuned add_thmss;
wenzelm
parents: 13308
diff changeset
  1981
1bd21b082466 tuned add_thmss;
wenzelm
parents: 13308
diff changeset
  1982
13297
wenzelm
parents: 13211
diff changeset
  1983
(* add_locale(_i) *)
wenzelm
parents: 13211
diff changeset
  1984
wenzelm
parents: 13211
diff changeset
  1985
local
wenzelm
parents: 13211
diff changeset
  1986
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  1987
fun gen_add_locale prep_ctxt prep_expr do_pred bname raw_import raw_body thy =
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  1988
  (* CB: do_pred controls generation of predicates.
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  1989
         true -> with, false -> without predicates. *)
13297
wenzelm
parents: 13211
diff changeset
  1990
  let
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  1991
    val name = Sign.full_name thy bname;
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
  1992
    val _ = conditional (isSome (get_locale thy name)) (fn () =>
13297
wenzelm
parents: 13211
diff changeset
  1993
      error ("Duplicate definition of locale " ^ quote name));
wenzelm
parents: 13211
diff changeset
  1994
wenzelm
parents: 13211
diff changeset
  1995
    val thy_ctxt = ProofContext.init thy;
17228
19b460b39dad print_locale omits facts by default
ballarin
parents: 17221
diff changeset
  1996
    val (((import_ctxt, import_elemss), (body_ctxt, body_elemss, syn)),
19b460b39dad print_locale omits facts by default
ballarin
parents: 17221
diff changeset
  1997
      text as (parms, ((_, exts'), _), _)) =
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1998
      prep_ctxt raw_import raw_body thy_ctxt;
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  1999
    val elemss = import_elemss @ body_elemss;
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  2000
    val import = prep_expr thy raw_import;
13297
wenzelm
parents: 13211
diff changeset
  2001
17228
19b460b39dad print_locale omits facts by default
ballarin
parents: 17221
diff changeset
  2002
    val extraTs = foldr Term.add_term_tfrees [] exts' \\
19b460b39dad print_locale omits facts by default
ballarin
parents: 17221
diff changeset
  2003
      foldr Term.add_typ_tfrees [] (map #2 parms);
19b460b39dad print_locale omits facts by default
ballarin
parents: 17221
diff changeset
  2004
    val _ = if null extraTs then ()
17355
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2005
      else warning ("Additional type variables in locale specification: " ^ quote bname);
17228
19b460b39dad print_locale omits facts by default
ballarin
parents: 17221
diff changeset
  2006
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  2007
    val (pred_thy, (elemss', predicate as (predicate_statement, predicate_axioms))) =
13394
b39347206719 define cumulative predicate view;
wenzelm
parents: 13375
diff changeset
  2008
      if do_pred then thy |> define_preds bname text elemss
13415
63462ccc6fac tuned view;
wenzelm
parents: 13399
diff changeset
  2009
      else (thy, (elemss, ([], [])));
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  2010
    val pred_ctxt = ProofContext.init pred_thy;
13420
39fca1e5818a removed unused locale_facts(_i);
wenzelm
parents: 13415
diff changeset
  2011
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  2012
    fun axiomify axioms elemss = 
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  2013
      (axioms, elemss) |> foldl_map (fn (axs, (id, elems)) => let
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
  2014
                   val ts = List.concat (List.mapPartial (fn (Assumes asms) =>
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
  2015
                     SOME (List.concat (map (map #1 o #2) asms)) | _ => NONE) elems);
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  2016
                   val (axs1, axs2) = splitAt (length ts, axs);
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2017
                 in (axs2, ((id, Assumed axs1), elems)) end)
15206
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  2018
        |> snd;
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  2019
    val (ctxt, (_, facts)) = activate_facts (K I)
09d78ec709c7 Modified locales: improved implementation of "includes".
ballarin
parents: 15127
diff changeset
  2020
      (pred_ctxt, axiomify predicate_axioms elemss');
17355
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2021
    val export = ProofContext.export_standard_view predicate_statement ctxt pred_ctxt;
13420
39fca1e5818a removed unused locale_facts(_i);
wenzelm
parents: 13415
diff changeset
  2022
    val facts' = facts |> map (fn (a, ths) => ((a, []), [(map export ths, [])]));
17142
76a5a2cc3171 add_locale_context(_i) now exporting elements (still some refinements to be done)
haftmann
parents: 17138
diff changeset
  2023
    val elems' = List.concat (map #2 (List.filter (equal "" o #1 o #1) elemss'))
13297
wenzelm
parents: 13211
diff changeset
  2024
  in
13375
7cbf2dea46d0 proper predicate definitions of locale body;
wenzelm
parents: 13336
diff changeset
  2025
    pred_thy
14564
3667b4616e9a renamed have_thms to note_thms;
wenzelm
parents: 14528
diff changeset
  2026
    |> note_thmss_qualified "" name facts' |> #1
13297
wenzelm
parents: 13211
diff changeset
  2027
    |> declare_locale name
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  2028
    |> put_locale name {predicate = predicate, import = import,
17142
76a5a2cc3171 add_locale_context(_i) now exporting elements (still some refinements to be done)
haftmann
parents: 17138
diff changeset
  2029
        elems = map (fn e => (e, stamp ())) elems',
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  2030
        params = (params_of elemss' |>
17221
6cd180204582 curried_lookup/update;
wenzelm
parents: 17203
diff changeset
  2031
          map (fn (x, SOME T) => ((x, T), the (Symtab.curried_lookup syn x))), map #1 (params_of body_elemss)),
16736
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
  2032
        regs = []}
17142
76a5a2cc3171 add_locale_context(_i) now exporting elements (still some refinements to be done)
haftmann
parents: 17138
diff changeset
  2033
    |> pair (elems', body_ctxt)
13297
wenzelm
parents: 13211
diff changeset
  2034
  end;
wenzelm
parents: 13211
diff changeset
  2035
wenzelm
parents: 13211
diff changeset
  2036
in
wenzelm
parents: 13211
diff changeset
  2037
17109
606c269d1e26 added add_locale_context(_i), which returns the body context for presentation;
wenzelm
parents: 17096
diff changeset
  2038
val add_locale_context = gen_add_locale read_context intern_expr;
606c269d1e26 added add_locale_context(_i), which returns the body context for presentation;
wenzelm
parents: 17096
diff changeset
  2039
val add_locale_context_i = gen_add_locale cert_context (K I);
17142
76a5a2cc3171 add_locale_context(_i) now exporting elements (still some refinements to be done)
haftmann
parents: 17138
diff changeset
  2040
fun add_locale b = #2 oooo add_locale_context b;
76a5a2cc3171 add_locale_context(_i) now exporting elements (still some refinements to be done)
haftmann
parents: 17138
diff changeset
  2041
fun add_locale_i b = #2 oooo add_locale_context_i b;
13297
wenzelm
parents: 13211
diff changeset
  2042
wenzelm
parents: 13211
diff changeset
  2043
end;
wenzelm
parents: 13211
diff changeset
  2044
15801
d2f5ca3c048d superceded by Pure.thy and CPure.thy;
wenzelm
parents: 15798
diff changeset
  2045
val _ = Context.add_setup
d2f5ca3c048d superceded by Pure.thy and CPure.thy;
wenzelm
parents: 15798
diff changeset
  2046
 [add_locale_i true "var" empty [Fixes [(Syntax.internal "x", NONE, SOME Syntax.NoSyn)]],
d2f5ca3c048d superceded by Pure.thy and CPure.thy;
wenzelm
parents: 15798
diff changeset
  2047
  add_locale_i true "struct" empty [Fixes [(Syntax.internal "S", NONE, NONE)]]];
d2f5ca3c048d superceded by Pure.thy and CPure.thy;
wenzelm
parents: 15798
diff changeset
  2048
13297
wenzelm
parents: 13211
diff changeset
  2049
12730
fd0f8fa2b6bd produce predicate text;
wenzelm
parents: 12727
diff changeset
  2050
17355
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2051
(** locale goals **)
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2052
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2053
local
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2054
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2055
fun global_goal prep_att =
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2056
  Proof.global_goal ProofDisplay.present_results prep_att ProofContext.bind_propp_schematic_i;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2057
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2058
fun gen_theorem prep_att prep_elem prep_stmt kind after_qed a raw_elems concl thy =
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2059
  let
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2060
    val thy_ctxt = ProofContext.init thy;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2061
    val elems = map (prep_elem thy) raw_elems;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2062
    val (_, (_, view), _, ctxt, propp) = prep_stmt NONE elems (map snd concl) thy_ctxt;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2063
    val ctxt' = ctxt |> ProofContext.add_view thy_ctxt view;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2064
    val stmt = map fst concl ~~ propp;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2065
  in global_goal prep_att kind after_qed NONE a stmt ctxt' end;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2066
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2067
fun gen_theorem_in_locale prep_locale prep_src prep_elem prep_stmt
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2068
    kind after_qed raw_locale (name, atts) raw_elems concl thy =
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2069
  let
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2070
    val locale = prep_locale thy raw_locale;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2071
    val locale_atts = map (prep_src thy) atts;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2072
    val locale_attss = map (map (prep_src thy) o snd o fst) concl;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2073
    val target = SOME (extern thy locale);
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2074
    val elems = map (prep_elem thy) raw_elems;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2075
    val names = map (fst o fst) concl;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2076
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2077
    val thy_ctxt = thy |> theory_qualified locale |> ProofContext.init;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2078
    val (_, (locale_view, elems_view), locale_ctxt, elems_ctxt, propp) =
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2079
      prep_stmt (SOME raw_locale) elems (map snd concl) thy_ctxt;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2080
    val elems_ctxt' = elems_ctxt |> ProofContext.add_view locale_ctxt elems_view;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2081
    val elems_ctxt'' = elems_ctxt' |> ProofContext.add_view thy_ctxt locale_view;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2082
    val locale_ctxt' = locale_ctxt |> ProofContext.add_view thy_ctxt locale_view;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2083
      
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2084
    val stmt = map (apsnd (K []) o fst) concl ~~ propp;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2085
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2086
    fun after_qed' (goal_ctxt, raw_results) results =
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2087
      let val res = results |> (map o map)
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2088
          (ProofContext.export_standard elems_ctxt' locale_ctxt) in
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2089
        Sign.restore_naming thy
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2090
        #> curry (add_thmss kind locale ((names ~~ locale_attss) ~~ res)) locale_ctxt
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2091
        #-> (fn res' =>
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2092
          if name = "" andalso null locale_atts then I
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2093
          else #2 o add_thmss kind locale [((name, locale_atts), List.concat (map #2 res'))])
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2094
        #> #2
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2095
        #> after_qed ((goal_ctxt, locale_ctxt'), raw_results) results
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2096
      end;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2097
  in global_goal (K I) kind after_qed' target (name, []) stmt elems_ctxt'' end;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2098
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2099
in
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2100
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2101
val theorem = gen_theorem Attrib.global_attribute intern_attrib_elem_expr read_context_statement;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2102
val theorem_i = gen_theorem (K I) (K I) cert_context_statement;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2103
val theorem_in_locale =
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2104
  gen_theorem_in_locale intern Attrib.intern_src intern_attrib_elem_expr read_context_statement;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2105
val theorem_in_locale_i =
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2106
  gen_theorem_in_locale (K I) (K I) (K I) cert_context_statement;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2107
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2108
fun smart_theorem kind NONE a [] concl =   (* FIXME tune *)
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2109
      Proof.theorem kind (K (K I)) NONE a concl o ProofContext.init
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2110
  | smart_theorem kind NONE a elems concl =
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2111
      theorem kind (K (K I)) a elems concl
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2112
  | smart_theorem kind (SOME loc) a elems concl =
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2113
      theorem_in_locale kind (K (K I)) loc a elems concl;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2114
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2115
end;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2116
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2117
15598
4ab52355bb53 Registrations of global locale interpretations: improved, better naming.
ballarin
parents: 15596
diff changeset
  2118
(** Interpretation commands **)
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2119
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2120
local
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2121
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2122
(* extract proof obligations (assms and defs) from elements *)
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2123
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2124
fun extract_asms_elem (Fixes _) ts = ts
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2125
  | extract_asms_elem (Constrains _) ts = ts
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2126
  | extract_asms_elem (Assumes asms) ts =
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2127
      ts @ List.concat (map (fn (_, ams) => map (fn (t, _) => t) ams) asms)
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2128
  | extract_asms_elem (Defines defs) ts =
16169
b59202511b8a Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 16144
diff changeset
  2129
      ts @ map (fn (_, (def, _)) => def) defs
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2130
  | extract_asms_elem (Notes _) ts = ts;
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2131
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2132
fun extract_asms_elems ((id, Assumed _), elems) =
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2133
      (id, fold extract_asms_elem elems [])
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2134
  | extract_asms_elems ((id, Derived _), _) = (id, []);
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2135
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2136
fun extract_asms_elemss elemss = map extract_asms_elems elemss;
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2137
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
  2138
(* activate instantiated facts in theory or context *)
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2139
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2140
fun gen_activate_facts_elemss get_reg note attrib std put_reg add_wit
17033
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2141
        attn all_elemss new_elemss propss result thy_ctxt =
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2142
    let
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2143
      fun activate_elem disch (prfx, atts) (Notes facts) thy_ctxt =
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2144
          let
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2145
            val facts' = facts
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2146
              (* discharge hyps in attributes *)
17109
606c269d1e26 added add_locale_context(_i), which returns the body context for presentation;
wenzelm
parents: 17096
diff changeset
  2147
              |> Attrib.map_facts (attrib thy_ctxt o Args.map_values I I I disch)
17033
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2148
              (* insert interpretation attributes *)
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2149
              |> map (apfst (apsnd (fn a => a @ map (attrib thy_ctxt) atts)))
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2150
              (* discharge hyps *)
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2151
              |> map (apsnd (map (apfst (map disch))))
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2152
              (* prefix names *)
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2153
              |> map (apfst (apfst (NameSpace.qualified prfx)))
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2154
          in fst (note prfx facts' thy_ctxt) end
17033
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2155
        | activate_elem _ _ _ thy_ctxt = thy_ctxt;
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2156
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2157
      fun activate_elems disch ((id, _), elems) thy_ctxt =
17033
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2158
          let
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2159
            val ((prfx, atts2), _) = valOf (get_reg thy_ctxt id)
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2160
                handle Option => sys_error ("Unknown registration of " ^
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2161
                  quote (fst id) ^ " while activating facts.");
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2162
          in
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2163
            fold (activate_elem disch (prfx, atts2)) elems thy_ctxt
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2164
          end;
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2165
17033
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2166
      val thmss = unflat (map snd propss) result;
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2167
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2168
      val thy_ctxt' = thy_ctxt
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2169
        (* add registrations *)
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2170
        |> fold (fn ((id, _), _) => put_reg id attn) new_elemss
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2171
        (* add witnesses of Assumed elements *)
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2172
        |> fold (fn (id, thms) => fold (add_wit id) thms)
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2173
           (map fst propss ~~ thmss);
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2174
17033
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2175
      val prems = List.concat (List.mapPartial
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2176
            (fn ((id, Assumed _), _) => Option.map snd (get_reg thy_ctxt' id)
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2177
              | ((_, Derived _), _) => NONE) all_elemss);
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2178
      val disch = Drule.satisfy_hyps prems;
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2179
      val disch' = std o Drule.fconv_rule (Thm.beta_conversion true) o disch;
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2180
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2181
      val thy_ctxt'' = thy_ctxt'
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2182
        (* add witnesses of Derived elements *)
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2183
        |> fold (fn (id, thms) => fold (add_wit id o disch) thms)
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2184
           (List.mapPartial (fn ((_, Assumed _), _) => NONE
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2185
              | ((id, Derived thms), _) => SOME (id, thms)) all_elemss)
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2186
    in
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2187
      thy_ctxt''
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2188
        (* add facts to theory or context *)
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2189
        |> fold (activate_elems disch') new_elemss
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2190
    end;
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2191
17355
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2192
fun global_activate_facts_elemss x = gen_activate_facts_elemss
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  2193
      (fn thy => fn (name, ps) =>
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  2194
        get_global_registration thy (name, map Logic.varify ps))
16144
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  2195
      (global_note_accesses_i (Drule.kind ""))
17033
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2196
      Attrib.global_attribute_i Drule.standard
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2197
      (fn (name, ps) => put_global_registration (name, map Logic.varify ps))
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2198
      (fn (n, ps) => fn thm =>
17355
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2199
         add_global_witness (n, map Logic.varify ps) (Drule.freeze_all thm)) x;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2200
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2201
fun local_activate_facts_elemss x = gen_activate_facts_elemss
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  2202
      get_local_registration
16144
e339119f4261 renamed cond_extern to extern;
wenzelm
parents: 16105
diff changeset
  2203
      local_note_accesses_i
17033
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2204
      Attrib.context_attribute_i I
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2205
      put_local_registration
17355
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2206
      add_local_witness x;
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
  2207
17033
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2208
fun gen_prep_registration mk_ctxt is_local read_terms test_reg activate
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
  2209
    attn expr insts thy_ctxt =
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2210
  let
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
  2211
    val ctxt = mk_ctxt thy_ctxt;
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  2212
    val thy = ProofContext.theory_of ctxt;
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2213
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  2214
    val ctxt' = ctxt |> ProofContext.theory_of |> ProofContext.init;
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  2215
    val ((ids, _), raw_elemss) = flatten (ctxt', intern_expr thy)
16102
c5f6726d9bb1 Locale expressions: rename with optional mixfix syntax.
ballarin
parents: 16028
diff changeset
  2216
          (([], Symtab.empty), Expr expr);
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2217
    val ((parms, all_elemss, _), (_, (_, defs, _))) =
16736
1e792b32abef Preparations for interpretation of locales in locales.
ballarin
parents: 16620
diff changeset
  2218
          read_elemss false ctxt' [] raw_elemss [];
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2219
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2220
    (** compute instantiation **)
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2221
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  2222
    (* user input *)
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2223
    val insts = if length parms < length insts
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2224
         then error "More arguments than parameters in instantiation."
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2225
         else insts @ replicate (length parms - length insts) NONE;
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2226
    val (ps, pTs) = split_list parms;
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2227
    val pvTs = map Type.varifyT pTs;
15598
4ab52355bb53 Registrations of global locale interpretations: improved, better naming.
ballarin
parents: 15596
diff changeset
  2228
4ab52355bb53 Registrations of global locale interpretations: improved, better naming.
ballarin
parents: 15596
diff changeset
  2229
    (* instantiations given by user *)
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2230
    val given = List.mapPartial (fn (_, (NONE, _)) => NONE
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2231
         | (x, (SOME inst, T)) => SOME (x, (inst, T))) (ps ~~ (insts ~~ pvTs));
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2232
    val (given_ps, given_insts) = split_list given;
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2233
    val tvars = foldr Term.add_typ_tvars [] pvTs;
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2234
    val used = foldr Term.add_typ_varnames [] pvTs;
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2235
    fun sorts (a, i) = assoc (tvars, (a, i));
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
  2236
    val (vs, vinst) = read_terms thy_ctxt sorts used given_insts;
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  2237
    val vars = foldl Term.add_term_tvar_ixns [] vs \\ map fst tvars;
16861
7446b4be013b tuned fold on terms;
wenzelm
parents: 16850
diff changeset
  2238
    val vars' = fold Term.add_term_varnames vs vars;
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  2239
    val _ = if null vars' then ()
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  2240
         else error ("Illegal schematic variable(s) in instantiation: " ^
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  2241
           commas_quote (map Syntax.string_of_vname vars'));
15598
4ab52355bb53 Registrations of global locale interpretations: improved, better naming.
ballarin
parents: 15596
diff changeset
  2242
    (* replace new types (which are TFrees) by ones with new names *)
4ab52355bb53 Registrations of global locale interpretations: improved, better naming.
ballarin
parents: 15596
diff changeset
  2243
    val new_Tnames = foldr Term.add_term_tfree_names [] vs;
4ab52355bb53 Registrations of global locale interpretations: improved, better naming.
ballarin
parents: 15596
diff changeset
  2244
    val new_Tnames' = Term.invent_names used "'a" (length new_Tnames);
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  2245
    val renameT =
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  2246
          if is_local then I
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  2247
          else Type.unvarifyT o Term.map_type_tfree (fn (a, s) =>
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  2248
            TFree (valOf (assoc (new_Tnames ~~ new_Tnames', a)), s));
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  2249
    val rename =
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  2250
          if is_local then I
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  2251
          else Term.map_term_types renameT;
15598
4ab52355bb53 Registrations of global locale interpretations: improved, better naming.
ballarin
parents: 15596
diff changeset
  2252
4ab52355bb53 Registrations of global locale interpretations: improved, better naming.
ballarin
parents: 15596
diff changeset
  2253
    val tinst = Symtab.make (map
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  2254
                (fn ((x, 0), T) => (x, T |> renameT)
16850
35e07087aba2 sys_error;
wenzelm
parents: 16790
diff changeset
  2255
                  | ((_, n), _) => sys_error "Internal error var in prep_registration") vinst);
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  2256
    val inst = Symtab.make (given_ps ~~ map rename vs);
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2257
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2258
    (* defined params without user input *)
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2259
    val not_given = List.mapPartial (fn (x, (NONE, T)) => SOME (x, T)
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2260
         | (_, (SOME _, _)) => NONE) (ps ~~ (insts ~~ pTs));
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2261
    fun add_def ((inst, tinst), (p, pT)) =
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2262
      let
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2263
        val (t, T) = case find_first (fn (Free (a, _), _) => a = p) defs of
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2264
               NONE => error ("Instance missing for parameter " ^ quote p)
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2265
             | SOME (Free (_, T), t) => (t, T);
17316
fc7cc8137b97 fixed printing of locales
ballarin
parents: 17271
diff changeset
  2266
        val d = inst_tab_term (inst, tinst) t;
17221
6cd180204582 curried_lookup/update;
wenzelm
parents: 17203
diff changeset
  2267
      in (Symtab.curried_update_new (p, d) inst, tinst) end;
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2268
    val (inst, tinst) = Library.foldl add_def ((inst, tinst), not_given);
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  2269
    (* Note: inst and tinst contain no vars. *)
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2270
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2271
    (** compute proof obligations **)
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2272
15598
4ab52355bb53 Registrations of global locale interpretations: improved, better naming.
ballarin
parents: 15596
diff changeset
  2273
    (* restore "small" ids *)
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2274
    val ids' = map (fn ((n, ps), (_, mode)) =>
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2275
          ((n, map (fn p => Free (p, valOf (assoc (parms, p)))) ps), mode)) ids;
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2276
    (* instantiate ids and elements *)
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2277
    val inst_elemss = map
17033
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2278
          (fn ((id, _), ((_, mode), elems)) =>
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2279
             inst_tab_elems thy (inst, tinst) (id, map (fn Int e => e) elems)
17033
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2280
               |> apfst (fn id => (id, map_mode (map (inst_tab_thm thy (inst, tinst))) mode))) 
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2281
          (ids' ~~ all_elemss);
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2282
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
  2283
    (* remove fragments already registered with theory or context *)
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2284
    val new_inst_elemss = List.filter (fn ((id, _), _) =>
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
  2285
          not (test_reg thy_ctxt id)) inst_elemss;
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  2286
    val new_ids = map #1 new_inst_elemss;
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2287
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2288
    val propss = extract_asms_elemss new_inst_elemss;
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2289
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15696
diff changeset
  2290
    val bind_attrib = Attrib.crude_closure ctxt o Args.assignable;
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  2291
    val attn' = apsnd (map (bind_attrib o Attrib.intern_src thy)) attn;
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2292
17033
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2293
  in (propss, activate attn' inst_elemss new_inst_elemss propss) end;
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
  2294
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
  2295
val prep_global_registration = gen_prep_registration
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  2296
     ProofContext.init false
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
  2297
     (fn thy => fn sorts => fn used =>
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16346
diff changeset
  2298
       Sign.read_def_terms (thy, K NONE, sorts) used true)
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  2299
     (fn thy => fn (name, ps) =>
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  2300
       test_global_registration thy (name, map Logic.varify ps))
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
  2301
     global_activate_facts_elemss;
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
  2302
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
  2303
val prep_local_registration = gen_prep_registration
15696
1da4ce092c0b First release of interpretation commands.
ballarin
parents: 15624
diff changeset
  2304
     I true
15624
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
  2305
     (fn ctxt => ProofContext.read_termTs ctxt (K false) (K NONE))
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
  2306
     smart_test_registration
484178635bd8 Further work on interpretation commands. New command `interpret' for
ballarin
parents: 15623
diff changeset
  2307
     local_activate_facts_elemss;
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2308
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2309
fun prep_registration_in_locale target expr thy =
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2310
  (* target already in internal form *)
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2311
  let
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2312
    val ctxt = ProofContext.init thy;
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2313
    val ((raw_target_ids, target_syn), _) = flatten (ctxt, I)
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2314
        (([], Symtab.empty), Expr (Locale target));
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2315
    val fixed = the_locale thy target |> #params |> #1 |> map #1;
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2316
    val ((all_ids, syn), raw_elemss) = flatten (ctxt, intern_expr thy)
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2317
        ((raw_target_ids, target_syn), Expr expr);
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2318
    val (target_ids, ids) = splitAt (length raw_target_ids, all_ids);
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2319
    val ((parms, elemss, _), _) = read_elemss false ctxt fixed raw_elemss [];
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2320
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2321
    (** compute proof obligations **)
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2322
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2323
    (* restore "small" ids, with mode *)
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2324
    val ids' = map (apsnd snd) ids;
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2325
    (* remove Int markers *)
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2326
    val elemss' = map (fn (_, es) =>
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2327
        map (fn Int e => e) es) elemss
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2328
    (* extract assumptions and defs *)
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2329
    val ids_elemss = ids' ~~ elemss';
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2330
    val propss = extract_asms_elemss ids_elemss;
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2331
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2332
    (** activation function:
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2333
        - add registrations to the target locale
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2334
        - add induced registrations for all global registrations of
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2335
          the target, unless already present
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2336
        - add facts of induced registrations to theory **)
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2337
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2338
    val t_ids = List.mapPartial
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2339
        (fn (id, (_, Assumed _)) => SOME id | _ => NONE) target_ids;
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2340
17033
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2341
    fun activate locale_results thy = let
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2342
        val ids_elemss_thmss = ids_elemss ~~
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2343
	    unflat (map snd propss) locale_results;
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2344
        val regs = get_global_registrations thy target;
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2345
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2346
        fun activate_id (((id, Assumed _), _), thms) thy =
17033
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2347
            thy |> put_registration_in_locale target id
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2348
                |> fold (add_witness_in_locale target id) thms
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2349
          | activate_id _ thy = thy;
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2350
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2351
        fun activate_reg (vts, ((prfx, atts2), _)) thy = let
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2352
            val ((inst, tinst), wits) =
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2353
                collect_global_witnesses thy fixed t_ids vts;
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2354
            fun inst_parms ps = map (fn p =>
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2355
                  valOf (assoc (map #1 fixed ~~ vts, p))) ps;
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2356
            val disch = Drule.fconv_rule (Thm.beta_conversion true) o
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2357
                Drule.satisfy_hyps wits;
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2358
            val new_elemss = List.filter (fn (((name, ps), _), _) =>
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2359
                not (test_global_registration thy (name, inst_parms ps))) (ids_elemss);
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2360
            fun activate_assumed_id (((_, Derived _), _), _) thy = thy
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2361
              | activate_assumed_id ((((name, ps), Assumed _), _), thms) thy = let
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2362
                val ps' = inst_parms ps;
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2363
              in
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2364
                if test_global_registration thy (name, ps')
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2365
                then thy
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2366
                else thy
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2367
                  |> put_global_registration (name, ps') (prfx, atts2)
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2368
                  |> fold (fn thm => fn thy => add_global_witness (name, ps')
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2369
                       ((disch o inst_tab_thm thy (inst, tinst)) thm) thy) thms
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2370
              end;
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2371
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2372
            fun activate_derived_id ((_, Assumed _), _) thy = thy
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2373
              | activate_derived_id (((name, ps), Derived ths), _) thy = let
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2374
                val ps' = inst_parms ps;
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2375
              in
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2376
                if test_global_registration thy (name, ps')
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2377
                then thy
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2378
                else thy
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2379
                  |> put_global_registration (name, ps') (prfx, atts2)
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2380
                  |> fold (fn thm => fn thy => add_global_witness (name, ps')
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2381
                       ((disch o inst_tab_thm thy (inst, tinst) o Drule.satisfy_hyps locale_results) thm) thy) ths
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2382
              end;
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2383
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2384
            fun activate_elem (Notes facts) thy =
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2385
                let
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2386
                  val facts' = facts
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2387
                      |> Attrib.map_facts (Attrib.global_attribute_i thy o
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2388
                         Args.map_values I (tinst_tab_type tinst)
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2389
                           (inst_tab_term (inst, tinst))
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2390
                           (disch o inst_tab_thm thy (inst, tinst) o
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2391
                            Drule.satisfy_hyps locale_results))
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2392
                      |> map (apfst (apsnd (fn a => a @ map (Attrib.global_attribute thy) atts2)))
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2393
                      |> map (apsnd (map (apfst (map (disch o inst_tab_thm thy (inst, tinst) o Drule.satisfy_hyps locale_results)))))
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2394
                      |> map (apfst (apfst (NameSpace.qualified prfx)))
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2395
                in
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2396
                  fst (global_note_accesses_i (Drule.kind "") prfx facts' thy)
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2397
                end
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2398
              | activate_elem _ thy = thy;
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2399
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2400
            fun activate_elems (_, elems) thy = fold activate_elem elems thy;
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2401
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2402
          in thy |> fold activate_assumed_id ids_elemss_thmss
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2403
                 |> fold activate_derived_id ids_elemss
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2404
                 |> fold activate_elems new_elemss end;
17033
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2405
      in
17138
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2406
        thy |> fold activate_id ids_elemss_thmss
ad4c98fd367b Interpretation in locales: extended back end;
ballarin
parents: 17109
diff changeset
  2407
            |> fold activate_reg regs
17033
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2408
      end;
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2409
17033
f4c1ce91aa3c Release of interpretation in locale.
ballarin
parents: 17000
diff changeset
  2410
  in (propss, activate) end;
17000
552df70f52c2 First version of interpretation in locales. Not yet fully functional.
ballarin
parents: 16947
diff changeset
  2411
17355
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2412
fun prep_propp propss = propss |> map (fn ((name, _), props) =>
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2413
  ((NameSpace.base name, []), map (rpair ([], [])) props));
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2414
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2415
in
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2416
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2417
fun interpretation (prfx, atts) expr insts thy =
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2418
  let
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2419
    val thy_ctxt = ProofContext.init thy;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2420
    val (propss, activate) = prep_global_registration (prfx, atts) expr insts thy;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2421
    fun after_qed (goal_ctxt, raw_results) _ =
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2422
      activate (map (ProofContext.export_plain goal_ctxt thy_ctxt) raw_results);
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2423
  in Proof.theorem_i Drule.internalK after_qed NONE ("", []) (prep_propp propss) thy_ctxt end;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2424
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2425
fun interpretation_in_locale (raw_target, expr) thy =
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2426
  let
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2427
    val target = intern thy raw_target;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2428
    val (propss, activate) = prep_registration_in_locale target expr thy;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2429
    fun after_qed ((goal_ctxt, locale_ctxt), raw_results) _ =
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2430
      activate (map (ProofContext.export_plain goal_ctxt locale_ctxt) raw_results);
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2431
  in
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2432
    theorem_in_locale_i Drule.internalK after_qed target ("", []) [] (prep_propp propss) thy
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2433
  end;
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2434
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2435
fun interpret (prfx, atts) expr insts int state =
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2436
  let
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2437
    val (propss, activate) =
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2438
      prep_local_registration (prfx, atts) expr insts (Proof.context_of state);
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2439
    fun after_qed (_, raw_results) _ = Seq.single o Proof.map_context (activate raw_results);
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2440
  in Proof.have_i after_qed (prep_propp propss) int state end;
15596
8665d08085df First version of global registration command.
ballarin
parents: 15574
diff changeset
  2441
11896
1ff33f896720 moved locale.ML to Isar/locale.ML;
wenzelm
parents:
diff changeset
  2442
end;
17355
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2443
5b31131c0365 load late, after proof.ML;
wenzelm
parents: 17316
diff changeset
  2444
end;