| author | huffman | 
| Mon, 07 Mar 2005 23:54:01 +0100 | |
| changeset 15587 | f363e6e080e7 | 
| parent 15531 | 08c8dad8e399 | 
| child 15596 | 8665d08085df | 
| 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 | 
| 12876 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 31 | val back: bool -> 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 | 
| 12876 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 50 | val print_locale: Locale.expr * Args.src Locale.element list | 
| 12758 | 51 | -> Toplevel.transition -> Toplevel.transition | 
| 5831 | 52 | val print_attributes: Toplevel.transition -> Toplevel.transition | 
| 12382 | 53 | val print_rules: Toplevel.transition -> Toplevel.transition | 
| 11666 | 54 | val print_induct_rules: Toplevel.transition -> Toplevel.transition | 
| 9219 | 55 | val print_trans_rules: Toplevel.transition -> Toplevel.transition | 
| 5831 | 56 | val print_methods: Toplevel.transition -> Toplevel.transition | 
| 9219 | 57 | val print_antiquotations: Toplevel.transition -> Toplevel.transition | 
| 13284 | 58 | val print_thms_containing: int option * string list | 
| 59 | -> Toplevel.transition -> Toplevel.transition | |
| 15456 
956d6acacf89
Specific theorems in a named list of theorems can now be referred to
 berghofe parents: 
15237diff
changeset | 60 | val thm_deps: (thmref * Args.src list) list -> Toplevel.transition -> Toplevel.transition | 
| 5831 | 61 | val print_binds: Toplevel.transition -> Toplevel.transition | 
| 62 | val print_lthms: Toplevel.transition -> Toplevel.transition | |
| 8369 | 63 | val print_cases: Toplevel.transition -> Toplevel.transition | 
| 13801 
6c5c5bdfae84
Moved print_intros from proof_general.ML to Isar/isar_cmd.ML
 berghofe parents: 
13284diff
changeset | 64 | val print_intros: Toplevel.transition -> Toplevel.transition | 
| 15456 
956d6acacf89
Specific theorems in a named list of theorems can now be referred to
 berghofe parents: 
15237diff
changeset | 65 | val print_thms: string list * (thmref * Args.src list) list | 
| 10581 | 66 | -> Toplevel.transition -> Toplevel.transition | 
| 15456 
956d6acacf89
Specific theorems in a named list of theorems can now be referred to
 berghofe parents: 
15237diff
changeset | 67 | val print_prfs: bool -> string list * (thmref * Args.src list) list option | 
| 11524 
197f2e14a714
Added functions for printing primitive proof terms.
 berghofe parents: 
