author | haftmann |
Thu, 19 Jun 2025 17:15:40 +0200 | |
changeset 82734 | 89347c0cc6a3 |
parent 78812 | d769a183d51d |
permissions | -rw-r--r-- |
27389 | 1 |
(* Title: Pure/ML/ml_thms.ML |
2 |
Author: Makarius |
|
3 |
||
45592 | 4 |
Attribute source and theorem values within ML. |
27389 | 5 |
*) |
6 |
||
7 |
signature ML_THMS = |
|
8 |
sig |
|
58011
bc6bced136e5
tuned signature -- moved type src to Token, without aliases;
wenzelm
parents:
56304
diff
changeset
|
9 |
val the_attributes: Proof.context -> int -> Token.src list |
48782
e955964d89cb
more direct embedding of abstract thm values into the ML environment -- avoidance of repeated ML_Thms.the_thm(s) considerably reduces compilation time for Poly/ML 5.4.x;
wenzelm
parents:
48776
diff
changeset
|
10 |
val the_thmss: Proof.context -> thm list list |
78812
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
wenzelm
parents:
78795
diff
changeset
|
11 |
val thm_binding: string -> bool -> thm list -> Proof.context -> |
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
wenzelm
parents:
78795
diff
changeset
|
12 |
(Proof.context -> string * string) * Proof.context |
74606 | 13 |
val embedded_lemma: (Proof.context -> thm list * (term list * Proof.context)) parser |
56199 | 14 |
val get_stored_thms: unit -> thm list |
15 |
val get_stored_thm: unit -> thm |
|
16 |
val store_thms: string * thm list -> unit |
|
17 |
val store_thm: string * thm -> unit |
|
18 |
val bind_thm: string * thm -> unit |
|
19 |
val bind_thms: string * thm list -> unit |
|
27389 | 20 |
end; |
21 |
||
22 |
structure ML_Thms: ML_THMS = |
|
23 |
struct |
|
24 |
||
45592 | 25 |
(* auxiliary data *) |
27389 | 26 |
|
48782
e955964d89cb
more direct embedding of abstract thm values into the ML environment -- avoidance of repeated ML_Thms.the_thm(s) considerably reduces compilation time for Poly/ML 5.4.x;
wenzelm
parents:
48776
diff
changeset
|
27 |
type thms = (string * bool) * thm list; (*name, single, value*) |
e955964d89cb
more direct embedding of abstract thm values into the ML environment -- avoidance of repeated ML_Thms.the_thm(s) considerably reduces compilation time for Poly/ML 5.4.x;
wenzelm
parents:
48776
diff
changeset
|
28 |
|
45592 | 29 |
structure Data = Proof_Data |
27389 | 30 |
( |
58011
bc6bced136e5
tuned signature -- moved type src to Token, without aliases;
wenzelm
parents:
56304
diff
changeset
|
31 |
type T = Token.src list Inttab.table * thms list; |
48782
e955964d89cb
more direct embedding of abstract thm values into the ML environment -- avoidance of repeated ML_Thms.the_thm(s) considerably reduces compilation time for Poly/ML 5.4.x;
wenzelm
parents:
48776
diff
changeset
|
32 |
fun init _ = (Inttab.empty, []); |
27389 | 33 |
); |
34 |
||
45592 | 35 |
val put_attributes = Data.map o apfst o Inttab.update; |
36 |
fun the_attributes ctxt name = the (Inttab.lookup (fst (Data.get ctxt)) name); |
|
37 |
||
48782
e955964d89cb
more direct embedding of abstract thm values into the ML environment -- avoidance of repeated ML_Thms.the_thm(s) considerably reduces compilation time for Poly/ML 5.4.x;
wenzelm
parents:
48776
diff
changeset
|
38 |
val get_thmss = snd o Data.get; |
e955964d89cb
more direct embedding of abstract thm values into the ML environment -- avoidance of repeated ML_Thms.the_thm(s) considerably reduces compilation time for Poly/ML 5.4.x;
wenzelm
parents:
48776
diff
changeset
|
39 |
val the_thmss = map snd o get_thmss; |
e955964d89cb
more direct embedding of abstract thm values into the ML environment -- avoidance of repeated ML_Thms.the_thm(s) considerably reduces compilation time for Poly/ML 5.4.x;
wenzelm
parents:
48776
diff
changeset
|
40 |
val cons_thms = Data.map o apsnd o cons; |
45592 | 41 |
|
42 |
||
43 |
(* attribute source *) |
|
27389 | 44 |
|
53171 | 45 |
val _ = Theory.setup |
67147 | 46 |
(ML_Antiquotation.declaration \<^binding>\<open>attributes\<close> Attrib.attribs |
61814
1ca1142e1711
clarified type Token.src: plain token list, with usual implicit value assignment;
wenzelm
parents:
59127
diff
changeset
|
47 |
(fn _ => fn srcs => fn ctxt => |
59112 | 48 |
let val i = serial () in |
49 |
ctxt |
|
61814
1ca1142e1711
clarified type Token.src: plain token list, with usual implicit value assignment;
wenzelm
parents:
59127
diff
changeset
|
50 |
|> put_attributes (i, srcs) |
73549
a2c589d5e1e4
clarified signature: more detailed token positions for antiquotations;
wenzelm
parents:
72054
diff
changeset
|
51 |
|> ML_Antiquotation.value_decl "attributes" |
59112 | 52 |
("ML_Thms.the_attributes ML_context " ^ string_of_int i) |
53 |
end)); |
|
45592 | 54 |
|
55 |
||
56 |
(* fact references *) |
|
27389 | 57 |
|
56069
451d5b73f8cf
simplified programming interface to define ML antiquotations -- NB: the transformed context ignores updates of the context parser;
wenzelm
parents:
55997
diff
changeset
|
58 |
fun thm_binding kind is_single thms ctxt = |
48782
e955964d89cb
more direct embedding of abstract thm values into the ML environment -- avoidance of repeated ML_Thms.the_thm(s) considerably reduces compilation time for Poly/ML 5.4.x;
wenzelm
parents:
48776
diff
changeset
|
59 |
let |
53169
e2d31807cbf6
clarified type ML_Context.antiq: context parser maintains compilation context, declaration is applied to final context;
wenzelm
parents:
53168
diff
changeset
|
60 |
val initial = null (get_thmss ctxt); |
59112 | 61 |
val (name, ctxt') = ML_Context.variant kind ctxt; |
53169
e2d31807cbf6
clarified type ML_Context.antiq: context parser maintains compilation context, declaration is applied to final context;
wenzelm
parents:
53168
diff
changeset
|
62 |
val ctxt'' = cons_thms ((name, is_single), thms) ctxt'; |
27389 | 63 |
|
59127
723b11f8ffbf
more careful handling of auxiliary environment structure -- allow nested ML evaluation;
wenzelm
parents:
59112
diff
changeset
|
64 |
val ml_body = ML_Context.struct_name ctxt ^ "." ^ name; |
53169
e2d31807cbf6
clarified type ML_Context.antiq: context parser maintains compilation context, declaration is applied to final context;
wenzelm
parents:
53168
diff
changeset
|
65 |
fun decl final_ctxt = |
48782
e955964d89cb
more direct embedding of abstract thm values into the ML environment -- avoidance of repeated ML_Thms.the_thm(s) considerably reduces compilation time for Poly/ML 5.4.x;
wenzelm
parents:
48776
diff
changeset
|
66 |
if initial then |
e955964d89cb
more direct embedding of abstract thm values into the ML environment -- avoidance of repeated ML_Thms.the_thm(s) considerably reduces compilation time for Poly/ML 5.4.x;
wenzelm
parents:
48776
diff
changeset
|
67 |
let |
53169
e2d31807cbf6
clarified type ML_Context.antiq: context parser maintains compilation context, declaration is applied to final context;
wenzelm
parents:
53168
diff
changeset
|
68 |
val binds = get_thmss final_ctxt |> map (fn ((a, b), _) => (b ? enclose "[" "]") a); |
48782
e955964d89cb
more direct embedding of abstract thm values into the ML environment -- avoidance of repeated ML_Thms.the_thm(s) considerably reduces compilation time for Poly/ML 5.4.x;
wenzelm
parents:
48776
diff
changeset
|
69 |
val ml_env = "val [" ^ commas binds ^ "] = ML_Thms.the_thmss ML_context;\n"; |
e955964d89cb
more direct embedding of abstract thm values into the ML environment -- avoidance of repeated ML_Thms.the_thm(s) considerably reduces compilation time for Poly/ML 5.4.x;
wenzelm
parents:
48776
diff
changeset
|
70 |
in (ml_env, ml_body) end |
e955964d89cb
more direct embedding of abstract thm values into the ML environment -- avoidance of repeated ML_Thms.the_thm(s) considerably reduces compilation time for Poly/ML 5.4.x;
wenzelm
parents:
48776
diff
changeset
|
71 |
else ("", ml_body); |
56069
451d5b73f8cf
simplified programming interface to define ML antiquotations -- NB: the transformed context ignores updates of the context parser;
wenzelm
parents:
55997
diff
changeset
|
72 |
in (decl, ctxt'') end; |
27389 | 73 |
|
53171 | 74 |
val _ = Theory.setup |
67147 | 75 |
(ML_Antiquotation.declaration \<^binding>\<open>thm\<close> (Attrib.thm >> single) (K (thm_binding "thm" true)) #> |
76 |
ML_Antiquotation.declaration \<^binding>\<open>thms\<close> Attrib.thms (K (thm_binding "thms" false))); |
|
27389 | 77 |
|
78 |
||
74603 | 79 |
(* embedded lemma *) |
80 |
||
81 |
val embedded_lemma = |
|
74604 | 82 |
Args.mode "open" -- Parse.and_list1 (Scan.repeat1 Parse.embedded_inner_syntax) |
83 |
-- Parse.for_fixes -- Method.parse_by |
|
84 |
>> (fn (((is_open, raw_stmt), fixes), (methods, reports)) => fn ctxt => |
|
74603 | 85 |
let |
86 |
val _ = Context_Position.reports ctxt reports; |
|
87 |
||
74606 | 88 |
val fixes_ctxt = #2 (Proof_Context.add_fixes_cmd fixes ctxt); |
89 |
val stmt = burrow (map (rpair []) o Syntax.read_props fixes_ctxt) raw_stmt; |
|
90 |
val stmt_ctxt = (fold o fold) (Proof_Context.augment o #1) stmt fixes_ctxt; |
|
74604 | 91 |
|
74603 | 92 |
val prep_result = Goal.norm_result ctxt #> not is_open ? Thm.close_derivation \<^here>; |
93 |
fun after_qed res goal_ctxt = |
|
94 |
Proof_Context.put_thms false (Auto_Bind.thisN, |
|
95 |
SOME (map prep_result (Proof_Context.export goal_ctxt ctxt (flat res)))) goal_ctxt; |
|
96 |
||
74604 | 97 |
val thms_ctxt = stmt_ctxt |
74603 | 98 |
|> Proof.theorem NONE after_qed stmt |
99 |
|> Proof.global_terminal_proof methods; |
|
100 |
val thms = |
|
74604 | 101 |
Proof_Context.get_fact thms_ctxt |
102 |
(Facts.named (Proof_Context.full_name thms_ctxt (Binding.name Auto_Bind.thisN))) |
|
74606 | 103 |
in (thms, (map #1 (flat stmt), stmt_ctxt)) end); |
27389 | 104 |
|
53171 | 105 |
val _ = Theory.setup |
74603 | 106 |
(ML_Antiquotation.declaration \<^binding>\<open>lemma\<close> (Scan.lift embedded_lemma) |
107 |
(fn _ => fn make_lemma => fn ctxt => |
|
74606 | 108 |
let val thms = #1 (make_lemma ctxt) |
74596 | 109 |
in thm_binding "lemma" (length thms = 1) thms ctxt end)); |
27389 | 110 |
|
56199 | 111 |
|
112 |
(* old-style theorem bindings *) |
|
113 |
||
72054 | 114 |
structure Data = Theory_Data |
56199 | 115 |
( |
116 |
type T = thm list; |
|
117 |
val empty = []; |
|
72054 | 118 |
val merge = #1; |
56199 | 119 |
); |
120 |
||
72054 | 121 |
fun get_stored_thms () = Data.get (Context.the_global_context ()); |
56199 | 122 |
val get_stored_thm = hd o get_stored_thms; |
123 |
||
124 |
fun ml_store get (name, ths) = |
|
125 |
let |
|
67715 | 126 |
val (_, ths') = |
78795
f7e972d567f3
clarified signature: more concise variations on implicit theory setup;
wenzelm
parents:
74606
diff
changeset
|
127 |
Theory.setup_result (Global_Theory.note_thms "" ((Binding.name name, []), [(ths, [])])); |
72054 | 128 |
val _ = Theory.setup (Data.put ths'); |
56199 | 129 |
val _ = |
130 |
if name = "" then () |
|
131 |
else if not (ML_Syntax.is_identifier name) then |
|
132 |
error ("Cannot bind theorem(s) " ^ quote name ^ " as ML value") |
|
133 |
else |
|
56304
40274e4f5ebf
redirect ML_Compiler reports more directly: only the (big) parse tree report is deferred via Execution.print (NB: this does not work for asynchronous "diag" commands);
wenzelm
parents:
56275
diff
changeset
|
134 |
ML_Compiler.eval (ML_Compiler.verbose true ML_Compiler.flags) Position.none |
56199 | 135 |
(ML_Lex.tokenize ("val " ^ name ^ " = " ^ get ^ " ();")); |
72054 | 136 |
val _ = Theory.setup (Data.put []); |
56199 | 137 |
in () end; |
138 |
||
139 |
val store_thms = ml_store "ML_Thms.get_stored_thms"; |
|
140 |
fun store_thm (name, th) = ml_store "ML_Thms.get_stored_thm" (name, [th]); |
|
141 |
||
142 |
fun bind_thm (name, thm) = store_thm (name, Drule.export_without_context thm); |
|
143 |
fun bind_thms (name, thms) = store_thms (name, map Drule.export_without_context thms); |
|
144 |
||
27389 | 145 |
end; |