| author | wenzelm | 
| Fri, 05 May 2006 21:59:43 +0200 | |
| changeset 19575 | 2d9940cd52d3 | 
| parent 19430 | 177e35232d1b | 
| child 20574 | a10885a269cb | 
| permissions | -rw-r--r-- | 
| 5831 | 1 | (* Title: Pure/Isar/isar_cmd.ML | 
| 2 | ID: $Id$ | |
| 3 | Author: Markus Wenzel, TU Muenchen | |
| 4 | ||
| 5 | Non-logical toplevel commands. | |
| 6 | *) | |
| 7 | ||
| 8 | signature ISAR_CMD = | |
| 9 | sig | |
| 7462 | 10 | val welcome: Toplevel.transition -> Toplevel.transition | 
| 11 | val init_toplevel: Toplevel.transition -> Toplevel.transition | |
| 5831 | 12 | val exit: Toplevel.transition -> Toplevel.transition | 
| 13 | val quit: Toplevel.transition -> Toplevel.transition | |
| 7908 | 14 | val touch_child_thys: string -> Toplevel.transition -> Toplevel.transition | 
| 7101 | 15 | val touch_all_thys: Toplevel.transition -> Toplevel.transition | 
| 16 | val touch_thy: string -> Toplevel.transition -> Toplevel.transition | |
| 17 | val remove_thy: string -> Toplevel.transition -> Toplevel.transition | |
| 7931 | 18 | val kill_thy: string -> Toplevel.transition -> Toplevel.transition | 
| 9731 | 19 | val pr: string list * (int option * int option) -> Toplevel.transition -> Toplevel.transition | 
| 8453 | 20 | val disable_pr: Toplevel.transition -> Toplevel.transition | 
| 21 | val enable_pr: Toplevel.transition -> Toplevel.transition | |
| 6734 | 22 | val cannot_undo: string -> Toplevel.transition -> Toplevel.transition | 
| 7729 | 23 | val clear_undos_theory: int -> Toplevel.transition -> Toplevel.transition | 
| 6742 | 24 | val redo: Toplevel.transition -> Toplevel.transition | 
| 25 | val undos_proof: int -> Toplevel.transition -> Toplevel.transition | |
| 7936 | 26 | val kill_proof_notify: (unit -> unit) -> Toplevel.transition -> Toplevel.transition | 
| 6742 | 27 | val kill_proof: Toplevel.transition -> Toplevel.transition | 
| 28 | val undo_theory: Toplevel.transition -> Toplevel.transition | |
| 6686 | 29 | val undo: Toplevel.transition -> Toplevel.transition | 
| 8498 | 30 | val kill: Toplevel.transition -> Toplevel.transition | 
| 17066 | 31 | val back: Toplevel.transition -> Toplevel.transition | 
| 14950 | 32 | val use: Path.T -> Toplevel.transition -> Toplevel.transition | 
| 12876 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 33 | val use_mltext_theory: string -> Toplevel.transition -> Toplevel.transition | 
| 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 34 | val use_mltext: bool -> string -> Toplevel.transition -> Toplevel.transition | 
| 5831 | 35 | val use_commit: Toplevel.transition -> Toplevel.transition | 
| 14950 | 36 | val cd: Path.T -> Toplevel.transition -> Toplevel.transition | 
| 5831 | 37 | val pwd: Toplevel.transition -> Toplevel.transition | 
| 38 | val use_thy: string -> Toplevel.transition -> Toplevel.transition | |
| 6694 | 39 | val use_thy_only: string -> Toplevel.transition -> Toplevel.transition | 
| 6195 | 40 | val update_thy: string -> Toplevel.transition -> Toplevel.transition | 
| 7101 | 41 | val update_thy_only: string -> Toplevel.transition -> Toplevel.transition | 
| 14950 | 42 | val display_drafts: Path.T list -> Toplevel.transition -> Toplevel.transition | 
| 43 | val print_drafts: Path.T list -> Toplevel.transition -> Toplevel.transition | |
| 7124 | 44 | val pretty_setmargin: int -> Toplevel.transition -> Toplevel.transition | 
| 7308 | 45 | val print_context: Toplevel.transition -> Toplevel.transition | 
| 5831 | 46 | val print_theory: Toplevel.transition -> Toplevel.transition | 
| 47 | val print_syntax: Toplevel.transition -> Toplevel.transition | |
| 5880 | 48 | val print_theorems: Toplevel.transition -> Toplevel.transition | 
| 12060 | 49 | val print_locales: Toplevel.transition -> Toplevel.transition | 
| 18135 | 50 | val print_locale: bool * (Locale.expr * Element.context list) | 
| 12758 | 51 | -> Toplevel.transition -> Toplevel.transition | 
| 17139 
165c97f9bb63
Printing of interpretations: option to show witness theorems;
 ballarin parents: 