11017diff
changeset | 68 | -> Toplevel.transition -> Toplevel.transition | 
| 12876 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 69 | 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 | 70 | 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 | 71 | 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 | 72 | val add_header: string * Position.T -> Toplevel.transition -> Toplevel.transition | 
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 73 | val add_chapter: string * Position.T -> Toplevel.transition -> Toplevel.transition | 
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 74 | val add_section: string * Position.T -> Toplevel.transition -> Toplevel.transition | 
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 75 | val add_subsection: string * Position.T -> Toplevel.transition -> Toplevel.transition | 
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 76 | val add_subsubsection: string * Position.T -> Toplevel.transition -> Toplevel.transition | 
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 77 | val add_text: string * Position.T -> Toplevel.transition -> Toplevel.transition | 
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 78 | 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 | 79 | 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 | 80 | 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 | 81 | 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 | 82 | 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 | 83 | val add_txt_raw: string * Position.T -> Toplevel.transition -> Toplevel.transition | 
| 5831 | 84 | end; | 
| 85 | ||
| 86 | structure IsarCmd: ISAR_CMD = | |
| 87 | struct | |
| 88 | ||
| 89 | ||
| 7462 | 90 | (* variations on init / exit *) | 
| 91 | ||
| 92 | val init_toplevel = Toplevel.imperative (fn () => raise Toplevel.RESTART); | |
| 93 | val welcome = Toplevel.imperative (writeln o Session.welcome); | |
| 5831 | 94 | |
| 95 | val exit = Toplevel.keep (fn state => | |
| 96 | (Context.set_context (try Toplevel.theory_of state); | |
| 6635 | 97 | writeln "Leaving the Isar loop. Invoke 'loop();' to restart."; | 
| 5831 | 98 | raise Toplevel.TERMINATE)); | 
| 99 | ||
| 100 | val quit = Toplevel.imperative quit; | |
| 101 | ||
| 7101 | 102 | |
| 103 | (* touch theories *) | |
| 104 | ||
| 7908 | 105 | fun touch_child_thys name = Toplevel.imperative (fn () => ThyInfo.touch_child_thys name); | 
| 7101 | 106 | val touch_all_thys = Toplevel.imperative ThyInfo.touch_all_thys; | 
| 107 | fun touch_thy name = Toplevel.imperative (fn () => ThyInfo.touch_thy name); | |
| 108 | fun remove_thy name = Toplevel.imperative (fn () => ThyInfo.remove_thy name); | |
| 7931 | 109 | fun kill_thy name = Toplevel.imperative (fn () => IsarThy.kill_theory name); | 
| 7101 | 110 | |
| 5831 | 111 | |
| 8453 | 112 | (* print state *) | 
| 113 | ||
| 8463 | 114 | fun with_modes modes e = | 
| 115 | Library.setmp print_mode (modes @ ! print_mode) e (); | |
| 116 | ||
| 15531 | 117 | fun set_limit _ NONE = () | 
| 118 | | set_limit r (SOME n) = r := n; | |
| 9731 | 119 | |
| 120 | fun pr (ms, (lim1, lim2)) = Toplevel.keep (fn state => | |
| 121 | (set_limit goals_limit lim1; set_limit ProofContext.prems_limit lim2; Toplevel.quiet := false; | |
| 8886 | 122 | with_modes ms (fn () => Toplevel.print_state true state))); | 
| 8453 | 123 | |
| 124 | val disable_pr = Toplevel.imperative (fn () => Toplevel.quiet := true); | |
| 125 | val enable_pr = Toplevel.imperative (fn () => Toplevel.quiet := false); | |
| 126 | ||
| 127 | ||
| 6686 | 128 | (* history commands *) | 
| 129 | ||
| 6734 | 130 | fun cannot_undo txt = Toplevel.imperative (fn () => error ("Cannot undo " ^ quote txt));
 | 
| 7729 | 131 | val clear_undos_theory = Toplevel.history o History.clear; | 
| 15237 
250e9be7a09d
Some changes to allow skipping of proof scripts.
 berghofe parents: 
15222diff
changeset | 132 | val redo = Toplevel.history History.redo o Toplevel.proof'' ProofHistory.redo o | 
| 
250e9be7a09d
Some changes to allow skipping of proof scripts.
 berghofe parents: 
15222diff
changeset | 133 | Toplevel.skip_proof History.redo; | 
| 6686 | 134 | |
| 15237 
250e9be7a09d
Some changes to allow skipping of proof scripts.
 berghofe parents: 
