src/Pure/Isar/theory_target.ML
author boehmes
Wed, 12 May 2010 23:53:59 +0200
changeset 36895 a96f9793d9c5
parent 36610 bafd82950e24
child 37146 f652333bbf8e
permissions -rw-r--r--
split monolithic Z3 proof reconstruction structure into separate structures, use one set of schematic theorems for all uncertain proof rules (to extend proof reconstruction by missing cases), added several schematic theorems, improved abstraction of goals (abstract all uninterpreted sub-terms, only leave builtin symbols)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20894
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/Isar/theory_target.ML
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
30437
910a7aeb8dec more precise treatment of qualified bindings;
wenzelm
parents: 30364
diff changeset
     3
    Author:     Florian Haftmann, TU Muenchen
20894
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
     4
25542
haftmann
parents: 25519
diff changeset
     5
Common theory/locale/class/instantiation/overloading targets.
20894
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
     6
*)
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
     7
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
     8
signature THEORY_TARGET =
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
     9
sig
35205
611b90bb89bc removed unused Theory_Target.begin;
wenzelm
parents: 35127
diff changeset
    10
  val peek: local_theory ->
611b90bb89bc removed unused Theory_Target.begin;
wenzelm
parents: 35127
diff changeset
    11
   {target: string,
611b90bb89bc removed unused Theory_Target.begin;
wenzelm
parents: 35127
diff changeset
    12
    is_locale: bool,
611b90bb89bc removed unused Theory_Target.begin;
wenzelm
parents: 35127
diff changeset
    13
    is_class: bool,
611b90bb89bc removed unused Theory_Target.begin;
wenzelm
parents: 35127
diff changeset
    14
    instantiation: string list * (string * sort) list * sort,
25864
11f531354852 explicit type variables for instantiation
haftmann
parents: 25684
diff changeset
    15
    overloading: (string * (string * typ) * bool) list}
25269
f9090ae5cec9 clarified theory target interface
haftmann
parents: 25240
diff changeset
    16
  val init: string option -> theory -> local_theory
35205
611b90bb89bc removed unused Theory_Target.begin;
wenzelm
parents: 35127
diff changeset
    17
  val context_cmd: xstring -> theory -> local_theory
25864
11f531354852 explicit type variables for instantiation
haftmann
parents: 25684
diff changeset
    18
  val instantiation: string list * (string * sort) list * sort -> theory -> local_theory
29971
68331b62c873 fixed signature
haftmann
parents: 29710
diff changeset
    19
  val instantiation_cmd: xstring list * xstring list * xstring -> theory -> local_theory
25864
11f531354852 explicit type variables for instantiation
haftmann
parents: 25684
diff changeset
    20
  val overloading: (string * (string * typ) * bool) list -> theory -> local_theory
26049
8186c03194ed overloading: reduced code redundancy, no xstrings here;
wenzelm
parents: 25984
diff changeset
    21
  val overloading_cmd: (string * string * bool) list -> theory -> local_theory
20894
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
    22
end;
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
    23
33553
35f2b30593a8 modernized structure Theory_Target;
wenzelm
parents: 33537
diff changeset
    24
structure Theory_Target: THEORY_TARGET =
20894
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
    25
struct
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
    26
21006
ac2732072403 added peek;
wenzelm
parents: 20984
diff changeset
    27
(* context data *)
ac2732072403 added peek;
wenzelm
parents: 20984
diff changeset
    28
29576
669b560fc2b9 wrecked old locale package and related modules
haftmann
parents: 29393
diff changeset
    29
datatype target = Target of {target: string, is_locale: bool,
25864
11f531354852 explicit type variables for instantiation
haftmann
parents: 25684
diff changeset
    30
  is_class: bool, instantiation: string list * (string * sort) list * sort,
11f531354852 explicit type variables for instantiation
haftmann
parents: 25684
diff changeset
    31
  overloading: (string * (string * typ) * bool) list};
25012
448af76a1ba3 pass explicit target record -- more informative peek operation;
wenzelm
parents: 25002
diff changeset
    32
29576
669b560fc2b9 wrecked old locale package and related modules
haftmann
parents: 29393
diff changeset
    33
fun make_target target is_locale is_class instantiation overloading =
669b560fc2b9 wrecked old locale package and related modules
haftmann
parents: 29393
diff changeset
    34
  Target {target = target, is_locale = is_locale,
25519
8570745cb40b overloading target
haftmann
parents: 25514
diff changeset
    35
    is_class = is_class, instantiation = instantiation, overloading = overloading};
25291
870455627720 misc cleanup of init functions;
wenzelm
parents: 25269
diff changeset
    36
29576
669b560fc2b9 wrecked old locale package and related modules
haftmann
parents: 29393
diff changeset
    37
val global_target = make_target "" false false ([], [], []) [];
25012
448af76a1ba3 pass explicit target record -- more informative peek operation;
wenzelm
parents: 25002
diff changeset
    38
33519
e31a85f92ce9 adapted Generic_Data, Proof_Data;
wenzelm
parents: 33466
diff changeset
    39
structure Data = Proof_Data
21006
ac2732072403 added peek;
wenzelm
parents: 20984
diff changeset
    40
(
25012
448af76a1ba3 pass explicit target record -- more informative peek operation;
wenzelm
parents: 25002
diff changeset
    41
  type T = target;
25291
870455627720 misc cleanup of init functions;
wenzelm
parents: 25269
diff changeset
    42
  fun init _ = global_target;
21006
ac2732072403 added peek;
wenzelm
parents: 20984
diff changeset
    43
);
ac2732072403 added peek;
wenzelm
parents: 20984
diff changeset
    44
25012
448af76a1ba3 pass explicit target record -- more informative peek operation;
wenzelm
parents: 25002
diff changeset
    45
val peek = (fn Target args => args) o Data.get;
21006
ac2732072403 added peek;
wenzelm
parents: 20984
diff changeset
    46
ac2732072403 added peek;
wenzelm
parents: 20984
diff changeset
    47
20894
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
    48
(* pretty *)
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
    49
32785
ec5292653aff eliminated redundant parameters;
wenzelm
parents: 32009
diff changeset
    50
fun pretty_thy ctxt target is_class =
20894
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
    51
  let
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
    52
    val thy = ProofContext.theory_of ctxt;
29576
669b560fc2b9 wrecked old locale package and related modules
haftmann
parents: 29393
diff changeset
    53
    val target_name = (if is_class then "class " else "locale ") ^ Locale.extern thy target;