17066diff
changeset | 52 | val print_registrations: bool -> string -> Toplevel.transition -> Toplevel.transition | 
| 5831 | 53 | val print_attributes: Toplevel.transition -> Toplevel.transition | 
| 16026 | 54 | val print_simpset: Toplevel.transition -> Toplevel.transition | 
| 12382 | 55 | val print_rules: Toplevel.transition -> Toplevel.transition | 
| 11666 | 56 | val print_induct_rules: Toplevel.transition -> Toplevel.transition | 
| 9219 | 57 | val print_trans_rules: Toplevel.transition -> Toplevel.transition | 
| 5831 | 58 | val print_methods: Toplevel.transition -> Toplevel.transition | 
| 9219 | 59 | val print_antiquotations: Toplevel.transition -> Toplevel.transition | 
| 16026 | 60 | val thm_deps: (thmref * Attrib.src list) list -> | 
| 61 | Toplevel.transition -> Toplevel.transition | |
| 16037 | 62 | val find_theorems: int option * (bool * string FindTheorems.criterion) list | 
| 13284 | 63 | -> Toplevel.transition -> Toplevel.transition | 
| 5831 | 64 | val print_binds: Toplevel.transition -> Toplevel.transition | 
| 65 | val print_lthms: Toplevel.transition -> Toplevel.transition | |
| 8369 | 66 | val print_cases: Toplevel.transition -> Toplevel.transition | 
| 19268 | 67 | val print_stmts: string list * (thmref * Attrib.src list) list | 
| 68 | -> Toplevel.transition -> Toplevel.transition | |
| 15703 | 69 | val print_thms: string list * (thmref * Attrib.src list) list | 
| 10581 | 70 | -> Toplevel.transition -> Toplevel.transition | 
| 15703 | 71 | val print_prfs: bool -> string list * (thmref * Attrib.src list) list option | 
| 11524 
197f2e14a714
Added functions for printing primitive proof terms.
 berghofe parents: 
11017diff
changeset | 72 | -> Toplevel.transition -> Toplevel.transition | 
| 12876 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 73 | val print_prop: (string list * string) -> Toplevel.transition -> Toplevel.transition | 
| 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 74 | val print_term: (string list * string) -> Toplevel.transition -> Toplevel.transition | 
| 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 75 | val print_type: (string list * string) -> Toplevel.transition -> Toplevel.transition | 
| 12938 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 76 | val add_header: string * Position.T -> Toplevel.transition -> Toplevel.transition | 
| 17262 
63cf42df2723
add_chapter/section/subsection/subsubsection/text: optional locale specification;
 wenzelm parents: 
17228diff
changeset | 77 | val add_chapter: xstring option * (string * Position.T) -> | 
| 
63cf42df2723
add_chapter/section/subsection/subsubsection/text: optional locale specification;
 wenzelm parents: 
17228diff
changeset | 78 | Toplevel.transition -> Toplevel.transition | 
| 
63cf42df2723
add_chapter/section/subsection/subsubsection/text: optional locale specification;
 wenzelm parents: 
17228diff
changeset | 79 | val add_section: xstring option * (string * Position.T) -> | 
| 
63cf42df2723
add_chapter/section/subsection/subsubsection/text: optional locale specification;
 wenzelm parents: 