15222diff
changeset | 135 | fun undos_proof n = Toplevel.proof'' (fn prf => | 
| 
250e9be7a09d
Some changes to allow skipping of proof scripts.
 berghofe parents: 
15222diff
changeset | 136 | 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 | 137 | Toplevel.skip_proof (fn h => | 
| 
250e9be7a09d
Some changes to allow skipping of proof scripts.
 berghofe parents: 
15222diff
changeset | 138 | if History.is_initial h then raise Toplevel.UNDEF else funpow n History.undo h); | 
| 6686 | 139 | |
| 7936 | 140 | fun kill_proof_notify (f: unit -> unit) = Toplevel.history (fn hist => | 
| 6742 | 141 | (case History.current hist of | 
| 142 | Toplevel.Theory _ => raise Toplevel.UNDEF | |
| 15237 
250e9be7a09d
Some changes to allow skipping of proof scripts.
 berghofe parents: 
15222diff
changeset | 143 | | _ => (f (); History.undo hist))); | 
| 7936 | 144 | |
| 145 | val kill_proof = kill_proof_notify (K ()); | |
| 6686 | 146 | |
| 6742 | 147 | val undo_theory = Toplevel.history (fn hist => | 
| 148 | if History.is_initial hist then raise Toplevel.UNDEF else History.undo hist); | |
| 6686 | 149 | |
| 7413 | 150 | val undo = Toplevel.kill o undo_theory o undos_proof 1; | 
| 8498 | 151 | val kill = Toplevel.kill o kill_proof; | 
| 12876 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 152 | val back = Toplevel.proof o ProofHistory.back; | 
| 9273 | 153 | |
| 6686 | 154 | |
| 5831 | 155 | (* use ML text *) | 
| 156 | ||
| 14950 | 157 | fun use path = Toplevel.keep (fn state => | 
| 158 | Context.setmp (try Toplevel.theory_of state) (ThyInfo.load_file false) path); | |
| 5831 | 159 | |
| 160 | (*passes changes of theory context*) | |
| 12876 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 161 | val use_mltext_theory = Toplevel.theory' o Context.use_mltext_theory; | 
| 5831 | 162 | |
| 163 | (*ignore result theory context*) | |
| 12876 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 164 | 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 | 165 | (Context.use_mltext txt (v andalso verb) (try Toplevel.theory_of state))); | 
| 5831 | 166 | |
| 167 | (*Note: commit is dynamically bound*) | |
| 12876 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 168 | val use_commit = use_mltext false "commit();"; | 
| 5831 | 169 | |
| 170 | ||
| 171 | (* current working directory *) | |
| 172 | ||
| 14950 | 173 | fun cd path = Toplevel.imperative (fn () => (File.cd path)); | 
| 7790 | 174 | val pwd = Toplevel.imperative (fn () => writeln (Path.pack (File.pwd ()))); | 
| 5831 | 175 | |
| 176 | ||
| 177 | (* load theory files *) | |
| 178 | ||
| 6243 | 179 | fun use_thy name = Toplevel.imperative (fn () => Context.save ThyInfo.use_thy name); | 
| 6694 | 180 | fun use_thy_only name = Toplevel.imperative (fn () => Context.save ThyInfo.use_thy_only name); | 
| 6243 | 181 | fun update_thy name = Toplevel.imperative (fn () => Context.save ThyInfo.update_thy name); | 
| 7124 | 182 | fun update_thy_only name = | 
| 183 | Toplevel.imperative (fn () => Context.save ThyInfo.update_thy_only name); | |
| 184 | ||
| 185 | ||
| 14934 | 186 | (* present draft files *) | 
| 187 | ||
| 188 | fun display_drafts files = Toplevel.imperative (fn () => | |
| 15222 | 189 | let val outfile = File.quote_sysify_path (Present.drafts "pdf" files) | 
| 14934 | 190 |   in system ("\"$ISATOOL\" display -c " ^ outfile ^ " &"); () end);
 | 
| 191 | ||
| 192 | fun print_drafts files = Toplevel.imperative (fn () => | |
| 14950 | 193 | let val outfile = File.quote_sysify_path (Present.drafts "ps" files) | 
| 14934 | 194 |   in system ("\"$ISATOOL\" print -c " ^ outfile); () end);
 | 
