src/Pure/Isar/attrib.ML
author boehmes
Wed, 12 May 2010 23:53:59 +0200
changeset 36895 a96f9793d9c5
parent 36787 f60e4dd6d76f
child 36950 75b8f26f2f07
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:
5823
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/Isar/attrib.ML
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
     2
    Author:     Markus Wenzel, TU Muenchen
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
     3
18734
f5ea6b0d3501 simplified type attribute;
wenzelm
parents: 18708
diff changeset
     4
Symbolic representation of attributes -- with name and syntax.
5823
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
     5
*)
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
     6
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
     7
signature ATTRIB =
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
     8
sig
27729
aaf08262b177 tuned signature;
wenzelm
parents: 26891
diff changeset
     9
  type src = Args.src
29581
b3b33e0298eb binding is alias for Binding.T
haftmann
parents: 29004
diff changeset
    10
  type binding = binding * src list
28965
1de908189869 cleaned up binding module and related code
haftmann
parents: 28084
diff changeset
    11
  val empty_binding: binding
27729
aaf08262b177 tuned signature;
wenzelm
parents: 26891
diff changeset
    12
  val print_attributes: theory -> unit
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16344
diff changeset
    13
  val intern: theory -> xstring -> string
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16344
diff changeset
    14
  val intern_src: theory -> src -> src
21031
a56e6d1e56a3 added pretty_attribs (from attrib.ML);
wenzelm
parents: 20906
diff changeset
    15
  val pretty_attribs: Proof.context -> src list -> Pretty.T list
26891
bfa1944e5238 added defined;
wenzelm
parents: 26715
diff changeset
    16
  val defined: theory -> string -> bool
18734
f5ea6b0d3501 simplified type attribute;
wenzelm
parents: 18708
diff changeset
    17
  val attribute: theory -> src -> attribute
f5ea6b0d3501 simplified type attribute;
wenzelm
parents: 18708
diff changeset
    18
  val attribute_i: theory -> src -> attribute
26336
a0e2b706ce73 renamed datatype thmref to Facts.ref, tuned interfaces;
wenzelm
parents: 25983
diff changeset
    19
  val eval_thms: Proof.context -> (Facts.ref * src list) list -> thm list
18905
5542716503ab more generic type for map_specs/facts;
wenzelm
parents: 18872
diff changeset
    20
  val map_specs: ('a -> 'att) ->
30759
3bc78fbb9f57 added map_facts_refs;
wenzelm
parents: 30575
diff changeset
    21
    (('c * 'a list) * 'b) list -> (('c * 'att list) * 'b) list
18905
5542716503ab more generic type for map_specs/facts;
wenzelm
parents: 18872
diff changeset
    22
  val map_facts: ('a -> 'att) ->
17105
1b07a176a880 added map_specs/facts operators (from locale.ML);
wenzelm
parents: 16934
diff changeset
    23
    (('c * 'a list) * ('d * 'a list) list) list ->
18905
5542716503ab more generic type for map_specs/facts;
wenzelm
parents: 18872
diff changeset
    24
    (('c * 'att list) * ('d * 'att list) list) list
30759
3bc78fbb9f57 added map_facts_refs;
wenzelm
parents: 30575
diff changeset
    25
  val map_facts_refs: ('a -> 'att) -> ('b -> 'fact) ->
3bc78fbb9f57 added map_facts_refs;
wenzelm
parents: 30575
diff changeset
    26
    (('c * 'a list) * ('b * 'a list) list) list ->
3bc78fbb9f57 added map_facts_refs;
wenzelm
parents: 30575
diff changeset
    27
    (('c * 'att list) * ('fact * 'att list) list) list
20289
ba7a7c56bed5 normalized Proof.context/method type aliases;
wenzelm
parents: 20241
diff changeset
    28
  val crude_closure: Proof.context -> src -> src
30525
8a5a0aa30e1c added setup and attribute_setup -- expect plain parser instead of syntax function;
wenzelm
parents: 30513
diff changeset
    29
  val setup: Binding.binding -> attribute context_parser -> string -> theory -> theory
30575
368e26dfba69 more precise type Symbol_Pos.text;
wenzelm
parents: 30543
diff changeset
    30
  val attribute_setup: bstring * Position.T -> Symbol_Pos.text * Position.T -> string ->
368e26dfba69 more precise type Symbol_Pos.text;
wenzelm
parents: 30543
diff changeset
    31
    theory -> theory
30525
8a5a0aa30e1c added setup and attribute_setup -- expect plain parser instead of syntax function;
wenzelm
parents: 30513
diff changeset
    32
  val add_del: attribute -> attribute -> attribute context_parser
30513
1796b8ea88aa eliminated type Args.T;
wenzelm
parents: 30466
diff changeset
    33
  val thm_sel: Facts.interval list parser
1796b8ea88aa eliminated type Args.T;
wenzelm
parents: 30466
diff changeset
    34
  val thm: thm context_parser
1796b8ea88aa eliminated type Args.T;
wenzelm
parents: 30466
diff changeset
    35
  val thms: thm list context_parser
1796b8ea88aa eliminated type Args.T;
wenzelm
parents: 30466
diff changeset
    36
  val multi_thm: thm list context_parser
24110
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
    37
  val print_configs: Proof.context -> unit
25983
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
    38
  val internal: (morphism -> attribute) -> src
36002
f4f343500249 pass raw Context.generic, to avoid wasteful Context.proof_of -- Config.get_thy is often used in performance critical spots like unify.ML;
wenzelm
parents: 36000
diff changeset
    39
  val config_bool: bstring -> (Context.generic -> bool) -> bool Config.T * (theory -> theory)
f4f343500249 pass raw Context.generic, to avoid wasteful Context.proof_of -- Config.get_thy is often used in performance critical spots like unify.ML;
wenzelm
parents: 36000
diff changeset
    40
  val config_int: bstring -> (Context.generic -> int) -> int Config.T * (theory -> theory)
