| author | wenzelm |
| Mon, 10 Jun 2024 14:53:54 +0200 | |
| changeset 80330 | e01aae620437 |
| parent 80311 | 31df11a23d6e |
| child 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 |
|
80299
a397fd0c451a
more accurate output of Thm_Name.T wrt. facts name space;
wenzelm
parents:
80297
diff
changeset
|
26 |
val print_prefix: Context.generic -> Name_Space.T -> T -> Markup.T * string |
|
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 |
29 |
val short: T -> string |
|
| 80311 | 30 |
val encode: T XML.Encode.T |
31 |
val decode: T XML.Decode.T |
|
| 70574 | 32 |
end; |
33 |
||
34 |
structure Thm_Name: THM_NAME = |
|
35 |
struct |
|
36 |
||
| 80297 | 37 |
(* type T *) |
38 |
||
| 70574 | 39 |
type T = string * int; |
40 |
val ord = prod_ord string_ord int_ord; |
|
41 |
||
|
80295
8a9588ffc133
more accurate Thm_Name.T for PThm / Thm.name_derivation / Thm.derivation_name;
wenzelm
parents:
80289
diff
changeset
|
42 |
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
|
43 |
structure Table = Table(Set.Key); |
| 80289 | 44 |
|
|
80295
8a9588ffc133
more accurate Thm_Name.T for PThm / Thm.name_derivation / Thm.derivation_name;
wenzelm
parents:
80289
diff
changeset
|
45 |
val empty: T = ("", 0);
|
|
8a9588ffc133
more accurate Thm_Name.T for PThm / Thm.name_derivation / Thm.derivation_name;
wenzelm
parents:
80289
diff
changeset
|
46 |
fun is_empty ((a, _): T) = a = ""; |
| 80286 | 47 |
|
|
80330
e01aae620437
clarified signature: prefer internal Thm_Name.T over external Facts.ref;
wenzelm
parents:
80311
diff
changeset
|
48 |
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
|
49 |
| 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
|
50 |
|
| 70574 | 51 |
|
| 80297 | 52 |
(* type P *) |
|
80295
8a9588ffc133
more accurate Thm_Name.T for PThm / Thm.name_derivation / Thm.derivation_name;
wenzelm
parents:
80289
diff
changeset
|
53 |
|
|
8a9588ffc133
more accurate Thm_Name.T for PThm / Thm.name_derivation / Thm.derivation_name;
wenzelm
parents:
80289
diff
changeset
|
54 |
type P = T * Position.T; |
|
8a9588ffc133
more accurate Thm_Name.T for PThm / Thm.name_derivation / Thm.derivation_name;
wenzelm
parents:
80289
diff
changeset
|
55 |
|
|
8a9588ffc133
more accurate Thm_Name.T for PThm / Thm.name_derivation / Thm.derivation_name;
wenzelm
parents:
80289
diff
changeset
|
56 |
val none: P = (empty, Position.none); |
| 70574 | 57 |
|
| 80296 | 58 |
fun list (name, pos) [x] = [(((name, 0), pos): P, x)] |
59 |
| list ("", pos) xs = map (fn thm => ((empty, pos), thm)) xs
|
|
60 |
| list (name, pos) xs = map_index (fn (i, thm) => (((name, i + 1), pos), thm)) xs; |
|
| 70574 | 61 |
|
| 79377 | 62 |
fun expr name = burrow_fst (burrow (list name)); |
| 79372 | 63 |
|
| 80297 | 64 |
|
| 80305 | 65 |
(* parse *) |
66 |
||
67 |
local |
|
68 |
||
69 |
fun is_bg c = c = #"(";
|
|
70 |
fun is_en c = c = #")"; |
|
71 |
fun is_digit c = #"0" <= c andalso c <= #"9"; |
|
72 |
fun get_digit c = Char.ord c - Char.ord #"0"; |
|
73 |
||
74 |
in |
|
75 |
||
76 |
fun parse string = |
|
77 |
let |
|
78 |
val n = size string; |
|
79 |
fun char i = if 0 <= i andalso i < n then String.nth string i else #"\000"; |
|
80 |
fun test pred i = pred (char i); |
|
81 |
||
82 |
fun scan i k m = |
|
83 |
let val c = char i in |
|
84 |
if is_digit c then scan (i - 1) (k * 10) (m + k * get_digit c) |
|
85 |
else if is_bg c then (String.substring (string, 0, i), m) |
|
86 |
else (string, 0) |
|
87 |
end; |
|
88 |
in |
|
89 |
if test is_en (n - 1) andalso test is_digit (n - 2) |
|
90 |
then scan (n - 2) 1 0 |
|
91 |
else (string, 0) |
|
92 |
end; |
|
93 |
||
94 |
end; |
|
95 |
||
96 |
||
97 |
(* print *) |
|
| 80297 | 98 |
|
|
80299
a397fd0c451a
more accurate output of Thm_Name.T wrt. facts name space;
wenzelm
parents:
80297
diff
changeset
|
99 |
fun print_prefix context space ((name, _): T) = |
|
a397fd0c451a
more accurate output of Thm_Name.T wrt. facts name space;
wenzelm
parents:
80297
diff
changeset
|
100 |
if name = "" then (Markup.empty, "") |
|
a397fd0c451a
more accurate output of Thm_Name.T wrt. facts name space;
wenzelm
parents:
80297
diff
changeset
|
101 |
else (Name_Space.markup space name, Name_Space.extern_generic context space name); |
|
a397fd0c451a
more accurate output of Thm_Name.T wrt. facts name space;
wenzelm
parents:
80297
diff
changeset
|
102 |
|
|
a397fd0c451a
more accurate output of Thm_Name.T wrt. facts name space;
wenzelm
parents:
80297
diff
changeset
|
103 |
fun print_suffix (name, index) = |
|
a397fd0c451a
more accurate output of Thm_Name.T wrt. facts name space;
wenzelm
parents:
80297
diff
changeset
|
104 |
if name = "" orelse index = 0 then "" |
|
a397fd0c451a
more accurate output of Thm_Name.T wrt. facts name space;
wenzelm
parents:
80297
diff
changeset
|
105 |
else enclose "(" ")" (string_of_int index);
|
|
a397fd0c451a
more accurate output of Thm_Name.T wrt. facts name space;
wenzelm
parents:
80297
diff
changeset
|
106 |
|
|
a397fd0c451a
more accurate output of Thm_Name.T wrt. facts name space;
wenzelm
parents:
80297
diff
changeset
|
107 |
fun print (name, index) = name ^ print_suffix (name, index); |
| 80297 | 108 |
|
109 |
fun short (name, index) = |
|
110 |
if name = "" orelse index = 0 then name |
|
111 |
else name ^ "_" ^ string_of_int index; |
|
112 |
||
| 80311 | 113 |
|
114 |
(* XML data representation *) |
|
115 |
||
116 |
val encode = let open XML.Encode in pair string int end; |
|
117 |
val decode = let open XML.Decode in pair string int end; |
|
118 |
||
| 70574 | 119 |
end; |