| 195 | ||
| 196 | ||
| 7124 | 197 | (* pretty_setmargin *) | 
| 198 | ||
| 199 | fun pretty_setmargin n = Toplevel.imperative (fn () => Pretty.setmargin n); | |
| 5831 | 200 | |
| 201 | ||
| 9513 | 202 | (* print parts of theory and proof context *) | 
| 5831 | 203 | |
| 7308 | 204 | val print_context = Toplevel.keep Toplevel.print_state_context; | 
| 9513 | 205 | |
| 206 | val print_theory = Toplevel.unknown_theory o | |
| 207 | Toplevel.keep (PureThy.print_theory o Toplevel.theory_of); | |
| 208 | ||
| 209 | val print_syntax = Toplevel.unknown_theory o | |
| 12069 | 210 | Toplevel.keep (Display.print_syntax o Toplevel.theory_of) o | 
| 211 | Toplevel.keep (ProofContext.print_syntax o Proof.context_of o Toplevel.proof_of); | |
| 9513 | 212 | |
| 213 | val print_theorems = Toplevel.unknown_theory o | |
| 214 | Toplevel.keep (PureThy.print_theorems o Toplevel.theory_of); | |
| 215 | ||
| 12060 | 216 | val print_locales = Toplevel.unknown_theory o | 
| 217 | Toplevel.keep (Locale.print_locales o Toplevel.theory_of); | |
| 218 | ||
| 12758 | 219 | fun print_locale (import, body) = Toplevel.unknown_theory o Toplevel.keep (fn state => | 
| 220 | let val thy = Toplevel.theory_of state in | |
| 15206 
09d78ec709c7
Modified locales: improved implementation of "includes".
 ballarin parents: 
15127diff
changeset | 221 | Locale.print_locale thy import (map (Locale.map_attrib_element (Attrib.local_attribute thy)) body) | 
| 12758 | 222 | end); | 
| 12060 | 223 | |
| 9513 | 224 | val print_attributes = Toplevel.unknown_theory o | 
| 225 | Toplevel.keep (Attrib.print_attributes o Toplevel.theory_of); | |
| 226 | ||
| 12382 | 227 | val print_rules = Toplevel.unknown_context o | 
| 228 | Toplevel.keep (Toplevel.node_case ContextRules.print_global_rules | |
| 229 | (ContextRules.print_local_rules o Proof.context_of)); | |
| 230 | ||
| 11666 | 231 | val print_induct_rules = Toplevel.unknown_context o | 
| 232 | Toplevel.keep (Toplevel.node_case InductAttrib.print_global_rules | |
| 233 | (InductAttrib.print_local_rules o Proof.context_of)); | |
| 234 | ||
| 9513 | 235 | val print_trans_rules = Toplevel.unknown_context o | 
| 236 | Toplevel.keep (Toplevel.node_case Calculation.print_global_rules | |
| 237 | (Calculation.print_local_rules o Proof.context_of)); | |
| 238 | ||
| 239 | val print_methods = Toplevel.unknown_theory o | |
| 240 | Toplevel.keep (Method.print_methods o Toplevel.theory_of); | |
| 241 | ||
| 9219 | 242 | val print_antiquotations = Toplevel.imperative IsarOutput.print_antiquotations; | 
| 5831 | 243 | |
| 13284 | 244 | fun print_thms_containing (lim, spec) = Toplevel.unknown_theory o Toplevel.keep (fn state => | 
| 13273 | 245 | ProofContext.print_thms_containing | 
| 13284 | 246 | (Toplevel.node_case ProofContext.init Proof.context_of state) lim spec); | 
| 7615 | 247 | |
| 9513 | 248 | fun thm_deps args = Toplevel.unknown_theory o Toplevel.keep (fn state => | 
| 9454 | 249 | ThmDeps.thm_deps (IsarThy.get_thmss args (Toplevel.enter_forward_proof state))); | 
| 250 | ||
| 5831 | 251 | |
| 252 | (* print proof context contents *) | |
| 253 | ||
| 9513 | 254 | val print_binds = Toplevel.unknown_proof o Toplevel.keep (fn state => | 
| 255 | ProofContext.setmp_verbose | |
| 256 | ProofContext.print_binds (Proof.context_of (Toplevel.proof_of state))); | |
| 257 | ||
| 258 | val print_lthms = Toplevel.unknown_proof o Toplevel.keep (fn state => | |
| 259 | ProofContext.setmp_verbose | |
| 12055 | 260 | ProofContext.print_lthms (Proof.context_of (Toplevel.proof_of state))); | 
| 9513 | 261 | |
| 262 | val print_cases = Toplevel.unknown_proof o Toplevel.keep (fn state => | |
| 263 | ProofContext.setmp_verbose | |
| 264 | ProofContext.print_cases (Proof.context_of (Toplevel.proof_of state))); | |
| 5831 | 265 | |
| 13801 
6c5c5bdfae84
Moved print_intros from proof_general.ML to Isar/isar_cmd.ML
 berghofe parents: 
13284diff
changeset | 266 | val print_intros = Toplevel.unknown_proof o Toplevel.keep (fn state => | 
| 
6c5c5bdfae84
Moved print_intros from proof_general.ML to Isar/isar_cmd.ML
 berghofe parents: 
13284diff
changeset | 267 | let | 
| 
6c5c5bdfae84
Moved print_intros from proof_general.ML to Isar/isar_cmd.ML
 berghofe parents: 
13284diff
changeset | 268 | val (ctxt, (_, st)) = Proof.get_goal (Toplevel.proof_of state) | 
| 
6c5c5bdfae84
Moved print_intros from proof_general.ML to Isar/isar_cmd.ML
 berghofe parents: 
13284diff
changeset | 269 | val prt_fact = ProofContext.pretty_fact ctxt | 
| 
6c5c5bdfae84
Moved print_intros from proof_general.ML to Isar/isar_cmd.ML
 berghofe parents: 
13284diff
changeset | 270 | val thy = ProofContext.theory_of ctxt | 
| 
6c5c5bdfae84
Moved print_intros from proof_general.ML to Isar/isar_cmd.ML
 berghofe parents: 
13284diff
changeset | 271 | val facts = map (apsnd single) (PureThy.find_intros_goal thy st 1) | 
| 
6c5c5bdfae84
Moved print_intros from proof_general.ML to Isar/isar_cmd.ML
 berghofe parents: 
13284diff
changeset | 272 | in map prt_fact (rev facts) |> Pretty.chunks |> Pretty.writeln end); | 
| 
6c5c5bdfae84
Moved print_intros from proof_general.ML to Isar/isar_cmd.ML
 berghofe parents: 