30437
910a7aeb8dec more precise treatment of qualified bindings;
wenzelm
parents: 30364
diff changeset
    54
    val fixes =
910a7aeb8dec more precise treatment of qualified bindings;
wenzelm
parents: 30364
diff changeset
    55
      map (fn (x, T) => (Binding.name x, SOME T, NoSyn)) (#1 (ProofContext.inferred_fixes ctxt));
910a7aeb8dec more precise treatment of qualified bindings;
wenzelm
parents: 30364
diff changeset
    56
    val assumes =
30473
e0b66c11e7e4 Assumption.all_prems_of, Assumption.all_assms_of;
wenzelm
parents: 30438
diff changeset
    57
      map (fn A => (Attrib.empty_binding, [(Thm.term_of A, [])])) (Assumption.all_assms_of ctxt);
20894
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
    58
    val elems =
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
    59
      (if null fixes then [] else [Element.Fixes fixes]) @
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
    60
      (if null assumes then [] else [Element.Assumes assumes]);
26049
8186c03194ed overloading: reduced code redundancy, no xstrings here;
wenzelm
parents: 25984
diff changeset
    61
  in
8186c03194ed overloading: reduced code redundancy, no xstrings here;
wenzelm
parents: 25984
diff changeset
    62
    if target = "" then []
25607
779c79c36c5e pretty for instantiation and overloading
haftmann
parents: 25597
diff changeset
    63
    else if null elems then [Pretty.str target_name]
779c79c36c5e pretty for instantiation and overloading
haftmann
parents: 25597
diff changeset
    64
    else [Pretty.big_list (target_name ^ " =")
779c79c36c5e pretty for instantiation and overloading
haftmann
parents: 25597
diff changeset
    65
      (map (Pretty.chunks o Element.pretty_ctxt ctxt) elems)]
20894
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
    66
  end;
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
    67
32785
ec5292653aff eliminated redundant parameters;
wenzelm
parents: 32009
diff changeset
    68
fun pretty (Target {target, is_class, instantiation, overloading, ...}) ctxt =
25607
779c79c36c5e pretty for instantiation and overloading
haftmann
parents: 25597
diff changeset
    69
  Pretty.block [Pretty.str "theory", Pretty.brk 1,
779c79c36c5e pretty for instantiation and overloading
haftmann
parents: 25597
diff changeset
    70
      Pretty.str (Context.theory_name (ProofContext.theory_of ctxt))] ::
779c79c36c5e pretty for instantiation and overloading
haftmann
parents: 25597
diff changeset
    71
    (if not (null overloading) then [Overloading.pretty ctxt]
29358
efdfe5dfe008 rearranged target theories
haftmann
parents: 29252
diff changeset
    72
     else if not (null (#1 instantiation)) then [Class_Target.pretty_instantiation ctxt]
32785
ec5292653aff eliminated redundant parameters;
wenzelm
parents: 32009
diff changeset
    73
     else pretty_thy ctxt target is_class);
25607
779c79c36c5e pretty for instantiation and overloading
haftmann
parents: 25597
diff changeset
    74
20894
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
    75
33456
fbd47f9b9b12 allow "pervasive" local theory declarations, which are applied the background theory;
wenzelm
parents: 33282
diff changeset
    76
(* generic declarations *)
fbd47f9b9b12 allow "pervasive" local theory declarations, which are applied the background theory;
wenzelm
parents: 33282
diff changeset
    77
fbd47f9b9b12 allow "pervasive" local theory declarations, which are applied the background theory;
wenzelm
parents: 33282
diff changeset
    78
local
24838
1d1bddf87353 put declarations first
haftmann
parents: 24818
diff changeset
    79
33456
fbd47f9b9b12 allow "pervasive" local theory declarations, which are applied the background theory;
wenzelm
parents: 33282
diff changeset
    80
fun direct_decl decl =
fbd47f9b9b12 allow "pervasive" local theory declarations, which are applied the background theory;
wenzelm
parents: 33282
diff changeset
    81
  let val decl0 = Morphism.form decl in
33671
4b0f2599ed48 modernized structure Local_Theory;
wenzelm
parents: 33670
diff changeset
    82
    Local_Theory.theory (Context.theory_map decl0) #>
4b0f2599ed48 modernized structure Local_Theory;
wenzelm
parents: 33670
diff changeset
    83
    Local_Theory.target (Context.proof_map decl0)
33456
fbd47f9b9b12 allow "pervasive" local theory declarations, which are applied the background theory;
wenzelm
parents: 33282
diff changeset
    84
  end;
fbd47f9b9b12 allow "pervasive" local theory declarations, which are applied the background theory;
wenzelm
parents: 33282
diff changeset
    85
fbd47f9b9b12 allow "pervasive" local theory declarations, which are applied the background theory;
wenzelm
parents: 33282
diff changeset
    86
fun target_decl add (Target {target, ...}) pervasive decl lthy =
24838
1d1bddf87353 put declarations first
haftmann
parents: 24818
diff changeset
    87
  let
33671
4b0f2599ed48 modernized structure Local_Theory;
wenzelm
parents: 33670
diff changeset
    88
    val global_decl = Morphism.transform (Local_Theory.global_morphism lthy) decl;
4b0f2599ed48 modernized structure Local_Theory;
wenzelm
parents: 33670
diff changeset
    89
    val target_decl = Morphism.transform (Local_Theory.target_morphism lthy) decl;
24838
1d1bddf87353 put declarations first
haftmann
parents: 24818
diff changeset
    90
  in
25012
448af76a1ba3 pass explicit target record -- more informative peek operation;
wenzelm
parents: 25002
diff changeset
    91
    if target = "" then
24838
1d1bddf87353 put declarations first
haftmann
parents: 24818
diff changeset
    92
      lthy
35127
5b29c1660047 apply global morphism for theory, instantiation and overloading target; n.b. target morphism and global morphism coincide for theory target
haftmann
parents: 33764
diff changeset
    93
      |> direct_decl global_decl
24838
1d1bddf87353 put declarations first
haftmann
parents: 24818
diff changeset
    94
    else
1d1bddf87353 put declarations first
haftmann
parents: 24818
diff changeset
    95
      lthy
33456
fbd47f9b9b12 allow "pervasive" local theory declarations, which are applied the background theory;
wenzelm
parents: 33282
diff changeset
    96
      |> pervasive ? direct_decl global_decl
33671
4b0f2599ed48 modernized structure Local_Theory;
wenzelm
parents: 33670
diff changeset
    97
      |> Local_Theory.target (add target target_decl)
24838
1d1bddf87353 put declarations first
haftmann
parents: 24818
diff changeset
    98
  end;
1d1bddf87353 put declarations first
haftmann
parents: 24818
diff changeset
    99
33456
fbd47f9b9b12 allow "pervasive" local theory declarations, which are applied the background theory;
wenzelm
parents: 33282
diff changeset
   100
in
fbd47f9b9b12 allow "pervasive" local theory declarations, which are applied the background theory;
wenzelm
parents: 33282
diff changeset
   101
29576
669b560fc2b9 wrecked old locale package and related modules
haftmann
parents: 29393
diff changeset
   102
val declaration = target_decl Locale.add_declaration;
35798
fd1bb29f8170 replaced type_syntax/term_syntax by uniform syntax_declaration;
wenzelm
parents: 35765
diff changeset
   103
val syntax_declaration = target_decl Locale.add_syntax_declaration;
24838
1d1bddf87353 put declarations first
haftmann
parents: 24818
diff changeset
   104
33456
fbd47f9b9b12 allow "pervasive" local theory declarations, which are applied the background theory;
wenzelm
parents: 33282
diff changeset
   105
end;
fbd47f9b9b12 allow "pervasive" local theory declarations, which are applied the background theory;
wenzelm
parents: 33282
diff changeset
   106
25105
c9f67836c4d8 internal tuning: class_target, fork_mixfix, declare_const (singleton), abbrev;
wenzelm
parents: 25096
diff changeset
   107
fun class_target (Target {target, ...}) f =
33671
4b0f2599ed48 modernized structure Local_Theory;
wenzelm
parents: 33670
diff changeset
   108
  Local_Theory.raw_theory f #>
4b0f2599ed48 modernized structure Local_Theory;
wenzelm
parents: 33670
diff changeset
   109
  Local_Theory.target (Class_Target.refresh_syntax target);
24838
1d1bddf87353 put declarations first
haftmann
parents: 24818
diff changeset
   110
21611
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   111
20894
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
   112
(* notes *)
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
   113
21611
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   114
fun import_export_proof ctxt (name, raw_th) =
21594
2859c94d67d4 reworked notes: towards proper import/export of proof terms;
wenzelm
parents: 21585
diff changeset
   115
  let
21611
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   116
    val thy = ProofContext.theory_of ctxt;
36610
bafd82950e24 renamed ProofContext.init to ProofContext.init_global to emphasize that this is not the real thing;
wenzelm
parents: 36106
diff changeset
   117
    val thy_ctxt = ProofContext.init_global thy;
21611
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   118
    val certT = Thm.ctyp_of thy;
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   119
    val cert = Thm.cterm_of thy;
21594
2859c94d67d4 reworked notes: towards proper import/export of proof terms;
wenzelm
parents: 21585
diff changeset
   120
21611
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   121
    (*export assumes/defines*)
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   122
    val th = Goal.norm_result raw_th;
35624
c4e29a0bb8c1 modernized structure Local_Defs;
wenzelm
parents: 35205
diff changeset
   123
    val (defs, th') = Local_Defs.export ctxt thy_ctxt th;
30473
e0b66c11e7e4 Assumption.all_prems_of, Assumption.all_assms_of;
wenzelm
parents: 30438
diff changeset
   124
    val assms = map (MetaSimplifier.rewrite_rule defs o Thm.assume) (Assumption.all_assms_of ctxt);
21611
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   125
    val nprems = Thm.nprems_of th' - Thm.nprems_of th;
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   126
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   127
    (*export fixes*)
22692
1e057a3f087d proper ProofContext.infer_types;
wenzelm
parents: 22673
diff changeset
   128
    val tfrees = map TFree (Thm.fold_terms Term.add_tfrees th' []);
1e057a3f087d proper ProofContext.infer_types;
wenzelm
parents: 22673
diff changeset
   129
    val frees = map Free (Thm.fold_terms Term.add_frees th' []);
21611
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   130
    val (th'' :: vs) = (th' :: map (Drule.mk_term o cert) (map Logic.mk_type tfrees @ frees))
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   131
      |> Variable.export ctxt thy_ctxt
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   132
      |> Drule.zero_var_indexes_list;
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   133
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   134
    (*thm definition*)
33700
768d14a67256 eliminated obsolete thm position tags;
wenzelm
parents: 33671
diff changeset
   135
    val result = PureThy.name_thm true true name th'';
21611
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   136
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   137
    (*import fixes*)
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   138
    val (tvars, vars) =
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   139
      chop (length tfrees) (map (Thm.term_of o Drule.dest_term) vs)
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   140
      |>> map Logic.dest_type;
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   141
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   142
    val instT = map_filter (fn (TVar v, T) => SOME (v, T) | _ => NONE) (tvars ~~ tfrees);
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   143
    val inst = filter (is_Var o fst) (vars ~~ frees);
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   144
    val cinstT = map (pairself certT o apfst TVar) instT;
31977
e03059ae2d82 renamed structure TermSubst to Term_Subst;
wenzelm
parents: 31869
diff changeset
   145
    val cinst = map (pairself (cert o Term.map_types (Term_Subst.instantiateT instT))) inst;
21611
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   146
    val result' = Thm.instantiate (cinstT, cinst) result;
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   147
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   148
    (*import assumes/defines*)
21594
2859c94d67d4 reworked notes: towards proper import/export of proof terms;
wenzelm
parents: 21585
diff changeset
   149
    val assm_tac = FIRST' (map (fn assm => Tactic.compose_tac (false, assm, 0)) assms);
21611
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   150
    val result'' =
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   151
      (case SINGLE (Seq.INTERVAL assm_tac 1 nprems) result' of
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   152
        NONE => raise THM ("Failed to re-import result", 0, [result'])
35739
35a3b3721ffb Local_Defs.contract convenience;
wenzelm
parents: 35717
diff changeset
   153
      | SOME res => Local_Defs.contract ctxt defs (Thm.cprop_of th) res)
21644
5154a7213d3c notes: added non-official name;
wenzelm
parents: 21615
diff changeset
   154
      |> Goal.norm_result
33700
768d14a67256 eliminated obsolete thm position tags;
wenzelm
parents: 33671
diff changeset
   155
      |> PureThy.name_thm false false name;
21611
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   156
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   157
  in (result'', result) end;
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   158
29576
669b560fc2b9 wrecked old locale package and related modules
haftmann
parents: 29393
diff changeset
   159
fun notes (Target {target, is_locale, ...}) kind facts lthy =
21585
2444f1d1127b Assumption.assms_of: cterm;
wenzelm
parents: 21570
diff changeset
   160
  let
21594
2859c94d67d4 reworked notes: towards proper import/export of proof terms;
wenzelm
parents: 21585
diff changeset
   161
    val thy = ProofContext.theory_of lthy;
2859c94d67d4 reworked notes: towards proper import/export of proof terms;
wenzelm
parents: 21585
diff changeset
   162
    val facts' = facts
28991
694227dd3e8c dropped NameSpace.declare_base
haftmann
parents: 28965
diff changeset
   163
      |> map (fn (a, bs) => (a, PureThy.burrow_fact (PureThy.name_multi
33671
4b0f2599ed48 modernized structure Local_Theory;
wenzelm
parents: 33670
diff changeset
   164
          (Local_Theory.full_name lthy (fst a))) bs))
21615
1bd558879c44 notes: proper naming of thm proof, activated import_export_proof;
wenzelm
parents: 21613
diff changeset
   165
      |> PureThy.map_facts (import_export_proof lthy);
21611
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   166
    val local_facts = PureThy.map_facts #1 facts'
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   167
      |> Attrib.map_facts (Attrib.attribute_i thy);
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   168
    val target_facts = PureThy.map_facts #1 facts'
33671
4b0f2599ed48 modernized structure Local_Theory;
wenzelm
parents: 33670
diff changeset
   169
      |> is_locale ? Element.facts_map (Element.morph_ctxt (Local_Theory.target_morphism lthy));
21611
fc95ff1fe738 notes: proper import/export of proofs (still inactive);
wenzelm
parents: 21594
diff changeset
   170
    val global_facts = PureThy.map_facts #2 facts'
25012
448af76a1ba3 pass explicit target record -- more informative peek operation;
wenzelm
parents: 25002
diff changeset
   171
      |> Attrib.map_facts (if is_locale then K I else Attrib.attribute_i thy);
21594
2859c94d67d4 reworked notes: towards proper import/export of proof terms;
wenzelm
parents: 21585
diff changeset
   172
  in
33167
f02b804305d6 maintain group via name space, not tags;
wenzelm
parents: 32785
diff changeset
   173
    lthy
33671
4b0f2599ed48 modernized structure Local_Theory;
wenzelm
parents: 33670
diff changeset
   174
    |> Local_Theory.theory (PureThy.note_thmss kind global_facts #> snd)
4b0f2599ed48 modernized structure Local_Theory;
wenzelm
parents: 33670
diff changeset
   175
    |> not is_locale ? Local_Theory.target (ProofContext.note_thmss kind global_facts #> snd)
4b0f2599ed48 modernized structure Local_Theory;
wenzelm
parents: 33670
diff changeset
   176
    |> is_locale ? Local_Theory.target (Locale.add_thmss target kind target_facts)
30761
ac7570d80c3d renamed ProofContext.note_thmss_i to ProofContext.note_thmss, eliminated obsolete external version;
wenzelm
parents: 30519
diff changeset
   177
    |> ProofContext.note_thmss kind local_facts
20894
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
   178
  end;
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
   179
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
   180
35764
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   181
(* consts *)
24939
wenzelm
parents: 24935
diff changeset
   182
25105
c9f67836c4d8 internal tuning: class_target, fork_mixfix, declare_const (singleton), abbrev;
wenzelm
parents: 25096
diff changeset
   183
fun fork_mixfix (Target {is_locale, is_class, ...}) mx =
c9f67836c4d8 internal tuning: class_target, fork_mixfix, declare_const (singleton), abbrev;
wenzelm
parents: 25096
diff changeset
   184
  if not is_locale then (NoSyn, NoSyn, mx)
c9f67836c4d8 internal tuning: class_target, fork_mixfix, declare_const (singleton), abbrev;
wenzelm
parents: 25096
diff changeset
   185
  else if not is_class then (NoSyn, mx, NoSyn)
c9f67836c4d8 internal tuning: class_target, fork_mixfix, declare_const (singleton), abbrev;
wenzelm
parents: 25096
diff changeset
   186
  else (mx, NoSyn, NoSyn);
25068
a11d25316c3d tuned fork_mixfix (back from class.ML);
wenzelm
parents: 25064
diff changeset
   187
33167
f02b804305d6 maintain group via name space, not tags;
wenzelm
parents: 32785
diff changeset
   188
fun locale_const (Target {target, is_class, ...}) (prmode as (mode, _)) ((b, mx), rhs) phi =
24939
wenzelm
parents: 24935
diff changeset
   189
  let
28965
1de908189869 cleaned up binding module and related code
haftmann
parents: 28941
diff changeset
   190
    val b' = Morphism.binding phi b;
24939
wenzelm
parents: 24935
diff changeset
   191
    val rhs' = Morphism.term phi rhs;
28861
f53abb0733ee using name bindings
haftmann
parents: 28849
diff changeset
   192
    val arg = (b', Term.close_schematic_term rhs');
33537
06c87d2c5b5a locale_const/target_notation: uniform use of Term.aconv_untyped;
wenzelm
parents: 33519
diff changeset
   193
    val same_shape = Term.aconv_untyped (rhs, rhs');
25212
9dd61cb753ae locale_const: in_class workaround prevents additional locale version of class consts;
wenzelm
parents: 25150
diff changeset
   194
    (* FIXME workaround based on educated guess *)
30278
18ce07e05a95 Binding.prefix_of;
wenzelm
parents: 30242
diff changeset
   195
    val prefix' = Binding.prefix_of b';
33282
c6364889fea5 misc tuning;
wenzelm
parents: 33173
diff changeset
   196
    val class_global =
c6364889fea5 misc tuning;
wenzelm
parents: 33173
diff changeset
   197
      Binding.eq_name (b, b') andalso
c6364889fea5 misc tuning;
wenzelm
parents: 33173
diff changeset
   198
      not (null prefix') andalso
c6364889fea5 misc tuning;
wenzelm
parents: 33173
diff changeset
   199
      fst (snd (split_last prefix')) = Class_Target.class_prefix target;
24939
wenzelm
parents: 24935
diff changeset
   200
  in
33537
06c87d2c5b5a locale_const/target_notation: uniform use of Term.aconv_untyped;
wenzelm
parents: 33519
diff changeset
   201
    not (is_class andalso (same_shape orelse class_global)) ?
25212
9dd61cb753ae locale_const: in_class workaround prevents additional locale version of class consts;
wenzelm
parents: 25150
diff changeset
   202
      (Context.mapping_result
33173
b8ca12f6681a eliminated obsolete tags for types/consts -- now handled via name space, in strongly typed fashion;
wenzelm
parents: 33167
diff changeset
   203
        (Sign.add_abbrev PrintMode.internal arg)
b8ca12f6681a eliminated obsolete tags for types/consts -- now handled via name space, in strongly typed fashion;
wenzelm
parents: 33167
diff changeset
   204
        (ProofContext.add_abbrev PrintMode.internal arg)
25212
9dd61cb753ae locale_const: in_class workaround prevents additional locale version of class consts;
wenzelm
parents: 25150
diff changeset
   205
      #-> (fn (lhs' as Const (d, _), _) =>
33537
06c87d2c5b5a locale_const/target_notation: uniform use of Term.aconv_untyped;
wenzelm
parents: 33519
diff changeset
   206
          same_shape ?
25212
9dd61cb753ae locale_const: in_class workaround prevents additional locale version of class consts;
wenzelm
parents: 25150
diff changeset
   207
            (Context.mapping (Sign.revert_abbrev mode d) (ProofContext.revert_abbrev mode d) #>
9dd61cb753ae locale_const: in_class workaround prevents additional locale version of class consts;
wenzelm
parents: 25150
diff changeset
   208
             Morphism.form (ProofContext.target_notation true prmode [(lhs', mx)]))))
24939
wenzelm
parents: 24935
diff changeset
   209
  end;
wenzelm
parents: 24935
diff changeset
   210
wenzelm
parents: 24935
diff changeset
   211
wenzelm
parents: 24935
diff changeset
   212
(* abbrev *)
wenzelm
parents: 24935
diff changeset
   213
28083
103d9282a946 explicit type Name.binding for higher-specification elements;
wenzelm
parents: 27690
diff changeset
   214
fun abbrev (ta as Target {target, is_locale, is_class, ...}) prmode ((b, mx), t) lthy =
24939
wenzelm
parents: 24935
diff changeset
   215
  let
36610
bafd82950e24 renamed ProofContext.init to ProofContext.init_global to emphasize that this is not the real thing;
wenzelm
parents: 36106
diff changeset
   216
    val thy_ctxt = ProofContext.init_global (ProofContext.theory_of lthy);
33671
4b0f2599ed48 modernized structure Local_Theory;
wenzelm
parents: 33670
diff changeset
   217
    val target_ctxt = Local_Theory.target_of lthy;
25105
c9f67836c4d8 internal tuning: class_target, fork_mixfix, declare_const (singleton), abbrev;
wenzelm
parents: 25096
diff changeset
   218
c9f67836c4d8 internal tuning: class_target, fork_mixfix, declare_const (singleton), abbrev;
wenzelm
parents: 25096
diff changeset
   219
    val (mx1, mx2, mx3) = fork_mixfix ta mx;
c9f67836c4d8 internal tuning: class_target, fork_mixfix, declare_const (singleton), abbrev;
wenzelm
parents: 25096
diff changeset
   220
    val t' = Assumption.export_term lthy target_ctxt t;
c9f67836c4d8 internal tuning: class_target, fork_mixfix, declare_const (singleton), abbrev;
wenzelm
parents: 25096
diff changeset
   221
    val xs = map Free (rev (Variable.add_fixed target_ctxt t' []));
c9f67836c4d8 internal tuning: class_target, fork_mixfix, declare_const (singleton), abbrev;
wenzelm
parents: 25096
diff changeset
   222
    val u = fold_rev lambda xs t';
c9f67836c4d8 internal tuning: class_target, fork_mixfix, declare_const (singleton), abbrev;
wenzelm
parents: 25096
diff changeset
   223
    val global_rhs =
c9f67836c4d8 internal tuning: class_target, fork_mixfix, declare_const (singleton), abbrev;
wenzelm
parents: 25096
diff changeset
   224
      singleton (Variable.export_terms (Variable.declare_term u target_ctxt) thy_ctxt) u;
25121
fbea3ca04d51 tuned abbrev interface;
wenzelm
parents: 25105
diff changeset
   225
  in
fbea3ca04d51 tuned abbrev interface;
wenzelm
parents: 25105
diff changeset
   226
    lthy |>
fbea3ca04d51 tuned abbrev interface;
wenzelm
parents: 25105
diff changeset
   227
     (if is_locale then
33671
4b0f2599ed48 modernized structure Local_Theory;
wenzelm
parents: 33670
diff changeset
   228
        Local_Theory.theory_result (Sign.add_abbrev PrintMode.internal (b, global_rhs))
25121
fbea3ca04d51 tuned abbrev interface;
wenzelm
parents: 25105
diff changeset
   229
        #-> (fn (lhs, _) =>
35845
e5980f0ad025 renamed varify/unvarify operations to varify_global/unvarify_global to emphasize that these only work in a global situation;
wenzelm
parents: 35798
diff changeset
   230
          let val lhs' = Term.list_comb (Logic.unvarify_global lhs, xs) in
35798
fd1bb29f8170 replaced type_syntax/term_syntax by uniform syntax_declaration;
wenzelm
parents: 35765
diff changeset
   231
            syntax_declaration ta false (locale_const ta prmode ((b, mx2), lhs')) #>
33173
b8ca12f6681a eliminated obsolete tags for types/consts -- now handled via name space, in strongly typed fashion;
wenzelm
parents: 33167
diff changeset
   232
            is_class ? class_target ta (Class_Target.abbrev target prmode ((b, mx1), t'))
25105
c9f67836c4d8 internal tuning: class_target, fork_mixfix, declare_const (singleton), abbrev;
wenzelm
parents: 25096
diff changeset
   233
          end)
c9f67836c4d8 internal tuning: class_target, fork_mixfix, declare_const (singleton), abbrev;
wenzelm
parents: 25096
diff changeset
   234
      else
33671
4b0f2599ed48 modernized structure Local_Theory;
wenzelm
parents: 33670
diff changeset
   235
        Local_Theory.theory
33173
b8ca12f6681a eliminated obsolete tags for types/consts -- now handled via name space, in strongly typed fashion;
wenzelm
parents: 33167
diff changeset
   236
          (Sign.add_abbrev (#1 prmode) (b, global_rhs) #-> (fn (lhs, _) =>
25121
fbea3ca04d51 tuned abbrev interface;
wenzelm
parents: 25105
diff changeset
   237
           Sign.notation true prmode [(lhs, mx3)])))
33173
b8ca12f6681a eliminated obsolete tags for types/consts -- now handled via name space, in strongly typed fashion;
wenzelm
parents: 33167
diff changeset
   238
    |> ProofContext.add_abbrev PrintMode.internal (b, t) |> snd
35624
c4e29a0bb8c1 modernized structure Local_Defs;
wenzelm
parents: 35205
diff changeset
   239
    |> Local_Defs.fixed_abbrev ((b, NoSyn), t)
24939
wenzelm
parents: 24935
diff changeset
   240
  end;
wenzelm
parents: 24935
diff changeset
   241
wenzelm
parents: 24935
diff changeset
   242
25022
bb0dcb603a13 abbrev: return hypothetical def;
wenzelm
parents: 25012
diff changeset
   243
(* define *)
24939
wenzelm
parents: 24935
diff changeset
   244
35764
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   245
local
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   246
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   247
fun syntax_error c = error ("Illegal mixfix syntax for overloaded constant " ^ quote c);
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   248
35765
09e238561460 local theory specifications handle hidden polymorphism implicitly;
wenzelm
parents: 35764
diff changeset
   249
fun declare_const (ta as Target {target, is_locale, is_class, ...})
09e238561460 local theory specifications handle hidden polymorphism implicitly;
wenzelm
parents: 35764
diff changeset
   250
    extra_tfrees xs ((b, T), mx) lthy =
35764
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   251
  let
35765
09e238561460 local theory specifications handle hidden polymorphism implicitly;
wenzelm
parents: 35764
diff changeset
   252
    val type_params = map (Logic.mk_type o TFree) extra_tfrees;
09e238561460 local theory specifications handle hidden polymorphism implicitly;
wenzelm
parents: 35764
diff changeset
   253
    val term_params =
35764
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   254
      rev (Variable.fixes_of (Local_Theory.target_of lthy))
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   255
      |> map_filter (fn (_, x) =>
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   256
        (case AList.lookup (op =) xs x of
35765
09e238561460 local theory specifications handle hidden polymorphism implicitly;
wenzelm
parents: 35764
diff changeset
   257
          SOME T => SOME (Free (x, T))
35764
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   258
        | NONE => NONE));
35765
09e238561460 local theory specifications handle hidden polymorphism implicitly;
wenzelm
parents: 35764
diff changeset
   259
    val params = type_params @ term_params;
09e238561460 local theory specifications handle hidden polymorphism implicitly;
wenzelm
parents: 35764
diff changeset
   260
09e238561460 local theory specifications handle hidden polymorphism implicitly;
wenzelm
parents: 35764
diff changeset
   261
    val U = map Term.fastype_of params ---> T;
35764
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   262
    val (mx1, mx2, mx3) = fork_mixfix ta mx;
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   263
    val (const, lthy') = lthy |>
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   264
      (case Class_Target.instantiation_param lthy b of
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   265
        SOME c' =>
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   266
          if mx3 <> NoSyn then syntax_error c'
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   267
          else Local_Theory.theory_result (AxClass.declare_overloaded (c', U))
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   268
            ##> Class_Target.confirm_declaration b
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   269
      | NONE =>
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   270
          (case Overloading.operation lthy b of
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   271
            SOME (c', _) =>
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   272
              if mx3 <> NoSyn then syntax_error c'
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   273
              else Local_Theory.theory_result (Overloading.declare (c', U))
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   274
                ##> Overloading.confirm b
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   275
          | NONE => Local_Theory.theory_result (Sign.declare_const ((b, U), mx3))));
35765
09e238561460 local theory specifications handle hidden polymorphism implicitly;
wenzelm
parents: 35764
diff changeset
   276
    val t = Term.list_comb (const, params);
35764
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   277
  in
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   278
    lthy'
35798
fd1bb29f8170 replaced type_syntax/term_syntax by uniform syntax_declaration;
wenzelm
parents: 35765
diff changeset
   279
    |> is_locale ? syntax_declaration ta false (locale_const ta Syntax.mode_default ((b, mx2), t))
35858
0d394a82337e handle hidden polymorphism in class target (without class target syntax, though)
haftmann
parents: 35845
diff changeset
   280
    |> is_class ? class_target ta (Class_Target.declare target ((b, mx1), (type_params, t)))
35764
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   281
    |> Local_Defs.add_def ((b, NoSyn), t)
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   282
  end;
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   283
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   284
in
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   285
33764
7bcefaab8d41 Local_Theory.define: eliminated slightly odd kind argument -- such low-level definitions should be hardly ever exposed to end-users anyway;
wenzelm
parents: 33724
diff changeset
   286
fun define ta ((b, mx), ((name, atts), rhs)) lthy =
24939
wenzelm
parents: 24935
diff changeset
   287
  let
24987
50b07326da38 local_theory: incorporated consts into axioms;
wenzelm
parents: 24983
diff changeset
   288
    val thy = ProofContext.theory_of lthy;
36610
bafd82950e24 renamed ProofContext.init to ProofContext.init_global to emphasize that this is not the real thing;
wenzelm
parents: 36106
diff changeset
   289
    val thy_ctxt = ProofContext.init_global thy;
24939
wenzelm
parents: 24935
diff changeset
   290
30437
910a7aeb8dec more precise treatment of qualified bindings;
wenzelm
parents: 30364
diff changeset
   291
    val name' = Thm.def_binding_optional b name;
35717
1856c0172cf2 more basic Local_Defs.export_cterm;
wenzelm
parents: 35624
diff changeset
   292
1856c0172cf2 more basic Local_Defs.export_cterm;
wenzelm
parents: 35624
diff changeset
   293
    val crhs = Thm.cterm_of thy rhs;
1856c0172cf2 more basic Local_Defs.export_cterm;
wenzelm
parents: 35624
diff changeset
   294
    val (defs, rhs') = Local_Defs.export_cterm lthy thy_ctxt crhs ||> Thm.term_of;
1856c0172cf2 more basic Local_Defs.export_cterm;
wenzelm
parents: 35624
diff changeset
   295
    val rhs_conv = MetaSimplifier.rewrite true defs crhs;
1856c0172cf2 more basic Local_Defs.export_cterm;
wenzelm
parents: 35624
diff changeset
   296
33671
4b0f2599ed48 modernized structure Local_Theory;
wenzelm
parents: 33670
diff changeset
   297
    val xs = Variable.add_fixed (Local_Theory.target_of lthy) rhs' [];
24939
wenzelm
parents: 24935
diff changeset
   298
    val T = Term.fastype_of rhs;
35765
09e238561460 local theory specifications handle hidden polymorphism implicitly;
wenzelm
parents: 35764
diff changeset
   299
    val tfreesT = Term.add_tfreesT T (fold (Term.add_tfreesT o #2) xs []);
09e238561460 local theory specifications handle hidden polymorphism implicitly;
wenzelm
parents: 35764
diff changeset
   300
    val extra_tfrees =
09e238561460 local theory specifications handle hidden polymorphism implicitly;
wenzelm
parents: 35764
diff changeset
   301
      fold_types (fold_atyps
09e238561460 local theory specifications handle hidden polymorphism implicitly;
wenzelm
parents: 35764
diff changeset
   302
        (fn TFree v => if member (op =) tfreesT v then I else insert (op =) v | _ => I)) rhs []
09e238561460 local theory specifications handle hidden polymorphism implicitly;
wenzelm
parents: 35764
diff changeset
   303
      |> sort_wrt #1;
24939
wenzelm
parents: 24935
diff changeset
   304
25105
c9f67836c4d8 internal tuning: class_target, fork_mixfix, declare_const (singleton), abbrev;
wenzelm
parents: 25096
diff changeset
   305
    (*const*)
35765
09e238561460 local theory specifications handle hidden polymorphism implicitly;
wenzelm
parents: 35764
diff changeset
   306
    val ((lhs, local_def), lthy2) = lthy |> declare_const ta extra_tfrees xs ((b, T), mx);
25022
bb0dcb603a13 abbrev: return hypothetical def;
wenzelm
parents: 25012
diff changeset
   307
    val (_, lhs') = Logic.dest_equals (Thm.prop_of local_def);
35765
09e238561460 local theory specifications handle hidden polymorphism implicitly;
wenzelm
parents: 35764
diff changeset
   308
    val Const (head, _) = Term.head_of lhs';
24939
wenzelm
parents: 24935
diff changeset
   309
wenzelm
parents: 24935
diff changeset
   310
    (*def*)
25022
bb0dcb603a13 abbrev: return hypothetical def;
wenzelm
parents: 25012
diff changeset
   311
    val (global_def, lthy3) = lthy2
33671
4b0f2599ed48 modernized structure Local_Theory;
wenzelm
parents: 33670
diff changeset
   312
      |> Local_Theory.theory_result
33282
c6364889fea5 misc tuning;
wenzelm
parents: 33173
diff changeset
   313
        (case Overloading.operation lthy b of
35765
09e238561460 local theory specifications handle hidden polymorphism implicitly;
wenzelm
parents: 35764
diff changeset
   314
          SOME (_, checked) => Overloading.define checked name' (head, rhs')
30519
c05c0199826f coherent binding policy with primitive target operations
haftmann
parents: 30473
diff changeset
   315
        | NONE =>
35764
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   316
            if is_some (Class_Target.instantiation_param lthy b)
35765
09e238561460 local theory specifications handle hidden polymorphism implicitly;
wenzelm
parents: 35764
diff changeset
   317
            then AxClass.define_overloaded name' (head, rhs')
36106
19deea200358 Thm.add_axiom/add_def: return internal name of foundational axiom;
wenzelm
parents: 35858
diff changeset
   318
            else Thm.add_def false false (name', Logic.mk_equals (lhs', rhs')) #>> snd);
35624
c4e29a0bb8c1 modernized structure Local_Defs;
wenzelm
parents: 35205
diff changeset
   319
    val def = Local_Defs.trans_terms lthy3
25022
bb0dcb603a13 abbrev: return hypothetical def;
wenzelm
parents: 25012
diff changeset
   320
      [(*c == global.c xs*)     local_def,
bb0dcb603a13 abbrev: return hypothetical def;
wenzelm
parents: 25012
diff changeset
   321
       (*global.c xs == rhs'*)  global_def,
25485
33840a854e63 tuned interfaces of class module
haftmann
parents: 25462
diff changeset
   322
       (*rhs' == rhs*)          Thm.symmetric rhs_conv];
24939
wenzelm
parents: 24935
diff changeset
   323
25105
c9f67836c4d8 internal tuning: class_target, fork_mixfix, declare_const (singleton), abbrev;
wenzelm
parents: 25096
diff changeset
   324
    (*note*)
24939
wenzelm
parents: 24935
diff changeset
   325
    val ([(res_name, [res])], lthy4) = lthy3
33764
7bcefaab8d41 Local_Theory.define: eliminated slightly odd kind argument -- such low-level definitions should be hardly ever exposed to end-users anyway;
wenzelm
parents: 33724
diff changeset
   326
      |> notes ta "" [((name', atts), [([def], [])])];
24939
wenzelm
parents: 24935
diff changeset
   327
  in ((lhs, (res_name, res)), lthy4) end;
wenzelm
parents: 24935
diff changeset
   328
35764
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   329
end;
f7f88f2e004f minor tuning and simplification;
wenzelm
parents: 35739
diff changeset
   330
24939
wenzelm
parents: 24935
diff changeset
   331
35205
611b90bb89bc removed unused Theory_Target.begin;
wenzelm
parents: 35127
diff changeset
   332
(* init various targets *)
25291
870455627720 misc cleanup of init functions;
wenzelm
parents: 25269
diff changeset
   333
870455627720 misc cleanup of init functions;
wenzelm
parents: 25269
diff changeset
   334
local
20894
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
   335
25291
870455627720 misc cleanup of init functions;
wenzelm
parents: 25269
diff changeset
   336
fun init_target _ NONE = global_target
33670
02b7738aef6a eliminated slightly odd kind argument of LocalTheory.note(s);
wenzelm
parents: 33553
diff changeset
   337
  | init_target thy (SOME target) =
35205
611b90bb89bc removed unused Theory_Target.begin;
wenzelm
parents: 35127
diff changeset
   338
      if Locale.defined thy target
29710
f2e70a0636b9 strict check for locale target
haftmann
parents: 29576
diff changeset
   339
      then make_target target true (Class_Target.is_class thy target) ([], [], []) []
f2e70a0636b9 strict check for locale target
haftmann
parents: 29576
diff changeset
   340
      else error ("No such locale: " ^ quote target);
25291
870455627720 misc cleanup of init functions;
wenzelm
parents: 25269
diff changeset
   341
29576
669b560fc2b9 wrecked old locale package and related modules
haftmann
parents: 29393
diff changeset
   342
fun init_ctxt (Target {target, is_locale, is_class, instantiation, overloading}) =
29358
efdfe5dfe008 rearranged target theories
haftmann
parents: 29252
diff changeset
   343
  if not (null (#1 instantiation)) then Class_Target.init_instantiation instantiation
25519
8570745cb40b overloading target
haftmann
parents: 25514
diff changeset
   344
  else if not (null overloading) then Overloading.init overloading
36610
bafd82950e24 renamed ProofContext.init to ProofContext.init_global to emphasize that this is not the real thing;
wenzelm
parents: 36106
diff changeset
   345
  else if not is_locale then ProofContext.init_global
29576
669b560fc2b9 wrecked old locale package and related modules
haftmann
parents: 29393
diff changeset
   346
  else if not is_class then Locale.init target
29358
efdfe5dfe008 rearranged target theories
haftmann
parents: 29252
diff changeset
   347
  else Class_Target.init target;
25269
f9090ae5cec9 clarified theory target interface
haftmann
parents: 25240
diff changeset
   348
25542
haftmann
parents: 25519
diff changeset
   349
fun init_lthy (ta as Target {target, instantiation, overloading, ...}) =
25291
870455627720 misc cleanup of init functions;
wenzelm
parents: 25269
diff changeset
   350
  Data.put ta #>
33724
5ee13e0428d2 uniform new_group/reset_group;
wenzelm
parents: 33700
diff changeset
   351
  Local_Theory.init NONE (Long_Name.base_name target)
25291
870455627720 misc cleanup of init functions;
wenzelm
parents: 25269
diff changeset
   352
   {pretty = pretty ta,
870455627720 misc cleanup of init functions;
wenzelm
parents: 25269
diff changeset
   353
    abbrev = abbrev ta,
870455627720 misc cleanup of init functions;
wenzelm
parents: 25269
diff changeset
   354
    define = define ta,
870455627720 misc cleanup of init functions;
wenzelm
parents: 25269
diff changeset
   355
    notes = notes ta,
870455627720 misc cleanup of init functions;
wenzelm
parents: 25269
diff changeset
   356
    declaration = declaration ta,
35798
fd1bb29f8170 replaced type_syntax/term_syntax by uniform syntax_declaration;
wenzelm
parents: 35765
diff changeset
   357
    syntax_declaration = syntax_declaration ta,
25291
870455627720 misc cleanup of init functions;
wenzelm
parents: 25269
diff changeset
   358
    reinit = fn lthy => init_lthy_ctxt ta (ProofContext.theory_of lthy),
33671
4b0f2599ed48 modernized structure Local_Theory;
wenzelm
parents: 33670
diff changeset
   359
    exit = Local_Theory.target_of o
29358
efdfe5dfe008 rearranged target theories
haftmann
parents: 29252
diff changeset
   360
      (if not (null (#1 instantiation)) then Class_Target.conclude_instantiation
26049
8186c03194ed overloading: reduced code redundancy, no xstrings here;
wenzelm
parents: 25984
diff changeset
   361
       else if not (null overloading) then Overloading.conclude
8186c03194ed overloading: reduced code redundancy, no xstrings here;
wenzelm
parents: 25984
diff changeset
   362
       else I)}
25291
870455627720 misc cleanup of init functions;
wenzelm
parents: 25269
diff changeset
   363
and init_lthy_ctxt ta = init_lthy ta o init_ctxt ta;
20894
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
   364
26049
8186c03194ed overloading: reduced code redundancy, no xstrings here;
wenzelm
parents: 25984
diff changeset
   365
fun gen_overloading prep_const raw_ops thy =
8186c03194ed overloading: reduced code redundancy, no xstrings here;
wenzelm
parents: 25984
diff changeset
   366
  let
36610
bafd82950e24 renamed ProofContext.init to ProofContext.init_global to emphasize that this is not the real thing;
wenzelm
parents: 36106
diff changeset
   367
    val ctxt = ProofContext.init_global thy;
26049
8186c03194ed overloading: reduced code redundancy, no xstrings here;
wenzelm
parents: 25984
diff changeset
   368
    val ops = raw_ops |> map (fn (name, const, checked) =>
8186c03194ed overloading: reduced code redundancy, no xstrings here;
wenzelm
parents: 25984
diff changeset
   369
      (name, Term.dest_Const (prep_const ctxt const), checked));
29576
669b560fc2b9 wrecked old locale package and related modules
haftmann
parents: 29393
diff changeset
   370
  in thy |> init_lthy_ctxt (make_target "" false false ([], [], []) ops) end;
26049
8186c03194ed overloading: reduced code redundancy, no xstrings here;
wenzelm
parents: 25984
diff changeset
   371
25291
870455627720 misc cleanup of init functions;
wenzelm
parents: 25269
diff changeset
   372
in
20894
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
   373
25291
870455627720 misc cleanup of init functions;
wenzelm
parents: 25269
diff changeset
   374
fun init target thy = init_lthy_ctxt (init_target thy target) thy;
25269
f9090ae5cec9 clarified theory target interface
haftmann
parents: 25240
diff changeset
   375
35205
611b90bb89bc removed unused Theory_Target.begin;
wenzelm
parents: 35127
diff changeset
   376
fun context_cmd "-" thy = init NONE thy
611b90bb89bc removed unused Theory_Target.begin;
wenzelm
parents: 35127
diff changeset
   377
  | context_cmd target thy = init (SOME (Locale.intern thy target)) thy;
33282
c6364889fea5 misc tuning;
wenzelm
parents: 33173
diff changeset
   378
29576
669b560fc2b9 wrecked old locale package and related modules
haftmann
parents: 29393
diff changeset
   379
fun instantiation arities = init_lthy_ctxt (make_target "" false false arities []);
35205
611b90bb89bc removed unused Theory_Target.begin;
wenzelm
parents: 35127
diff changeset
   380
fun instantiation_cmd arities thy = instantiation (Class_Target.read_multi_arity thy arities) thy;
25519
8570745cb40b overloading target
haftmann
parents: 25514
diff changeset
   381
26049
8186c03194ed overloading: reduced code redundancy, no xstrings here;
wenzelm
parents: 25984
diff changeset
   382
val overloading = gen_overloading (fn ctxt => Syntax.check_term ctxt o Const);
8186c03194ed overloading: reduced code redundancy, no xstrings here;
wenzelm
parents: 25984
diff changeset
   383
val overloading_cmd = gen_overloading Syntax.read_term;
25462
dad0291cb76a rudimentary instantiation target
haftmann
parents: 25395
diff changeset
   384
20894
784eefc906aa Common theory targets.
wenzelm
parents:
diff changeset
   385
end;
25291
870455627720 misc cleanup of init functions;
wenzelm
parents: 25269
diff changeset
   386
870455627720 misc cleanup of init functions;
wenzelm
parents: 25269
diff changeset
   387
end;
870455627720 misc cleanup of init functions;
wenzelm
parents: 25269
diff changeset
   388