17228diff
changeset | 80 | Toplevel.transition -> Toplevel.transition | 
| 
63cf42df2723
add_chapter/section/subsection/subsubsection/text: optional locale specification;
 wenzelm parents: 
17228diff
changeset | 81 | val add_subsection: xstring option * (string * Position.T) -> | 
| 
63cf42df2723
add_chapter/section/subsection/subsubsection/text: optional locale specification;
 wenzelm parents: 
17228diff
changeset | 82 | Toplevel.transition -> Toplevel.transition | 
| 
63cf42df2723
add_chapter/section/subsection/subsubsection/text: optional locale specification;
 wenzelm parents: 
17228diff
changeset | 83 | val add_subsubsection: xstring option * (string * Position.T) -> | 
| 
63cf42df2723
add_chapter/section/subsection/subsubsection/text: optional locale specification;
 wenzelm parents: 
17228diff
changeset | 84 | Toplevel.transition -> Toplevel.transition | 
| 
63cf42df2723
add_chapter/section/subsection/subsubsection/text: optional locale specification;
 wenzelm parents: 
17228diff
changeset | 85 | val add_text: xstring option * (string * Position.T) -> | 
| 
63cf42df2723
add_chapter/section/subsection/subsubsection/text: optional locale specification;
 wenzelm parents: 
17228diff
changeset | 86 | Toplevel.transition -> Toplevel.transition | 
| 12938 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 87 | val add_text_raw: string * Position.T -> Toplevel.transition -> Toplevel.transition | 
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 88 | val add_sect: string * Position.T -> Toplevel.transition -> Toplevel.transition | 
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 89 | val add_subsect: string * Position.T -> Toplevel.transition -> Toplevel.transition | 
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 90 | val add_subsubsect: string * Position.T -> Toplevel.transition -> Toplevel.transition | 
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 91 | val add_txt: string * Position.T -> Toplevel.transition -> Toplevel.transition | 
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 92 | val add_txt_raw: string * Position.T -> Toplevel.transition -> Toplevel.transition | 
| 5831 | 93 | end; | 
| 94 | ||
| 95 | structure IsarCmd: ISAR_CMD = | |
| 96 | struct | |
| 97 | ||
| 98 | ||
| 7462 | 99 | (* variations on init / exit *) | 
| 100 | ||
| 101 | val init_toplevel = Toplevel.imperative (fn () => raise Toplevel.RESTART); | |
| 102 | val welcome = Toplevel.imperative (writeln o Session.welcome); | |
| 5831 | 103 | |
| 104 | val exit = Toplevel.keep (fn state => | |
| 105 | (Context.set_context (try Toplevel.theory_of state); | |
| 18063 | 106 | writeln "Leaving the Isar loop. Invoke 'Isar.loop();' to continue."; | 
| 5831 | 107 | raise Toplevel.TERMINATE)); | 
| 108 | ||
| 109 | val quit = Toplevel.imperative quit; | |
| 110 | ||
| 7101 | 111 | |
| 112 | (* touch theories *) | |
| 113 | ||
| 7908 | 114 | fun touch_child_thys name = Toplevel.imperative (fn () => ThyInfo.touch_child_thys name); | 
| 7101 | 115 | val touch_all_thys = Toplevel.imperative ThyInfo.touch_all_thys; | 
| 116 | fun touch_thy name = Toplevel.imperative (fn () => ThyInfo.touch_thy name); | |
| 117 | fun remove_thy name = Toplevel.imperative (fn () => ThyInfo.remove_thy name); | |
| 7931 | 118 | fun kill_thy name = Toplevel.imperative (fn () => IsarThy.kill_theory name); | 
| 7101 | 119 | |
| 5831 | 120 | |
| 8453 | 121 | (* print state *) | 
| 122 | ||
| 8463 | 123 | fun with_modes modes e = | 
| 124 | Library.setmp print_mode (modes @ ! print_mode) e (); | |
| 125 | ||
| 15531 | 126 | fun set_limit _ NONE = () | 
| 127 | | set_limit r (SOME n) = r := n; | |
| 9731 | 128 | |
| 19385 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 129 | fun pr (modes, (lim1, lim2)) = Toplevel.keep (fn state => | 
| 9731 | 130 | (set_limit goals_limit lim1; set_limit ProofContext.prems_limit lim2; Toplevel.quiet := false; | 
| 19385 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 131 | with_modes modes (fn () => Toplevel.print_state true state))); | 
| 8453 | 132 | |
| 133 | val disable_pr = Toplevel.imperative (fn () => Toplevel.quiet := true); | |
| 134 | val enable_pr = Toplevel.imperative (fn () => Toplevel.quiet := false); | |
| 135 | ||
| 136 | ||
| 6686 | 137 | (* history commands *) | 
| 138 | ||
| 6734 | 139 | fun cannot_undo txt = Toplevel.imperative (fn () => error ("Cannot undo " ^ quote txt));
 | 