f4f343500249 pass raw Context.generic, to avoid wasteful Context.proof_of -- Config.get_thy is often used in performance critical spots like unify.ML;
wenzelm
parents: 36000
diff changeset
    41
  val config_string: bstring -> (Context.generic -> string) -> string Config.T * (theory -> theory)
f4f343500249 pass raw Context.generic, to avoid wasteful Context.proof_of -- Config.get_thy is often used in performance critical spots like unify.ML;
wenzelm
parents: 36000
diff changeset
    42
  val config_bool_global: bstring -> (Context.generic -> bool) -> bool Config.T * (theory -> theory)
f4f343500249 pass raw Context.generic, to avoid wasteful Context.proof_of -- Config.get_thy is often used in performance critical spots like unify.ML;
wenzelm
parents: 36000
diff changeset
    43
  val config_int_global: bstring -> (Context.generic -> int) -> int Config.T * (theory -> theory)
f4f343500249 pass raw Context.generic, to avoid wasteful Context.proof_of -- Config.get_thy is often used in performance critical spots like unify.ML;
wenzelm
parents: 36000
diff changeset
    44
  val config_string_global: bstring -> (Context.generic -> string) -> string Config.T * (theory -> theory)
5823
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
    45
end;
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
    46
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
    47
structure Attrib: ATTRIB =
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
    48
struct
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
    49
27812
af8edf3ab68c unified Args.T with OuterLex.token, renamed some operations;
wenzelm
parents: 27751
diff changeset
    50
structure T = OuterLex;
af8edf3ab68c unified Args.T with OuterLex.token, renamed some operations;
wenzelm
parents: 27751
diff changeset
    51
structure P = OuterParse;
af8edf3ab68c unified Args.T with OuterLex.token, renamed some operations;
wenzelm
parents: 27751
diff changeset
    52
28084
a05ca48ef263 type Attrib.binding abbreviates Name.binding without attributes;
wenzelm
parents: 28083
diff changeset
    53
a05ca48ef263 type Attrib.binding abbreviates Name.binding without attributes;
wenzelm
parents: 28083
diff changeset
    54
(* source and bindings *)
a05ca48ef263 type Attrib.binding abbreviates Name.binding without attributes;
wenzelm
parents: 28083
diff changeset
    55
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15596
diff changeset
    56
type src = Args.src;
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15596
diff changeset
    57
29581
b3b33e0298eb binding is alias for Binding.T
haftmann
parents: 29004
diff changeset
    58
type binding = binding * src list;
28965
1de908189869 cleaned up binding module and related code
haftmann
parents: 28084
diff changeset
    59
val empty_binding: binding = (Binding.empty, []);
28084
a05ca48ef263 type Attrib.binding abbreviates Name.binding without attributes;
wenzelm
parents: 28083
diff changeset
    60
a05ca48ef263 type Attrib.binding abbreviates Name.binding without attributes;
wenzelm
parents: 28083
diff changeset
    61
27729
aaf08262b177 tuned signature;
wenzelm
parents: 26891
diff changeset
    62
18734
f5ea6b0d3501 simplified type attribute;
wenzelm
parents: 18708
diff changeset
    63
(** named attributes **)
18636
cb068cfdcac8 added rule, declaration;
wenzelm
parents: 18418
diff changeset
    64
18734
f5ea6b0d3501 simplified type attribute;
wenzelm
parents: 18708
diff changeset
    65
(* theory data *)
5823
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
    66
33522
737589bb9bb8 adapted Theory_Data;
wenzelm
parents: 33368
diff changeset
    67
structure Attributes = Theory_Data
22846
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22669
diff changeset
    68
(
33095
bbd52d2f8696 renamed NameSpace to Name_Space -- also to emphasize its subtle change in semantics;
wenzelm
parents: 33092
diff changeset
    69
  type T = ((src -> attribute) * string) Name_Space.table;
33159
369da293bbd4 make SML/NJ happy;
wenzelm
parents: 33096
diff changeset
    70
  val empty : T = Name_Space.empty_table "attribute";
16458
4c6fd0c01d28 accomodate change of TheoryDataFun;
wenzelm
parents: 16344
diff changeset
    71
  val extend = I;
33522
737589bb9bb8 adapted Theory_Data;
wenzelm
parents: 33368
diff changeset
    72
  fun merge data : T = Name_Space.merge_tables data;
22846
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22669
diff changeset
    73
);
5823
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
    74
22846
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22669
diff changeset
    75
fun print_attributes thy =
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22669
diff changeset
    76
  let
24110
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
    77
    val attribs = Attributes.get thy;
33092
c859019d3ac5 eliminated separate stamp -- NameSpace.define/merge etc. ensure uniqueness already;
wenzelm
parents: 31794
diff changeset
    78
    fun prt_attr (name, (_, comment)) = Pretty.block
22846
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22669
diff changeset
    79
      [Pretty.str (name ^ ":"), Pretty.brk 2, Pretty.str comment];
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22669
diff changeset
    80
  in
33095
bbd52d2f8696 renamed NameSpace to Name_Space -- also to emphasize its subtle change in semantics;
wenzelm
parents: 33092
diff changeset
    81
    [Pretty.big_list "attributes:" (map prt_attr (Name_Space.extern_table attribs))]
22846
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22669
diff changeset
    82
    |> Pretty.chunks |> Pretty.writeln
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22669
diff changeset
    83
  end;
7611
5b5aba10c8f6 help: unkown theory context;
wenzelm
parents: 7598
diff changeset
    84
33092
c859019d3ac5 eliminated separate stamp -- NameSpace.define/merge etc. ensure uniqueness already;
wenzelm
parents: 31794
diff changeset
    85
