| author | blanchet | 
| Mon, 19 Aug 2013 18:50:45 +0200 | |
| changeset 53086 | 15fe0ca088b3 | 
| parent 52788 | da1fdbfebd39 | 
| child 53189 | ee8b8dafef0e | 
| permissions | -rw-r--r-- | 
| 5828 | 1 | (* Title: Pure/Isar/toplevel.ML | 
| 2 | Author: Markus Wenzel, TU Muenchen | |
| 3 | ||
| 26602 
5534b6a6b810
made purely value-oriented, moved global state to structure Isar (cf. isar.ML);
 wenzelm parents: 
26491diff
changeset | 4 | Isabelle/Isar toplevel transactions. | 
| 5828 | 5 | *) | 
| 6 | ||
| 7 | signature TOPLEVEL = | |
| 8 | sig | |
| 19063 | 9 | exception UNDEF | 
| 5828 | 10 | type state | 
| 26602 
5534b6a6b810
made purely value-oriented, moved global state to structure Isar (cf. isar.ML);
 wenzelm parents: 
26491diff
changeset | 11 | val toplevel: state | 
| 7732 | 12 | val is_toplevel: state -> bool | 
| 18589 | 13 | val is_theory: state -> bool | 
| 14 | val is_proof: state -> bool | |
| 51555 | 15 | val is_skipped_proof: state -> bool | 
| 17076 | 16 | val level: state -> int | 
| 30398 | 17 | val presentation_context_of: state -> Proof.context | 
| 30801 | 18 | val previous_context_of: state -> Proof.context option | 
| 21506 | 19 | val context_of: state -> Proof.context | 
| 22089 | 20 | val generic_theory_of: state -> generic_theory | 
| 5828 | 21 | val theory_of: state -> theory | 
| 22 | val proof_of: state -> Proof.state | |
| 18589 | 23 | val proof_position_of: state -> int | 
| 37953 
ddc3b72f9a42
simplified handling of theory begin/end wrt. toplevel and theory loader;
 wenzelm parents: 
37951diff
changeset | 24 | val end_theory: Position.T -> state -> theory | 
| 16815 | 25 | val print_state_context: state -> unit | 
| 26 | val print_state: bool -> state -> unit | |
| 37858 | 27 | val pretty_abstract: state -> Pretty.T | 
| 32738 | 28 | val quiet: bool Unsynchronized.ref | 
| 29 | val debug: bool Unsynchronized.ref | |
| 30 | val interact: bool Unsynchronized.ref | |
| 31 | val timing: bool Unsynchronized.ref | |
| 32 | val profiling: int Unsynchronized.ref | |
| 20128 
8f0e07d7cf92
keep/transaction: unified execution model (with debugging etc.);
 wenzelm parents: 