13284diff
changeset | 273 | |
| 5831 | 274 | |
| 7012 | 275 | (* print theorems / types / terms / props *) | 
| 5880 | 276 | |
| 9128 | 277 | fun string_of_thms state ms args = with_modes ms (fn () => | 
| 12055 | 278 | Pretty.string_of (ProofContext.pretty_thms (Proof.context_of state) | 
| 279 | (IsarThy.get_thmss args state))); | |
| 5895 | 280 | |
| 12125 
316d11f760f7
Commands prf and full_prf can now also be used to display proof term
 berghofe parents: 
12069diff
changeset | 281 | fun string_of_prfs full state ms arg = with_modes ms (fn () => | 
| 
316d11f760f7
Commands prf and full_prf can now also be used to display proof term
 berghofe parents: 
12069diff
changeset | 282 | Pretty.string_of (case arg of (* FIXME context syntax!? *) | 
| 15531 | 283 | NONE => | 
| 12125 
316d11f760f7
Commands prf and full_prf can now also be used to display proof term
 berghofe parents: 
12069diff
changeset | 284 | let | 
| 
316d11f760f7
Commands prf and full_prf can now also be used to display proof term
 berghofe parents: 
12069diff
changeset | 285 | val (_, (_, thm)) = Proof.get_goal state; | 
| 
316d11f760f7
Commands prf and full_prf can now also be used to display proof term
 berghofe parents: 
12069diff
changeset | 286 |           val {sign, prop, der = (_, prf), ...} = rep_thm thm;
 | 
| 
316d11f760f7
Commands prf and full_prf can now also be used to display proof term
 berghofe parents: 
12069diff
changeset | 287 | 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 | 288 | in | 
| 
316d11f760f7
Commands prf and full_prf can now also be used to display proof term
 berghofe parents: 
12069diff
changeset | 289 | ProofSyntax.pretty_proof sign | 
| 
316d11f760f7
Commands prf and full_prf can now also be used to display proof term
 berghofe parents: 
12069diff
changeset | 290 | (if full then Reconstruct.reconstruct_proof sign prop prf' else prf') | 
| 
316d11f760f7
Commands prf and full_prf can now also be used to display proof term
 berghofe parents: 
12069diff
changeset | 291 | end | 
| 15531 | 292 | | SOME args => Pretty.chunks | 
| 12125 
316d11f760f7
Commands prf and full_prf can now also be used to display proof term
 berghofe parents: 
12069diff
changeset | 293 | (map (ProofSyntax.pretty_proof_of full) (IsarThy.get_thmss args state)))); | 
| 11524 
197f2e14a714
Added functions for printing primitive proof terms.
 berghofe parents: 
11017diff
changeset | 294 | |
| 9128 | 295 | fun string_of_prop state ms s = | 
| 5831 | 296 | let | 
| 12055 | 297 | val ctxt = Proof.context_of state; | 
| 298 | val prop = ProofContext.read_prop ctxt s; | |
| 299 | in | |
| 300 | with_modes ms (fn () => Pretty.string_of (Pretty.quote (ProofContext.pretty_term ctxt prop))) | |
| 301 | end; | |
| 5831 | 302 | |
| 9128 | 303 | fun string_of_term state ms s = | 
| 5831 | 304 | let | 
| 12055 | 305 | val ctxt = Proof.context_of state; | 
| 306 | val t = ProofContext.read_term ctxt s; | |
| 5831 | 307 | val T = Term.type_of t; | 
| 308 | in | |
| 9128 | 309 | with_modes ms (fn () => Pretty.string_of | 
| 12055 | 310 | (Pretty.block [Pretty.quote (ProofContext.pretty_term ctxt t), Pretty.fbrk, | 
| 311 | Pretty.str "::", Pretty.brk 1, Pretty.quote (ProofContext.pretty_typ ctxt T)])) | |
| 9128 | 312 | end; | 
| 5831 | 313 | |
| 9128 | 314 | fun string_of_type state ms s = | 
| 5831 | 315 | let | 
| 12055 | 316 | val ctxt = Proof.context_of state; | 
| 317 | val T = ProofContext.read_typ ctxt s; | |
| 318 | in with_modes ms (fn () => Pretty.string_of (Pretty.quote (ProofContext.pretty_typ ctxt T))) end; | |
| 9128 | 319 | |
| 320 | fun print_item string_of (x, y) = Toplevel.keep (fn state => | |
| 9454 | 321 | writeln (string_of (Toplevel.enter_forward_proof state) x y)); | 
| 9128 | 322 | |
| 12876 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 323 | val print_thms = print_item string_of_thms; | 
| 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 324 | fun print_prfs full = print_item (string_of_prfs full); | 
| 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 325 | val print_prop = print_item string_of_prop; | 
| 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 326 | val print_term = print_item string_of_term; | 
| 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12758diff
changeset | 327 | val print_type = print_item string_of_type; | 
| 5831 | 328 | |
| 12938 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 329 | |
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 330 | (* markup commands *) | 
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 331 | |
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 332 | fun add_header s = Toplevel.keep' (fn int => fn state => | 
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 333 | (if Toplevel.is_toplevel state then () else raise Toplevel.UNDEF; | 
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 334 | OuterSyntax.check_text s int state)); | 
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 335 | |
| 12953 
7d5bd53555d8
markup commands: proper theory/proof transactions!
 wenzelm parents: 