fun add_attribute name att comment thy = thy
33095
bbd52d2f8696 renamed NameSpace to Name_Space -- also to emphasize its subtle change in semantics;
wenzelm
parents: 33092
diff changeset
    86
  |> Attributes.map (#2 o Name_Space.define true (Sign.naming_of thy) (name, (att, comment)));
31306
a74ee84288a0 eliminated old Attrib.add_attributes (and Attrib.syntax);
wenzelm
parents: 31305
diff changeset
    87
5823
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
    88
21031
a56e6d1e56a3 added pretty_attribs (from attrib.ML);
wenzelm
parents: 20906
diff changeset
    89
(* name space *)
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15596
diff changeset
    90
33095
bbd52d2f8696 renamed NameSpace to Name_Space -- also to emphasize its subtle change in semantics;
wenzelm
parents: 33092
diff changeset
    91
val intern = Name_Space.intern o #1 o Attributes.get;
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15596
diff changeset
    92
val intern_src = Args.map_name o intern;
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15596
diff changeset
    93
33095
bbd52d2f8696 renamed NameSpace to Name_Space -- also to emphasize its subtle change in semantics;
wenzelm
parents: 33092
diff changeset
    94
val extern = Name_Space.extern o #1 o Attributes.get o ProofContext.theory_of;
21031
a56e6d1e56a3 added pretty_attribs (from attrib.ML);
wenzelm
parents: 20906
diff changeset
    95
a56e6d1e56a3 added pretty_attribs (from attrib.ML);
wenzelm
parents: 20906
diff changeset
    96
a56e6d1e56a3 added pretty_attribs (from attrib.ML);
wenzelm
parents: 20906
diff changeset
    97
(* pretty printing *)
a56e6d1e56a3 added pretty_attribs (from attrib.ML);
wenzelm
parents: 20906
diff changeset
    98
a56e6d1e56a3 added pretty_attribs (from attrib.ML);
wenzelm
parents: 20906
diff changeset
    99
fun pretty_attribs _ [] = []
a56e6d1e56a3 added pretty_attribs (from attrib.ML);
wenzelm
parents: 20906
diff changeset
   100
  | pretty_attribs ctxt srcs =
a56e6d1e56a3 added pretty_attribs (from attrib.ML);
wenzelm
parents: 20906
diff changeset
   101
      [Pretty.enclose "[" "]"
a56e6d1e56a3 added pretty_attribs (from attrib.ML);
wenzelm
parents: 20906
diff changeset
   102
        (Pretty.commas (map (Args.pretty_src ctxt o Args.map_name (extern ctxt)) srcs))];
a56e6d1e56a3 added pretty_attribs (from attrib.ML);
wenzelm
parents: 20906
diff changeset
   103
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15596
diff changeset
   104
18734
f5ea6b0d3501 simplified type attribute;
wenzelm
parents: 18708
diff changeset
   105
(* get attributes *)
5823
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
   106
26891
bfa1944e5238 added defined;
wenzelm
parents: 26715
diff changeset
   107
val defined = Symtab.defined o #2 o Attributes.get;
bfa1944e5238 added defined;
wenzelm
parents: 26715
diff changeset
   108
18734
f5ea6b0d3501 simplified type attribute;
wenzelm
parents: 18708
diff changeset
   109
fun attribute_i thy =
5823
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
   110
  let
24110
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   111
    val attrs = #2 (Attributes.get thy);
5879
18b8f048d93a several args parsers;
wenzelm
parents: 5823
diff changeset
   112
    fun attr src =
16344
a52fe1277902 attribs: NameSpace.table;
wenzelm
parents: 16141
diff changeset
   113
      let val ((name, _), pos) = Args.dest_src src in
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17221
diff changeset
   114
        (case Symtab.lookup attrs name of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15456
diff changeset
   115
          NONE => error ("Unknown attribute: " ^ quote name ^ Position.str_of pos)
33092
c859019d3ac5 eliminated separate stamp -- NameSpace.define/merge etc. ensure uniqueness already;
wenzelm
parents: 31794
diff changeset
   116
        | SOME (att, _) => (Position.report (Markup.attribute name) pos; att src))
5823
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
   117
      end;
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
   118
  in attr end;
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
   119
18734
f5ea6b0d3501 simplified type attribute;
wenzelm
parents: 18708
diff changeset
   120
fun attribute thy = attribute_i thy o intern_src thy;
18636
cb068cfdcac8 added rule, declaration;
wenzelm
parents: 18418
diff changeset
   121
33666
e49bfeb0d822 eliminated obsolete "generated" kind -- collapsed to unspecific "" (definitely unused according to Lukas Bulwahn);
wenzelm
parents: 33522
diff changeset
   122
fun eval_thms ctxt args = ProofContext.note_thmss ""
30759
3bc78fbb9f57 added map_facts_refs;
wenzelm
parents: 30575
diff changeset
   123
    [(Thm.empty_binding, args |> map (fn (a, atts) =>
3bc78fbb9f57 added map_facts_refs;
wenzelm
parents: 30575
diff changeset
   124
        (ProofContext.get_fact ctxt a, map (attribute (ProofContext.theory_of ctxt)) atts)))] ctxt
26685
40aefd1e8f05 PureThy.get_fact: pass dynamic context;
wenzelm
parents: 26463
diff changeset
   125
  |> fst |> maps snd;
24723
2110df1e157d added eval_thms;
wenzelm
parents: 24713
diff changeset
   126
5823
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
   127
17105
1b07a176a880 added map_specs/facts operators (from locale.ML);
wenzelm
parents: 16934
diff changeset
   128
(* attributed declarations *)
1b07a176a880 added map_specs/facts operators (from locale.ML);
wenzelm
parents: 16934
diff changeset
   129
1b07a176a880 added map_specs/facts operators (from locale.ML);
wenzelm
parents: 16934
diff changeset
   130
fun map_specs f = map (apfst (apsnd (map f)));
30759
3bc78fbb9f57 added map_facts_refs;
wenzelm
parents: 30575
diff changeset
   131
17105
1b07a176a880 added map_specs/facts operators (from locale.ML);
wenzelm
parents: 16934
diff changeset
   132
fun map_facts f = map (apfst (apsnd (map f)) o apsnd (map (apsnd (map f))));
30759
3bc78fbb9f57 added map_facts_refs;
wenzelm
parents: 30575
diff changeset
   133
fun map_facts_refs f g = map_facts f #> map (apsnd (map (apfst g)));
17105
1b07a176a880 added map_specs/facts operators (from locale.ML);
wenzelm
parents: 16934
diff changeset
   134
1b07a176a880 added map_specs/facts operators (from locale.ML);
wenzelm
parents: 16934
diff changeset
   135
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15596
diff changeset
   136
(* crude_closure *)
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15596
diff changeset
   137
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15596
diff changeset
   138
(*Produce closure without knowing facts in advance! The following
18734
f5ea6b0d3501 simplified type attribute;
wenzelm
parents: 18708
diff changeset
   139
  works reasonably well for attribute parsers that do not peek at the
f5ea6b0d3501 simplified type attribute;
wenzelm
parents: 18708
diff changeset
   140
  thm structure.*)
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15596
diff changeset
   141
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15596
diff changeset
   142
fun crude_closure ctxt src =
18734
f5ea6b0d3501 simplified type attribute;
wenzelm
parents: 18708
diff changeset
   143
 (try (fn () => attribute_i (ProofContext.theory_of ctxt) src
f5ea6b0d3501 simplified type attribute;
wenzelm
parents: 18708
diff changeset
   144
    (Context.Proof ctxt, Drule.asm_rl)) ();
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15596
diff changeset
   145
  Args.closure src);
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15596
diff changeset
   146
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15596
diff changeset
   147
30525
8a5a0aa30e1c added setup and attribute_setup -- expect plain parser instead of syntax function;
wenzelm
parents: 30513
diff changeset
   148
(* attribute setup *)
8a5a0aa30e1c added setup and attribute_setup -- expect plain parser instead of syntax function;
wenzelm
parents: 30513
diff changeset
   149
31306
a74ee84288a0 eliminated old Attrib.add_attributes (and Attrib.syntax);
wenzelm
parents: 31305
diff changeset
   150
fun syntax scan = Args.syntax "attribute" scan;
30525
8a5a0aa30e1c added setup and attribute_setup -- expect plain parser instead of syntax function;
wenzelm
parents: 30513
diff changeset
   151
31306
a74ee84288a0 eliminated old Attrib.add_attributes (and Attrib.syntax);
wenzelm
parents: 31305
diff changeset
   152
fun setup name scan =
a74ee84288a0 eliminated old Attrib.add_attributes (and Attrib.syntax);
wenzelm
parents: 31305
diff changeset
   153
  add_attribute name
a74ee84288a0 eliminated old Attrib.add_attributes (and Attrib.syntax);
wenzelm
parents: 31305
diff changeset
   154
    (fn src => fn (ctxt, th) => let val (a, ctxt') = syntax scan src ctxt in a (ctxt', th) end);
5879
18b8f048d93a several args parsers;
wenzelm
parents: 5823
diff changeset
   155
30525
8a5a0aa30e1c added setup and attribute_setup -- expect plain parser instead of syntax function;
wenzelm
parents: 30513
diff changeset
   156
fun attribute_setup name (txt, pos) cmt =
8a5a0aa30e1c added setup and attribute_setup -- expect plain parser instead of syntax function;
wenzelm
parents: 30513
diff changeset
   157
  Context.theory_map (ML_Context.expression pos
8a5a0aa30e1c added setup and attribute_setup -- expect plain parser instead of syntax function;
wenzelm
parents: 30513
diff changeset
   158
    "val (name, scan, comment): binding * attribute context_parser * string"
8a5a0aa30e1c added setup and attribute_setup -- expect plain parser instead of syntax function;
wenzelm
parents: 30513
diff changeset
   159
    "Context.map_theory (Attrib.setup name scan comment)"
8a5a0aa30e1c added setup and attribute_setup -- expect plain parser instead of syntax function;
wenzelm
parents: 30513
diff changeset
   160
    ("(" ^ ML_Syntax.make_binding name ^ ", " ^ txt ^ ", " ^ ML_Syntax.print_string cmt ^ ")"));
8a5a0aa30e1c added setup and attribute_setup -- expect plain parser instead of syntax function;
wenzelm
parents: 30513
diff changeset
   161
8a5a0aa30e1c added setup and attribute_setup -- expect plain parser instead of syntax function;
wenzelm
parents: 30513
diff changeset
   162
31305
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   163
(* add/del syntax *)
5823
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
   164
31305
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   165
fun add_del add del = Scan.lift (Args.add >> K add || Args.del >> K del || Scan.succeed add);
5879
18b8f048d93a several args parsers;
wenzelm
parents: 5823
diff changeset
   166
18b8f048d93a several args parsers;
wenzelm
parents: 5823
diff changeset
   167
25983
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   168
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   169
(** parsing attributed theorems **)
5879
18b8f048d93a several args parsers;
wenzelm
parents: 5823
diff changeset
   170
27812
af8edf3ab68c unified Args.T with OuterLex.token, renamed some operations;
wenzelm
parents: 27751
diff changeset
   171
val thm_sel = P.$$$ "(" |-- P.list1
af8edf3ab68c unified Args.T with OuterLex.token, renamed some operations;
wenzelm
parents: 27751
diff changeset
   172
 (P.nat --| P.minus -- P.nat >> Facts.FromTo ||
af8edf3ab68c unified Args.T with OuterLex.token, renamed some operations;
wenzelm
parents: 27751
diff changeset
   173
  P.nat --| P.minus >> Facts.From ||
af8edf3ab68c unified Args.T with OuterLex.token, renamed some operations;
wenzelm
parents: 27751
diff changeset
   174
  P.nat >> Facts.Single) --| P.$$$ ")";
af8edf3ab68c unified Args.T with OuterLex.token, renamed some operations;
wenzelm
parents: 27751
diff changeset
   175
18636
cb068cfdcac8 added rule, declaration;
wenzelm
parents: 18418
diff changeset
   176
local
cb068cfdcac8 added rule, declaration;
wenzelm
parents: 18418
diff changeset
   177
21698
43a842769765 thms etc.: proper treatment of internal_fact with selection;
wenzelm
parents: 21658
diff changeset
   178
val fact_name = Args.internal_fact >> K "<fact>" || Args.name;
43a842769765 thms etc.: proper treatment of internal_fact with selection;
wenzelm
parents: 21658
diff changeset
   179
26336
a0e2b706ce73 renamed datatype thmref to Facts.ref, tuned interfaces;
wenzelm
parents: 25983
diff changeset
   180
fun gen_thm pick = Scan.depend (fn context =>
a0e2b706ce73 renamed datatype thmref to Facts.ref, tuned interfaces;
wenzelm
parents: 25983
diff changeset
   181
  let
a0e2b706ce73 renamed datatype thmref to Facts.ref, tuned interfaces;
wenzelm
parents: 25983
diff changeset
   182
    val thy = Context.theory_of context;
26685
40aefd1e8f05 PureThy.get_fact: pass dynamic context;
wenzelm
parents: 26463
diff changeset
   183
    val get = Context.cases (PureThy.get_fact context) ProofContext.get_fact context;
26361
7946f459c6c8 Facts.Named: include position;
wenzelm
parents: 26345
diff changeset
   184
    val get_fact = get o Facts.Fact;
27820
56515e560104 pass position to get_fact;
wenzelm
parents: 27812
diff changeset
   185
    fun get_named pos name = get (Facts.Named ((name, pos), NONE));
26336
a0e2b706ce73 renamed datatype thmref to Facts.ref, tuned interfaces;
wenzelm
parents: 25983
diff changeset
   186
  in
27820
56515e560104 pass position to get_fact;
wenzelm
parents: 27812
diff changeset
   187
    P.$$$ "[" |-- Args.attribs (intern thy) --| P.$$$ "]" >> (fn srcs =>
24008
63ff2445ce1e renamed Config to ConfigOption;
wenzelm
parents: 24003
diff changeset
   188
      let
26336
a0e2b706ce73 renamed datatype thmref to Facts.ref, tuned interfaces;
wenzelm
parents: 25983
diff changeset
   189
        val atts = map (attribute_i thy) srcs;
a0e2b706ce73 renamed datatype thmref to Facts.ref, tuned interfaces;
wenzelm
parents: 25983
diff changeset
   190
        val (context', th') = Library.apply atts (context, Drule.dummy_thm);
a0e2b706ce73 renamed datatype thmref to Facts.ref, tuned interfaces;
wenzelm
parents: 25983
diff changeset
   191
      in (context', pick "" [th']) end)
a0e2b706ce73 renamed datatype thmref to Facts.ref, tuned interfaces;
wenzelm
parents: 25983
diff changeset
   192
    ||
a0e2b706ce73 renamed datatype thmref to Facts.ref, tuned interfaces;
wenzelm
parents: 25983
diff changeset
   193
    (Scan.ahead Args.alt_name -- Args.named_fact get_fact
27820
56515e560104 pass position to get_fact;
wenzelm
parents: 27812
diff changeset
   194
      >> (fn (s, fact) => ("", Facts.Fact s, fact)) ||
56515e560104 pass position to get_fact;
wenzelm
parents: 27812
diff changeset
   195
     Scan.ahead (P.position fact_name) :|-- (fn (name, pos) =>
56515e560104 pass position to get_fact;
wenzelm
parents: 27812
diff changeset
   196
      Args.named_fact (get_named pos) -- Scan.option thm_sel
56515e560104 pass position to get_fact;
wenzelm
parents: 27812
diff changeset
   197
        >> (fn (fact, sel) => (name, Facts.Named ((name, pos), sel), fact))))
26336
a0e2b706ce73 renamed datatype thmref to Facts.ref, tuned interfaces;
wenzelm
parents: 25983
diff changeset
   198
    -- Args.opt_attribs (intern thy) >> (fn ((name, thmref, fact), srcs) =>
a0e2b706ce73 renamed datatype thmref to Facts.ref, tuned interfaces;
wenzelm
parents: 25983
diff changeset
   199
      let
a0e2b706ce73 renamed datatype thmref to Facts.ref, tuned interfaces;
wenzelm
parents: 25983
diff changeset
   200
        val ths = Facts.select thmref fact;
a0e2b706ce73 renamed datatype thmref to Facts.ref, tuned interfaces;
wenzelm
parents: 25983
diff changeset
   201
        val atts = map (attribute_i thy) srcs;
30190
479806475f3c use long names for old-style fold combinators;
wenzelm
parents: 29690
diff changeset
   202
        val (context', ths') = Library.foldl_map (Library.apply atts) (context, ths);
26336
a0e2b706ce73 renamed datatype thmref to Facts.ref, tuned interfaces;
wenzelm
parents: 25983
diff changeset
   203
      in (context', pick name ths') end)
a0e2b706ce73 renamed datatype thmref to Facts.ref, tuned interfaces;
wenzelm
parents: 25983
diff changeset
   204
  end);