| 7729 | 140 | val clear_undos_theory = Toplevel.history o History.clear; | 
| 16812 | 141 | |
| 142 | val redo = | |
| 143 | Toplevel.history History.redo o | |
| 144 | Toplevel.actual_proof ProofHistory.redo o | |
| 15237 
250e9be7a09d
Some changes to allow skipping of proof scripts.
 berghofe parents: 
15222diff
changeset | 145 | Toplevel.skip_proof History.redo; | 
| 6686 | 146 | |
| 16812 | 147 | fun undos_proof n = | 
| 148 | Toplevel.actual_proof (fn prf => | |
| 15237 
250e9be7a09d
Some changes to allow skipping of proof scripts.
 berghofe parents: 
15222diff
changeset | 149 | if ProofHistory.is_initial prf then raise Toplevel.UNDEF else funpow n ProofHistory.undo prf) o | 
| 
250e9be7a09d
Some changes to allow skipping of proof scripts.
 berghofe parents: 
15222diff
changeset | 150 | Toplevel.skip_proof (fn h => | 
| 
250e9be7a09d
Some changes to allow skipping of proof scripts.
 berghofe parents: 
15222diff
changeset | 151 | if History.is_initial h then raise Toplevel.UNDEF else funpow n History.undo h); | 
| 6686 | 152 | |
| 7936 | 153 | fun kill_proof_notify (f: unit -> unit) = Toplevel.history (fn hist => | 
| 18588 | 154 | if is_some (Toplevel.theory_node (History.current hist)) then raise Toplevel.UNDEF | 
| 155 | else (f (); History.undo hist)); | |
| 7936 | 156 | |
| 157 | val kill_proof = kill_proof_notify (K ()); | |
| 6686 | 158 | |
| 6742 | 159 | val undo_theory = Toplevel.history (fn hist => | 
| 160 | if History.is_initial hist then raise Toplevel.UNDEF else History.undo hist); | |
| 6686 | 161 | |
| 7413 | 162 | val undo = Toplevel.kill o undo_theory o undos_proof 1; | 
| 8498 | 163 | val kill = Toplevel.kill o kill_proof; | 
| 17899 | 164 | |
| 165 | val back = | |
| 166 | Toplevel.actual_proof ProofHistory.back o | |
| 167 | Toplevel.skip_proof (History.apply I); | |
| 9273 | 168 | |
| 6686 | 169 | |
| 5831 | 170 | (* use ML text *) | 
| 171 | ||
| 16045 | 172 | fun use path = Toplevel.keep (fn state => | 
| 173 | Context.setmp (try Toplevel.theory_of state) (ThyInfo.load_file false) path); | |
| 5831 | 174 | |
| 175 | (*passes changes of theory context*) | |
| 12876 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 176 | val use_mltext_theory = Toplevel.theory' o Context.use_mltext_theory; | 
| 5831 | 177 | |
| 178 | (*ignore result theory context*) | |
| 12876 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 179 | fun use_mltext v txt = Toplevel.keep' (fn verb => fn state => | 
| 8349 
611342539639
moved use_mltext, use_mltext_theory, use_let, use_setup to context.ML;
 wenzelm parents: 