19996diff
changeset | 33 | val program: (unit -> 'a) -> 'a | 
| 33604 
d4220df6fde2
Toplevel.thread provides Isar-style exception output;
 wenzelm parents: 
33553diff
changeset | 34 | val thread: bool -> (unit -> unit) -> Thread.thread | 
| 16682 | 35 | type transition | 
| 5828 | 36 | val empty: transition | 
| 38888 
8248cda328de
moved Toplevel.run_command to Pure/PIDE/document.ML;
 wenzelm parents: 
38876diff
changeset | 37 | val print_of: transition -> bool | 
| 27427 | 38 | val name_of: transition -> string | 
| 28105 | 39 | val pos_of: transition -> Position.T | 
| 5828 | 40 | val name: string -> transition -> transition | 
| 41 | val position: Position.T -> transition -> transition | |
| 42 | val interactive: bool -> transition -> transition | |
| 38888 
8248cda328de
moved Toplevel.run_command to Pure/PIDE/document.ML;
 wenzelm parents: 
38876diff
changeset | 43 | val set_print: bool -> transition -> transition | 
| 5828 | 44 | val print: transition -> transition | 
| 44187 
88d770052bac
simplified Toplevel.init_theory: discontinued special name argument;
 wenzelm parents: 
44186diff
changeset | 45 | val init_theory: (unit -> theory) -> transition -> transition | 
| 
88d770052bac
simplified Toplevel.init_theory: discontinued special name argument;
 wenzelm parents: 
44186diff
changeset | 46 | val is_init: transition -> bool | 
| 44186 
806f0ec1a43d
simplified Toplevel.init_theory: discontinued special master argument;
 wenzelm parents: 
44185diff
changeset | 47 | val modify_init: (unit -> theory) -> transition -> transition | 
| 6689 | 48 | val exit: transition -> transition | 
| 5828 | 49 | val keep: (state -> unit) -> transition -> transition | 
| 7612 | 50 | val keep': (bool -> state -> unit) -> transition -> transition | 
| 5828 | 51 | val imperative: (unit -> unit) -> transition -> transition | 
| 27840 | 52 | val ignored: Position.T -> transition | 
| 51268 
fcc4b89a600d
simplified Outer_Syntax.read_span: internalized Toplevel.is_ignored;
 wenzelm parents: 
51241diff
changeset | 53 | val is_ignored: transition -> bool | 
| 27840 | 54 | val malformed: Position.T -> string -> transition | 
| 48772 | 55 | val is_malformed: transition -> bool | 
| 26491 | 56 | val generic_theory: (generic_theory -> generic_theory) -> transition -> transition | 
| 7612 | 57 | val theory': (bool -> theory -> theory) -> transition -> transition | 
| 49012 
8686c36fa27d
refined treatment of forked proofs at transaction boundaries, including proof commands (see also 7ee000ce5390);
 wenzelm parents: 
49011diff
changeset | 58 | val theory: (theory -> theory) -> transition -> transition | 
| 20985 | 59 | val begin_local_theory: bool -> (theory -> local_theory) -> transition -> transition | 
| 21007 | 60 | val end_local_theory: transition -> transition | 
| 47069 | 61 | val open_target: (generic_theory -> local_theory) -> transition -> transition | 
| 62 | val close_target: transition -> transition | |
| 45488 
6d71d9e52369
pass positions for named targets, for formal links in the document model;
 wenzelm parents: 
44304diff
changeset | 63 | val local_theory': (xstring * Position.T) option -> (bool -> local_theory -> local_theory) -> | 
| 
6d71d9e52369
pass positions for named targets, for formal links in the document model;
 wenzelm parents: 
44304diff
changeset | 64 | transition -> transition | 
| 
6d71d9e52369
pass positions for named targets, for formal links in the document model;
 wenzelm parents: 
44304diff
changeset | 65 | val local_theory: (xstring * Position.T) option -> (local_theory -> local_theory) -> | 
| 29380 | 66 | transition -> transition | 
| 45488 
6d71d9e52369
pass positions for named targets, for formal links in the document model;
 wenzelm parents: 
44304diff
changeset | 67 | val present_local_theory: (xstring * Position.T) option -> (state -> unit) -> | 
| 24453 | 68 | transition -> transition | 
| 45488 
6d71d9e52369
pass positions for named targets, for formal links in the document model;
 wenzelm parents: 
44304diff
changeset | 69 | val local_theory_to_proof': (xstring * Position.T) option -> | 
| 
6d71d9e52369
pass positions for named targets, for formal links in the document model;
 wenzelm parents: 
44304diff
changeset | 70 | (bool -> local_theory -> Proof.state) -> transition -> transition | 
| 
6d71d9e52369
pass positions for named targets, for formal links in the document model;
 wenzelm parents: 
44304diff
changeset | 71 | val local_theory_to_proof: (xstring * Position.T) option -> | 
| 
6d71d9e52369
pass positions for named targets, for formal links in the document model;
 wenzelm parents: 
44304diff
changeset | 72 | (local_theory -> Proof.state) -> transition -> transition | 
| 17363 | 73 | val theory_to_proof: (theory -> Proof.state) -> transition -> transition | 
| 21007 | 74 | val end_proof: (bool -> Proof.state -> Proof.context) -> transition -> transition | 
| 75 | val forget_proof: transition -> transition | |
| 30366 
e3d788b9dffb
simplified presentation: built into transaction, pass state directly;
 wenzelm parents: 
29516diff
changeset | 76 | val present_proof: (state -> unit) -> transition -> transition | 
| 49863 
b5fb6e7f8d81
more informative errors for 'proof' and 'apply' steps;
 wenzelm parents: 
49062diff
changeset | 77 | val proofs': (bool -> Proof.state -> Proof.state Seq.result Seq.seq) -> transition -> transition | 
| 17904 
21c6894b5998
simplified interfaces proof/proof' etc.: perform ProofHistory.apply(s)/current internally;
 wenzelm parents: 
17513diff
changeset | 78 | val proof': (bool -> Proof.state -> Proof.state) -> transition -> transition | 
| 49863 
b5fb6e7f8d81
more informative errors for 'proof' and 'apply' steps;
 wenzelm parents: 
49062diff
changeset | 79 | val proofs: (Proof.state -> Proof.state Seq.result Seq.seq) -> transition -> transition | 
| 21177 | 80 | val proof: (Proof.state -> Proof.state) -> transition -> transition | 
| 33390 | 81 | val actual_proof: (Proof_Node.T -> Proof_Node.T) -> transition -> transition | 
| 27564 
fc6d34e49e17
replaced obsolete ProofHistory by ProofNode (backtracking only);
 wenzelm parents: 
27500diff
changeset | 82 | val skip_proof: (int -> int) -> transition -> transition | 
| 17904 
21c6894b5998
simplified interfaces proof/proof' etc.: perform ProofHistory.apply(s)/current internally;
 wenzelm parents: 
17513diff
changeset | 83 | val skip_proof_to_theory: (int -> bool) -> transition -> transition | 
| 52536 | 84 | val exec_id: Document_ID.exec -> transition -> transition | 
| 9512 | 85 | val unknown_theory: transition -> transition | 
| 86 | val unknown_proof: transition -> transition | |
| 87 | val unknown_context: transition -> transition | |
| 28425 | 88 |   val setmp_thread_position: transition -> ('a -> 'b) -> 'a -> 'b
 | 
| 27606 | 89 | val status: transition -> Markup.T -> unit | 
| 28103 
b79e61861f0f
simplified Toplevel.add_hook: cover successful transactions only;
 wenzelm parents: 
28095diff
changeset | 90 | val add_hook: (transition -> state -> state -> unit) -> unit | 
| 51423 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 91 | val get_timing: transition -> Time.time option | 
| 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 92 | val put_timing: Time.time option -> transition -> transition | 
| 26602 
5534b6a6b810
made purely value-oriented, moved global state to structure Isar (cf. isar.ML);
 wenzelm parents: 
26491diff
changeset | 93 | val transition: bool -> transition -> state -> (state * (exn * string) option) option | 
| 51323 | 94 | val command_errors: bool -> transition -> state -> Runtime.error list * state option | 
| 51284 
59a03019f3bf
fork diagnostic commands (theory loader and PIDE interaction);
 wenzelm parents: 
51282diff
changeset | 95 | val command_exception: bool -> transition -> state -> state | 
| 51332 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 96 | type result | 
| 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 97 | val join_results: result -> (transition * state) list | 
| 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 98 | val element_result: transition Thy_Syntax.element -> state -> result * state | 
| 5828 | 99 | end; | 
| 100 | ||
| 6965 | 101 | structure Toplevel: TOPLEVEL = | 
| 5828 | 102 | struct | 
| 103 | ||
| 104 | (** toplevel state **) | |
| 105 | ||
| 31476 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 wenzelm parents: 
31431diff
changeset | 106 | exception UNDEF = Runtime.UNDEF; | 
| 19063 | 107 | |
| 108 | ||
| 21294 | 109 | (* local theory wrappers *) | 
| 5828 | 110 | |
| 38350 
480b2de9927c
renamed Theory_Target to the more appropriate Named_Target
 haftmann parents: 
38236diff
changeset | 111 | val loc_init = Named_Target.context_cmd; | 
| 52118 
2a976115c7c3
mark local theory as brittle also after interpretation inside locales;
 haftmann parents: 
51735diff
changeset | 112 | val loc_exit = Local_Theory.assert_bottom true #> Local_Theory.exit_global; | 
| 21294 | 113 | |
| 47274 | 114 | fun loc_begin loc (Context.Theory thy) = | 
| 115 |       (Context.Theory o loc_exit, loc_init (the_default ("-", Position.none) loc) thy)
 | |
| 116 | | loc_begin NONE (Context.Proof lthy) = | |
| 117 | (Context.Proof o Local_Theory.restore, lthy) | |
| 118 | | loc_begin (SOME loc) (Context.Proof lthy) = | |
| 52118 
2a976115c7c3
mark local theory as brittle also after interpretation inside locales;
 haftmann parents: 
51735diff
changeset | 119 | (Context.Proof o Named_Target.reinit lthy, loc_init loc (loc_exit (Local_Theory.assert_nonbrittle lthy))); | 
| 21294 | 120 | |
| 121 | ||
| 21958 
9dfd1ca4c0a0
refined notion of empty toplevel, admits undo of 'end';
 wenzelm parents: 
21861diff
changeset | 122 | (* datatype node *) | 
| 21294 | 123 | |
| 5828 | 124 | datatype node = | 
| 27576 
7afff36043e6
eliminated internal command history -- superceeded by global Isar state (cf. isar.ML);
 wenzelm parents: 
27564diff
changeset | 125 | Theory of generic_theory * Proof.context option | 
| 
7afff36043e6
eliminated internal command history -- superceeded by global Isar state (cf. isar.ML);
 wenzelm parents: 
27564diff
changeset | 126 | (*theory with presentation context*) | | 
| 33390 | 127 | Proof of Proof_Node.T * ((Proof.context -> generic_theory) * generic_theory) | 
| 27576 
7afff36043e6
eliminated internal command history -- superceeded by global Isar state (cf. isar.ML);
 wenzelm parents: 
27564diff
changeset | 128 | (*proof node, finish, original theory*) | | 
| 51555 | 129 | Skipped_Proof of int * (generic_theory * generic_theory); | 
| 27564 
fc6d34e49e17
replaced obsolete ProofHistory by ProofNode (backtracking only);
 wenzelm parents: 
27500diff
changeset | 130 | (*proof depth, resulting theory, original theory*) | 
| 5828 | 131 | |
| 20963 
a7fd8f05a2be
added type global_theory -- theory or local_theory;
 wenzelm parents: 
20928diff
changeset | 132 | val theory_node = fn Theory (gthy, _) => SOME gthy | _ => NONE; | 
| 18589 | 133 | val proof_node = fn Proof (prf, _) => SOME prf | _ => NONE; | 
| 51555 | 134 | val skipped_proof_node = fn Skipped_Proof _ => true | _ => false; | 
| 18589 | 135 | |
| 20963 
a7fd8f05a2be
added type global_theory -- theory or local_theory;
 wenzelm parents: 
20928diff
changeset | 136 | fun cases_node f _ (Theory (gthy, _)) = f gthy | 
| 33390 | 137 | | cases_node _ g (Proof (prf, _)) = g (Proof_Node.current prf) | 
| 51555 | 138 | | cases_node f _ (Skipped_Proof (_, (gthy, _))) = f gthy; | 
| 19063 | 139 | |
| 29066 | 140 | val context_node = cases_node Context.proof_of Proof.context_of; | 
| 141 | ||
| 21958 
9dfd1ca4c0a0
refined notion of empty toplevel, admits undo of 'end';
 wenzelm parents: 
21861diff
changeset | 142 | |
| 
9dfd1ca4c0a0
refined notion of empty toplevel, admits undo of 'end';
 wenzelm parents: 
21861diff
changeset | 143 | (* datatype state *) | 
| 
9dfd1ca4c0a0
refined notion of empty toplevel, admits undo of 'end';
 wenzelm parents: 
21861diff
changeset | 144 | |
| 37953 
ddc3b72f9a42
simplified handling of theory begin/end wrt. toplevel and theory loader;
 wenzelm parents: 
37951diff
changeset | 145 | datatype state = State of node option * node option; (*current, previous*) | 
| 5828 | 146 | |
| 27576 
7afff36043e6
eliminated internal command history -- superceeded by global Isar state (cf. isar.ML);
 wenzelm parents: 
27564diff
changeset | 147 | val toplevel = State (NONE, NONE); | 
| 5828 | 148 | |
| 27576 
7afff36043e6
eliminated internal command history -- superceeded by global Isar state (cf. isar.ML);
 wenzelm parents: 
27564diff
changeset | 149 | fun is_toplevel (State (NONE, _)) = true | 
| 7732 | 150 | | is_toplevel _ = false; | 
| 151 | ||
| 27576 
7afff36043e6
eliminated internal command history -- superceeded by global Isar state (cf. isar.ML);
 wenzelm parents: 
27564diff
changeset | 152 | fun level (State (NONE, _)) = 0 | 
| 37953 
ddc3b72f9a42
simplified handling of theory begin/end wrt. toplevel and theory loader;
 wenzelm parents: 
37951diff
changeset | 153 | | level (State (SOME (Theory _), _)) = 0 | 
| 
ddc3b72f9a42
simplified handling of theory begin/end wrt. toplevel and theory loader;
 wenzelm parents: 
37951diff
changeset | 154 | | level (State (SOME (Proof (prf, _)), _)) = Proof.level (Proof_Node.current prf) | 
| 51555 | 155 | | level (State (SOME (Skipped_Proof (d, _)), _)) = d + 1; (*different notion of proof depth!*) | 
| 17076 | 156 | |
| 52565 | 157 | fun str_of_state (State (NONE, SOME (Theory (Context.Theory thy, _)))) = | 
| 158 | "at top level, result theory " ^ quote (Context.theory_name thy) | |
| 159 | | str_of_state (State (NONE, _)) = "at top level" | |
| 37953 
ddc3b72f9a42
simplified handling of theory begin/end wrt. toplevel and theory loader;
 wenzelm parents: 
37951diff
changeset | 160 | | str_of_state (State (SOME (Theory (Context.Theory _, _)), _)) = "in theory mode" | 
| 
ddc3b72f9a42
simplified handling of theory begin/end wrt. toplevel and theory loader;
 wenzelm parents: 
37951diff
changeset | 161 | | str_of_state (State (SOME (Theory (Context.Proof _, _)), _)) = "in local theory mode" | 
| 
ddc3b72f9a42
simplified handling of theory begin/end wrt. toplevel and theory loader;
 wenzelm parents: 
37951diff
changeset | 162 | | str_of_state (State (SOME (Proof _), _)) = "in proof mode" | 
| 51555 | 163 | | str_of_state (State (SOME (Skipped_Proof _), _)) = "in skipped proof mode"; | 
| 5946 
a4600d21b59b
print_state hook, obeys Goals.current_goals_markers by default;
 wenzelm parents: 
5939diff
changeset | 164 | |
| 
a4600d21b59b
print_state hook, obeys Goals.current_goals_markers by default;
 wenzelm parents: 
5939diff
changeset | 165 | |
| 27576 
7afff36043e6
eliminated internal command history -- superceeded by global Isar state (cf. isar.ML);
 wenzelm parents: 
27564diff
changeset | 166 | (* current node *) | 
| 5828 | 167 | |
| 27576 
7afff36043e6
eliminated internal command history -- superceeded by global Isar state (cf. isar.ML);
 wenzelm parents: 
27564diff
changeset | 168 | fun node_of (State (NONE, _)) = raise UNDEF | 
| 37953 
ddc3b72f9a42
simplified handling of theory begin/end wrt. toplevel and theory loader;
 wenzelm parents: 
37951diff
changeset | 169 | | node_of (State (SOME node, _)) = node; | 
| 5828 | 170 | |
| 18589 | 171 | fun is_theory state = not (is_toplevel state) andalso is_some (theory_node (node_of state)); | 
| 172 | fun is_proof state = not (is_toplevel state) andalso is_some (proof_node (node_of state)); | |
| 51555 | 173 | fun is_skipped_proof state = not (is_toplevel state) andalso skipped_proof_node (node_of state); | 
| 18589 | 174 | |
| 19063 | 175 | fun node_case f g state = cases_node f g (node_of state); | 
| 5828 | 176 | |
| 30398 | 177 | fun presentation_context_of state = | 
| 178 | (case try node_of state of | |
| 179 | SOME (Theory (_, SOME ctxt)) => ctxt | |
| 180 | | SOME node => context_node node | |
| 181 | | NONE => raise UNDEF); | |
| 30366 
e3d788b9dffb
simplified presentation: built into transaction, pass state directly;
 wenzelm parents: 
29516diff
changeset | 182 | |
| 30801 | 183 | fun previous_context_of (State (_, NONE)) = NONE | 
| 37953 
ddc3b72f9a42
simplified handling of theory begin/end wrt. toplevel and theory loader;
 wenzelm parents: 
37951diff
changeset | 184 | | previous_context_of (State (_, SOME prev)) = SOME (context_node prev); | 
| 30801 | 185 | |
| 21506 | 186 | val context_of = node_case Context.proof_of Proof.context_of; | 
| 22089 | 187 | val generic_theory_of = node_case I (Context.Proof o Proof.context_of); | 
| 20963 
a7fd8f05a2be
added type global_theory -- theory or local_theory;
 wenzelm parents: 
20928diff
changeset | 188 | val theory_of = node_case Context.theory_of Proof.theory_of; | 
| 18589 | 189 | val proof_of = node_case (fn _ => raise UNDEF) I; | 
| 17208 | 190 | |
| 18589 | 191 | fun proof_position_of state = | 
| 192 | (case node_of state of | |
| 33390 | 193 | Proof (prf, _) => Proof_Node.position prf | 
| 18589 | 194 | | _ => raise UNDEF); | 
| 6664 | 195 | |
| 43667 
6d73cceb1503
explicit exit_transaction with Theory.end_theory (which could include sanity checks as in HOL-SPARK for example);
 wenzelm parents: 
43665diff
changeset | 196 | fun end_theory _ (State (NONE, SOME (Theory (Context.Theory thy, _)))) = thy | 
| 48992 | 197 |   | end_theory pos (State (NONE, _)) = error ("Bad theory" ^ Position.here pos)
 | 
| 198 |   | end_theory pos (State (SOME _, _)) = error ("Unfinished theory" ^ Position.here pos);
 | |
| 37953 
ddc3b72f9a42
simplified handling of theory begin/end wrt. toplevel and theory loader;
 wenzelm parents: 
37951diff
changeset | 199 | |
| 5828 | 200 | |
| 16815 | 201 | (* print state *) | 
| 202 | ||
| 38388 | 203 | val pretty_context = Local_Theory.pretty o Context.cases (Named_Target.theory_init) I; | 
| 16815 | 204 | |
| 23640 
baec2e674461
toplevel prompt/print_state: proper markup, removed hooks;
 wenzelm parents: 
23619diff
changeset | 205 | fun print_state_context state = | 
| 24795 
6f5cb7885fd7
print_state_context: local theory context, not proof context;
 wenzelm parents: 
24780diff
changeset | 206 | (case try node_of state of | 
| 21506 | 207 | NONE => [] | 
| 24795 
6f5cb7885fd7
print_state_context: local theory context, not proof context;
 wenzelm parents: 
24780diff
changeset | 208 | | SOME (Theory (gthy, _)) => pretty_context gthy | 
| 
6f5cb7885fd7
print_state_context: local theory context, not proof context;
 wenzelm parents: 
24780diff
changeset | 209 | | SOME (Proof (_, (_, gthy))) => pretty_context gthy | 
| 51555 | 210 | | SOME (Skipped_Proof (_, (gthy, _))) => pretty_context gthy) | 
| 23640 
baec2e674461
toplevel prompt/print_state: proper markup, removed hooks;
 wenzelm parents: 
23619diff
changeset | 211 | |> Pretty.chunks |> Pretty.writeln; | 
| 16815 | 212 | |
| 23640 
baec2e674461
toplevel prompt/print_state: proper markup, removed hooks;
 wenzelm parents: 
23619diff
changeset | 213 | fun print_state prf_only state = | 
| 23701 | 214 | (case try node_of state of | 
| 215 | NONE => [] | |
| 216 | | SOME (Theory (gthy, _)) => if prf_only then [] else pretty_context gthy | |
| 217 | | SOME (Proof (prf, _)) => | |
| 33390 | 218 | Proof.pretty_state (Proof_Node.position prf) (Proof_Node.current prf) | 
| 51555 | 219 |   | SOME (Skipped_Proof (d, _)) => [Pretty.str ("skipped proof: depth " ^ string_of_int d)])
 | 
| 50201 
c26369c9eda6
Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
 wenzelm parents: 
49863diff
changeset | 220 | |> Pretty.markup_chunks Markup.state |> Pretty.writeln; | 
| 16815 | 221 | |
| 37858 | 222 | fun pretty_abstract state = Pretty.str ("<Isar " ^ str_of_state state ^ ">");
 | 
| 223 | ||
| 16815 | 224 | |
| 15668 | 225 | |
| 5828 | 226 | (** toplevel transitions **) | 
| 227 | ||
| 32738 | 228 | val quiet = Unsynchronized.ref false; | 
| 39513 
fce2202892c4
discontinued Output.debug, which belongs to early PGIP experiments (b6788dbd2ef9) and causes just too many problems (like spamming the message channel if it is used by more than one module);
 wenzelm parents: 
39285diff
changeset | 229 | val debug = Runtime.debug; | 
| 32738 | 230 | val interact = Unsynchronized.ref false; | 
| 42012 
2c3fe3cbebae
structure Timing: covers former start_timing/end_timing and Output.timeit etc;
 wenzelm parents: 
41703diff
changeset | 231 | val timing = Unsynchronized.ref false; | 
| 32738 | 232 | val profiling = Unsynchronized.ref 0; | 
| 16682 | 233 | |
| 33604 
d4220df6fde2
Toplevel.thread provides Isar-style exception output;
 wenzelm parents: 
33553diff
changeset | 234 | fun program body = | 
| 
d4220df6fde2
Toplevel.thread provides Isar-style exception output;
 wenzelm parents: 
33553diff
changeset | 235 | (body | 
| 31476 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 wenzelm parents: 
31431diff
changeset | 236 | |> Runtime.controlled_execution | 
| 33604 
d4220df6fde2
Toplevel.thread provides Isar-style exception output;
 wenzelm parents: 
33553diff
changeset | 237 | |> Runtime.toplevel_error (Output.error_msg o ML_Compiler.exn_message)) (); | 
| 
d4220df6fde2
Toplevel.thread provides Isar-style exception output;
 wenzelm parents: 
33553diff
changeset | 238 | |
| 
d4220df6fde2
Toplevel.thread provides Isar-style exception output;
 wenzelm parents: 
33553diff
changeset | 239 | fun thread interrupts body = | 
| 
d4220df6fde2
Toplevel.thread provides Isar-style exception output;
 wenzelm parents: 
33553diff
changeset | 240 | Thread.fork | 
| 39232 
69c6d3e87660
more abstract treatment of interrupts in structure Exn -- hardly ever need to mention Interrupt literally;
 wenzelm parents: 
38888diff
changeset | 241 | (((fn () => body () handle exn => if Exn.is_interrupt exn then () else reraise exn) | 
| 33604 
d4220df6fde2
Toplevel.thread provides Isar-style exception output;
 wenzelm parents: 
33553diff
changeset | 242 | |> Runtime.debugging | 
| 
d4220df6fde2
Toplevel.thread provides Isar-style exception output;
 wenzelm parents: 
33553diff
changeset | 243 | |> Runtime.toplevel_error | 
| 40132 
7ee65dbffa31
renamed Output.priority to Output.urgent_message to emphasize its special role more clearly;
 wenzelm parents: 
39513diff
changeset | 244 | (fn exn => | 
| 
7ee65dbffa31
renamed Output.priority to Output.urgent_message to emphasize its special role more clearly;
 wenzelm parents: 
39513diff
changeset | 245 |             Output.urgent_message ("## INTERNAL ERROR ##\n" ^ ML_Compiler.exn_message exn))),
 | 
| 37216 
3165bc303f66
modernized some structure names, keeping a few legacy aliases;
 wenzelm parents: 
37208diff
changeset | 246 | Simple_Thread.attributes interrupts); | 
| 20128 
8f0e07d7cf92
keep/transaction: unified execution model (with debugging etc.);
 wenzelm parents: 
19996diff
changeset | 247 | |
| 5828 | 248 | |
| 27601 
6683cdb94af8
simplified commit_exit: operate on previous node of final state, include warning here;
 wenzelm parents: 
27583diff
changeset | 249 | (* node transactions -- maintaining stable checkpoints *) | 
| 7022 | 250 | |
| 31476 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 wenzelm parents: 
31431diff
changeset | 251 | exception FAILURE of state * exn; | 
| 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 wenzelm parents: 
31431diff
changeset | 252 | |
| 6689 | 253 | local | 
| 254 | ||
| 30366 
e3d788b9dffb
simplified presentation: built into transaction, pass state directly;
 wenzelm parents: 
29516diff
changeset | 255 | fun reset_presentation (Theory (gthy, _)) = Theory (gthy, NONE) | 
| 
e3d788b9dffb
simplified presentation: built into transaction, pass state directly;
 wenzelm parents: 
29516diff
changeset | 256 | | reset_presentation node = node; | 
| 
e3d788b9dffb
simplified presentation: built into transaction, pass state directly;
 wenzelm parents: 
29516diff
changeset | 257 | |
| 27576 
7afff36043e6
eliminated internal command history -- superceeded by global Isar state (cf. isar.ML);
 wenzelm parents: 
27564diff
changeset | 258 | fun map_theory f (Theory (gthy, ctxt)) = | 
| 33671 | 259 | Theory (Context.mapping f (Local_Theory.raw_theory f) gthy, ctxt) | 
| 27576 
7afff36043e6
eliminated internal command history -- superceeded by global Isar state (cf. isar.ML);
 wenzelm parents: 
27564diff
changeset | 260 | | map_theory _ node = node; | 
| 6689 | 261 | |
| 262 | in | |
| 263 | ||
| 37953 
ddc3b72f9a42
simplified handling of theory begin/end wrt. toplevel and theory loader;
 wenzelm parents: 
37951diff
changeset | 264 | fun apply_transaction f g node = | 
| 20128 
8f0e07d7cf92
keep/transaction: unified execution model (with debugging etc.);
 wenzelm parents: 
19996diff
changeset | 265 | let | 
| 27576 
7afff36043e6
eliminated internal command history -- superceeded by global Isar state (cf. isar.ML);
 wenzelm parents: 
27564diff
changeset | 266 | val cont_node = reset_presentation node; | 
| 37953 
ddc3b72f9a42
simplified handling of theory begin/end wrt. toplevel and theory loader;
 wenzelm parents: 
37951diff
changeset | 267 | fun state_error e nd = (State (SOME nd, SOME node), e); | 
| 6689 | 268 | |
| 20128 
8f0e07d7cf92
keep/transaction: unified execution model (with debugging etc.);
 wenzelm parents: 
19996diff
changeset | 269 | val (result, err) = | 
| 
8f0e07d7cf92
keep/transaction: unified execution model (with debugging etc.);
 wenzelm parents: 
19996diff
changeset | 270 | cont_node | 
| 31476 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 wenzelm parents: 
31431diff
changeset | 271 | |> Runtime.controlled_execution f | 
| 26624 
770265032999
transaction/init: ensure stable theory (non-draft);
 wenzelm parents: 
26621diff
changeset | 272 | |> state_error NONE | 
| 
770265032999
transaction/init: ensure stable theory (non-draft);
 wenzelm parents: 
26621diff
changeset | 273 | handle exn => state_error (SOME exn) cont_node; | 
| 20128 
8f0e07d7cf92
keep/transaction: unified execution model (with debugging etc.);
 wenzelm parents: 
19996diff
changeset | 274 | in | 
| 52696 
38466f4f3483
immutable theory values with full stamp record of every update (increase of stamp size for HOL: 20000 -> 100000, JinjaThreads: 65000 -> 300000) -- minimal measurable impact on inference kernel performance;
 wenzelm parents: 
52565diff
changeset | 275 | (case err of | 
| 
38466f4f3483
immutable theory values with full stamp record of every update (increase of stamp size for HOL: 20000 -> 100000, JinjaThreads: 65000 -> 300000) -- minimal measurable impact on inference kernel performance;
 wenzelm parents: 
52565diff
changeset | 276 | NONE => tap g result | 
| 
38466f4f3483
immutable theory values with full stamp record of every update (increase of stamp size for HOL: 20000 -> 100000, JinjaThreads: 65000 -> 300000) -- minimal measurable impact on inference kernel performance;
 wenzelm parents: 
52565diff
changeset | 277 | | SOME exn => raise FAILURE (result, exn)) | 
| 20128 
8f0e07d7cf92
keep/transaction: unified execution model (with debugging etc.);
 wenzelm parents: 
19996diff
changeset | 278 | end; | 
| 6689 | 279 | |
| 43667 
6d73cceb1503
explicit exit_transaction with Theory.end_theory (which could include sanity checks as in HOL-SPARK for example);
 wenzelm parents: 
43665diff
changeset | 280 | val exit_transaction = | 
| 
6d73cceb1503
explicit exit_transaction with Theory.end_theory (which could include sanity checks as in HOL-SPARK for example);
 wenzelm parents: 
43665diff
changeset | 281 | apply_transaction | 
| 
6d73cceb1503
explicit exit_transaction with Theory.end_theory (which could include sanity checks as in HOL-SPARK for example);
 wenzelm parents: 
43665diff
changeset | 282 | (fn Theory (Context.Theory thy, _) => Theory (Context.Theory (Theory.end_theory thy), NONE) | 
| 
6d73cceb1503
explicit exit_transaction with Theory.end_theory (which could include sanity checks as in HOL-SPARK for example);
 wenzelm parents: 
43665diff
changeset | 283 | | node => node) (K ()) | 
| 
6d73cceb1503
explicit exit_transaction with Theory.end_theory (which could include sanity checks as in HOL-SPARK for example);
 wenzelm parents: 
43665diff
changeset | 284 | #> (fn State (node', _) => State (NONE, node')); | 
| 
6d73cceb1503
explicit exit_transaction with Theory.end_theory (which could include sanity checks as in HOL-SPARK for example);
 wenzelm parents: 
43665diff
changeset | 285 | |
| 6689 | 286 | end; | 
| 287 | ||
| 288 | ||
| 289 | (* primitive transitions *) | |
| 290 | ||
| 5828 | 291 | datatype trans = | 
| 44187 
88d770052bac
simplified Toplevel.init_theory: discontinued special name argument;
 wenzelm parents: 
44186diff
changeset | 292 | Init of unit -> theory | (*init theory*) | 
| 37953 
ddc3b72f9a42
simplified handling of theory begin/end wrt. toplevel and theory loader;
 wenzelm parents: 
37951diff
changeset | 293 | Exit | (*formal exit of theory*) | 
| 
ddc3b72f9a42
simplified handling of theory begin/end wrt. toplevel and theory loader;
 wenzelm parents: 
37951diff
changeset | 294 | Keep of bool -> state -> unit | (*peek at state*) | 
| 30366 
e3d788b9dffb
simplified presentation: built into transaction, pass state directly;
 wenzelm parents: 
29516diff
changeset | 295 | Transaction of (bool -> node -> node) * (state -> unit); (*node transaction and presentation*) | 
| 21958 
9dfd1ca4c0a0
refined notion of empty toplevel, admits undo of 'end';
 wenzelm parents: 
21861diff
changeset | 296 | |
| 6689 | 297 | local | 
| 5828 | 298 | |
| 44187 
88d770052bac
simplified Toplevel.init_theory: discontinued special name argument;
 wenzelm parents: 
44186diff
changeset | 299 | fun apply_tr _ (Init f) (State (NONE, _)) = | 
| 52788 | 300 | State (SOME (Theory (Context.Theory (Runtime.controlled_execution f ()), NONE)), NONE) | 
| 43667 
6d73cceb1503
explicit exit_transaction with Theory.end_theory (which could include sanity checks as in HOL-SPARK for example);
 wenzelm parents: 
43665diff
changeset | 301 | | apply_tr _ Exit (State (SOME (state as Theory (Context.Theory _, _)), _)) = | 
| 
6d73cceb1503
explicit exit_transaction with Theory.end_theory (which could include sanity checks as in HOL-SPARK for example);
 wenzelm parents: 
43665diff
changeset | 302 | exit_transaction state | 
| 32792 | 303 | | apply_tr int (Keep f) state = | 
| 31476 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 wenzelm parents: 
31431diff
changeset | 304 | Runtime.controlled_execution (fn x => tap (f int) x) state | 
| 32792 | 305 | | apply_tr int (Transaction (f, g)) (State (SOME state, _)) = | 
| 306 | apply_transaction (fn x => f int x) g state | |
| 307 | | apply_tr _ _ _ = raise UNDEF; | |
| 5828 | 308 | |
| 32792 | 309 | fun apply_union _ [] state = raise FAILURE (state, UNDEF) | 
| 310 | | apply_union int (tr :: trs) state = | |
| 311 | apply_union int trs state | |
| 312 | handle Runtime.UNDEF => apply_tr int tr state | |
| 313 | | FAILURE (alt_state, UNDEF) => apply_tr int tr alt_state | |
| 6689 | 314 | | exn as FAILURE _ => raise exn | 
| 315 | | exn => raise FAILURE (state, exn); | |
| 316 | ||
| 317 | in | |
| 318 | ||
| 32792 | 319 | fun apply_trans int trs state = (apply_union int trs state, NONE) | 
| 15531 | 320 | handle FAILURE (alt_state, exn) => (alt_state, SOME exn) | exn => (state, SOME exn); | 
| 6689 | 321 | |
| 322 | end; | |
| 5828 | 323 | |
| 324 | ||
| 325 | (* datatype transition *) | |
| 326 | ||
| 327 | datatype transition = Transition of | |
| 26621 
78b3ad7af5d5
eliminated unused name_of, source, source_of, print', print3, three_buffersN;
 wenzelm parents: 
26602diff
changeset | 328 |  {name: string,              (*command name*)
 | 
| 
78b3ad7af5d5
eliminated unused name_of, source, source_of, print', print3, three_buffersN;
 wenzelm parents: 
26602diff
changeset | 329 | pos: Position.T, (*source position*) | 
| 
78b3ad7af5d5
eliminated unused name_of, source, source_of, print', print3, three_buffersN;
 wenzelm parents: 
26602diff
changeset | 330 | int_only: bool, (*interactive-only*) | 
| 
78b3ad7af5d5
eliminated unused name_of, source, source_of, print', print3, three_buffersN;
 wenzelm parents: 
26602diff
changeset | 331 | print: bool, (*print result state*) | 
| 51423 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 332 | timing: Time.time option, (*prescient timing information*) | 
| 26621 
78b3ad7af5d5
eliminated unused name_of, source, source_of, print', print3, three_buffersN;
 wenzelm parents: 
26602diff
changeset | 333 | trans: trans list}; (*primitive transitions (union)*) | 
| 5828 | 334 | |
| 51658 
21c10672633b
discontinued Toplevel.no_timing complication -- also recovers timing of diagnostic commands, e.g. 'find_theorems';
 wenzelm parents: 
51605diff
changeset | 335 | fun make_transition (name, pos, int_only, print, timing, trans) = | 
| 51217 
65ab2c4f4c32
support for prescient timing information within command transactions;
 wenzelm parents: 
51216diff
changeset | 336 |   Transition {name = name, pos = pos, int_only = int_only, print = print,
 | 
| 51658 
21c10672633b
discontinued Toplevel.no_timing complication -- also recovers timing of diagnostic commands, e.g. 'find_theorems';
 wenzelm parents: 
51605diff
changeset | 337 | timing = timing, trans = trans}; | 
| 5828 | 338 | |
| 51658 
21c10672633b
discontinued Toplevel.no_timing complication -- also recovers timing of diagnostic commands, e.g. 'find_theorems';
 wenzelm parents: 
51605diff
changeset | 339 | fun map_transition f (Transition {name, pos, int_only, print, timing, trans}) =
 | 
| 
21c10672633b
discontinued Toplevel.no_timing complication -- also recovers timing of diagnostic commands, e.g. 'find_theorems';
 wenzelm parents: 
51605diff
changeset | 340 | make_transition (f (name, pos, int_only, print, timing, trans)); | 
| 5828 | 341 | |
| 51658 
21c10672633b
discontinued Toplevel.no_timing complication -- also recovers timing of diagnostic commands, e.g. 'find_theorems';
 wenzelm parents: 
51605diff
changeset | 342 | val empty = make_transition ("", Position.none, false, false, NONE, []);
 | 
| 5828 | 343 | |
| 344 | ||
| 345 | (* diagnostics *) | |
| 346 | ||
| 38888 
8248cda328de
moved Toplevel.run_command to Pure/PIDE/document.ML;
 wenzelm parents: 
38876diff
changeset | 347 | fun print_of (Transition {print, ...}) = print;
 | 
| 27427 | 348 | fun name_of (Transition {name, ...}) = name;
 | 
| 28105 | 349 | fun pos_of (Transition {pos, ...}) = pos;
 | 
| 5828 | 350 | |
| 48993 | 351 | fun command_msg msg tr = msg ^ "command " ^ quote (name_of tr) ^ Position.here (pos_of tr); | 
| 38875 
c7a66b584147
tuned messages: discontinued spurious full-stops (messages are occasionally composed unexpectedly);
 wenzelm parents: 
38721diff
changeset | 352 | fun at_command tr = command_msg "At " tr; | 
| 5828 | 353 | |
| 354 | fun type_error tr state = | |
| 18685 | 355 | ERROR (command_msg "Illegal application of " tr ^ " " ^ str_of_state state); | 
| 5828 | 356 | |
| 357 | ||
| 358 | (* modify transitions *) | |
| 359 | ||
| 51658 
21c10672633b
discontinued Toplevel.no_timing complication -- also recovers timing of diagnostic commands, e.g. 'find_theorems';
 wenzelm parents: 
51605diff
changeset | 360 | fun name name = map_transition (fn (_, pos, int_only, print, timing, trans) => | 
| 
21c10672633b
discontinued Toplevel.no_timing complication -- also recovers timing of diagnostic commands, e.g. 'find_theorems';
 wenzelm parents: 
51605diff
changeset | 361 | (name, pos, int_only, print, timing, trans)); | 
| 9010 | 362 | |
| 51658 
21c10672633b
discontinued Toplevel.no_timing complication -- also recovers timing of diagnostic commands, e.g. 'find_theorems';
 wenzelm parents: 
51605diff
changeset | 363 | fun position pos = map_transition (fn (name, _, int_only, print, timing, trans) => | 
| 
21c10672633b
discontinued Toplevel.no_timing complication -- also recovers timing of diagnostic commands, e.g. 'find_theorems';
 wenzelm parents: 
51605diff
changeset | 364 | (name, pos, int_only, print, timing, trans)); | 
| 5828 | 365 | |
| 51658 
21c10672633b
discontinued Toplevel.no_timing complication -- also recovers timing of diagnostic commands, e.g. 'find_theorems';
 wenzelm parents: 
51605diff
changeset | 366 | fun interactive int_only = map_transition (fn (name, pos, _, print, timing, trans) => | 
| 
21c10672633b
discontinued Toplevel.no_timing complication -- also recovers timing of diagnostic commands, e.g. 'find_theorems';
 wenzelm parents: 
51605diff
changeset | 367 | (name, pos, int_only, print, timing, trans)); | 
| 14923 | 368 | |
| 51658 
21c10672633b
discontinued Toplevel.no_timing complication -- also recovers timing of diagnostic commands, e.g. 'find_theorems';
 wenzelm parents: 
51605diff
changeset | 369 | fun add_trans tr = map_transition (fn (name, pos, int_only, print, timing, trans) => | 
| 
21c10672633b
discontinued Toplevel.no_timing complication -- also recovers timing of diagnostic commands, e.g. 'find_theorems';
 wenzelm parents: 
51605diff
changeset | 370 | (name, pos, int_only, print, timing, tr :: trans)); | 
| 16607 | 371 | |
| 51658 
21c10672633b
discontinued Toplevel.no_timing complication -- also recovers timing of diagnostic commands, e.g. 'find_theorems';
 wenzelm parents: 
51605diff
changeset | 372 | val reset_trans = map_transition (fn (name, pos, int_only, print, timing, _) => | 
| 
21c10672633b
discontinued Toplevel.no_timing complication -- also recovers timing of diagnostic commands, e.g. 'find_theorems';
 wenzelm parents: 
51605diff
changeset | 373 | (name, pos, int_only, print, timing, [])); | 
| 28433 
b3dab95f098f
begin_proof: avoid race condition wrt. skip_proofs flag;
 wenzelm parents: 
28425diff
changeset | 374 | |
| 51658 
21c10672633b
discontinued Toplevel.no_timing complication -- also recovers timing of diagnostic commands, e.g. 'find_theorems';
 wenzelm parents: 
51605diff
changeset | 375 | fun set_print print = map_transition (fn (name, pos, int_only, _, timing, trans) => | 
| 
21c10672633b
discontinued Toplevel.no_timing complication -- also recovers timing of diagnostic commands, e.g. 'find_theorems';
 wenzelm parents: 
51605diff
changeset | 376 | (name, pos, int_only, print, timing, trans)); | 
| 28453 
06702e7acd1d
excursion/unit_result: no print for forked end, finish into global theory, pick resul from presentation context;
 wenzelm parents: 
28451diff
changeset | 377 | |
| 
06702e7acd1d
excursion/unit_result: no print for forked end, finish into global theory, pick resul from presentation context;
 wenzelm parents: 
28451diff
changeset | 378 | val print = set_print true; | 
| 5828 | 379 | |
| 380 | ||
| 21007 | 381 | (* basic transitions *) | 
| 5828 | 382 | |
| 44187 
88d770052bac
simplified Toplevel.init_theory: discontinued special name argument;
 wenzelm parents: 
44186diff
changeset | 383 | fun init_theory f = add_trans (Init f); | 
| 37977 
3ceccd415145
simplified/clarified theory loader: more explicit task management, kill old versions at start, commit results only in the very end, non-optional master dependency, do not store text in deps;
 wenzelm parents: 
37953diff
changeset | 384 | |
| 44187 
88d770052bac
simplified Toplevel.init_theory: discontinued special name argument;
 wenzelm parents: 
44186diff
changeset | 385 | fun is_init (Transition {trans = [Init _], ...}) = true
 | 
| 
88d770052bac
simplified Toplevel.init_theory: discontinued special name argument;
 wenzelm parents: 
44186diff
changeset | 386 | | is_init _ = false; | 
| 
88d770052bac
simplified Toplevel.init_theory: discontinued special name argument;
 wenzelm parents: 
44186diff
changeset | 387 | |
| 
88d770052bac
simplified Toplevel.init_theory: discontinued special name argument;
 wenzelm parents: 
44186diff
changeset | 388 | fun modify_init f tr = if is_init tr then init_theory f (reset_trans tr) else tr; | 
| 37977 
3ceccd415145
simplified/clarified theory loader: more explicit task management, kill old versions at start, commit results only in the very end, non-optional master dependency, do not store text in deps;
 wenzelm parents: 
37953diff
changeset | 389 | |
| 6689 | 390 | val exit = add_trans Exit; | 
| 7612 | 391 | val keep' = add_trans o Keep; | 
| 30366 
e3d788b9dffb
simplified presentation: built into transaction, pass state directly;
 wenzelm parents: 
29516diff
changeset | 392 | |
| 
e3d788b9dffb
simplified presentation: built into transaction, pass state directly;
 wenzelm parents: 
29516diff
changeset | 393 | fun present_transaction f g = add_trans (Transaction (f, g)); | 
| 
e3d788b9dffb
simplified presentation: built into transaction, pass state directly;
 wenzelm parents: 
29516diff
changeset | 394 | fun transaction f = present_transaction f (K ()); | 
| 5828 | 395 | |
| 7612 | 396 | fun keep f = add_trans (Keep (fn _ => f)); | 
| 5828 | 397 | fun imperative f = keep (fn _ => f ()); | 
| 398 | ||
| 27840 | 399 | fun ignored pos = empty |> name "<ignored>" |> position pos |> imperative I; | 
| 51268 
fcc4b89a600d
simplified Outer_Syntax.read_span: internalized Toplevel.is_ignored;
 wenzelm parents: 
51241diff
changeset | 400 | fun is_ignored tr = name_of tr = "<ignored>"; | 
| 48772 | 401 | |
| 402 | val malformed_name = "<malformed>"; | |
| 27840 | 403 | fun malformed pos msg = | 
| 48772 | 404 | empty |> name malformed_name |> position pos |> imperative (fn () => error msg); | 
| 405 | fun is_malformed tr = name_of tr = malformed_name; | |
| 27840 | 406 | |
| 21007 | 407 | val unknown_theory = imperative (fn () => warning "Unknown theory context"); | 
| 408 | val unknown_proof = imperative (fn () => warning "Unknown proof context"); | |
| 409 | val unknown_context = imperative (fn () => warning "Unknown context"); | |
| 15668 | 410 | |
| 21007 | 411 | |
| 49012 
8686c36fa27d
refined treatment of forked proofs at transaction boundaries, including proof commands (see also 7ee000ce5390);
 wenzelm parents: 
49011diff
changeset | 412 | (* theory transitions *) | 
| 44304 
7ee000ce5390
maintain recent future proofs at transaction boundaries;
 wenzelm parents: 
44270diff
changeset | 413 | |
| 27601 
6683cdb94af8
simplified commit_exit: operate on previous node of final state, include warning here;
 wenzelm parents: 
27583diff
changeset | 414 | fun generic_theory f = transaction (fn _ => | 
| 26491 | 415 | (fn Theory (gthy, _) => Theory (f gthy, NONE) | 
| 416 | | _ => raise UNDEF)); | |
| 417 | ||
| 27601 
6683cdb94af8
simplified commit_exit: operate on previous node of final state, include warning here;
 wenzelm parents: 
27583diff
changeset | 418 | fun theory' f = transaction (fn int => | 
| 33725 
a8481da77270
implicit name space grouping for theory/local_theory transactions;
 wenzelm parents: 
33671diff
changeset | 419 | (fn Theory (Context.Theory thy, _) => | 
| 
a8481da77270
implicit name space grouping for theory/local_theory transactions;
 wenzelm parents: 
33671diff
changeset | 420 | let val thy' = thy | 
| 49012 
8686c36fa27d
refined treatment of forked proofs at transaction boundaries, including proof commands (see also 7ee000ce5390);
 wenzelm parents: 
49011diff
changeset | 421 | |> Sign.new_group | 
| 33725 
a8481da77270
implicit name space grouping for theory/local_theory transactions;
 wenzelm parents: 
33671diff
changeset | 422 | |> f int | 
| 
a8481da77270
implicit name space grouping for theory/local_theory transactions;
 wenzelm parents: 
33671diff
changeset | 423 | |> Sign.reset_group; | 
| 
a8481da77270
implicit name space grouping for theory/local_theory transactions;
 wenzelm parents: 
33671diff
changeset | 424 | in Theory (Context.Theory thy', NONE) end | 
| 20963 
a7fd8f05a2be
added type global_theory -- theory or local_theory;
 wenzelm parents: 
20928diff
changeset | 425 | | _ => raise UNDEF)); | 
| 
a7fd8f05a2be
added type global_theory -- theory or local_theory;
 wenzelm parents: 
20928diff
changeset | 426 | |
| 
a7fd8f05a2be
added type global_theory -- theory or local_theory;
 wenzelm parents: 
20928diff
changeset | 427 | fun theory f = theory' (K f); | 
| 
a7fd8f05a2be
added type global_theory -- theory or local_theory;
 wenzelm parents: 
20928diff
changeset | 428 | |
| 27601 
6683cdb94af8
simplified commit_exit: operate on previous node of final state, include warning here;
 wenzelm parents: 
27583diff
changeset | 429 | fun begin_local_theory begin f = transaction (fn _ => | 
| 20963 
a7fd8f05a2be
added type global_theory -- theory or local_theory;
 wenzelm parents: 
20928diff
changeset | 430 | (fn Theory (Context.Theory thy, _) => | 
| 
a7fd8f05a2be
added type global_theory -- theory or local_theory;
 wenzelm parents: 
20928diff
changeset | 431 | let | 
| 20985 | 432 | val lthy = f thy; | 
| 21294 | 433 | val gthy = if begin then Context.Proof lthy else Context.Theory (loc_exit lthy); | 
| 434 | in Theory (gthy, SOME lthy) end | |
| 20963 
a7fd8f05a2be
added type global_theory -- theory or local_theory;
 wenzelm parents: 
20928diff
changeset | 435 | | _ => raise UNDEF)); | 
| 17076 | 436 | |
| 27601 
6683cdb94af8
simplified commit_exit: operate on previous node of final state, include warning here;
 wenzelm parents: 
27583diff
changeset | 437 | val end_local_theory = transaction (fn _ => | 
| 21294 | 438 | (fn Theory (Context.Proof lthy, _) => Theory (Context.Theory (loc_exit lthy), SOME lthy) | 
| 21007 | 439 | | _ => raise UNDEF)); | 
| 440 | ||
| 47069 | 441 | fun open_target f = transaction (fn _ => | 
| 442 | (fn Theory (gthy, _) => | |
| 443 | let val lthy = f gthy | |
| 444 | in Theory (Context.Proof lthy, SOME lthy) end | |
| 445 | | _ => raise UNDEF)); | |
| 446 | ||
| 447 | val close_target = transaction (fn _ => | |
| 448 | (fn Theory (Context.Proof lthy, _) => | |
| 449 | (case try Local_Theory.close_target lthy of | |
| 50739 
5165d7e6d3b9
more precise Local_Theory.level: 1 really means main target and >= 2 nested context;
 wenzelm parents: 
50201diff
changeset | 450 | SOME ctxt' => | 
| 
5165d7e6d3b9
more precise Local_Theory.level: 1 really means main target and >= 2 nested context;
 wenzelm parents: 
50201diff
changeset | 451 | let | 
| 
5165d7e6d3b9
more precise Local_Theory.level: 1 really means main target and >= 2 nested context;
 wenzelm parents: 
50201diff
changeset | 452 | val gthy' = | 
| 
5165d7e6d3b9
more precise Local_Theory.level: 1 really means main target and >= 2 nested context;
 wenzelm parents: 
50201diff
changeset | 453 | if can Local_Theory.assert ctxt' | 
| 
5165d7e6d3b9
more precise Local_Theory.level: 1 really means main target and >= 2 nested context;
 wenzelm parents: 
50201diff
changeset | 454 | then Context.Proof ctxt' | 
| 
5165d7e6d3b9
more precise Local_Theory.level: 1 really means main target and >= 2 nested context;
 wenzelm parents: 
50201diff
changeset | 455 | else Context.Theory (Proof_Context.theory_of ctxt'); | 
| 
5165d7e6d3b9
more precise Local_Theory.level: 1 really means main target and >= 2 nested context;
 wenzelm parents: 
50201diff
changeset | 456 | in Theory (gthy', SOME lthy) end | 
| 47069 | 457 | | NONE => raise UNDEF) | 
| 458 | | _ => raise UNDEF)); | |
| 459 | ||
| 460 | ||
| 21007 | 461 | local | 
| 462 | ||
| 30366 
e3d788b9dffb
simplified presentation: built into transaction, pass state directly;
 wenzelm parents: 
29516diff
changeset | 463 | fun local_theory_presentation loc f = present_transaction (fn int => | 
| 21294 | 464 | (fn Theory (gthy, _) => | 
| 465 | let | |
| 49062 
7e31dfd99ce7
discontinued complicated/unreliable notion of recent proofs within context;
 wenzelm parents: 
49042diff
changeset | 466 | val (finish, lthy) = loc_begin loc gthy; | 
| 47274 | 467 | val lthy' = lthy | 
| 49012 
8686c36fa27d
refined treatment of forked proofs at transaction boundaries, including proof commands (see also 7ee000ce5390);
 wenzelm parents: 
49011diff
changeset | 468 | |> Local_Theory.new_group | 
| 33725 
a8481da77270
implicit name space grouping for theory/local_theory transactions;
 wenzelm parents: 
33671diff
changeset | 469 | |> f int | 
| 
a8481da77270
implicit name space grouping for theory/local_theory transactions;
 wenzelm parents: 
33671diff
changeset | 470 | |> Local_Theory.reset_group; | 
| 21294 | 471 | in Theory (finish lthy', SOME lthy') end | 
| 30366 
e3d788b9dffb
simplified presentation: built into transaction, pass state directly;
 wenzelm parents: 
29516diff
changeset | 472 | | _ => raise UNDEF)); | 
| 15668 | 473 | |
| 21007 | 474 | in | 
| 475 | ||
| 30366 
e3d788b9dffb
simplified presentation: built into transaction, pass state directly;
 wenzelm parents: 
29516diff
changeset | 476 | fun local_theory' loc f = local_theory_presentation loc f (K ()); | 
| 29380 | 477 | fun local_theory loc f = local_theory' loc (K f); | 
| 30366 
e3d788b9dffb
simplified presentation: built into transaction, pass state directly;
 wenzelm parents: 
29516diff
changeset | 478 | fun present_local_theory loc = local_theory_presentation loc (K I); | 
| 18955 | 479 | |
| 21007 | 480 | end; | 
| 481 | ||
| 482 | ||
| 483 | (* proof transitions *) | |
| 484 | ||
| 27601 
6683cdb94af8
simplified commit_exit: operate on previous node of final state, include warning here;
 wenzelm parents: 
27583diff
changeset | 485 | fun end_proof f = transaction (fn int => | 
| 24795 
6f5cb7885fd7
print_state_context: local theory context, not proof context;
 wenzelm parents: 
24780diff
changeset | 486 | (fn Proof (prf, (finish, _)) => | 
| 33390 | 487 | let val state = Proof_Node.current prf in | 
| 21007 | 488 | if can (Proof.assert_bottom true) state then | 
| 489 | let | |
| 490 | val ctxt' = f int state; | |
| 491 | val gthy' = finish ctxt'; | |
| 492 | in Theory (gthy', SOME ctxt') end | |
| 493 | else raise UNDEF | |
| 494 | end | |
| 51555 | 495 | | Skipped_Proof (0, (gthy, _)) => Theory (gthy, NONE) | 
| 21007 | 496 | | _ => raise UNDEF)); | 
| 497 | ||
| 21294 | 498 | local | 
| 499 | ||
| 47274 | 500 | fun begin_proof init = transaction (fn int => | 
| 21294 | 501 | (fn Theory (gthy, _) => | 
| 502 | let | |
| 47274 | 503 | val (finish, prf) = init int gthy; | 
| 52499 | 504 | val skip = Goal.skip_proofs_enabled (); | 
| 40960 | 505 | val (is_goal, no_skip) = | 
| 506 | (true, Proof.schematic_goal prf) handle ERROR _ => (false, true); | |
| 47274 | 507 | val _ = | 
| 508 | if is_goal andalso skip andalso no_skip then | |
| 509 | warning "Cannot skip proof of schematic goal statement" | |
| 510 | else (); | |
| 21294 | 511 | in | 
| 40960 | 512 | if skip andalso not no_skip then | 
| 51555 | 513 | Skipped_Proof (0, (finish (Proof.global_skip_proof true prf), gthy)) | 
| 47274 | 514 | else Proof (Proof_Node.init prf, (finish, gthy)) | 
| 21294 | 515 | end | 
| 516 | | _ => raise UNDEF)); | |
| 517 | ||
| 518 | in | |
| 519 | ||
| 24780 
47bb1e380d83
local_theory transactions: more careful treatment of context position;
 wenzelm parents: 
24634diff
changeset | 520 | fun local_theory_to_proof' loc f = begin_proof | 
| 47274 | 521 | (fn int => fn gthy => | 
| 49062 
7e31dfd99ce7
discontinued complicated/unreliable notion of recent proofs within context;
 wenzelm parents: 
49042diff
changeset | 522 | let val (finish, lthy) = loc_begin loc gthy | 
| 49012 
8686c36fa27d
refined treatment of forked proofs at transaction boundaries, including proof commands (see also 7ee000ce5390);
 wenzelm parents: 
49011diff
changeset | 523 | in (finish o Local_Theory.reset_group, f int (Local_Theory.new_group lthy)) end); | 
| 24780 
47bb1e380d83
local_theory transactions: more careful treatment of context position;
 wenzelm parents: 
24634diff
changeset | 524 | |
| 24453 | 525 | fun local_theory_to_proof loc f = local_theory_to_proof' loc (K f); | 
| 21294 | 526 | |
| 527 | fun theory_to_proof f = begin_proof | |
| 47274 | 528 | (fn _ => fn gthy => | 
| 52788 | 529 | (Context.Theory o Sign.reset_group o Proof_Context.theory_of, | 
| 49062 
7e31dfd99ce7
discontinued complicated/unreliable notion of recent proofs within context;
 wenzelm parents: 
49042diff
changeset | 530 | (case gthy of | 
| 52788 | 531 | Context.Theory thy => f (Sign.new_group thy) | 
| 49012 
8686c36fa27d
refined treatment of forked proofs at transaction boundaries, including proof commands (see also 7ee000ce5390);
 wenzelm parents: 
49011diff
changeset | 532 | | _ => raise UNDEF))); | 
| 21294 | 533 | |
| 534 | end; | |
| 535 | ||
| 27601 
6683cdb94af8
simplified commit_exit: operate on previous node of final state, include warning here;
 wenzelm parents: 
27583diff
changeset | 536 | val forget_proof = transaction (fn _ => | 
| 21007 | 537 | (fn Proof (_, (_, orig_gthy)) => Theory (orig_gthy, NONE) | 
| 51555 | 538 | | Skipped_Proof (_, (_, orig_gthy)) => Theory (orig_gthy, NONE) | 
| 21007 | 539 | | _ => raise UNDEF)); | 
| 540 | ||
| 30366 
e3d788b9dffb
simplified presentation: built into transaction, pass state directly;
 wenzelm parents: 
29516diff
changeset | 541 | val present_proof = present_transaction (fn _ => | 
| 49062 
7e31dfd99ce7
discontinued complicated/unreliable notion of recent proofs within context;
 wenzelm parents: 
49042diff
changeset | 542 | (fn Proof (prf, x) => Proof (Proof_Node.apply I prf, x) | 
| 51555 | 543 | | skip as Skipped_Proof _ => skip | 
| 30366 
e3d788b9dffb
simplified presentation: built into transaction, pass state directly;
 wenzelm parents: 
29516diff
changeset | 544 | | _ => raise UNDEF)); | 
| 21177 | 545 | |
| 27601 
6683cdb94af8
simplified commit_exit: operate on previous node of final state, include warning here;
 wenzelm parents: 
27583diff
changeset | 546 | fun proofs' f = transaction (fn int => | 
| 49062 
7e31dfd99ce7
discontinued complicated/unreliable notion of recent proofs within context;
 wenzelm parents: 
49042diff
changeset | 547 | (fn Proof (prf, x) => Proof (Proof_Node.applys (f int) prf, x) | 
| 51555 | 548 | | skip as Skipped_Proof _ => skip | 
| 16815 | 549 | | _ => raise UNDEF)); | 
| 15668 | 550 | |
| 49863 
b5fb6e7f8d81
more informative errors for 'proof' and 'apply' steps;
 wenzelm parents: 
49062diff
changeset | 551 | fun proof' f = proofs' ((Seq.single o Seq.Result) oo f); | 
| 17904 
21c6894b5998
simplified interfaces proof/proof' etc.: perform ProofHistory.apply(s)/current internally;
 wenzelm parents: 
17513diff
changeset | 552 | val proofs = proofs' o K; | 
| 6689 | 553 | val proof = proof' o K; | 
| 16815 | 554 | |
| 27601 
6683cdb94af8
simplified commit_exit: operate on previous node of final state, include warning here;
 wenzelm parents: 
27583diff
changeset | 555 | fun actual_proof f = transaction (fn _ => | 
| 21007 | 556 | (fn Proof (prf, x) => Proof (f prf, x) | 
| 20963 
a7fd8f05a2be
added type global_theory -- theory or local_theory;
 wenzelm parents: 
20928diff
changeset | 557 | | _ => raise UNDEF)); | 
| 16815 | 558 | |
| 27601 
6683cdb94af8
simplified commit_exit: operate on previous node of final state, include warning here;
 wenzelm parents: 
27583diff
changeset | 559 | fun skip_proof f = transaction (fn _ => | 
| 51555 | 560 | (fn Skipped_Proof (h, x) => Skipped_Proof (f h, x) | 
| 18563 | 561 | | _ => raise UNDEF)); | 
| 562 | ||
| 27601 
6683cdb94af8
simplified commit_exit: operate on previous node of final state, include warning here;
 wenzelm parents: 
27583diff
changeset | 563 | fun skip_proof_to_theory pred = transaction (fn _ => | 
| 51555 | 564 | (fn Skipped_Proof (d, (gthy, _)) => if pred d then Theory (gthy, NONE) else raise UNDEF | 
| 33725 
a8481da77270
implicit name space grouping for theory/local_theory transactions;
 wenzelm parents: 
33671diff
changeset | 565 | | _ => raise UNDEF)); | 
| 5828 | 566 | |
| 567 | ||
| 568 | ||
| 569 | (** toplevel transactions **) | |
| 570 | ||
| 52527 
dbac84eab3bc
separate exec_id assignment for Command.print states, without affecting result of eval;
 wenzelm parents: 
52499diff
changeset | 571 | (* runtime position *) | 
| 27427 | 572 | |
| 52536 | 573 | fun exec_id id (tr as Transition {pos, ...}) =
 | 
| 574 | position (Position.put_id (Document_ID.print id) pos) tr; | |
| 25799 | 575 | |
| 25960 | 576 | fun setmp_thread_position (Transition {pos, ...}) f x =
 | 
| 25819 
e6feb08b7f4b
replaced thread_properties by simplified version in position.ML;
 wenzelm parents: 
25809diff
changeset | 577 | Position.setmp_thread_data pos f x; | 
| 25799 | 578 | |
| 27606 | 579 | fun status tr m = | 
| 43665 | 580 | setmp_thread_position tr (fn () => Output.status (Markup.markup_only m)) (); | 
| 27606 | 581 | |
| 25799 | 582 | |
| 28095 
7eaf0813bdc3
added add_hook interface for post-transition hooks;
 wenzelm parents: 
27859diff
changeset | 583 | (* post-transition hooks *) | 
| 
7eaf0813bdc3
added add_hook interface for post-transition hooks;
 wenzelm parents: 
27859diff
changeset | 584 | |
| 37905 | 585 | local | 
| 586 | val hooks = Unsynchronized.ref ([]: (transition -> state -> state -> unit) list); | |
| 587 | in | |
| 28095 
7eaf0813bdc3
added add_hook interface for post-transition hooks;
 wenzelm parents: 
27859diff
changeset | 588 | |
| 32738 | 589 | fun add_hook f = CRITICAL (fn () => Unsynchronized.change hooks (cons f)); | 
| 33223 | 590 | fun get_hooks () = ! hooks; | 
| 28095 
7eaf0813bdc3
added add_hook interface for post-transition hooks;
 wenzelm parents: 
27859diff
changeset | 591 | |
| 
7eaf0813bdc3
added add_hook interface for post-transition hooks;
 wenzelm parents: 
27859diff
changeset | 592 | end; | 
| 
7eaf0813bdc3
added add_hook interface for post-transition hooks;
 wenzelm parents: 
27859diff
changeset | 593 | |
| 
7eaf0813bdc3
added add_hook interface for post-transition hooks;
 wenzelm parents: 
27859diff
changeset | 594 | |
| 5828 | 595 | (* apply transitions *) | 
| 596 | ||
| 51217 
65ab2c4f4c32
support for prescient timing information within command transactions;
 wenzelm parents: 
51216diff
changeset | 597 | fun get_timing (Transition {timing, ...}) = timing;
 | 
| 51658 
21c10672633b
discontinued Toplevel.no_timing complication -- also recovers timing of diagnostic commands, e.g. 'find_theorems';
 wenzelm parents: 
51605diff
changeset | 598 | fun put_timing timing = map_transition (fn (name, pos, int_only, print, _, trans) => | 
| 
21c10672633b
discontinued Toplevel.no_timing complication -- also recovers timing of diagnostic commands, e.g. 'find_theorems';
 wenzelm parents: 
51605diff
changeset | 599 | (name, pos, int_only, print, timing, trans)); | 
| 51217 
65ab2c4f4c32
support for prescient timing information within command transactions;
 wenzelm parents: 
51216diff
changeset | 600 | |
| 6664 | 601 | local | 
| 602 | ||
| 51658 
21c10672633b
discontinued Toplevel.no_timing complication -- also recovers timing of diagnostic commands, e.g. 'find_theorems';
 wenzelm parents: 
51605diff
changeset | 603 | fun app int (tr as Transition {trans, print, ...}) =
 | 
| 25819 
e6feb08b7f4b
replaced thread_properties by simplified version in position.ML;
 wenzelm parents: 
25809diff
changeset | 604 | setmp_thread_position tr (fn state => | 
| 25799 | 605 | let | 
| 51595 | 606 | val timing_start = Timing.start (); | 
| 25799 | 607 | |
| 51595 | 608 | val (result, opt_err) = | 
| 51658 
21c10672633b
discontinued Toplevel.no_timing complication -- also recovers timing of diagnostic commands, e.g. 'find_theorems';
 wenzelm parents: 
51605diff
changeset | 609 | state |> (apply_trans int trans |> ! profiling > 0 ? profile (! profiling)); | 
| 26621 
78b3ad7af5d5
eliminated unused name_of, source, source_of, print', print3, three_buffersN;
 wenzelm parents: 
26602diff
changeset | 610 | val _ = if int andalso not (! quiet) andalso print then print_state false result else (); | 
| 51216 | 611 | |
| 51595 | 612 | val timing_result = Timing.result timing_start; | 
| 51662 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 613 | val timing_props = | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 614 | Markup.command_timing :: (Markup.nameN, name_of tr) :: Position.properties_of (pos_of tr); | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 615 | val _ = Timing.protocol_message timing_props timing_result; | 
| 51595 | 616 | in | 
| 617 | (result, Option.map (fn UNDEF => type_error tr state | exn => exn) opt_err) | |
| 618 | end); | |
| 6664 | 619 | |
| 620 | in | |
| 5828 | 621 | |
| 26602 
5534b6a6b810
made purely value-oriented, moved global state to structure Isar (cf. isar.ML);
 wenzelm parents: 
26491diff
changeset | 622 | fun transition int tr st = | 
| 28095 
7eaf0813bdc3
added add_hook interface for post-transition hooks;
 wenzelm parents: 
27859diff
changeset | 623 | let | 
| 
7eaf0813bdc3
added add_hook interface for post-transition hooks;
 wenzelm parents: 
27859diff
changeset | 624 | val hooks = get_hooks (); | 
| 28103 
b79e61861f0f
simplified Toplevel.add_hook: cover successful transactions only;
 wenzelm parents: 
28095diff
changeset | 625 | fun apply_hooks st' = hooks |> List.app (fn f => (try (fn () => f tr st st') (); ())); | 
| 28095 
7eaf0813bdc3
added add_hook interface for post-transition hooks;
 wenzelm parents: 