12938diff
changeset | 336 | local | 
| 
7d5bd53555d8
markup commands: proper theory/proof transactions!
 wenzelm parents: 
12938diff
changeset | 337 | |
| 12938 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 338 | fun present_text assert_proof present (s, pos) = Toplevel.keep' (fn int => fn state => | 
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 339 | (if can Toplevel.proof_of state = assert_proof then () else raise Toplevel.UNDEF; | 
| 15531 | 340 | Context.setmp (SOME (Toplevel.theory_of state)) present s; | 
| 12938 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 341 | OuterSyntax.check_text (s, pos) int state; | 
| 12953 
7d5bd53555d8
markup commands: proper theory/proof transactions!
 wenzelm parents: 
12938diff
changeset | 342 | raise Toplevel.UNDEF)); | 
| 
7d5bd53555d8
markup commands: proper theory/proof transactions!
 wenzelm parents: 
12938diff
changeset | 343 | |
| 
7d5bd53555d8
markup commands: proper theory/proof transactions!
 wenzelm parents: 
12938diff
changeset | 344 | fun theory f x = Toplevel.theory I o present_text false f x; | 
| 
7d5bd53555d8
markup commands: proper theory/proof transactions!
 wenzelm parents: 
12938diff
changeset | 345 | fun proof f x = Toplevel.print o Toplevel.proof (ProofHistory.apply I) o present_text true f x; | 
| 12938 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 346 | |
| 12953 
7d5bd53555d8
markup commands: proper theory/proof transactions!
 wenzelm parents: 
12938diff
changeset | 347 | in | 
| 
7d5bd53555d8
markup commands: proper theory/proof transactions!
 wenzelm parents: 
12938diff
changeset | 348 | |
| 
7d5bd53555d8
markup commands: proper theory/proof transactions!
 wenzelm parents: 
12938diff
changeset | 349 | val add_chapter = theory Present.section; | 
| 
7d5bd53555d8
markup commands: proper theory/proof transactions!
 wenzelm parents: 
12938diff
changeset | 350 | val add_section = theory Present.section; | 
| 
7d5bd53555d8
markup commands: proper theory/proof transactions!
 wenzelm parents: 
12938diff
changeset | 351 | val add_subsection = theory Present.subsection; | 
| 
7d5bd53555d8
markup commands: proper theory/proof transactions!
 wenzelm parents: 
12938diff
changeset | 352 | val add_subsubsection = theory Present.subsubsection; | 
| 
7d5bd53555d8
markup commands: proper theory/proof transactions!
 wenzelm parents: 
12938diff
changeset | 353 | val add_text = theory (K ()); | 
| 12938 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 354 | val add_text_raw = add_text; | 
| 12953 
7d5bd53555d8
markup commands: proper theory/proof transactions!
 wenzelm parents: 
12938diff
changeset | 355 | val add_txt = proof (K ()); | 
| 12938 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 356 | val add_txt_raw = add_txt; | 
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 357 | val add_sect = add_txt; | 
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 358 | val add_subsect = add_txt; | 
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 359 | val add_subsubsect = add_txt; | 
| 
a646d0467d81
markup commands (from isar_thy.ML) with proper check of antiquotations;
 wenzelm parents: 
12876diff
changeset | 360 | |
| 5831 | 361 | end; | 
| 12953 
7d5bd53555d8
markup commands: proper theory/proof transactions!
 wenzelm parents: 
12938diff
changeset | 362 | |
| 
7d5bd53555d8
markup commands: proper theory/proof transactions!
 wenzelm parents: 
12938diff
changeset | 363 | end; |