7936diff
changeset | 180 | (Context.use_mltext txt (v andalso verb) (try Toplevel.theory_of state))); | 
| 5831 | 181 | |
| 16193 | 182 | (*commit is dynamically bound!*) | 
| 12876 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 183 | val use_commit = use_mltext false "commit();"; | 
| 5831 | 184 | |
| 185 | ||
| 186 | (* current working directory *) | |
| 187 | ||
| 14950 | 188 | fun cd path = Toplevel.imperative (fn () => (File.cd path)); | 
| 7790 | 189 | val pwd = Toplevel.imperative (fn () => writeln (Path.pack (File.pwd ()))); | 
| 5831 | 190 | |
| 191 | ||
| 192 | (* load theory files *) | |
| 193 | ||
| 6243 | 194 | fun use_thy name = Toplevel.imperative (fn () => Context.save ThyInfo.use_thy name); | 
| 6694 | 195 | fun use_thy_only name = Toplevel.imperative (fn () => Context.save ThyInfo.use_thy_only name); | 
| 6243 | 196 | fun update_thy name = Toplevel.imperative (fn () => Context.save ThyInfo.update_thy name); | 
| 7124 | 197 | fun update_thy_only name = | 
| 198 | Toplevel.imperative (fn () => Context.save ThyInfo.update_thy_only name); | |
| 199 | ||
| 200 | ||
| 14934 | 201 | (* present draft files *) | 
| 202 | ||
| 203 | fun display_drafts files = Toplevel.imperative (fn () => | |
| 16258 | 204 | let val outfile = File.shell_path (Present.drafts (getenv "ISABELLE_DOC_FORMAT") files) | 
| 205 |   in File.isatool ("display -c " ^ outfile ^ " &"); () end);
 | |
| 14934 | 206 | |
| 207 | fun print_drafts files = Toplevel.imperative (fn () => | |
| 16258 | 208 | let val outfile = File.shell_path (Present.drafts "ps" files) | 
| 209 |   in File.isatool ("print -c " ^ outfile); () end);
 | |
| 14934 | 210 | |
| 211 | ||
| 7124 | 212 | (* pretty_setmargin *) | 
| 213 | ||
| 214 | fun pretty_setmargin n = Toplevel.imperative (fn () => Pretty.setmargin n); | |
| 5831 | 215 | |
| 216 | ||
| 9513 | 217 | (* print parts of theory and proof context *) | 
| 5831 | 218 | |
| 7308 | 219 | val print_context = Toplevel.keep Toplevel.print_state_context; | 
| 9513 | 220 | |
| 221 | val print_theory = Toplevel.unknown_theory o | |
| 19430 | 222 | Toplevel.keep (ProofDisplay.print_theory o Toplevel.theory_of); | 
| 9513 | 223 | |
| 224 | val print_syntax = Toplevel.unknown_theory o | |
| 12069 | 225 | Toplevel.keep (Display.print_syntax o Toplevel.theory_of) o | 
| 226 | Toplevel.keep (ProofContext.print_syntax o Proof.context_of o Toplevel.proof_of); | |
| 9513 | 227 | |
| 17066 | 228 | val print_theorems_proof = Toplevel.keep (fn state => | 
| 229 | ProofContext.setmp_verbose | |
| 230 | ProofContext.print_lthms (Proof.context_of (Toplevel.proof_of state))); | |
| 231 | ||
| 18588 | 232 | val print_theorems_theory = Toplevel.keep (fn state => | 
| 233 | Toplevel.theory_of state |> | |
| 234 | (case Option.map Toplevel.theory_node (History.previous (Toplevel.node_history_of state)) of | |
| 19430 | 235 | SOME (SOME prev_thy) => ProofDisplay.print_theorems_diff prev_thy | 
| 236 | | _ => ProofDisplay.print_theorems)); | |
| 18588 | 237 | |
| 238 | val print_theorems = Toplevel.unknown_theory o print_theorems_theory o print_theorems_proof; | |
| 9513 | 239 | |
| 12060 | 240 | val print_locales = Toplevel.unknown_theory o | 
| 241 | Toplevel.keep (Locale.print_locales o Toplevel.theory_of); | |
| 242 | ||
| 19385 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 243 | fun print_locale (show_facts, (import, body)) = Toplevel.unknown_theory o | 
| 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 244 | Toplevel.keep (fn state => | 
| 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 245 | Locale.print_locale (Toplevel.theory_of state) show_facts import body); | 
| 15596 | 246 | |
| 17139 
165c97f9bb63
Printing of interpretations: option to show witness theorems;
 ballarin parents: 
