author | haftmann |
Mon, 08 Aug 2005 09:28:25 +0200 | |
changeset 17030 | ab8c7fbf235b |
parent 16894 | 40f80823b451 |
child 17067 | eb07469a4cdd |
permissions | -rw-r--r-- |
9140 | 1 |
(* Title: Pure/Isar/isar_output.ML |
2 |
ID: $Id$ |
|
16002 | 3 |
Author: Markus Wenzel, TU Muenchen |
9140 | 4 |
|
5 |
Isar theory output. |
|
6 |
*) |
|
7 |
||
8 |
signature ISAR_OUTPUT = |
|
9 |
sig |
|
14899 | 10 |
val display: bool ref |
11 |
val quotes: bool ref |
|
12 |
val indent: int ref |
|
13 |
val source: bool ref |
|
10321 | 14 |
val add_commands: (string * (Args.src -> Toplevel.state -> string)) list -> unit |
9140 | 15 |
val add_options: (string * (string -> (unit -> string) -> unit -> string)) list -> unit |
9220 | 16 |
val print_antiquotations: unit -> unit |
9140 | 17 |
val boolean: string -> bool |
18 |
val integer: string -> int |
|
19 |
val args: (Proof.context * Args.T list -> 'a * (Proof.context * Args.T list)) -> |
|
10321 | 20 |
(Args.src -> Proof.context -> 'a -> string) -> Args.src -> Toplevel.state -> string |
9140 | 21 |
datatype markup = Markup | MarkupEnv | Verbatim |
22 |
val interest_level: int ref |
|
15430
1e1aeaf1dec3
Implemented hiding of proofs and other commands.
berghofe
parents:
15349
diff
changeset
|
23 |
val hide_commands: bool ref |
1e1aeaf1dec3
Implemented hiding of proofs and other commands.
berghofe
parents:
15349
diff
changeset
|
24 |
val add_hidden_commands: string list -> unit |
11714 | 25 |
val modes: string list ref |
12939 | 26 |
val eval_antiquote: Scan.lexicon -> Toplevel.state -> string * Position.T -> string |
9140 | 27 |
val parse_thy: (markup -> OuterLex.token list -> OuterLex.token * OuterLex.token list) -> |
28 |
Scan.lexicon -> Toplevel.transition list -> (OuterLex.token, 'a) Source.source -> |
|
15430
1e1aeaf1dec3
Implemented hiding of proofs and other commands.
berghofe
parents:
15349
diff
changeset
|
29 |
(Toplevel.transition * (Toplevel.state -> Toplevel.state -> Buffer.T -> Buffer.T)) list * Buffer.T |
11716 | 30 |
val output_with: (Proof.context -> 'a -> Pretty.T) -> Args.src -> |
31 |
Proof.context -> 'a -> string |
|
9140 | 32 |
end; |
33 |
||
34 |
structure IsarOutput: ISAR_OUTPUT = |
|
35 |
struct |
|
36 |
||
37 |
structure T = OuterLex; |
|
38 |
structure P = OuterParse; |
|
39 |
||
14899 | 40 |
(** global references -- defaults for options **) |
41 |
||
42 |
val locale = ref ""; |
|
43 |
val display = ref false; |
|
44 |
val quotes = ref false; |
|
45 |
val indent = ref 0; |
|
46 |
val source = ref false; |
|
47 |
val break = ref false; |
|
48 |
||
49 |
||
50 |
||
9140 | 51 |
(** maintain global commands **) |
52 |
||
53 |
local |
|
54 |
||
55 |
val global_commands = |
|
10321 | 56 |
ref (Symtab.empty: (Args.src -> Toplevel.state -> string) Symtab.table); |
9140 | 57 |
|
58 |
val global_options = |
|
59 |
ref (Symtab.empty: (string -> (unit -> string) -> unit -> string) Symtab.table); |
|
60 |
||
61 |
||
62 |
fun add_item kind (tab, (name, x)) = |
|
16894 | 63 |
(if not (Symtab.defined tab name) then () |
9140 | 64 |
else warning ("Redefined antiquotation output " ^ kind ^ ": " ^ quote name); |
65 |
Symtab.update ((name, x), tab)); |
|
66 |
||
15570 | 67 |
fun add_items kind xs tab = Library.foldl (add_item kind) (tab, xs); |
9140 | 68 |
|
69 |
in |
|
70 |
||
71 |
val add_commands = Library.change global_commands o (add_items "command"); |
|
72 |
val add_options = Library.change global_options o (add_items "option"); |
|
73 |
||
74 |
fun command src = |
|
75 |
let val ((name, _), pos) = Args.dest_src src in |
|
76 |
(case Symtab.lookup (! global_commands, name) of |
|
15531 | 77 |
NONE => error ("Unknown antiquotation command: " ^ quote name ^ Position.str_of pos) |
78 |
| SOME f => transform_failure (curry Antiquote.ANTIQUOTE_FAIL (name, pos)) (f src)) |
|
9140 | 79 |
end; |
80 |
||
81 |
fun option (name, s) f () = |
|
82 |
(case Symtab.lookup (! global_options, name) of |
|
15531 | 83 |
NONE => error ("Unknown antiquotation option: " ^ quote name) |
84 |
| SOME opt => opt s f ()); |
|
9140 | 85 |
|
86 |
fun options [] f = f |
|
87 |
| options (opt :: opts) f = option opt (options opts f); |
|
88 |
||
9213 | 89 |
|
9220 | 90 |
fun print_antiquotations () = |
91 |
[Pretty.big_list "antiquotation commands:" (map Pretty.str (Symtab.keys (! global_commands))), |
|
92 |
Pretty.big_list "antiquotation options:" (map Pretty.str (Symtab.keys (! global_options)))] |
|
93 |
|> Pretty.chunks |> Pretty.writeln; |
|
9213 | 94 |
|
9140 | 95 |
end; |
96 |
||
97 |
||
98 |
||
99 |
(** syntax of antiquotations **) |
|
100 |
||
101 |
(* option values *) |
|
102 |
||
103 |
fun boolean "" = true |
|
104 |
| boolean "true" = true |
|
105 |
| boolean "false" = false |
|
106 |
| boolean s = error ("Bad boolean value: " ^ quote s); |
|
107 |
||
108 |
fun integer s = |
|
109 |
let |
|
110 |
fun int ss = |
|
14899 | 111 |
(case Library.read_int ss of (i, []) => i |
112 |
| _ => error ("Bad integer value: " ^ quote s)); |
|
9140 | 113 |
in (case Symbol.explode s of "-" :: ss => ~ (int ss) | ss => int ss) end; |
114 |
||
115 |
||
116 |
(* args syntax *) |
|
117 |
||
118 |
fun syntax (scan: (Proof.context * Args.T list -> 'a * (Proof.context * Args.T list))) = |
|
119 |
Args.syntax "antiquotation" scan; |
|
120 |
||
10321 | 121 |
fun args scan f src state : string = |
14899 | 122 |
let |
123 |
val ctxt0 = |
|
124 |
if ! locale = "" then Toplevel.context_of state |
|
15531 | 125 |
else #3 (Locale.read_context_statement (SOME (! locale)) [] [] |
14899 | 126 |
(ProofContext.init (Toplevel.theory_of state))); |
127 |
val (ctxt, x) = syntax scan src ctxt0; |
|
10321 | 128 |
in f src ctxt x end; |
9140 | 129 |
|
130 |
||
131 |
(* outer syntax *) |
|
132 |
||
133 |
local |
|
134 |
||
135 |
val property = P.xname -- Scan.optional (P.$$$ "=" |-- P.!!! P.xname) ""; |
|
136 |
val properties = Scan.optional (P.$$$ "[" |-- P.!!! (P.enum "," property --| P.$$$ "]")) []; |
|
137 |
||
138 |
val antiq = P.position P.xname -- properties -- P.arguments --| Scan.ahead P.eof |
|
139 |
>> (fn (((x, pos), y), z) => (y, Args.src ((x, z), pos))); |
|
140 |
||
141 |
fun antiq_args_aux keyword_lexicon (str, pos) = |
|
142 |
Source.of_string str |
|
143 |
|> Symbol.source false |
|
144 |
|> T.source false (K (keyword_lexicon, Scan.empty_lexicon)) pos |
|
145 |
|> T.source_proper |
|
15531 | 146 |
|> Source.source T.stopper (Scan.error (Scan.bulk (P.!!! antiq))) NONE |
9140 | 147 |
|> Source.exhaust; |
148 |
||
149 |
in |
|
150 |
||
151 |
fun antiq_args lex (s, pos) = |
|
152 |
(case antiq_args_aux lex (s, pos) of [x] => x | _ => raise ERROR) handle ERROR => |
|
153 |
error ("Malformed antiquotation: " ^ quote ("@{" ^ s ^ "}") ^ Position.str_of pos); |
|
154 |
||
155 |
end; |
|
156 |
||
157 |
||
158 |
(* eval_antiquote *) |
|
159 |
||
11714 | 160 |
val modes = ref ([]: string list); |
161 |
||
9140 | 162 |
fun eval_antiquote lex state (str, pos) = |
163 |
let |
|
164 |
fun expand (Antiquote.Text s) = s |
|
165 |
| expand (Antiquote.Antiq x) = |
|
166 |
let val (opts, src) = antiq_args lex x in |
|
10739 | 167 |
options opts (fn () => command src state) (); (*preview errors!*) |
11714 | 168 |
Library.setmp print_mode (! modes @ Latex.modes @ ! print_mode) |
16194 | 169 |
(Output.no_warnings (options opts (fn () => command src state))) () |
10321 | 170 |
end; |
9140 | 171 |
val ants = Antiquote.antiquotes_of (str, pos); |
172 |
in |
|
173 |
if Toplevel.is_toplevel state andalso exists Antiquote.is_antiq ants then |
|
174 |
error ("Cannot expand antiquotations at top-level" ^ Position.str_of pos) |
|
175 |
else implode (map expand ants) |
|
176 |
end; |
|
177 |
||
178 |
||
179 |
||
180 |
(** present theory source **) |
|
181 |
||
182 |
(* present_tokens *) |
|
183 |
||
184 |
val interest_level = ref 0; |
|
185 |
||
15473 | 186 |
val hide_commands = ref true; |
15430
1e1aeaf1dec3
Implemented hiding of proofs and other commands.
berghofe
parents:
15349
diff
changeset
|
187 |
val hidden_commands = ref ([] : string list); |
1e1aeaf1dec3
Implemented hiding of proofs and other commands.
berghofe
parents:
15349
diff
changeset
|
188 |
|
1e1aeaf1dec3
Implemented hiding of proofs and other commands.
berghofe
parents:
15349
diff
changeset
|
189 |
fun add_hidden_commands cmds = (hidden_commands := !hidden_commands @ cmds); |
1e1aeaf1dec3
Implemented hiding of proofs and other commands.
berghofe
parents:
15349
diff
changeset
|
190 |
|
1e1aeaf1dec3
Implemented hiding of proofs and other commands.
berghofe
parents:
15349
diff
changeset
|
191 |
fun is_proof state = (case Toplevel.node_of state of |
1e1aeaf1dec3
Implemented hiding of proofs and other commands.
berghofe
parents:
15349
diff
changeset
|
192 |
Toplevel.Theory _ => false | _ => true) handle Toplevel.UNDEF => false; |
1e1aeaf1dec3
Implemented hiding of proofs and other commands.
berghofe
parents:
15349
diff
changeset
|
193 |
|
1e1aeaf1dec3
Implemented hiding of proofs and other commands.
berghofe
parents:
15349
diff
changeset
|
194 |
fun is_newline (Latex.Basic tk, _) = T.is_newline tk |
1e1aeaf1dec3
Implemented hiding of proofs and other commands.
berghofe
parents:
15349
diff
changeset
|
195 |
| is_newline _ = false; |
1e1aeaf1dec3
Implemented hiding of proofs and other commands.
berghofe
parents:
15349
diff
changeset
|
196 |
|
1e1aeaf1dec3
Implemented hiding of proofs and other commands.
berghofe
parents:
15349
diff
changeset
|
197 |
fun is_hidden (Latex.Basic tk, _) = |
1e1aeaf1dec3
Implemented hiding of proofs and other commands.
berghofe
parents:
15349
diff
changeset
|
198 |
T.is_kind T.Command tk andalso T.val_of tk mem !hidden_commands |
1e1aeaf1dec3
Implemented hiding of proofs and other commands.
berghofe
parents:
15349
diff
changeset
|
199 |
| is_hidden _ = false; |
1e1aeaf1dec3
Implemented hiding of proofs and other commands.
berghofe
parents:
15349
diff
changeset
|
200 |
|
15570 | 201 |
fun filter_newlines toks = (case List.mapPartial |
15531 | 202 |
(fn (tk, i) => if is_newline tk then SOME tk else NONE) toks of |
15529
b86d5c84a9a7
Optimized present_tokens to produce fewer newlines when hiding proofs.
berghofe
parents:
15473
diff
changeset
|
203 |
[] => [] | [tk] => [tk] | _ :: toks' => toks'); |
b86d5c84a9a7
Optimized present_tokens to produce fewer newlines when hiding proofs.
berghofe
parents:
15473
diff
changeset
|
204 |
|
15437 | 205 |
fun present_tokens lex (flag, toks) state state' = |
15531 | 206 |
Buffer.add (case flag of NONE => "" | SOME b => Latex.flag_markup b) o |
15437 | 207 |
((if !hide_commands andalso exists (is_hidden o fst) toks then [] |
15529
b86d5c84a9a7
Optimized present_tokens to produce fewer newlines when hiding proofs.
berghofe
parents:
15473
diff
changeset
|
208 |
else if !hide_commands andalso is_proof state then |
b86d5c84a9a7
Optimized present_tokens to produce fewer newlines when hiding proofs.
berghofe
parents:
15473
diff
changeset
|
209 |
if is_proof state' then [] else filter_newlines toks |
15570 | 210 |
else List.mapPartial (fn (tk, i) => |
15531 | 211 |
if i > ! interest_level then NONE else SOME tk) toks) |
15437 | 212 |
|> map (apsnd (eval_antiquote lex state')) |
11861 | 213 |
|> Latex.output_tokens |
214 |
|> Buffer.add); |
|
9140 | 215 |
|
216 |
||
217 |
(* parse_thy *) |
|
218 |
||
219 |
datatype markup = Markup | MarkupEnv | Verbatim; |
|
220 |
||
221 |
local |
|
222 |
||
223 |
val opt_newline = Scan.option (Scan.one T.is_newline); |
|
224 |
||
225 |
fun check_level i = |
|
226 |
if i > 0 then Scan.succeed () |
|
227 |
else Scan.fail_with (K "Bad nesting of meta-comments"); |
|
228 |
||
229 |
val ignore = |
|
13775
a918c547cd4d
corrected swallowing of newlines after end-of-ignore: rollback
oheimb
parents:
13774
diff
changeset
|
230 |
Scan.depend (fn i => opt_newline |-- P.position (Scan.one T.is_begin_ignore) >> pair (i + 1)) || |
a918c547cd4d
corrected swallowing of newlines after end-of-ignore: rollback
oheimb
parents:
13774
diff
changeset
|
231 |
Scan.depend (fn i => P.position (Scan.one T.is_end_ignore) --| |
13774
77a1e723151d
corrected swallowing of newlines after end-of-ignore (improved)
oheimb
parents:
13742
diff
changeset
|
232 |
(opt_newline -- check_level i) >> pair (i - 1)); |
9140 | 233 |
|
234 |
val ignore_cmd = Scan.state -- ignore |
|
15531 | 235 |
>> (fn (i, (x, pos)) => (false, (NONE, ((Latex.Basic x, ("", pos)), i)))); |
9140 | 236 |
|
237 |
||
238 |
val is_improper = not o (T.is_proper orf T.is_begin_ignore orf T.is_end_ignore); |
|
239 |
val improper = Scan.any is_improper; |
|
240 |
||
241 |
val improper_keep_indent = Scan.repeat |
|
242 |
(Scan.unless (Scan.one T.is_indent -- Scan.one T.is_proper) (Scan.one is_improper)); |
|
243 |
||
244 |
val improper_end = |
|
245 |
(improper -- P.semicolon) |-- improper_keep_indent || |
|
246 |
improper_keep_indent; |
|
247 |
||
248 |
||
249 |
val stopper = |
|
15531 | 250 |
((false, (NONE, ((Latex.Basic (#1 T.stopper), ("", Position.none)), 0))), |
11861 | 251 |
fn (_, (_, ((Latex.Basic x, _), _))) => (#2 T.stopper x) | _ => false); |
9140 | 252 |
|
253 |
in |
|
254 |
||
255 |
fun parse_thy markup lex trs src = |
|
256 |
let |
|
257 |
val text = P.position P.text; |
|
15666 | 258 |
val token = Scan.peek (fn i => |
9140 | 259 |
(improper |-- markup Markup -- P.!!!! (improper |-- text --| improper_end) |
15531 | 260 |
>> (fn (x, y) => (true, (SOME true, ((Latex.Markup (T.val_of x), y), i)))) || |
9140 | 261 |
improper |-- markup MarkupEnv -- P.!!!! (improper |-- text --| improper_end) |
15531 | 262 |
>> (fn (x, y) => (true, (SOME true, ((Latex.MarkupEnv (T.val_of x), y), i)))) || |
9140 | 263 |
(P.$$$ "--" |-- P.!!!! (improper |-- text)) |
15531 | 264 |
>> (fn y => (false, (NONE, ((Latex.Markup "cmt", y), i)))) || |
9140 | 265 |
(improper -- markup Verbatim) |-- P.!!!! (improper |-- text --| improper_end) |
15531 | 266 |
>> (fn y => (true, (NONE, ((Latex.Verbatim, y), i)))) || |
9140 | 267 |
P.position (Scan.one T.not_eof) |
15666 | 268 |
>> (fn (x, pos) => (T.is_kind T.Command x, (SOME false, ((Latex.Basic x, ("", pos)), i)))))); |
9140 | 269 |
|
270 |
val body = Scan.any (not o fst andf not o #2 stopper); |
|
11861 | 271 |
val section = body -- Scan.one fst -- body |
272 |
>> (fn ((b1, c), b2) => (#1 (#2 c), map (snd o snd) (b1 @ (c :: b2)))); |
|
9140 | 273 |
|
274 |
val cmds = |
|
275 |
src |
|
276 |
|> Source.filter (not o T.is_semicolon) |
|
15531 | 277 |
|> Source.source' 0 T.stopper (Scan.error (Scan.bulk (ignore_cmd || token))) NONE |
278 |
|> Source.source stopper (Scan.error (Scan.bulk section)) NONE |
|
9140 | 279 |
|> Source.exhaust; |
280 |
in |
|
281 |
if length cmds = length trs then |
|
282 |
(trs ~~ map (present_tokens lex) cmds, Buffer.empty) |
|
11861 | 283 |
else error "Messed-up outer syntax for presentation" |
9140 | 284 |
end; |
285 |
||
286 |
end; |
|
287 |
||
288 |
||
289 |
||
290 |
(** setup default output **) |
|
291 |
||
292 |
(* options *) |
|
293 |
||
294 |
val _ = add_options |
|
9220 | 295 |
[("show_types", Library.setmp Syntax.show_types o boolean), |
296 |
("show_sorts", Library.setmp Syntax.show_sorts o boolean), |
|
14707 | 297 |
("show_structs", Library.setmp show_structs o boolean), |
15988 | 298 |
("show_question_marks", Library.setmp show_question_marks o boolean), |
14696 | 299 |
("long_names", Library.setmp NameSpace.long_names o boolean), |
16142 | 300 |
("short_names", Library.setmp NameSpace.short_names o boolean), |
301 |
("unique_names", Library.setmp NameSpace.unique_names o boolean), |
|
9220 | 302 |
("eta_contract", Library.setmp Syntax.eta_contract o boolean), |
14899 | 303 |
("locale", Library.setmp locale), |
9140 | 304 |
("display", Library.setmp display o boolean), |
13929
21615e44ba88
Added "break" flag to allow line breaks within \isa{...}
berghofe
parents:
13775
diff
changeset
|
305 |
("break", Library.setmp break o boolean), |
9140 | 306 |
("quotes", Library.setmp quotes o boolean), |
307 |
("mode", fn s => fn f => fn () => Library.setmp print_mode (s :: ! print_mode) f ()), |
|
9732 | 308 |
("margin", Pretty.setmp_margin o integer), |
9750 | 309 |
("indent", Library.setmp indent o integer), |
10321 | 310 |
("source", Library.setmp source o boolean), |
311 |
("goals_limit", Library.setmp goals_limit o integer)]; |
|
9140 | 312 |
|
16002 | 313 |
|
9140 | 314 |
(* commands *) |
315 |
||
316 |
fun cond_quote prt = |
|
317 |
if ! quotes then Pretty.quote prt else prt; |
|
318 |
||
319 |
fun cond_display prt = |
|
320 |
if ! display then |
|
14835 | 321 |
Output.output (Pretty.string_of (Pretty.indent (! indent) prt)) |
9863 | 322 |
|> enclose "\\begin{isabelle}%\n" "%\n\\end{isabelle}" |
9140 | 323 |
else |
14835 | 324 |
Output.output ((if ! break then Pretty.string_of else Pretty.str_of) prt) |
9140 | 325 |
|> enclose "\\isa{" "}"; |
326 |
||
14345 | 327 |
fun cond_seq_display prts = |
328 |
if ! display then |
|
14835 | 329 |
map (Output.output o Pretty.string_of o Pretty.indent (! indent)) prts |
14345 | 330 |
|> separate "\\isasep\\isanewline%\n" |
331 |
|> implode |
|
332 |
|> enclose "\\begin{isabelle}%\n" "%\n\\end{isabelle}" |
|
333 |
else |
|
14835 | 334 |
map (Output.output o (if ! break then Pretty.string_of else Pretty.str_of)) prts |
14345 | 335 |
|> separate "\\isasep\\isanewline%\n" |
336 |
|> implode |
|
337 |
|> enclose "\\isa{" "}"; |
|
338 |
||
11011
14b78c0c9f05
pretty_text: tweak_lines handles linebreaks gracefully;
wenzelm
parents:
10739
diff
changeset
|
339 |
fun tweak_line s = |
14b78c0c9f05
pretty_text: tweak_lines handles linebreaks gracefully;
wenzelm
parents:
10739
diff
changeset
|
340 |
if ! display then s else Symbol.strip_blanks s; |
9750 | 341 |
|
11011
14b78c0c9f05
pretty_text: tweak_lines handles linebreaks gracefully;
wenzelm
parents:
10739
diff
changeset
|
342 |
val pretty_text = Pretty.chunks o map Pretty.str o map tweak_line o Library.split_lines; |
9140 | 343 |
|
9750 | 344 |
val pretty_source = |
345 |
pretty_text o space_implode " " o map Args.string_of o #2 o #1 o Args.dest_src; |
|
9140 | 346 |
|
12055 | 347 |
fun pretty_term ctxt = ProofContext.pretty_term ctxt o ProofContext.extern_skolem ctxt; |
9140 | 348 |
|
16002 | 349 |
fun pretty_term_typ ctxt t = |
350 |
(Syntax.const Syntax.constrainC $ |
|
351 |
ProofContext.extern_skolem ctxt t $ |
|
352 |
Syntax.term_of_typ (! show_sorts) (Term.fastype_of t)) |
|
353 |
|> ProofContext.pretty_term ctxt; |
|
15880
d6aa6c707acf
added antiquotations typeof, const, term_style, thm_style, term_type (something still to be done)
haftmann
parents:
15666
diff
changeset
|
354 |
|
16002 | 355 |
fun pretty_term_typeof ctxt = ProofContext.pretty_typ ctxt o Term.fastype_of; |
15880
d6aa6c707acf
added antiquotations typeof, const, term_style, thm_style, term_type (something still to be done)
haftmann
parents:
15666
diff
changeset
|
356 |
|
16002 | 357 |
fun pretty_term_const ctxt t = |
358 |
if Term.is_Const t then pretty_term ctxt t |
|
359 |
else error ("Logical constant expected: " ^ ProofContext.string_of_term ctxt t); |
|
15880
d6aa6c707acf
added antiquotations typeof, const, term_style, thm_style, term_type (something still to be done)
haftmann
parents:
15666
diff
changeset
|
360 |
|
14345 | 361 |
fun pretty_thm ctxt = pretty_term ctxt o Thm.prop_of; |
9140 | 362 |
|
15960 | 363 |
fun pretty_term_style ctxt (name, term) = |
364 |
let |
|
365 |
val thy = ProofContext.theory_of ctxt |
|
15988 | 366 |
in pretty_term ctxt (TermStyle.the_style thy name ctxt term) end; |
15880
d6aa6c707acf
added antiquotations typeof, const, term_style, thm_style, term_type (something still to be done)
haftmann
parents:
15666
diff
changeset
|
367 |
|
d6aa6c707acf
added antiquotations typeof, const, term_style, thm_style, term_type (something still to be done)
haftmann
parents:
15666
diff
changeset
|
368 |
fun pretty_thm_style ctxt (name, thm) = pretty_term_style ctxt (name, Thm.prop_of thm); |
d6aa6c707acf
added antiquotations typeof, const, term_style, thm_style, term_type (something still to be done)
haftmann
parents:
15666
diff
changeset
|
369 |
|
12055 | 370 |
fun pretty_prf full ctxt thms = (* FIXME context syntax!? *) |
11524
197f2e14a714
Added functions for printing primitive proof terms.
berghofe
parents:
11240
diff
changeset
|
371 |
Pretty.chunks (map (ProofSyntax.pretty_proof_of full) thms); |
197f2e14a714
Added functions for printing primitive proof terms.
berghofe
parents:
11240
diff
changeset
|
372 |
|
17030 | 373 |
fun pretty_mlidf mlidf = |
374 |
(use_text Context.ml_output false ("val _ = fn _ => " ^ mlidf ^ ";"); |
|
375 |
Pretty.str mlidf); |
|
376 |
||
9750 | 377 |
fun output_with pretty src ctxt x = |
378 |
let |
|
12055 | 379 |
val prt = pretty ctxt x; (*always pretty in order to catch errors!*) |
9750 | 380 |
val prt' = if ! source then pretty_source src else prt; |
381 |
in cond_display (cond_quote prt') end; |
|
9732 | 382 |
|
14345 | 383 |
fun output_seq_with pretty src ctxt xs = |
384 |
let |
|
385 |
val prts = map (pretty ctxt) xs; (*always pretty in order to catch errors!*) |
|
386 |
val prts' = if ! source then [pretty_source src] else prts; |
|
387 |
in cond_seq_display (map cond_quote prts') end; |
|
388 |
||
10360 | 389 |
fun output_goals main_goal src state = args (Scan.succeed ()) (output_with (fn _ => fn _ => |
390 |
Pretty.chunks (Proof.pretty_goals main_goal (Toplevel.proof_of state |
|
17030 | 391 |
handle Toplevel.UNDEF => error "No proof state")))) src state; |
10360 | 392 |
|
17030 | 393 |
val _ = add_commands [ |
394 |
("thm", args Attrib.local_thmss (output_seq_with pretty_thm)), |
|
16165 | 395 |
("thm_style", args ((Scan.lift (Args.name || Args.symbol)) -- Attrib.local_thm) (output_with pretty_thm_style)), |
9750 | 396 |
("prop", args Args.local_prop (output_with pretty_term)), |
397 |
("term", args Args.local_term (output_with pretty_term)), |
|
16165 | 398 |
("term_style", args ((Scan.lift (Args.name || Args.symbol)) -- Args.local_term) (output_with pretty_term_style)), |
15880
d6aa6c707acf
added antiquotations typeof, const, term_style, thm_style, term_type (something still to be done)
haftmann
parents:
15666
diff
changeset
|
399 |
("term_type", args Args.local_term (output_with pretty_term_typ)), |
d6aa6c707acf
added antiquotations typeof, const, term_style, thm_style, term_type (something still to be done)
haftmann
parents:
15666
diff
changeset
|
400 |
("typeof", args Args.local_term (output_with pretty_term_typeof)), |
d6aa6c707acf
added antiquotations typeof, const, term_style, thm_style, term_type (something still to be done)
haftmann
parents:
15666
diff
changeset
|
401 |
("const", args Args.local_term (output_with pretty_term_const)), |
16345 | 402 |
("typ", args Args.local_typ_abbrev (output_with ProofContext.pretty_typ)), |
14696 | 403 |
("text", args (Scan.lift Args.name) (output_with (K pretty_text))), |
10360 | 404 |
("goals", output_goals true), |
14696 | 405 |
("subgoals", output_goals false), |
406 |
("prf", args Attrib.local_thmss (output_with (pretty_prf false))), |
|
16064 | 407 |
("full_prf", args Attrib.local_thmss (output_with (pretty_prf true))), |
408 |
(*this is just experimental*) |
|
17030 | 409 |
("ML_idf", args (Scan.lift (Args.name || Args.symbol)) (output_with (K pretty_mlidf))) |
410 |
]; |
|
9140 | 411 |
|
412 |
end; |