src/Pure/Isar/bundle.ML
author wenzelm
Wed, 21 Mar 2012 17:25:35 +0100
changeset 47066 8a6124d09ff5
parent 47057 12423b36fcc4
child 47067 4ef29b0c568f
permissions -rw-r--r--
basic support for nested contexts including bundles; include multiple bundles; renamed "affirm" back to "assert" (cf. c4492c6bf450 which was motivated by obsolete Alice/ML); tuned signatures;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
47057
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/Isar/bundle.ML
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
     3
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
     4
Bundled declarations (notes etc.).
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
     5
*)
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
     6
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
     7
signature BUNDLE =
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
     8
sig
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
     9
  type bundle = (thm list * Args.src list) list
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    10
  val the_bundle: Proof.context -> string -> bundle
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    11
  val check: Proof.context -> xstring * Position.T -> string
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    12
  val bundle: binding * (thm list * Args.src list) list ->
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    13
    (binding * typ option * mixfix) list -> local_theory -> local_theory
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    14
  val bundle_cmd: binding * (Facts.ref * Args.src list) list ->
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    15
    (binding * string option * mixfix) list -> local_theory -> local_theory
47066
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
    16
  val include_: string list -> Proof.state -> Proof.state
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
    17
  val include_cmd: (xstring * Position.T) list -> Proof.state -> Proof.state
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
    18
  val including: string list -> Proof.state -> Proof.state
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
    19
  val including_cmd: (xstring * Position.T) list -> Proof.state -> Proof.state
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
    20
  val context_includes: string list -> local_theory -> local_theory
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
    21
  val context_includes_cmd: (xstring * Position.T) list -> local_theory -> local_theory
47057
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    22
  val print_bundles: Proof.context -> unit
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    23
end;
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    24
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    25
structure Bundle: BUNDLE =
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    26
struct
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    27
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    28
(* maintain bundles *)
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    29
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    30
type bundle = (thm list * Args.src list) list;
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    31
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    32
fun transform_bundle phi : bundle -> bundle =
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    33
  map (fn (fact, atts) => (Morphism.fact phi fact, map (Args.transform_values phi) atts));
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    34
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    35
structure Data = Generic_Data
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    36
(
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    37
  type T = bundle Name_Space.table;
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    38
  val empty : T = Name_Space.empty_table "bundle";
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    39
  val extend = I;
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    40
  val merge = Name_Space.merge_tables;
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    41
);
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    42
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    43
val get_bundles = Data.get o Context.Proof;
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    44
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    45
fun the_bundle ctxt name =
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    46
  (case Symtab.lookup (#2 (get_bundles ctxt)) name of
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    47
    SOME bundle => bundle
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    48
  | NONE => error ("Unknown bundle " ^ quote name));
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    49
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    50
fun check ctxt = #1 o Name_Space.check (Context.Proof ctxt) (get_bundles ctxt);
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    51
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    52
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    53
(* define bundle *)
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    54
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    55
local
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    56
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    57
fun gen_bundle prep_fact prep_att prep_vars (binding, raw_bundle) fixes lthy =
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    58
  let
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    59
    val (_, ctxt') = lthy |> prep_vars fixes |-> Proof_Context.add_fixes;
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    60
    val bundle0 = raw_bundle
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    61
      |> map (fn (fact, atts) => (prep_fact lthy fact, map (prep_att lthy) atts));
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    62
    val bundle =
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    63
      Attrib.partial_evaluation ctxt' [(Attrib.empty_binding, bundle0)] |> map snd |> flat
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    64
      |> transform_bundle (Proof_Context.export_morphism ctxt' lthy);
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    65
  in
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    66
    lthy |> Local_Theory.declaration {syntax = false, pervasive = true}
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    67
      (fn phi => fn context =>
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    68
        context |> Data.map
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    69
          (#2 o Name_Space.define context true
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    70
            (Morphism.binding phi binding, transform_bundle phi bundle)))
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    71
  end;
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    72
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    73
in
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    74
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    75
val bundle = gen_bundle (K I) (K I) Proof_Context.cert_vars;
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    76
val bundle_cmd =
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    77
  gen_bundle Proof_Context.get_fact (Attrib.intern_src o Proof_Context.theory_of)
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    78
    Proof_Context.read_vars;
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    79
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    80
end;
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    81
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    82
47066
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
    83
(* include bundles *)
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
    84
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
    85
local
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
    86
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
    87
fun gen_include prep raw_names ctxt =
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
    88
  let
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
    89
    val bundle = maps (the_bundle ctxt o prep ctxt) raw_names;
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
    90
    val attrib = Attrib.attribute_i (Proof_Context.theory_of ctxt);
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
    91
    val note = ((Binding.empty, []), map (apsnd (map attrib)) bundle);
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
    92
  in #2 (Proof_Context.note_thmss "" [note] ctxt) end;
47057
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
    93
47066
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
    94
fun gen_includes prep raw_names lthy =
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
    95
  Named_Target.assert lthy
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
    96
  |> gen_include prep raw_names
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
    97
  |> Local_Theory.open_target (Local_Theory.naming_of lthy) (Local_Theory.operations_of lthy);
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
    98
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
    99
in
47057
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
   100
47066
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
   101
fun include_ names =
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
   102
  Proof.assert_forward #> Proof.map_context (gen_include (K I) names) #> Proof.put_facts NONE;
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
   103
fun include_cmd names =
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
   104
  Proof.assert_forward #> Proof.map_context (gen_include check names) #> Proof.put_facts NONE;
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
   105
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
   106
fun including names = Proof.assert_backward #> Proof.map_context (gen_include (K I) names);
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
   107
fun including_cmd names = Proof.assert_backward #> Proof.map_context (gen_include check names);
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
   108
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
   109
val context_includes = gen_includes (K I);
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
   110
val context_includes_cmd = gen_includes check;
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
   111
8a6124d09ff5 basic support for nested contexts including bundles;
wenzelm
parents: 47057
diff changeset
   112
end;
47057
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
   113
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
   114
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
   115
(* print_bundles *)
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
   116
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
   117
fun print_bundles ctxt =
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
   118
  let
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
   119
    val prt_thm = Pretty.backquote o Display.pretty_thm ctxt;
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
   120
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
   121
    fun prt_fact (ths, []) = map prt_thm ths
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
   122
      | prt_fact (ths, atts) = Pretty.enclose "(" ")"
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
   123
          (Pretty.breaks (map prt_thm ths)) :: Attrib.pretty_attribs ctxt atts;
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
   124
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
   125
    fun prt_bundle (name, bundle) =
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
   126
      Pretty.block (Pretty.command "bundle" :: Pretty.str " " :: Pretty.str name ::
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
   127
        Pretty.breaks (Pretty.str " =" :: maps prt_fact bundle));
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
   128
  in
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
   129
    map prt_bundle (Name_Space.extern_table ctxt (get_bundles ctxt))
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
   130
  end |> Pretty.chunks |> Pretty.writeln;
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
   131
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
   132
end;
12423b36fcc4 basic support for bundled declarations;
wenzelm
parents:
diff changeset
   133