17066diff
changeset | 247 | fun print_registrations show_wits name = Toplevel.unknown_context o | 
| 
165c97f9bb63
Printing of interpretations: option to show witness theorems;
 ballarin parents: 
17066diff
changeset | 248 | Toplevel.keep (Toplevel.node_case (Locale.print_global_registrations show_wits name) | 
| 
165c97f9bb63
Printing of interpretations: option to show witness theorems;
 ballarin parents: 
17066diff
changeset | 249 | (Locale.print_local_registrations show_wits name o Proof.context_of)); | 
| 12060 | 250 | |
| 9513 | 251 | val print_attributes = Toplevel.unknown_theory o | 
| 252 | Toplevel.keep (Attrib.print_attributes o Toplevel.theory_of); | |
| 253 | ||
| 16026 | 254 | val print_simpset = Toplevel.unknown_context o | 
| 255 | Toplevel.keep (Toplevel.node_case Simplifier.print_simpset | |
| 256 | (Simplifier.print_local_simpset o Proof.context_of)); | |
| 257 | ||
| 12382 | 258 | val print_rules = Toplevel.unknown_context o | 
| 18639 | 259 | Toplevel.keep (ContextRules.print_rules o Toplevel.context_of); | 
| 12382 | 260 | |
| 11666 | 261 | val print_induct_rules = Toplevel.unknown_context o | 
| 18639 | 262 | Toplevel.keep (InductAttrib.print_rules o Toplevel.context_of); | 
| 11666 | 263 | |
| 9513 | 264 | val print_trans_rules = Toplevel.unknown_context o | 
| 18639 | 265 | Toplevel.keep (Calculation.print_rules o Toplevel.context_of); | 
| 9513 | 266 | |
| 267 | val print_methods = Toplevel.unknown_theory o | |
| 268 | Toplevel.keep (Method.print_methods o Toplevel.theory_of); | |
| 269 | ||
| 9219 | 270 | val print_antiquotations = Toplevel.imperative IsarOutput.print_antiquotations; | 
| 5831 | 271 | |
| 15964 
f2074e12d1d4
searching for thms by combination of criteria (intro, elim, dest, name, term pattern)
 kleing parents: 
