author | wenzelm |
Mon, 02 Dec 2024 11:36:53 +0100 | |
changeset 81535 | db073d1733ab |
parent 80590 | 505f97165f52 |
permissions | -rw-r--r-- |
70574 | 1 |
(* Title: Pure/thm_name.ML |
2 |
Author: Makarius |
|
3 |
||
4 |
Systematic naming of individual theorems, as selections from multi-facts. |
|
5 |
||
6 |
(NAME, 0): the single entry of a singleton fact NAME |
|
7 |
(NAME, i): entry i of a non-singleton fact (1 <= i <= length) |
|
8 |
*) |
|
9 |
||
10 |
signature THM_NAME = |
|
11 |
sig |
|
12 |
type T = string * int |
|
70586 | 13 |
val ord: T ord |
80295
8a9588ffc133
more accurate Thm_Name.T for PThm / Thm.name_derivation / Thm.derivation_name;
wenzelm
parents:
80289
diff
changeset
|
14 |
structure Set: SET |
8a9588ffc133
more accurate Thm_Name.T for PThm / Thm.name_derivation / Thm.derivation_name;
wenzelm
parents:
80289
diff
changeset
|
15 |
structure Table: TABLE |
8a9588ffc133
more accurate Thm_Name.T for PThm / Thm.name_derivation / Thm.derivation_name;
wenzelm
parents:
80289
diff
changeset
|
16 |
val empty: T |
8a9588ffc133
more accurate Thm_Name.T for PThm / Thm.name_derivation / Thm.derivation_name;
wenzelm
parents:
80289
diff
changeset
|
17 |
val is_empty: T -> bool |
80330
e01aae620437
clarified signature: prefer internal Thm_Name.T over external Facts.ref;
wenzelm
parents:
80311
diff
changeset
|
18 |
val make_list: string * 'a list -> (T * 'a) list |
80297 | 19 |
|
80289 | 20 |
type P = T * Position.T |
21 |
val none: P |
|
22 |
val list: string * Position.T -> 'a list -> (P * 'a) list |
|
23 |
val expr: string * Position.T -> ('a list * 'b) list -> ((P * 'a) list * 'b) list |
|
80297 | 24 |
|
80305 | 25 |
val parse: string -> T |
81535 | 26 |
val print_prefix: Proof.context -> Name_Space.T -> T -> Markup.T * string |
80299
a397fd0c451a
more accurate output of Thm_Name.T wrt. facts name space;
wenzelm
parents:
80297
diff
changeset
|
27 |
val print_suffix: T -> string |
80297 | 28 |
val print: T -> string |
80590 | 29 |
val print_pos: P -> string |
80297 | 30 |
val short: T -> string |
80311 | 31 |
val encode: T XML.Encode.T |
32 |
val decode: T XML.Decode.T |
|
80590 | 33 |
val encode_pos: P XML.Encode.T |
34 |
val decode_pos: P XML.Decode.T |
|
70574 | 35 |
end; |
36 |
||
37 |
structure Thm_Name: THM_NAME = |
|
38 |
struct |
|
39 |
||
80297 | 40 |
(* type T *) |
41 |
||
70574 | 42 |
type T = string * int; |
43 |
val ord = prod_ord string_ord int_ord; |
|
44 |
||
80295
8a9588ffc133
more accurate Thm_Name.T for PThm / Thm.name_derivation / Thm.derivation_name;
wenzelm
parents:
80289
diff
changeset
|
45 |
structure Set = Set(type key = T val ord = ord); |
8a9588ffc133
more accurate Thm_Name.T for PThm / Thm.name_derivation / Thm.derivation_name;
wenzelm
parents:
80289
diff
changeset
|
46 |
structure Table = Table(Set.Key); |
80289 | 47 |
|
80295
8a9588ffc133
more accurate Thm_Name.T for PThm / Thm.name_derivation / Thm.derivation_name;
wenzelm
parents:
80289
diff
changeset
|
48 |
val empty: T = ("", 0); |
8a9588ffc133
more accurate Thm_Name.T for PThm / Thm.name_derivation / Thm.derivation_name;
wenzelm
parents:
80289
diff
changeset
|
49 |
fun is_empty ((a, _): T) = a = ""; |
80286 | 50 |
|
80330
e01aae620437
clarified signature: prefer internal Thm_Name.T over external Facts.ref;
wenzelm
parents:
80311
diff
changeset
|
51 |
fun make_list (a, [b]) = [((a, 0): T, b)] |
e01aae620437
clarified signature: prefer internal Thm_Name.T over external Facts.ref;
wenzelm
parents:
80311
diff
changeset
|
52 |
| make_list (a, bs) = map_index (fn (i, b) => ((a, i + 1), b)) bs; |
e01aae620437
clarified signature: prefer internal Thm_Name.T over external Facts.ref;
wenzelm
parents:
80311
diff
changeset
|
53 |
|
70574 | 54 |
|
80297 | 55 |
(* type P *) |
80295
8a9588ffc133
more accurate Thm_Name.T for PThm / Thm.name_derivation / Thm.derivation_name;
wenzelm
parents:
80289
diff
changeset
|
56 |
|
8a9588ffc133
more accurate Thm_Name.T for PThm / Thm.name_derivation / Thm.derivation_name;
wenzelm
parents:
80289
diff
changeset
|
57 |
type P = T * Position.T; |
8a9588ffc133
more accurate Thm_Name.T for PThm / Thm.name_derivation / Thm.derivation_name;
wenzelm
parents:
80289
diff
changeset
|
58 |
|
8a9588ffc133
more accurate Thm_Name.T for PThm / Thm.name_derivation / Thm.derivation_name;
wenzelm
parents:
80289
diff
changeset
|
59 |
val none: P = (empty, Position.none); |
70574 | 60 |
|
80296 | 61 |
fun list (name, pos) [x] = [(((name, 0), pos): P, x)] |
62 |
| list ("", pos) xs = map (fn thm => ((empty, pos), thm)) xs |
|
63 |
| list (name, pos) xs = map_index (fn (i, thm) => (((name, i + 1), pos), thm)) xs; |
|
70574 | 64 |
|
79377 | 65 |
fun expr name = burrow_fst (burrow (list name)); |
79372 | 66 |
|
80297 | 67 |
|
80305 | 68 |
(* parse *) |
69 |
||
70 |
local |
|
71 |
||
72 |
fun is_bg c = c = #"("; |
|
73 |
fun is_en c = c = #")"; |
|
74 |
fun is_digit c = #"0" <= c andalso c <= #"9"; |
|
75 |
fun get_digit c = Char.ord c - Char.ord #"0"; |
|
76 |
||
77 |
in |
|
78 |
||
79 |
fun parse string = |
|
80 |
let |
|
81 |
val n = size string; |
|
82 |
fun char i = if 0 <= i andalso i < n then String.nth string i else #"\000"; |
|
83 |
fun test pred i = pred (char i); |
|
84 |
||
85 |
fun scan i k m = |
|
86 |
let val c = char i in |
|
87 |
if is_digit c then scan (i - 1) (k * 10) (m + k * get_digit c) |
|
88 |
else if is_bg c then (String.substring (string, 0, i), m) |
|
89 |
else (string, 0) |
|
90 |
end; |
|
91 |
in |
|
92 |
if test is_en (n - 1) andalso test is_digit (n - 2) |
|
93 |
then scan (n - 2) 1 0 |
|
94 |
else (string, 0) |
|
95 |
end; |
|
96 |
||
97 |
end; |
|
98 |
||
99 |
||
100 |
(* print *) |
|
80297 | 101 |
|
81535 | 102 |
fun print_prefix ctxt space ((name, _): T) = |
80299
a397fd0c451a
more accurate output of Thm_Name.T wrt. facts name space;
wenzelm
parents:
80297
diff
changeset
|
103 |
if name = "" then (Markup.empty, "") |
81535 | 104 |
else (Name_Space.markup space name, Name_Space.extern ctxt space name); |
80299
a397fd0c451a
more accurate output of Thm_Name.T wrt. facts name space;
wenzelm
parents:
80297
diff
changeset
|
105 |
|
a397fd0c451a
more accurate output of Thm_Name.T wrt. facts name space;
wenzelm
parents:
80297
diff
changeset
|
106 |
fun print_suffix (name, index) = |
a397fd0c451a
more accurate output of Thm_Name.T wrt. facts name space;
wenzelm
parents:
80297
diff
changeset
|
107 |
if name = "" orelse index = 0 then "" |
a397fd0c451a
more accurate output of Thm_Name.T wrt. facts name space;
wenzelm
parents:
80297
diff
changeset
|
108 |
else enclose "(" ")" (string_of_int index); |
a397fd0c451a
more accurate output of Thm_Name.T wrt. facts name space;
wenzelm
parents:
80297
diff
changeset
|
109 |
|
a397fd0c451a
more accurate output of Thm_Name.T wrt. facts name space;
wenzelm
parents:
80297
diff
changeset
|
110 |
fun print (name, index) = name ^ print_suffix (name, index); |
80297 | 111 |
|
80590 | 112 |
fun print_pos (thm_name, pos) = print thm_name ^ Position.here pos; |
113 |
||
80297 | 114 |
fun short (name, index) = |
115 |
if name = "" orelse index = 0 then name |
|
116 |
else name ^ "_" ^ string_of_int index; |
|
117 |
||
80311 | 118 |
|
119 |
(* XML data representation *) |
|
120 |
||
121 |
val encode = let open XML.Encode in pair string int end; |
|
122 |
val decode = let open XML.Decode in pair string int end; |
|
123 |
||
80590 | 124 |
val encode_pos = let open XML.Encode in pair encode (properties o Position.properties_of) end; |
125 |
val decode_pos = let open XML.Decode in pair decode (Position.of_properties o properties) end; |
|
126 |
||
70574 | 127 |
end; |