15456
956d6acacf89 Specific theorems in a named list of theorems can now be referred to
berghofe
parents: 15117
diff changeset
   205
18636
cb068cfdcac8 added rule, declaration;
wenzelm
parents: 18418
diff changeset
   206
in
cb068cfdcac8 added rule, declaration;
wenzelm
parents: 18418
diff changeset
   207
26336
a0e2b706ce73 renamed datatype thmref to Facts.ref, tuned interfaces;
wenzelm
parents: 25983
diff changeset
   208
val thm = gen_thm Facts.the_single;
18998
10c251f29847 Context.generic is canonical state of parsers;
wenzelm
parents: 18977
diff changeset
   209
val multi_thm = gen_thm (K I);
19482
9f11af8f7ef9 tuned basic list operators (flat, maps, map_filter);
wenzelm
parents: 19473
diff changeset
   210
val thms = Scan.repeat multi_thm >> flat;
18636
cb068cfdcac8 added rule, declaration;
wenzelm
parents: 18418
diff changeset
   211
cb068cfdcac8 added rule, declaration;
wenzelm
parents: 18418
diff changeset
   212
end;
cb068cfdcac8 added rule, declaration;
wenzelm
parents: 18418
diff changeset
   213
5823
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
   214
5879
18b8f048d93a several args parsers;
wenzelm
parents: 5823
diff changeset
   215