15799diff
changeset | 272 | |
| 16026 | 273 | (* retrieve theorems *) | 
| 7615 | 274 | |
| 9513 | 275 | fun thm_deps args = Toplevel.unknown_theory o Toplevel.keep (fn state => | 
| 17352 | 276 | ThmDeps.thm_deps (Proof.get_thmss (Toplevel.enter_forward_proof state) args)); | 
| 9454 | 277 | |
| 16026 | 278 | fun find_theorems (opt_lim, spec) = Toplevel.unknown_theory o Toplevel.keep (fn state => | 
| 279 | let | |
| 280 | val proof_state = Toplevel.enter_forward_proof state; | |
| 281 | val ctxt = Proof.context_of proof_state; | |
| 282 | val opt_goal = try Proof.get_goal proof_state |> Option.map (Thm.prop_of o #2 o #2); | |
| 283 | in FindTheorems.print_theorems ctxt opt_goal opt_lim spec end); | |
| 284 | ||
| 5831 | 285 | |
| 286 | (* print proof context contents *) | |
| 287 | ||
| 9513 | 288 | val print_binds = Toplevel.unknown_proof o Toplevel.keep (fn state => | 
| 289 | ProofContext.setmp_verbose | |
| 290 | ProofContext.print_binds (Proof.context_of (Toplevel.proof_of state))); | |
| 291 | ||
| 17066 | 292 | val print_lthms = Toplevel.unknown_proof o print_theorems_proof; | 
| 9513 | 293 | |
| 294 | val print_cases = Toplevel.unknown_proof o Toplevel.keep (fn state => | |
| 295 | ProofContext.setmp_verbose | |
| 296 | ProofContext.print_cases (Proof.context_of (Toplevel.proof_of state))); | |
| 5831 | 297 | |
| 298 | ||
| 19268 | 299 | (* print theorems, terms, types etc. *) | 
| 300 | ||
| 19385 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 301 | local | 
| 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 302 | |
| 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 303 | fun string_of_stmts state args = | 
| 19268 | 304 | Proof.get_thmss state args | 
| 305 | |> map (Element.pretty_statement (Proof.context_of state) PureThy.lemmaK) | |
| 19385 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 306 | |> Pretty.chunks2 |> Pretty.string_of; | 
| 5880 | 307 | |
| 19385 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 308 | fun string_of_thms state args = | 
| 12055 | 309 | Pretty.string_of (ProofContext.pretty_thms (Proof.context_of state) | 
| 19385 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 310 | (Proof.get_thmss state args)); | 
| 5895 | 311 | |
| 19385 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 312 | fun string_of_prfs full state arg = | 
| 17066 | 313 | Pretty.string_of (case arg of | 
| 15531 | 314 | NONE => | 
| 12125 
316d11f760f7
Commands prf and full_prf can now also be used to display proof term
 berghofe parents: 
12069diff
changeset | 315 | let | 
| 17066 | 316 | val (ctxt, (_, thm)) = Proof.get_goal state; | 
| 317 |           val {thy, der = (_, prf), ...} = Thm.rep_thm thm;
 | |
| 318 | val prop = Thm.full_prop_of thm; | |
| 12125 
316d11f760f7
Commands prf and full_prf can now also be used to display proof term
 berghofe parents: 
12069diff
changeset | 319 | val prf' = Proofterm.rewrite_proof_notypes ([], []) prf | 
| 
316d11f760f7
Commands prf and full_prf can now also be used to display proof term
 berghofe parents: 
12069diff
changeset | 320 | in | 
| 17066 | 321 | ProofContext.pretty_proof ctxt | 
| 322 | (if full then Reconstruct.reconstruct_proof thy prop prf' else prf') | |
| 12125 
316d11f760f7
Commands prf and full_prf can now also be used to display proof term
 berghofe parents: 
12069diff
changeset | 323 | end | 
| 15531 | 324 | | SOME args => Pretty.chunks | 
| 17066 | 325 | (map (ProofContext.pretty_proof_of (Proof.context_of state) full) | 
| 19385 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 326 | (Proof.get_thmss state args))); | 
| 11524 
197f2e14a714
Added functions for printing primitive proof terms.
 berghofe parents: 
11017diff
changeset | 327 | |
| 19385 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 328 | fun string_of_prop state s = | 
| 5831 | 329 | let | 
| 12055 | 330 | val ctxt = Proof.context_of state; | 
| 331 | val prop = ProofContext.read_prop ctxt s; | |
| 19385 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 332 | in Pretty.string_of (Pretty.quote (ProofContext.pretty_term ctxt prop)) end; | 
| 5831 | 333 | |
| 19385 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 334 | fun string_of_term state s = | 
| 5831 | 335 | let | 
| 12055 | 336 | val ctxt = Proof.context_of state; | 
| 337 | val t = ProofContext.read_term ctxt s; | |
| 5831 | 338 | val T = Term.type_of t; | 
| 339 | in | |
| 19385 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 340 | Pretty.string_of | 
| 12055 | 341 | (Pretty.block [Pretty.quote (ProofContext.pretty_term ctxt t), Pretty.fbrk, | 
| 19385 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 342 | Pretty.str "::", Pretty.brk 1, Pretty.quote (ProofContext.pretty_typ ctxt T)]) | 
| 9128 | 343 | end; | 
| 5831 | 344 | |
| 19385 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 345 | fun string_of_type state s = | 
| 5831 | 346 | let | 
| 12055 | 347 | val ctxt = Proof.context_of state; | 
| 348 | val T = ProofContext.read_typ ctxt s; | |
| 19385 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 349 | in Pretty.string_of (Pretty.quote (ProofContext.pretty_typ ctxt T)) end; | 
| 9128 | 350 | |
| 19385 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 351 | fun print_item string_of (modes, arg) = Toplevel.keep (fn state => with_modes modes (fn () => | 
| 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 352 | writeln (string_of (Toplevel.enter_forward_proof state) arg))); | 
| 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 353 | |
| 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 354 | in | 
| 9128 | 355 | |
| 19268 | 356 | val print_stmts = print_item string_of_stmts; | 
| 12876 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 357 | val print_thms = print_item string_of_thms; | 
| 19385 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 358 | val print_prfs = print_item o string_of_prfs; | 
| 12876 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 359 | val print_prop = print_item string_of_prop; | 
| 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 360 | val print_term = print_item string_of_term; | 
| 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 361 | val print_type = print_item string_of_type; | 
| 5831 | 362 | |
| 19385 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 363 | end; | 
| 
c0f2f8224ea8
print_term etc.: actually observe print mode in final output;
 wenzelm parents: 
19268diff
changeset | 364 | |
| 12938 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 365 | |
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 366 | (* markup commands *) | 
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 367 | |
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 368 | fun add_header s = Toplevel.keep' (fn int => fn state => | 
| 17262 
63cf42df2723
add_chapter/section/subsection/subsubsection/text: optional locale specification;
 wenzelm parents: 
17228diff
changeset | 369 | (Toplevel.assert (Toplevel.is_toplevel state); | 
| 19057 | 370 | if int then OuterSyntax.check_text s NONE else ())); | 
| 12938 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 371 | |
| 12953 
7d5bd53555d8
markup commands: proper theory/proof transactions!
 wenzelm parents: 