27859diff
changeset | 626 | |
| 
7eaf0813bdc3
added add_hook interface for post-transition hooks;
 wenzelm parents: 
27859diff
changeset | 627 | val ctxt = try context_of st; | 
| 
7eaf0813bdc3
added add_hook interface for post-transition hooks;
 wenzelm parents: 
27859diff
changeset | 628 | val res = | 
| 
7eaf0813bdc3
added add_hook interface for post-transition hooks;
 wenzelm parents: 
27859diff
changeset | 629 | (case app int tr st of | 
| 38888 
8248cda328de
moved Toplevel.run_command to Pure/PIDE/document.ML;
 wenzelm parents: 
38876diff
changeset | 630 | (_, SOME Runtime.TERMINATE) => NONE | 
| 
8248cda328de
moved Toplevel.run_command to Pure/PIDE/document.ML;
 wenzelm parents: 
38876diff
changeset | 631 | | (st', SOME (Runtime.EXCURSION_FAIL exn_info)) => SOME (st', SOME exn_info) | 
| 31476 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 wenzelm parents: 
31431diff
changeset | 632 | | (st', SOME exn) => SOME (st', SOME (Runtime.exn_context ctxt exn, at_command tr)) | 
| 28103 
b79e61861f0f
simplified Toplevel.add_hook: cover successful transactions only;
 wenzelm parents: 
28095diff
changeset | 633 | | (st', NONE) => SOME (st', NONE)); | 
| 
b79e61861f0f
simplified Toplevel.add_hook: cover successful transactions only;
 wenzelm parents: 