25983
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   216
(** basic attributes **)
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   217
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   218
(* internal *)
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   219
27812
af8edf3ab68c unified Args.T with OuterLex.token, renamed some operations;
wenzelm
parents: 27751
diff changeset
   220
fun internal att = Args.src (("Pure.attribute", [T.mk_attribute att]), Position.none);
25983
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   221
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   222
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   223
(* rule composition *)
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   224
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   225
val COMP_att =
31305
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   226
  Scan.lift (Scan.optional (Args.bracks P.nat) 1) -- thm
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   227
    >> (fn (i, B) => Thm.rule_attribute (fn _ => fn A => Drule.compose_single (A, i, B)));
25983
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   228
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   229
val THEN_att =
31305
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   230
  Scan.lift (Scan.optional (Args.bracks P.nat) 1) -- thm
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   231
    >> (fn (i, B) => Thm.rule_attribute (fn _ => fn A => A RSN (i, B)));
25983
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   232
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   233
val OF_att =
31305
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   234
  thms >> (fn Bs => Thm.rule_attribute (fn _ => fn A => Bs MRS A));
25983
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   235
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   236
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   237
(* rename_abs *)
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   238
31323
89f218fcab2a made SML/NJ happy;
wenzelm
parents: 31306
diff changeset
   239
fun rename_abs x = (Scan.repeat (Args.maybe Args.name) >> (apsnd o Drule.rename_bvars')) x;
25983
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   240
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   241
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   242
(* unfold / fold definitions *)
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   243
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   244
fun unfolded_syntax rule =
31305
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   245
  thms >> (fn ths => Thm.rule_attribute (fn context => rule (Context.proof_of context) ths));
25983
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   246
35624
c4e29a0bb8c1 modernized structure Local_Defs;
wenzelm
parents: 35021
diff changeset
   247
val unfolded = unfolded_syntax Local_Defs.unfold;
c4e29a0bb8c1 modernized structure Local_Defs;
wenzelm
parents: 35021
diff changeset
   248
val folded = unfolded_syntax Local_Defs.fold;
25983
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   249
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   250
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   251
(* rule format *)
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   252
31305
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   253
val rule_format = Args.mode "no_asm"
35625
9c818cab0dd0 modernized structure Object_Logic;
wenzelm
parents: 35624
diff changeset
   254
  >> (fn true => Object_Logic.rule_format_no_asm | false => Object_Logic.rule_format);
25983
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   255
31305
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   256
val elim_format = Thm.rule_attribute (K Tactic.make_elim);
25983
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   257
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   258
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   259
(* misc rules *)
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   260
31305
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   261
val no_vars = Thm.rule_attribute (fn context => fn th =>
26715
00ff79ab6e6b no_vars: reset body mode, i.e. invent global frees (which are acceptable to Variable.auto_fixes);
wenzelm
parents: 26685
diff changeset
   262
  let
00ff79ab6e6b no_vars: reset body mode, i.e. invent global frees (which are acceptable to Variable.auto_fixes);
wenzelm
parents: 26685
diff changeset
   263
    val ctxt = Variable.set_body false (Context.proof_of context);
31794
71af1fd6a5e4 renamed Variable.import_thms to Variable.import (back again cf. ed7aa5a350ef -- Alice is no longer supported);
wenzelm
parents: 31365
diff changeset
   264
    val ((_, [th']), _) = Variable.import true [th] ctxt;
31305
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   265
  in th' end);
25983
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   266
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   267
val eta_long =
31305
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   268
  Thm.rule_attribute (K (Conv.fconv_rule Drule.eta_long_conversion));
25983
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   269
31305
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   270
val rotated = Scan.optional P.int 1 >> (fn n => Thm.rule_attribute (K (rotate_prems n)));
29690
c81f8b2967e1 Added abs_def attribute.
berghofe
parents: 29581
diff changeset
   271
25983
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   272
111d2ed164f4 misc tuning and internal rearrangement;
wenzelm
parents: 24723
diff changeset
   273
(* theory setup *)
5823
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
   274
26463
9283b4185fdf Context.>> : operate on Context.generic;
wenzelm
parents: 26435
diff changeset
   275
val _ = Context.>> (Context.map_theory
31305
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   276
 (setup (Binding.name "attribute") (Scan.lift Args.internal_attribute >> Morphism.form)
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   277
    "internal attribute" #>
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   278
  setup (Binding.name "tagged") (Scan.lift (Args.name -- Args.name) >> Thm.tag) "tagged theorem" #>
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   279
  setup (Binding.name "untagged") (Scan.lift Args.name >> Thm.untag) "untagged theorem" #>
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   280
  setup (Binding.name "kind") (Scan.lift Args.name >> Thm.kind) "theorem kind" #>
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   281
  setup (Binding.name "COMP") COMP_att "direct composition with rules (no lifting)" #>
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   282
  setup (Binding.name "THEN") THEN_att "resolution with rule" #>
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   283
  setup (Binding.name "OF") OF_att "rule applied to facts" #>
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   284
  setup (Binding.name "rename_abs") (Scan.lift rename_abs)
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   285
    "rename bound variables in abstractions" #>
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   286
  setup (Binding.name "unfolded") unfolded "unfolded definitions" #>
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   287
  setup (Binding.name "folded") folded "folded definitions" #>
33368
b1cf34f1855c modernized structure Rule_Cases;
wenzelm
parents: 33159
diff changeset
   288
  setup (Binding.name "consumes") (Scan.lift (Scan.optional P.nat 1) >> Rule_Cases.consumes)
31305
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   289
    "number of consumed facts" #>
34986
7f7939c9370f Added "constraints" tag / attribute for specifying the number of equality
berghofe
parents: 33666
diff changeset
   290
  setup (Binding.name "constraints") (Scan.lift P.nat >> Rule_Cases.constraints)
7f7939c9370f Added "constraints" tag / attribute for specifying the number of equality
berghofe
parents: 33666
diff changeset
   291
    "number of equality constraints" #>
33368
b1cf34f1855c modernized structure Rule_Cases;
wenzelm
parents: 33159
diff changeset
   292
  setup (Binding.name "case_names") (Scan.lift (Scan.repeat1 Args.name) >> Rule_Cases.case_names)
31305
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   293
    "named rule cases" #>
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   294
  setup (Binding.name "case_conclusion")
33368
b1cf34f1855c modernized structure Rule_Cases;
wenzelm
parents: 33159
diff changeset
   295
    (Scan.lift (Args.name -- Scan.repeat Args.name) >> Rule_Cases.case_conclusion)
31305
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   296
    "named conclusion of rule cases" #>
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   297
  setup (Binding.name "params")
33368
b1cf34f1855c modernized structure Rule_Cases;
wenzelm
parents: 33159
diff changeset
   298
    (Scan.lift (P.and_list1 (Scan.repeat Args.name)) >> Rule_Cases.params)
31305
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   299
    "named rule parameters" #>
35021
c839a4c670c6 renamed old-style Drule.standard to Drule.export_without_context, to emphasize that this is in no way a standard operation;
wenzelm
parents: 34986
diff changeset
   300
  setup (Binding.name "standard") (Scan.succeed (Thm.rule_attribute (K Drule.export_without_context)))
31305
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   301
    "result put into standard form (legacy)" #>
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   302
  setup (Binding.name "rule_format") rule_format "result put into canonical rule format" #>
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   303
  setup (Binding.name "elim_format") (Scan.succeed elim_format)
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   304
    "destruct rule turned into elimination rule format" #>
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   305
  setup (Binding.name "no_vars") (Scan.succeed no_vars) "frozen schematic vars" #>
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   306
  setup (Binding.name "eta_long") (Scan.succeed eta_long)
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   307
    "put theorem into eta long beta normal form" #>
35625
9c818cab0dd0 modernized structure Object_Logic;
wenzelm
parents: 35624
diff changeset
   308
  setup (Binding.name "atomize") (Scan.succeed Object_Logic.declare_atomize)
31305
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   309
    "declaration of atomize rule" #>
35625
9c818cab0dd0 modernized structure Object_Logic;
wenzelm
parents: 35624
diff changeset
   310
  setup (Binding.name "rulify") (Scan.succeed Object_Logic.declare_rulify)
31305
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   311
    "declaration of rulify rule" #>
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   312
  setup (Binding.name "rotated") (Scan.lift rotated) "rotated theorem premises" #>
35624
c4e29a0bb8c1 modernized structure Local_Defs;
wenzelm
parents: 35021
diff changeset
   313
  setup (Binding.name "defn") (add_del Local_Defs.defn_add Local_Defs.defn_del)
31305
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   314
    "declaration of definitional transformations" #>
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   315
  setup (Binding.name "abs_def") (Scan.succeed (Thm.rule_attribute (K Drule.abs_def)))
a16f4d4f5b24 modernized attribute setup;
wenzelm
parents: 31177
diff changeset
   316
    "abstract over free variables of a definition"));
8633
427ead639d8a added add_del_args;
wenzelm
parents: 8496
diff changeset
   317
5823
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
   318
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
   319
24110
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   320
(** configuration options **)
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   321
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   322
(* naming *)
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   323
33522
737589bb9bb8 adapted Theory_Data;
wenzelm
parents: 33368
diff changeset
   324
structure Configs = Theory_Data
24713
8b3b6d09ef40 tuned functor application;
wenzelm
parents: 24238
diff changeset
   325
(
24110
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   326
  type T = Config.value Config.T Symtab.table;
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   327
  val empty = Symtab.empty;
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   328
  val extend = I;
33522
737589bb9bb8 adapted Theory_Data;
wenzelm
parents: 33368
diff changeset
   329
  fun merge data = Symtab.merge (K true) data;
24713
8b3b6d09ef40 tuned functor application;
wenzelm
parents: 24238
diff changeset
   330
);
5823
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
   331
24110
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   332
fun print_configs ctxt =
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   333
  let
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   334
    val thy = ProofContext.theory_of ctxt;
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   335
    fun prt (name, config) =
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   336
      let val value = Config.get ctxt config in
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   337
        Pretty.block [Pretty.str (name ^ ": " ^ Config.print_type value ^ " ="), Pretty.brk 1,
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   338
          Pretty.str (Config.print_value value)]
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   339
      end;
33095
bbd52d2f8696 renamed NameSpace to Name_Space -- also to emphasize its subtle change in semantics;
wenzelm
parents: 33092
diff changeset
   340
    val configs = Name_Space.extern_table (#1 (Attributes.get thy), Configs.get thy);
24110
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   341
  in Pretty.writeln (Pretty.big_list "configuration options" (map prt configs)) end;
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   342
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   343
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   344
(* concrete syntax *)
23988
aa46577f4f44 added attribute "option" for setting configuration options;
wenzelm
parents: 23937
diff changeset
   345
24003
da76d7e6435c attribute "option": more elaborate syntax (with value parsing);
wenzelm
parents: 23988
diff changeset
   346
local
da76d7e6435c attribute "option": more elaborate syntax (with value parsing);
wenzelm
parents: 23988
diff changeset
   347
27820
56515e560104 pass position to get_fact;
wenzelm
parents: 27812
diff changeset
   348
val equals = P.$$$ "=";
24003
da76d7e6435c attribute "option": more elaborate syntax (with value parsing);
wenzelm
parents: 23988
diff changeset
   349
24110
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   350
fun scan_value (Config.Bool _) =
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   351
      equals -- Args.$$$ "false" >> K (Config.Bool false) ||
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   352
      equals -- Args.$$$ "true" >> K (Config.Bool true) ||
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   353
      Scan.succeed (Config.Bool true)
27812
af8edf3ab68c unified Args.T with OuterLex.token, renamed some operations;
wenzelm
parents: 27751
diff changeset
   354
  | scan_value (Config.Int _) = equals |-- P.int >> Config.Int
24110
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   355
  | scan_value (Config.String _) = equals |-- Args.name >> Config.String;
24003
da76d7e6435c attribute "option": more elaborate syntax (with value parsing);
wenzelm
parents: 23988
diff changeset
   356
24110
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   357
fun scan_config thy config =
36787
f60e4dd6d76f renamed Config.get_thy to Config.get_global etc. to indicate that this is not the real thing;
wenzelm
parents: 36002
diff changeset
   358
  let val config_type = Config.get_global thy config
24110
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   359
  in scan_value config_type >> (K o Thm.declaration_attribute o K o Config.put_generic config) end;
24003
da76d7e6435c attribute "option": more elaborate syntax (with value parsing);
wenzelm
parents: 23988
diff changeset
   360
da76d7e6435c attribute "option": more elaborate syntax (with value parsing);
wenzelm
parents: 23988
diff changeset
   361
in
da76d7e6435c attribute "option": more elaborate syntax (with value parsing);
wenzelm
parents: 23988
diff changeset
   362
24126
913e1fa904fb turned simp_depth_limit into configuration option;
wenzelm
parents: 24110
diff changeset
   363
fun register_config config thy =
913e1fa904fb turned simp_depth_limit into configuration option;
wenzelm
parents: 24110
diff changeset
   364
  let
913e1fa904fb turned simp_depth_limit into configuration option;
wenzelm
parents: 24110
diff changeset
   365
    val bname = Config.name_of config;
28965
1de908189869 cleaned up binding module and related code
haftmann
parents: 28084
diff changeset
   366
    val name = Sign.full_bname thy bname;
24126
913e1fa904fb turned simp_depth_limit into configuration option;
wenzelm
parents: 24110
diff changeset
   367
  in
913e1fa904fb turned simp_depth_limit into configuration option;
wenzelm
parents: 24110
diff changeset
   368
    thy
31306
a74ee84288a0 eliminated old Attrib.add_attributes (and Attrib.syntax);
wenzelm
parents: 31305
diff changeset
   369
    |> setup (Binding.name bname) (Scan.lift (scan_config thy config) >> Morphism.form)
a74ee84288a0 eliminated old Attrib.add_attributes (and Attrib.syntax);
wenzelm
parents: 31305
diff changeset
   370
      "configuration option"
24126
913e1fa904fb turned simp_depth_limit into configuration option;
wenzelm
parents: 24110
diff changeset
   371
    |> Configs.map (Symtab.update (name, config))
913e1fa904fb turned simp_depth_limit into configuration option;
wenzelm
parents: 24110
diff changeset
   372
  end;
24110
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   373
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   374
fun declare_config make coerce global name default =
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   375
  let
36000
5560b2437789 configuration options admit dynamic default values;
wenzelm
parents: 35998
diff changeset
   376
    val config_value = Config.declare global name (make o default);
24110
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   377
    val config = coerce config_value;
24126
913e1fa904fb turned simp_depth_limit into configuration option;
wenzelm
parents: 24110
diff changeset
   378
  in (config, register_config config_value) end;
24110
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   379
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   380
val config_bool   = declare_config Config.Bool Config.bool false;
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   381
val config_int    = declare_config Config.Int Config.int false;
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   382
val config_string = declare_config Config.String Config.string false;
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   383
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   384
val config_bool_global   = declare_config Config.Bool Config.bool true;
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   385
val config_int_global    = declare_config Config.Int Config.int true;
4ab3084e311c tuned config options: eliminated separate attribute "option";
wenzelm
parents: 24030
diff changeset
   386
val config_string_global = declare_config Config.String Config.string true;
24003
da76d7e6435c attribute "option": more elaborate syntax (with value parsing);
wenzelm
parents: 23988
diff changeset
   387
da76d7e6435c attribute "option": more elaborate syntax (with value parsing);
wenzelm
parents: 23988
diff changeset
   388
end;
23988
aa46577f4f44 added attribute "option" for setting configuration options;
wenzelm
parents: 23937
diff changeset
   389
aa46577f4f44 added attribute "option" for setting configuration options;
wenzelm
parents: 23937
diff changeset
   390
18636
cb068cfdcac8 added rule, declaration;
wenzelm
parents: 18418
diff changeset
   391
(* theory setup *)
5823
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
   392
26463
9283b4185fdf Context.>> : operate on Context.generic;
wenzelm
parents: 26435
diff changeset
   393
val _ = Context.>> (Context.map_theory
24178
4ff1dc2aa18d turned Unify flags into configuration options (global only);
wenzelm
parents: 24126
diff changeset
   394
 (register_config Unify.trace_bound_value #>
4ff1dc2aa18d turned Unify flags into configuration options (global only);
wenzelm
parents: 24126
diff changeset
   395
  register_config Unify.search_bound_value #>
4ff1dc2aa18d turned Unify flags into configuration options (global only);
wenzelm
parents: 24126
diff changeset
   396
  register_config Unify.trace_simp_value #>
4ff1dc2aa18d turned Unify flags into configuration options (global only);
wenzelm
parents: 24126
diff changeset
   397
  register_config Unify.trace_types_value #>
35979
12bb31230550 replaced references 'trace_simp' and 'debug_simp' by configuration options stored in the context
boehmes
parents: 35625
diff changeset
   398
  register_config MetaSimplifier.simp_depth_limit_value #>
12bb31230550 replaced references 'trace_simp' and 'debug_simp' by configuration options stored in the context
boehmes
parents: 35625
diff changeset
   399
  register_config MetaSimplifier.debug_simp_value #>
12bb31230550 replaced references 'trace_simp' and 'debug_simp' by configuration options stored in the context
boehmes
parents: 35625
diff changeset
   400
  register_config MetaSimplifier.trace_simp_value));
5823
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
   401
ee7c198a2154 Symbolic theorem attributes.
wenzelm
parents:
diff changeset
   402
end;