12938diff
changeset | 372 | local | 
| 
7d5bd53555d8
markup commands: proper theory/proof transactions!
 wenzelm parents: 
12938diff
changeset | 373 | |
| 19057 | 374 | fun present _ txt true node = OuterSyntax.check_text txt (SOME node) | 
| 375 | | present f (s, _) false node = | |
| 376 | Context.setmp (try (Toplevel.cases_node I Proof.theory_of) node) f s; | |
| 12953 
7d5bd53555d8
markup commands: proper theory/proof transactions!
 wenzelm parents: 
12938diff
changeset | 377 | |
| 19057 | 378 | fun present_local_theory f (loc, txt) = Toplevel.present_local_theory loc (present f txt); | 
| 379 | fun present_proof f txt = Toplevel.print o Toplevel.present_proof (present f txt); | |
| 12938 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 380 | |
| 12953 
7d5bd53555d8
markup commands: proper theory/proof transactions!
 wenzelm parents: 
12938diff
changeset | 381 | in | 
| 
7d5bd53555d8
markup commands: proper theory/proof transactions!
 wenzelm parents: 
12938diff
changeset | 382 | |
| 19057 | 383 | val add_chapter = present_local_theory Present.section; | 
| 384 | val add_section = present_local_theory Present.section; | |
| 385 | val add_subsection = present_local_theory Present.subsection; | |
| 386 | val add_subsubsection = present_local_theory Present.subsubsection; | |
| 387 | val add_text = present_local_theory (K ()); | |
| 388 | fun add_text_raw txt = present_local_theory (K ()) (NONE, txt); | |
| 389 | val add_txt = present_proof (K ()); | |
| 390 | val add_txt_raw = add_txt; | |
| 391 | val add_sect = add_txt; | |
| 392 | val add_subsect = add_txt; | |
| 393 | val add_subsubsect = add_txt; | |
| 12938 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 394 | |
| 5831 | 395 | end; | 
| 12953 
7d5bd53555d8
markup commands: proper theory/proof transactions!
 wenzelm parents: 
12938diff
changeset | 396 | |
| 
7d5bd53555d8
markup commands: proper theory/proof transactions!
 wenzelm parents: 
12938diff
changeset | 397 | end; |