28095diff
changeset | 634 | val _ = (case res of SOME (st', NONE) => apply_hooks st' | _ => ()); | 
| 28095 
7eaf0813bdc3
added add_hook interface for post-transition hooks;
 wenzelm parents: 
27859diff
changeset | 635 | in res end; | 
| 6664 | 636 | |
| 637 | end; | |
| 5828 | 638 | |
| 639 | ||
| 51284 
59a03019f3bf
fork diagnostic commands (theory loader and PIDE interaction);
 wenzelm parents: 
51282diff
changeset | 640 | (* managed commands *) | 
| 5828 | 641 | |
| 51323 | 642 | fun command_errors int tr st = | 
| 643 | (case transition int tr st of | |
| 644 | SOME (st', NONE) => ([], SOME st') | |
| 645 | | SOME (_, SOME (exn, _)) => (ML_Compiler.exn_messages_ids exn, NONE) | |
| 646 | | NONE => (ML_Compiler.exn_messages_ids Runtime.TERMINATE, NONE)); | |
| 647 | ||
| 51284 
59a03019f3bf
fork diagnostic commands (theory loader and PIDE interaction);
 wenzelm parents: 
51282diff
changeset | 648 | fun command_exception int tr st = | 
| 
59a03019f3bf
fork diagnostic commands (theory loader and PIDE interaction);
 wenzelm parents: 
51282diff
changeset | 649 | (case transition int tr st of | 
| 28425 | 650 | SOME (st', NONE) => st' | 
| 39285 | 651 | | SOME (_, SOME (exn, info)) => | 
| 652 | if Exn.is_interrupt exn then reraise exn else raise Runtime.EXCURSION_FAIL (exn, info) | |
| 38888 
8248cda328de
moved Toplevel.run_command to Pure/PIDE/document.ML;
 wenzelm parents: 
38876diff
changeset | 653 | | NONE => raise Runtime.EXCURSION_FAIL (Runtime.TERMINATE, at_command tr)); | 
| 27576 
7afff36043e6
eliminated internal command history -- superceeded by global Isar state (cf. isar.ML);
 wenzelm parents: 
27564diff
changeset | 654 | |
| 51323 | 655 | fun command tr = command_exception (! interact) tr; | 
| 51284 
59a03019f3bf
fork diagnostic commands (theory loader and PIDE interaction);
 wenzelm parents: 
51282diff
changeset | 656 | |
| 28433 
b3dab95f098f
begin_proof: avoid race condition wrt. skip_proofs flag;
 wenzelm parents: 
28425diff
changeset | 657 | |
| 46959 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
45666diff
changeset | 658 | (* scheduled proof result *) | 
| 28433 
b3dab95f098f
begin_proof: avoid race condition wrt. skip_proofs flag;
 wenzelm parents: 
28425diff
changeset | 659 | |
| 51332 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 660 | datatype result = | 
| 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 661 | Result of transition * state | | 
| 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 662 | Result_List of result list | | 
| 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 663 | Result_Future of result future; | 
| 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 664 | |
| 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 665 | fun join_results (Result x) = [x] | 
| 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 666 | | join_results (Result_List xs) = maps join_results xs | 
| 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 667 | | join_results (Result_Future x) = join_results (Future.join x); | 
| 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 668 | |
| 51323 | 669 | local | 
| 670 | ||
| 47417 | 671 | structure Result = Proof_Data | 
| 28974 
d6b190efa01a
excursion: pass explicit proof states as result of future proof, replaced low-level Thm.join_futures by PureThy.force_proofs;
 wenzelm parents: 
28645diff
changeset | 672 | ( | 
| 51332 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 673 | type T = result; | 
| 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 674 | val empty: T = Result_List []; | 
| 47417 | 675 | fun init _ = empty; | 
| 28974 
d6b190efa01a
excursion: pass explicit proof states as result of future proof, replaced low-level Thm.join_futures by PureThy.force_proofs;
 wenzelm parents: 
28645diff
changeset | 676 | ); | 
| 
d6b190efa01a
excursion: pass explicit proof states as result of future proof, replaced low-level Thm.join_futures by PureThy.force_proofs;
 wenzelm parents: 
28645diff
changeset | 677 | |
| 51332 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 678 | val get_result = Result.get o Proof.context_of; | 
| 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 679 | val put_result = Proof.map_context o Result.put; | 
| 51324 | 680 | |
| 51423 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 681 | fun timing_estimate include_head elem = | 
| 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 682 | let | 
| 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 683 | val trs = Thy_Syntax.flat_element elem |> not include_head ? tl; | 
| 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 684 | val timings = map get_timing trs; | 
| 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 685 | in | 
| 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 686 | if forall is_some timings then | 
| 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 687 | SOME (fold (curry Time.+ o the) timings Time.zeroTime) | 
| 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 688 | else NONE | 
| 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 689 | end; | 
| 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 690 | |
| 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 691 | fun priority NONE = ~1 | 
| 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 692 | | priority (SOME estimate) = | 
| 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 693 | Int.min (Real.floor (Real.max (Math.log10 (Time.toReal estimate), ~3.0)) - 3, ~1); | 
| 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 694 | |
| 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 695 | fun proof_future_enabled estimate st = | 
| 51324 | 696 | (case try proof_of st of | 
| 697 | NONE => false | |
| 698 | | SOME state => | |
| 699 | not (Proof.is_relevant state) andalso | |
| 700 | (if can (Proof.assert_bottom true) state | |
| 701 | then Goal.future_enabled () | |
| 51423 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 702 | else | 
| 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 703 | (case estimate of | 
| 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 704 | NONE => Goal.future_enabled_nested 2 | 
| 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 705 | | SOME t => Goal.future_enabled_timing t))); | 
| 51278 | 706 | |
| 51323 | 707 | fun atom_result tr st = | 
| 708 | let | |
| 709 | val st' = | |
| 710 | if Goal.future_enabled () andalso Keyword.is_diag (name_of tr) then | |
| 51605 
eca8acb42e4a
more explicit Goal.fork_params -- avoid implicit arguments via thread data;
 wenzelm parents: 
51595diff
changeset | 711 | (Goal.fork_params | 
| 
eca8acb42e4a
more explicit Goal.fork_params -- avoid implicit arguments via thread data;
 wenzelm parents: 
51595diff
changeset | 712 |           {name = "Toplevel.diag", pos = pos_of tr,
 | 
| 
eca8acb42e4a
more explicit Goal.fork_params -- avoid implicit arguments via thread data;
 wenzelm parents: 
51595diff
changeset | 713 | pri = priority (timing_estimate true (Thy_Syntax.atom tr))} | 
| 
eca8acb42e4a
more explicit Goal.fork_params -- avoid implicit arguments via thread data;
 wenzelm parents: 
51595diff
changeset | 714 | (fn () => command tr st); st) | 
| 51323 | 715 | else command tr st; | 
| 51332 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 716 | in (Result (tr, st'), st') end; | 
| 51323 | 717 | |
| 718 | in | |
| 719 | ||
| 51332 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 720 | fun element_result (Thy_Syntax.Element (tr, NONE)) st = atom_result tr st | 
| 51423 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 721 | | element_result (elem as Thy_Syntax.Element (head_tr, SOME element_rest)) st = | 
| 48633 
7cd32f9d4293
recovered comination of Toplevel.skip_proofs and Goal.parallel_proofs from 9679bab23f93 (NB: skip_proofs leads to failure of Toplevel.proof_of);
 wenzelm parents: 
47881diff
changeset | 722 | let | 
| 51324 | 723 | val (head_result, st') = atom_result head_tr st; | 
| 51332 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 724 | val (body_elems, end_tr) = element_rest; | 
| 51423 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 725 | val estimate = timing_estimate false elem; | 
| 51324 | 726 | in | 
| 51423 
e5f9a6d9ca82
clarified parallel_subproofs_saturation (blind guess) vs. parallel_subproofs_threshold (precient timing estimate);
 wenzelm parents: 
51332diff
changeset | 727 | if not (proof_future_enabled estimate st') | 
| 51324 | 728 | then | 
| 51332 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 729 | let | 
| 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 730 | val proof_trs = maps Thy_Syntax.flat_element body_elems @ [end_tr]; | 
| 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 731 | val (proof_results, st'') = fold_map atom_result proof_trs st'; | 
| 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 732 | in (Result_List (head_result :: proof_results), st'') end | 
| 51324 | 733 | else | 
| 734 | let | |
| 735 | val finish = Context.Theory o Proof_Context.theory_of; | |
| 28974 
d6b190efa01a
excursion: pass explicit proof states as result of future proof, replaced low-level Thm.join_futures by PureThy.force_proofs;
 wenzelm parents: 
28645diff
changeset | 736 | |
| 51605 
eca8acb42e4a
more explicit Goal.fork_params -- avoid implicit arguments via thread data;
 wenzelm parents: 
51595diff
changeset | 737 | val future_proof = | 
| 
eca8acb42e4a
more explicit Goal.fork_params -- avoid implicit arguments via thread data;
 wenzelm parents: 
51595diff
changeset | 738 | Proof.future_proof (fn state => | 
| 
eca8acb42e4a
more explicit Goal.fork_params -- avoid implicit arguments via thread data;
 wenzelm parents: 
51595diff
changeset | 739 | Goal.fork_params | 
| 
eca8acb42e4a
more explicit Goal.fork_params -- avoid implicit arguments via thread data;
 wenzelm parents: 
51595diff
changeset | 740 |                   {name = "Toplevel.future_proof", pos = pos_of head_tr, pri = priority estimate}
 | 
| 
eca8acb42e4a
more explicit Goal.fork_params -- avoid implicit arguments via thread data;
 wenzelm parents: 
51595diff
changeset | 741 | (fn () => | 
| 
eca8acb42e4a
more explicit Goal.fork_params -- avoid implicit arguments via thread data;
 wenzelm parents: 
51595diff
changeset | 742 | let | 
| 
eca8acb42e4a
more explicit Goal.fork_params -- avoid implicit arguments via thread data;
 wenzelm parents: 
51595diff
changeset | 743 | val State (SOME (Proof (prf, (_, orig_gthy))), prev) = st'; | 
| 
eca8acb42e4a
more explicit Goal.fork_params -- avoid implicit arguments via thread data;
 wenzelm parents: 
51595diff
changeset | 744 | val prf' = Proof_Node.apply (K state) prf; | 
| 
eca8acb42e4a
more explicit Goal.fork_params -- avoid implicit arguments via thread data;
 wenzelm parents: 
51595diff
changeset | 745 | val (result, result_state) = | 
| 
eca8acb42e4a
more explicit Goal.fork_params -- avoid implicit arguments via thread data;
 wenzelm parents: 
51595diff
changeset | 746 | State (SOME (Proof (prf', (finish, orig_gthy))), prev) | 
| 
eca8acb42e4a
more explicit Goal.fork_params -- avoid implicit arguments via thread data;
 wenzelm parents: 
51595diff
changeset | 747 | |> fold_map element_result body_elems ||> command end_tr; | 
| 
eca8acb42e4a
more explicit Goal.fork_params -- avoid implicit arguments via thread data;
 wenzelm parents: 
51595diff
changeset | 748 | in (Result_List result, presentation_context_of result_state) end)) | 
| 51332 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 749 | #> (fn (res, state') => state' |> put_result (Result_Future res)); | 
| 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 750 | |
| 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 751 | val forked_proof = | 
| 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 752 | proof (future_proof #> | 
| 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 753 | (fn state => state |> Proof.local_done_proof |> put_result (get_result state))) o | 
| 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 754 | end_proof (fn _ => future_proof #> | 
| 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 755 | (fn state => state |> Proof.global_done_proof |> Result.put (get_result state))); | 
| 28974 
d6b190efa01a
excursion: pass explicit proof states as result of future proof, replaced low-level Thm.join_futures by PureThy.force_proofs;
 wenzelm parents: 
28645diff
changeset | 756 | |
| 51324 | 757 | val st'' = st' | 
| 51332 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 758 | |> command (head_tr |> set_print false |> reset_trans |> forked_proof); | 
| 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 759 | val end_result = Result (end_tr, st''); | 
| 51324 | 760 | val result = | 
| 51332 
8707df0b0255
refined parallel_proofs = 2: fork whole Isar sub-proofs, not just terminal ones;
 wenzelm parents: 
51324diff
changeset | 761 | Result_List [head_result, Result.get (presentation_context_of st''), end_result]; | 
| 51324 | 762 | in (result, st'') end | 
| 763 | end; | |
| 28433 
b3dab95f098f
begin_proof: avoid race condition wrt. skip_proofs flag;
 wenzelm parents: 
28425diff
changeset | 764 | |
| 6664 | 765 | end; | 
| 51323 | 766 | |
| 767 | end; |