| author | wenzelm | 
| Tue, 25 Aug 2020 14:54:41 +0200 | |
| changeset 72205 | bc71db05abe3 | 
| parent 71925 | bf085daea304 | 
| child 72515 | c7038c397ae3 | 
| permissions | -rw-r--r-- | 
| 67904 | 1 | (*:maxLineLen=78:*) | 
| 2 | ||
| 3 | theory Server | |
| 4 | imports Base | |
| 5 | begin | |
| 6 | ||
| 7 | chapter \<open>The Isabelle server\<close> | |
| 8 | ||
| 9 | text \<open> | |
| 10 | An Isabelle session requires at least two processes, which are both rather | |
| 11 | heavy: Isabelle/Scala for the system infrastructure and Isabelle/ML for the | |
| 12 | logic session (e.g.\ HOL). In principle, these processes can be invoked | |
| 13 |   directly on the command-line, e.g.\ via @{tool java}, @{tool scala}, @{tool
 | |
| 14 |   process}, @{tool console}, but this approach is inadequate for reactive
 | |
| 15 | applications that require quick responses from the prover. | |
| 16 | ||
| 17 | In contrast, the Isabelle server exposes Isabelle/Scala as a | |
| 18 | ``terminate-stay-resident'' application that manages multiple logic | |
| 19 | \<^emph>\<open>sessions\<close> and concurrent tasks to use \<^emph>\<open>theories\<close>. This provides an | |
| 69593 | 20 | analogous to \<^ML>\<open>Thy_Info.use_theories\<close> in Isabelle/ML, but with full | 
| 67904 | 21 | concurrency and Isabelle/PIDE markup. | 
| 22 | ||
| 23 | The client/server arrangement via TCP sockets also opens possibilities for | |
| 24 | remote Isabelle services that are accessed by local applications, e.g.\ via | |
| 25 | an SSH tunnel. | |
| 26 | \<close> | |
| 27 | ||
| 28 | ||
| 29 | section \<open>Command-line tools\<close> | |
| 30 | ||
| 31 | subsection \<open>Server \label{sec:tool-server}\<close>
 | |
| 32 | ||
| 33 | text \<open> | |
| 34 |   The @{tool_def server} tool manages resident server processes:
 | |
| 35 |   @{verbatim [display]
 | |
| 36 | \<open>Usage: isabelle server [OPTIONS] | |
| 37 | ||
| 38 | Options are: | |
| 39 | -L FILE logging on FILE | |
| 40 | -c console interaction with specified server | |
| 41 | -l list servers (alternative operation) | |
| 42 | -n NAME explicit server name (default: isabelle) | |
| 43 | -p PORT explicit server port | |
| 44 | -s assume existing server, no implicit startup | |
| 45 | -x exit specified server (alternative operation) | |
| 46 | ||
| 47 | Manage resident Isabelle servers.\<close>} | |
| 48 | ||
| 49 | The main operation of \<^verbatim>\<open>isabelle server\<close> is to ensure that a named server is | |
| 50 | running, either by finding an already running process (according to the | |
| 69593 | 51 | central database file \<^path>\<open>$ISABELLE_HOME_USER/servers.db\<close>) or by | 
| 67904 | 52 | becoming itself a new server that accepts connections on a particular TCP | 
| 53 | socket. The server name and its address are printed as initial output line. | |
| 54 | If another server instance is already running, the current | |
| 55 | \<^verbatim>\<open>isabelle server\<close> process will terminate; otherwise, it keeps running as a | |
| 56 | new server process until an explicit \<^verbatim>\<open>shutdown\<close> command is received. | |
| 57 | Further details of the server socket protocol are explained in | |
| 58 |   \secref{sec:server-protocol}.
 | |
| 59 | ||
| 60 | Other server management operations are invoked via options \<^verbatim>\<open>-l\<close> and \<^verbatim>\<open>-x\<close> | |
| 61 | (see below). | |
| 62 | ||
| 63 | \<^medskip> | |
| 64 | Option \<^verbatim>\<open>-n\<close> specifies an alternative server name: at most one process for | |
| 65 | each name may run, but each server instance supports multiple connections | |
| 66 | and logic sessions. | |
| 67 | ||
| 68 | \<^medskip> | |
| 69 | Option \<^verbatim>\<open>-p\<close> specifies an explicit TCP port for the server socket (which is | |
| 70 | always on \<^verbatim>\<open>localhost\<close>): the default is to let the operating system assign a | |
| 71 | free port number. | |
| 72 | ||
| 73 | \<^medskip> | |
| 74 | Option \<^verbatim>\<open>-s\<close> strictly assumes that the specified server process is already | |
| 75 | running, skipping the optional server startup phase. | |
| 76 | ||
| 77 | \<^medskip> | |
| 78 | Option \<^verbatim>\<open>-c\<close> connects the console in/out channels after the initial check | |
| 67918 | 79 |   for a suitable server process. Also note that the @{tool client} tool
 | 
| 80 |   (\secref{sec:tool-client}) provides a command-line editor to interact with
 | |
| 81 | the server. | |
| 67904 | 82 | |
| 83 | \<^medskip> | |
| 84 | Option \<^verbatim>\<open>-L\<close> specifies a log file for exceptional output of internal server | |
| 85 | and session operations. | |
| 67918 | 86 | |
| 87 | \<^medskip> | |
| 88 | Operation \<^verbatim>\<open>-l\<close> lists all active server processes with their connection | |
| 89 | details. | |
| 90 | ||
| 91 | \<^medskip> | |
| 92 | Operation \<^verbatim>\<open>-x\<close> exits the specified server process by sending it a | |
| 93 | \<^verbatim>\<open>shutdown\<close> command. | |
| 67904 | 94 | \<close> | 
| 95 | ||
| 96 | ||
| 97 | subsection \<open>Client \label{sec:tool-client}\<close>
 | |
| 98 | ||
| 99 | text \<open> | |
| 67918 | 100 |   The @{tool_def client} tool provides console interaction for Isabelle
 | 
| 101 | servers: | |
| 67904 | 102 |   @{verbatim [display]
 | 
| 103 | \<open>Usage: isabelle client [OPTIONS] | |
| 104 | ||
| 105 | Options are: | |
| 106 | -n NAME explicit server name | |
| 107 | -p PORT explicit server port | |
| 108 | ||
| 109 | Console interaction for Isabelle server (with line-editor).\<close>} | |
| 110 | ||
| 67918 | 111 | This is a wrapper to \<^verbatim>\<open>isabelle server -s -c\<close> for interactive | 
| 112 |   experimentation, which uses @{setting ISABELLE_LINE_EDITOR} if available.
 | |
| 67904 | 113 | The server name is sufficient for identification, as the client can | 
| 114 | determine the connection details from the local database of active servers. | |
| 115 | ||
| 116 | \<^medskip> | |
| 117 |   Option \<^verbatim>\<open>-n\<close> specifies an explicit server name as in @{tool server}.
 | |
| 118 | ||
| 119 | \<^medskip> | |
| 120 |   Option \<^verbatim>\<open>-p\<close> specifies an explicit server port as in @{tool server}.
 | |
| 121 | \<close> | |
| 122 | ||
| 123 | ||
| 124 | subsection \<open>Examples\<close> | |
| 125 | ||
| 126 | text \<open> | |
| 127 | Ensure that a particular server instance is running in the background: | |
| 128 |   @{verbatim [display] \<open>isabelle server -n test &\<close>}
 | |
| 129 | ||
| 67918 | 130 | The first line of output presents the connection details:\<^footnote>\<open>This information | 
| 131 | may be used in other TCP clients, without access to Isabelle/Scala and the | |
| 132 | underlying database of running servers.\<close> | |
| 67904 | 133 |   @{verbatim [display] \<open>server "test" = 127.0.0.1:4711 (password "XYZ")\<close>}
 | 
| 134 | ||
| 135 | \<^medskip> | |
| 136 | List available server processes: | |
| 137 |   @{verbatim [display] \<open>isabelle server -l\<close>}
 | |
| 138 | ||
| 139 | \<^medskip> | |
| 140 | Connect the command-line client to the above test server: | |
| 141 |   @{verbatim [display] \<open>isabelle client -n test\<close>}
 | |
| 142 | ||
| 143 | Interaction now works on a line-by-line basis, with commands like \<^verbatim>\<open>help\<close> or | |
| 144 | \<^verbatim>\<open>echo\<close>. For example, some JSON values may be echoed like this: | |
| 145 | ||
| 146 |   @{verbatim [display]
 | |
| 147 | \<open>echo 42 | |
| 148 | echo [1, 2, 3] | |
| 149 | echo {"a": "text", "b": true, "c": 42}\<close>}
 | |
| 150 | ||
| 151 | Closing the connection (via CTRL-D) leaves the server running: it is | |
| 152 | possible to reconnect again, and have multiple connections at the same time. | |
| 153 | ||
| 154 | \<^medskip> | |
| 67918 | 155 | Exit the named server on the command-line: | 
| 67904 | 156 |   @{verbatim [display] \<open>isabelle server -n test -x\<close>}
 | 
| 157 | \<close> | |
| 158 | ||
| 159 | ||
| 160 | section \<open>Protocol messages \label{sec:server-protocol}\<close>
 | |
| 161 | ||
| 162 | text \<open> | |
| 163 | The Isabelle server listens on a regular TCP socket, using a line-oriented | |
| 67918 | 164 | protocol of structured messages. Input \<^emph>\<open>commands\<close> and output \<^emph>\<open>results\<close> | 
| 67904 | 165 | (via \<^verbatim>\<open>OK\<close> or \<^verbatim>\<open>ERROR\<close>) are strictly alternating on the toplevel, but | 
| 166 | commands may also return a \<^emph>\<open>task\<close> identifier to indicate an ongoing | |
| 167 | asynchronous process that is joined later (via \<^verbatim>\<open>FINISHED\<close> or \<^verbatim>\<open>FAILED\<close>). | |
| 168 | Asynchronous \<^verbatim>\<open>NOTE\<close> messages may occur at any time: they are independent of | |
| 67918 | 169 | the main command-result protocol. | 
| 67904 | 170 | |
| 171 | For example, the synchronous \<^verbatim>\<open>echo\<close> command immediately returns its | |
| 172 | argument as \<^verbatim>\<open>OK\<close> result. In contrast, the asynchronous \<^verbatim>\<open>session_build\<close> | |
| 173 |   command returns \<^verbatim>\<open>OK {"task":\<close>\<open>id\<close>\<^verbatim>\<open>}\<close> and continues in the background. It
 | |
| 174 |   will eventually produce \<^verbatim>\<open>FINISHED {"task":\<close>\<open>id\<close>\<^verbatim>\<open>,\<close>\<open>\<dots>\<close>\<^verbatim>\<open>}\<close> or
 | |
| 175 |   \<^verbatim>\<open>FAILED {"task":\<close>\<open>id\<close>\<^verbatim>\<open>,\<close>\<open>\<dots>\<close>\<^verbatim>\<open>}\<close> with the final result. Intermediately, it
 | |
| 176 |   may emit asynchronous messages of the form \<^verbatim>\<open>NOTE {"task":\<close>\<open>id\<close>\<^verbatim>\<open>,\<close>\<open>\<dots>\<close>\<^verbatim>\<open>}\<close>
 | |
| 177 | to inform about its progress. Due to the explicit task identifier, the | |
| 178 | client can show these messages in the proper context, e.g.\ a GUI window for | |
| 67918 | 179 | this particular session build job. | 
| 67904 | 180 | |
| 181 | \medskip Subsequently, the protocol message formats are described in further | |
| 182 | detail. | |
| 183 | \<close> | |
| 184 | ||
| 185 | ||
| 69464 | 186 | subsection \<open>Byte messages \label{sec:byte-messages}\<close>
 | 
| 67904 | 187 | |
| 188 | text \<open> | |
| 189 | The client-server connection is a raw byte-channel for bidirectional | |
| 190 | communication, but the Isabelle server always works with messages of a | |
| 191 | particular length. Messages are written as a single chunk that is flushed | |
| 192 | immediately. | |
| 193 | ||
| 67918 | 194 | Message boundaries are determined as follows: | 
| 67904 | 195 | |
| 196 | \<^item> A \<^emph>\<open>short message\<close> consists of a single line: it is a sequence of | |
| 197 | arbitrary bytes excluding CR (13) and LF (10), and terminated by CR-LF or | |
| 198 | just LF. | |
| 199 | ||
| 67918 | 200 | \<^item> A \<^emph>\<open>long message\<close> starts with a single that consists only of decimal | 
| 201 | digits: these are interpreted as length of the subsequent block of | |
| 202 | arbitrary bytes. A final line-terminator (as above) may be included here, | |
| 67904 | 203 | but is not required. | 
| 204 | ||
| 205 | Messages in JSON format (see below) always fit on a single line, due to | |
| 206 | escaping of newline characters within string literals. This is convenient | |
| 207 | for interactive experimentation, but it can impact performance for very long | |
| 208 | messages. If the message byte-length is given on the preceding line, the | |
| 67918 | 209 | server can read the message more efficiently as a single block. | 
| 67904 | 210 | \<close> | 
| 211 | ||
| 212 | ||
| 213 | subsection \<open>Text messages\<close> | |
| 214 | ||
| 215 | text \<open> | |
| 216 | Messages are read and written as byte streams (with byte lengths), but the | |
| 217 | content is always interpreted as plain text in terms of the UTF-8 | |
| 218 | encoding.\<^footnote>\<open>See also the ``UTF-8 Everywhere Manifesto'' | |
| 68224 | 219 | \<^url>\<open>https://utf8everywhere.org\<close>.\<close> | 
| 67904 | 220 | |
| 221 | Note that line-endings and other formatting characters are invariant wrt. | |
| 222 | UTF-8 representation of text: thus implementations are free to determine the | |
| 223 | overall message structure before or after applying the text encoding. | |
| 224 | \<close> | |
| 225 | ||
| 226 | ||
| 67917 | 227 | subsection \<open>Input and output messages \label{sec:input-output-messages}\<close>
 | 
| 67904 | 228 | |
| 229 | text \<open> | |
| 230 | Server input and output messages have a uniform format as follows: | |
| 231 | ||
| 232 | \<^item> \<open>name argument\<close> such that: | |
| 233 | ||
| 234 | \<^item> \<open>name\<close> is the longest prefix consisting of ASCII letters, digits, | |
| 67918 | 235 | ``\<^verbatim>\<open>_\<close>'', ``\<^verbatim>\<open>.\<close>'', | 
| 67904 | 236 | |
| 237 | \<^item> the separator between \<open>name\<close> and \<open>argument\<close> is the longest possible | |
| 238 | sequence of ASCII blanks (it could be empty, e.g.\ when the argument | |
| 239 | starts with a quote or bracket), | |
| 240 | ||
| 67918 | 241 | \<^item> \<open>argument\<close> is the rest of the message without line terminator. | 
| 67904 | 242 | |
| 243 | \<^medskip> | |
| 244 | Input messages are sent from the client to the server. Here the \<open>name\<close> | |
| 245 | specifies a \<^emph>\<open>server command\<close>: the list of known commands may be | |
| 246 | retrieved via the \<^verbatim>\<open>help\<close> command. | |
| 247 | ||
| 248 | \<^medskip> | |
| 249 | Output messages are sent from the server to the client. Here the \<open>name\<close> | |
| 250 | specifies the \<^emph>\<open>server reply\<close>, which always has a specific meaning as | |
| 251 | follows: | |
| 252 | ||
| 253 | \<^item> synchronous results: \<^verbatim>\<open>OK\<close> or \<^verbatim>\<open>ERROR\<close> | |
| 254 | \<^item> asynchronous results: \<^verbatim>\<open>FINISHED\<close> or \<^verbatim>\<open>FAILED\<close> | |
| 255 | \<^item> intermediate notifications: \<^verbatim>\<open>NOTE\<close> | |
| 256 | ||
| 257 | \<^medskip> | |
| 258 | The \<open>argument\<close> format is uniform for both input and output messages: | |
| 259 | ||
| 260 | \<^item> empty argument (Scala type \<^verbatim>\<open>Unit\<close>) | |
| 261 | \<^item> XML element in YXML notation (Scala type \<^verbatim>\<open>XML.Elem\<close>) | |
| 262 | \<^item> JSON value (Scala type \<^verbatim>\<open>JSON.T\<close>) | |
| 263 | ||
| 264 | JSON values may consist of objects (records), arrays (lists), strings, | |
| 265 | numbers, bools, null.\<^footnote>\<open>See also the official specification | |
| 266 | \<^url>\<open>https://www.json.org\<close> and unofficial explorations ``Parsing JSON is a | |
| 267 | Minefield'' \<^url>\<open>http://seriot.ch/parsing_json.php\<close>.\<close> Since JSON requires | |
| 268 | explicit quotes and backslash-escapes to represent arbitrary text, the YXML | |
| 269 |   notation for XML trees (\secref{sec:yxml-vs-xml}) works better
 | |
| 270 | for large messages with a lot of PIDE markup. | |
| 271 | ||
| 272 | Nonetheless, the most common commands use JSON by default: big chunks of | |
| 273 | text (theory sources etc.) are taken from the underlying file-system and | |
| 274 | results are pre-formatted for plain-text output, without PIDE markup | |
| 275 | information. This is a concession to simplicity: the server imitates the | |
| 276 | appearance of command-line tools on top of the Isabelle/PIDE infrastructure. | |
| 277 | \<close> | |
| 278 | ||
| 279 | ||
| 280 | subsection \<open>Initial password exchange\<close> | |
| 281 | ||
| 282 | text \<open> | |
| 283 | Whenever a new client opens the server socket, the initial message needs to | |
| 69464 | 284 | be its unique password as a single line, without length indication (i.e.\ a | 
| 285 |   ``short message'' in the sense of \secref{sec:byte-messages}).
 | |
| 286 | ||
| 287 | The server replies either with \<^verbatim>\<open>OK\<close> (and some information about the | |
| 288 | Isabelle version) or by silent disconnection of what is considered an | |
| 289 |   illegal connection attempt. Note that @{tool client} already presents the
 | |
| 290 | correct password internally. | |
| 67904 | 291 | |
| 292 | Server passwords are created as Universally Unique Identifier (UUID) in | |
| 293 | Isabelle/Scala and stored in a per-user database, with restricted | |
| 294 | file-system access only for the current user. The Isabelle/Scala server | |
| 295 | implementation is careful to expose the password only on private output | |
| 296 | channels, and not on a process command-line (which is accessible to other | |
| 297 | users, e.g.\ via the \<^verbatim>\<open>ps\<close> command). | |
| 298 | \<close> | |
| 299 | ||
| 300 | ||
| 301 | subsection \<open>Synchronous commands\<close> | |
| 302 | ||
| 303 | text \<open> | |
| 304 | A \<^emph>\<open>synchronous command\<close> corresponds to regular function application in | |
| 305 | Isabelle/Scala, with single argument and result (regular or error). Both the | |
| 306 | argument and the result may consist of type \<^verbatim>\<open>Unit\<close>, \<^verbatim>\<open>XML.Elem\<close>, \<^verbatim>\<open>JSON.T\<close>. | |
| 307 | An error result typically consists of a JSON object with error message and | |
| 67918 | 308 | potentially further result fields (this resembles exceptions in Scala). | 
| 67904 | 309 | |
| 310 | These are the protocol exchanges for both cases of command execution: | |
| 311 |   \begin{center}
 | |
| 312 |   \begin{tabular}{rl}
 | |
| 313 | \<^bold>\<open>input:\<close> & \<open>command argument\<close> \\ | |
| 314 | (a) regular \<^bold>\<open>output:\<close> & \<^verbatim>\<open>OK\<close> \<open>result\<close> \\ | |
| 315 | (b) error \<^bold>\<open>output:\<close> & \<^verbatim>\<open>ERROR\<close> \<open>result\<close> \\ | |
| 316 |   \end{tabular}
 | |
| 317 |   \end{center}
 | |
| 318 | \<close> | |
| 319 | ||
| 320 | ||
| 321 | subsection \<open>Asynchronous commands\<close> | |
| 322 | ||
| 323 | text \<open> | |
| 324 | An \<^emph>\<open>asynchronous command\<close> corresponds to an ongoing process that finishes | |
| 67918 | 325 | or fails eventually, while emitting arbitrary notifications in between. | 
| 326 | Formally, it starts as synchronous command with immediate result \<^verbatim>\<open>OK\<close> | |
| 327 | giving the \<^verbatim>\<open>task\<close> identifier, or an immediate \<^verbatim>\<open>ERROR\<close> that indicates bad | |
| 328 | command syntax. For a running task, the termination is indicated later by | |
| 329 | \<^verbatim>\<open>FINISHED\<close> or \<^verbatim>\<open>FAILED\<close>, together with its ultimate result value. | |
| 67904 | 330 | |
| 331 | These are the protocol exchanges for various cases of command task | |
| 332 | execution: | |
| 333 | ||
| 334 |   \begin{center}
 | |
| 335 |   \begin{tabular}{rl}
 | |
| 336 | \<^bold>\<open>input:\<close> & \<open>command argument\<close> \\ | |
| 337 |   immediate \<^bold>\<open>output:\<close> & \<^verbatim>\<open>OK {"task":\<close>\<open>id\<close>\<^verbatim>\<open>}\<close> \\
 | |
| 338 |   intermediate \<^bold>\<open>output:\<close> & \<^verbatim>\<open>NOTE {"task":\<close>\<open>id\<close>\<^verbatim>\<open>,\<close>\<open>\<dots>\<close>\<^verbatim>\<open>}\<close> \\
 | |
| 339 |   (a) regular \<^bold>\<open>output:\<close> & \<^verbatim>\<open>FINISHED {"task":\<close>\<open>id\<close>\<^verbatim>\<open>,\<close>\<open>\<dots>\<close>\<^verbatim>\<open>}\<close> \\
 | |
| 340 |   (b) error \<^bold>\<open>output:\<close> & \<^verbatim>\<open>FAILED {"task":\<close>\<open>id\<close>\<^verbatim>\<open>,\<close>\<open>\<dots>\<close>\<^verbatim>\<open>}\<close> \\[3ex]
 | |
| 341 | \<^bold>\<open>input:\<close> & \<open>command argument\<close> \\ | |
| 342 | immediate \<^bold>\<open>output:\<close> & \<^verbatim>\<open>ERROR\<close>~\<open>\<dots>\<close> \\ | |
| 343 |   \end{tabular}
 | |
| 344 |   \end{center}
 | |
| 345 | ||
| 346 | All asynchronous messages are decorated with the task identifier that was | |
| 67918 | 347 | revealed in the immediate (synchronous) result. Thus the client can | 
| 348 | invoke further asynchronous commands and still dispatch the resulting stream of | |
| 67904 | 349 | asynchronous messages properly. | 
| 350 | ||
| 67920 | 351 |   The synchronous command \<^verbatim>\<open>cancel {"task":\<close>~\<open>id\<close>\<^verbatim>\<open>}\<close> tells the specified task
 | 
| 352 | to terminate prematurely: usually causing a \<^verbatim>\<open>FAILED\<close> result, but this is | |
| 353 | not guaranteed: the cancel event may come too late or the running process | |
| 354 | may just ignore it. | |
| 67917 | 355 | \<close> | 
| 356 | ||
| 357 | ||
| 67918 | 358 | section \<open>Types for JSON values \label{sec:json-types}\<close>
 | 
| 67917 | 359 | |
| 360 | text \<open> | |
| 361 | In order to specify concrete JSON types for command arguments and result | |
| 362 | messages, the following type definition language shall be used: | |
| 363 | ||
| 364 | \<^rail>\<open> | |
| 365 |     @{syntax type_def}: @'type' @{syntax name} '=' @{syntax type}
 | |
| 366 | ; | |
| 367 |     @{syntax type}: @{syntax name} | @{syntax value} | 'any' | 'null' |
 | |
| 368 |       'bool' | 'int' | 'long' | 'double' | 'string' | '[' @{syntax type} ']' |
 | |
| 369 |       '{' (@{syntax field_type} ',' *) '}' |
 | |
| 370 |       @{syntax type} '\<oplus>' @{syntax type} |
 | |
| 67918 | 371 |       @{syntax type} '|' @{syntax type} |
 | 
| 372 |       '(' @{syntax type} ')'
 | |
| 67917 | 373 | ; | 
| 374 |     @{syntax field_type}: @{syntax name} ('?'?) ':' @{syntax type}
 | |
| 375 | \<close> | |
| 376 | ||
| 67918 | 377 | This is a simplified variation of TypeScript | 
| 378 | interfaces.\<^footnote>\<open>\<^url>\<open>https://www.typescriptlang.org/docs/handbook/interfaces.html\<close>\<close> | |
| 379 | The meaning of these types is specified wrt. the Isabelle/Scala | |
| 380 | implementation as follows. | |
| 67917 | 381 | |
| 382 | \<^item> A \<open>name\<close> refers to a type defined elsewhere. The environment of type | |
| 383 | definitions is given informally: put into proper foundational order, it | |
| 67918 | 384 | needs to specify a strongly normalizing system of syntactic abbreviations; | 
| 385 | type definitions may not be recursive. | |
| 67917 | 386 | |
| 387 | \<^item> A \<open>value\<close> in JSON notation represents the singleton type of the given | |
| 67918 | 388 | item. For example, the string \<^verbatim>\<open>"error"\<close> can be used as type for a slot that | 
| 389 | is guaranteed to contain that constant. | |
| 67917 | 390 | |
| 391 | \<^item> Type \<open>any\<close> is the super type of all other types: it is an untyped slot in | |
| 392 | the specification and corresponds to \<^verbatim>\<open>Any\<close> or \<^verbatim>\<open>JSON.T\<close> in Isabelle/Scala. | |
| 393 | ||
| 394 | \<^item> Type \<open>null\<close> is the type of the improper value \<open>null\<close>; it corresponds to | |
| 395 | type \<^verbatim>\<open>Null\<close> in Scala and is normally not used in Isabelle/Scala.\<^footnote>\<open>See also | |
| 396 | ``Null References: The Billion Dollar Mistake'' by Tony Hoare | |
| 397 | \<^url>\<open>https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare\<close>.\<close> | |
| 398 | ||
| 67918 | 399 | \<^item> Type \<open>bool\<close> is the type of the truth values \<^verbatim>\<open>true\<close> and \<^verbatim>\<open>false\<close>; it | 
| 67917 | 400 | corresponds to \<^verbatim>\<open>Boolean\<close> in Scala. | 
| 401 | ||
| 402 | \<^item> Types \<open>int\<close>, \<open>long\<close>, \<open>double\<close> are specific versions of the generic | |
| 403 | \<open>number\<close> type, corresponding to \<^verbatim>\<open>Int\<close>, \<^verbatim>\<open>Long\<close>, \<^verbatim>\<open>Double\<close> in Scala, but | |
| 404 | \<^verbatim>\<open>Long\<close> is limited to 53 bit precision.\<^footnote>\<open>Implementations of JSON typically | |
| 405 | standardize \<open>number\<close> to \<^verbatim>\<open>Double\<close>, which can absorb \<^verbatim>\<open>Int\<close> faithfully, but | |
| 406 | not all of \<^verbatim>\<open>Long\<close>.\<close> | |
| 407 | ||
| 408 | \<^item> Type \<open>string\<close> represents Unicode text; it corresponds to type \<^verbatim>\<open>String\<close> in | |
| 409 | Scala. | |
| 410 | ||
| 411 | \<^item> Type \<open>[t]\<close> is the array (or list) type over \<open>t\<close>; it corresponds to | |
| 412 | \<^verbatim>\<open>List[t]\<close> in Scala. The list type is co-variant as usual (i.e.\ monotonic | |
| 67918 | 413 | wrt. the subtype relation). | 
| 67917 | 414 | |
| 415 | \<^item> Object types describe the possible content of JSON records, with field | |
| 416 | names and types. A question mark after a field name means that it is | |
| 67918 | 417 | optional. In Scala this could refer to an explicit type \<^verbatim>\<open>Option[t]\<close>, e.g.\ | 
| 418 |   \<open>{a: int, b?: string}\<close> corresponding to a Scala case class with arguments
 | |
| 419 | \<^verbatim>\<open>a: Int\<close>, \<^verbatim>\<open>b: Option[String]\<close>. | |
| 67917 | 420 | |
| 421 | Alternatively, optional fields can have a default value. If nothing else is | |
| 67918 | 422 | specified, a standard ``empty value'' is used for each type, i.e.\ \<^verbatim>\<open>0\<close> for | 
| 423 | the number types, \<^verbatim>\<open>false\<close> for \<open>bool\<close>, or the empty string, array, object | |
| 424 | etc. | |
| 67917 | 425 | |
| 426 | Object types are \<^emph>\<open>permissive\<close> in the sense that only the specified field | |
| 427 | names need to conform to the given types, but unspecified fields may be | |
| 428 | present as well. | |
| 429 | ||
| 430 | \<^item> The type expression \<open>t\<^sub>1 \<oplus> t\<^sub>2\<close> only works for two object types with | |
| 431 |   disjoint field names: it is the concatenation of the respective @{syntax
 | |
| 432 |   field_type} specifications taken together. For example: \<open>{task: string} \<oplus>
 | |
| 433 |   {ok: bool}\<close> is the equivalent to \<open>{task: string, ok: bool}\<close>.
 | |
| 434 | ||
| 435 | \<^item> The type expression \<open>t\<^sub>1 | t\<^sub>2\<close> is the disjoint union of two types, either | |
| 436 | one of the two cases may occur. | |
| 437 | ||
| 67918 | 438 | \<^item> Parentheses \<open>(t)\<close> merely group type expressions syntactically. | 
| 439 | ||
| 67917 | 440 | |
| 441 | These types correspond to JSON values in an obvious manner, which is not | |
| 442 | further described here. For example, the JSON array \<^verbatim>\<open>[1, 2, 3]\<close> conforms to | |
| 443 | types \<open>[int]\<close>, \<open>[long]\<close>, \<open>[double]\<close>, \<open>[any]\<close>, \<open>any\<close>. | |
| 444 | ||
| 445 | Note that JSON objects require field names to be quoted, but the type | |
| 67918 | 446 |   language omits quotes for clarity. Thus the object \<^verbatim>\<open>{"a": 42, "b": "xyz"}\<close>
 | 
| 447 |   conforms to the type \<open>{a: int, b: string}\<close>, for example.
 | |
| 67917 | 448 | |
| 449 | \<^medskip> | |
| 67918 | 450 | The absence of an argument or result is represented by the Scala type | 
| 451 | \<^verbatim>\<open>Unit\<close>: it is written as empty text in the message \<open>argument\<close> | |
| 67917 | 452 |   (\secref{sec:input-output-messages}). This is not part of the JSON language.
 | 
| 453 | ||
| 454 | Server replies have name tags like \<^verbatim>\<open>OK\<close>, \<^verbatim>\<open>ERROR\<close>: these are used literally | |
| 455 | together with type specifications to indicate the particular name with the | |
| 456 | type of its argument, e.g.\ \<^verbatim>\<open>OK\<close>~\<open>[string]\<close> for a regular result that is a | |
| 457 | list (JSON array) of strings. | |
| 458 | ||
| 459 | \<^bigskip> | |
| 67918 | 460 | Here are some common type definitions, for use in particular specifications | 
| 461 | of command arguments and results. | |
| 67917 | 462 | |
| 463 |   \<^item> \<^bold>\<open>type\<close>~\<open>position = {line?: int, offset?: int, end_offset?: int, file?:
 | |
| 67918 | 464 | string, id?: long}\<close> describes a source position within Isabelle text. Only | 
| 465 | the \<open>line\<close> and \<open>file\<close> fields make immediate sense to external programs. | |
| 67917 | 466 | Detailed \<open>offset\<close> and \<open>end_offset\<close> positions are counted according to | 
| 69593 | 467 |   Isabelle symbols, see \<^ML_type>\<open>Symbol.symbol\<close> in Isabelle/ML @{cite
 | 
| 67918 | 468 | "isabelle-implementation"}. The position \<open>id\<close> belongs to the representation | 
| 469 | of command transactions in the Isabelle/PIDE protocol: it normally does not | |
| 470 | occur in externalized positions. | |
| 67917 | 471 | |
| 67931 
f7917c15b566
field "kind" is always present, with default "writeln";
 wenzelm parents: 
67927diff
changeset | 472 |   \<^item> \<^bold>\<open>type\<close>~\<open>message = {kind: string, message: string, pos?: position}\<close> where
 | 
| 67917 | 473 | the \<open>kind\<close> provides some hint about the role and importance of the message. | 
| 67923 
3e072441c96a
clarified exported messages, e.g. suppress "information", "tracing";
 wenzelm parents: 
67922diff
changeset | 474 | The main message kinds are \<^verbatim>\<open>writeln\<close> (for regular output), \<^verbatim>\<open>warning\<close>, | 
| 67931 
f7917c15b566
field "kind" is always present, with default "writeln";
 wenzelm parents: 
67927diff
changeset | 475 | \<^verbatim>\<open>error\<close>. | 
| 67917 | 476 | |
| 477 |   \<^item> \<^bold>\<open>type\<close>~\<open>error_message = {kind:\<close>~\<^verbatim>\<open>"error"\<close>\<open>, message: string}\<close> refers to
 | |
| 478 | error messages in particular. These occur routinely with \<^verbatim>\<open>ERROR\<close> or | |
| 479 | \<^verbatim>\<open>FAILED\<close> replies, but also as initial command syntax errors (which are | |
| 480 | omitted in the command specifications below). | |
| 481 | ||
| 482 |   \<^item> \<^bold>\<open>type\<close>~\<open>theory_progress = {kind:\<close>~\<^verbatim>\<open>"writeln"\<close>\<open>, message: string, theory:
 | |
| 68957 | 483 | string, session: string, percentage?: int}\<close> reports formal progress in | 
| 484 | loading theories (e.g.\ when building a session image). Apart from a regular | |
| 485 | output message, it also reveals the formal theory name (e.g.\ \<^verbatim>\<open>"HOL.Nat"\<close>) | |
| 486 | and session name (e.g.\ \<^verbatim>\<open>"HOL"\<close>). Note that some rare theory names lack a | |
| 487 | proper session prefix, e.g.\ theory \<^verbatim>\<open>"Main"\<close> in session \<^verbatim>\<open>"HOL"\<close>. The | |
| 488 | optional percentage has the same meaning as in \<^bold>\<open>type\<close>~\<open>node_status\<close> below. | |
| 67917 | 489 | |
| 490 |   \<^item> \<^bold>\<open>type\<close>~\<open>timing = {elapsed: double, cpu: double, gc: double}\<close> refers to
 | |
| 491 | common Isabelle timing information in seconds, usually with a precision of | |
| 492 | three digits after the point (whole milliseconds). | |
| 493 | ||
| 494 | \<^item> \<^bold>\<open>type\<close>~\<open>uuid = string\<close> refers to a Universally Unique Identifier (UUID) | |
| 495 | as plain text.\<^footnote>\<open>See \<^url>\<open>https://www.ietf.org/rfc/rfc4122.txt\<close> and | |
| 71521 
e977609c30eb
formally depend on Java 11 --- discontinue Java 8 workaround;
 wenzelm parents: 
69854diff
changeset | 496 | \<^url>\<open>https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/UUID.html\<close>.\<close> Such | 
| 67917 | 497 | identifiers are created as private random numbers of the server and only | 
| 498 | revealed to the client that creates a certain resource (e.g.\ task or | |
| 499 | session). A client may disclose this information for use in a different | |
| 67918 | 500 | client connection: this allows to share sessions between multiple | 
| 67917 | 501 | connections. | 
| 502 | ||
| 503 | Client commands need to provide syntactically wellformed UUIDs: this is | |
| 504 | trivial to achieve by using only identifiers that have been produced by the | |
| 505 | server beforehand. | |
| 506 | ||
| 507 |   \<^item> \<^bold>\<open>type\<close>~\<open>task = {task: uuid}\<close> identifies a newly created asynchronous task
 | |
| 508 | and thus allows the client to control it by the \<^verbatim>\<open>cancel\<close> command. The same | |
| 67918 | 509 | task identification is included in all messages produced by this task. | 
| 510 | ||
| 67921 | 511 |   \<^item> \<^bold>\<open>type\<close> \<open>session_id = {session_id: uuid}\<close> identifies a newly created PIDE
 | 
| 512 | session managed by the server. Sessions are independent of client | |
| 513 | connections and may be shared by different clients, as long as the internal | |
| 514 | session identifier is known. | |
| 515 | ||
| 67943 | 516 |   \<^item> \<^bold>\<open>type\<close> \<open>node = {node_name: string, theory_name: string}\<close> represents the
 | 
| 517 | internal node name of a theory. The \<open>node_name\<close> is derived from the | |
| 71925 
bf085daea304
clarified sessions: "Notable Examples in Isabelle/HOL";
 wenzelm parents: 
71521diff
changeset | 518 | canonical theory file-name (e.g.\ \<^verbatim>\<open>"~~/src/HOL/Examples/Seq.thy"\<close> after | 
| 67943 | 519 | normalization within the file-system). The \<open>theory_name\<close> is the | 
| 71925 
bf085daea304
clarified sessions: "Notable Examples in Isabelle/HOL";
 wenzelm parents: 
71521diff
changeset | 520 | session-qualified theory name (e.g.\ \<^verbatim>\<open>HOL-Examples.Seq\<close>). | 
| 67943 | 521 | |
| 67918 | 522 |   \<^item> \<^bold>\<open>type\<close> \<open>node_status = {ok: bool, total: int, unprocessed: int, running:
 | 
| 68885 | 523 | int, warned: int, failed: int, finished: int, canceled: bool, consolidated: | 
| 68898 | 524 | bool, percentage: int}\<close> represents a formal theory node status of the PIDE | 
| 525 | document model as follows. | |
| 68882 | 526 | |
| 527 | \<^item> Fields \<open>total\<close>, \<open>unprocessed\<close>, \<open>running\<close>, \<open>warned\<close>, \<open>failed\<close>, \<open>finished\<close> | |
| 528 | account for individual commands within a theory node; \<open>ok\<close> is an | |
| 529 | abstraction for \<open>failed = 0\<close>. | |
| 530 | ||
| 531 | \<^item> The \<open>canceled\<close> flag tells if some command in the theory has been | |
| 532 | spontaneously canceled (by an Interrupt exception that could also | |
| 533 | indicate resource problems). | |
| 534 | ||
| 535 | \<^item> The \<open>consolidated\<close> flag indicates whether the outermost theory command | |
| 536 | structure has finished (or failed) and the final \<^theory_text>\<open>end\<close> command has been | |
| 537 | checked. | |
| 68898 | 538 | |
| 539 | \<^item> The \<open>percentage\<close> field tells how far the node has been processed. It | |
| 540 | ranges between 0 and 99 in normal operation, and reaches 100 when the node | |
| 541 | has been formally consolidated as described above. | |
| 67918 | 542 | \<close> | 
| 543 | ||
| 544 | ||
| 68898 | 545 | |
| 67918 | 546 | section \<open>Server commands and results\<close> | 
| 547 | ||
| 548 | text \<open> | |
| 549 | Here follows an overview of particular Isabelle server commands with their | |
| 550 | results, which are usually represented as JSON values with types according | |
| 551 |   to \secref{sec:json-types}. The general format of input and output messages
 | |
| 552 |   is described in \secref{sec:input-output-messages}. The relevant
 | |
| 553 | Isabelle/Scala source files are: | |
| 554 | ||
| 555 | \<^medskip> | |
| 556 |   \begin{tabular}{l}
 | |
| 557 | \<^file>\<open>$ISABELLE_HOME/src/Pure/Tools/server_commands.scala\<close> \\ | |
| 558 | \<^file>\<open>$ISABELLE_HOME/src/Pure/Tools/server.scala\<close> \\ | |
| 559 | \<^file>\<open>$ISABELLE_HOME/src/Pure/General/json.scala\<close> \\ | |
| 560 |   \end{tabular}
 | |
| 67917 | 561 | \<close> | 
| 562 | ||
| 563 | ||
| 564 | subsection \<open>Command \<^verbatim>\<open>help\<close>\<close> | |
| 565 | ||
| 566 | text \<open> | |
| 567 |   \begin{tabular}{ll}
 | |
| 568 | regular result: & \<^verbatim>\<open>OK\<close> \<open>[string]\<close> \\ | |
| 569 |   \end{tabular}
 | |
| 570 | \<^medskip> | |
| 571 | ||
| 67918 | 572 | The \<^verbatim>\<open>help\<close> command has no argument and returns the list of server command | 
| 573 | names. This is occasionally useful for interactive experimentation (see also | |
| 574 |   @{tool client} in \secref{sec:tool-client}).
 | |
| 67917 | 575 | \<close> | 
| 576 | ||
| 577 | ||
| 578 | subsection \<open>Command \<^verbatim>\<open>echo\<close>\<close> | |
| 579 | ||
| 580 | text \<open> | |
| 581 |   \begin{tabular}{ll}
 | |
| 582 | argument: & \<open>any\<close> \\ | |
| 583 | regular result: & \<^verbatim>\<open>OK\<close> \<open>any\<close> \\ | |
| 584 |   \end{tabular}
 | |
| 585 | \<^medskip> | |
| 586 | ||
| 587 | The \<^verbatim>\<open>echo\<close> command is the identity function: it returns its argument as | |
| 588 | regular result. This is occasionally useful for testing and interactive | |
| 589 |   experimentation (see also @{tool client} in \secref{sec:tool-client}).
 | |
| 590 | ||
| 67918 | 591 | The Scala type of \<^verbatim>\<open>echo\<close> is actually more general than given above: | 
| 592 | \<^verbatim>\<open>Unit\<close>, \<^verbatim>\<open>XML.Elem\<close>, \<^verbatim>\<open>JSON.T\<close> work uniformly. Note that \<^verbatim>\<open>XML.Elem\<close> might | |
| 67917 | 593 | be difficult to type on the console in its YXML syntax | 
| 594 |   (\secref{sec:yxml-vs-xml}).
 | |
| 595 | \<close> | |
| 596 | ||
| 597 | ||
| 598 | subsection \<open>Command \<^verbatim>\<open>shutdown\<close>\<close> | |
| 599 | ||
| 600 | text \<open> | |
| 601 |   \begin{tabular}{ll}
 | |
| 602 | regular result: & \<^verbatim>\<open>OK\<close> \\ | |
| 603 |   \end{tabular}
 | |
| 604 | \<^medskip> | |
| 605 | ||
| 606 | The \<^verbatim>\<open>shutdown\<close> command has no argument and result value. It forces a | |
| 607 | shutdown of the connected server process, stopping all open sessions and | |
| 608 | closing the server socket. This may disrupt pending commands on other | |
| 609 | connections! | |
| 610 | ||
| 611 | \<^medskip> | |
| 67918 | 612 | The command-line invocation \<^verbatim>\<open>isabelle server -x\<close> opens a server connection | 
| 613 |   and issues a \<^verbatim>\<open>shutdown\<close> command (see also \secref{sec:tool-server}).
 | |
| 67917 | 614 | \<close> | 
| 615 | ||
| 616 | ||
| 617 | subsection \<open>Command \<^verbatim>\<open>cancel\<close>\<close> | |
| 618 | ||
| 619 | text \<open> | |
| 620 |   \begin{tabular}{ll}
 | |
| 67920 | 621 | argument: & \<open>task\<close> \\ | 
| 67917 | 622 | regular result: & \<^verbatim>\<open>OK\<close> \\ | 
| 623 |   \end{tabular}
 | |
| 624 | \<^medskip> | |
| 625 | ||
| 67921 | 626 |   The command \<^verbatim>\<open>cancel {"task":\<close>~\<open>id\<close>\<^verbatim>\<open>}\<close> attempts to cancel the specified
 | 
| 627 | task. | |
| 67917 | 628 | |
| 629 | Cancellation is merely a hint that the client prefers an ongoing process to | |
| 630 | be stopped. The command always succeeds formally, but it may get ignored by | |
| 67918 | 631 | a task that is still running; it might also refer to a non-existing or | 
| 632 | no-longer existing task (without producing an error). | |
| 67917 | 633 | |
| 634 | Successful cancellation typically leads to an asynchronous failure of type | |
| 67918 | 635 |   \<^verbatim>\<open>FAILED {\<close>\<open>task: uuid, message:\<close>~\<^verbatim>\<open>"Interrupt"}\<close>. A different message is
 | 
| 636 | also possible, depending how the task handles the event. | |
| 67917 | 637 | \<close> | 
| 638 | ||
| 639 | ||
| 640 | subsection \<open>Command \<^verbatim>\<open>session_build\<close> \label{sec:command-session-build}\<close>
 | |
| 641 | ||
| 642 | text \<open> | |
| 643 |   \begin{tabular}{lll}
 | |
| 644 | argument: & \<open>session_build_args\<close> \\ | |
| 645 | immediate result: & \<^verbatim>\<open>OK\<close> \<open>task\<close> \\ | |
| 646 | notifications: & \<^verbatim>\<open>NOTE\<close> \<open>task \<oplus> (theory_progress | message)\<close> \\ | |
| 647 | regular result: & \<^verbatim>\<open>FINISHED\<close> \<open>task \<oplus> session_build_results\<close> \\ | |
| 648 | error result: & \<^verbatim>\<open>FAILED\<close> \<open>task \<oplus> error_message \<oplus> session_build_results\<close> \\[2ex] | |
| 649 |   \end{tabular}
 | |
| 650 | ||
| 651 |   \begin{tabular}{lll}
 | |
| 652 | \<^bold>\<open>type\<close> \<open>session_build_args =\<close> \\ | |
| 653 |   \quad\<open>{session: string,\<close> \\
 | |
| 654 | \quad~~\<open>preferences?: string,\<close> & \<^bold>\<open>default:\<close> server preferences \\ | |
| 655 | \quad~~\<open>options?: [string],\<close> \\ | |
| 656 | \quad~~\<open>dirs?: [string],\<close> \\ | |
| 67922 
9e668ae81f97
clarified signature: prefer selective include_sessions;
 wenzelm parents: 
67921diff
changeset | 657 | \quad~~\<open>include_sessions: [string],\<close> \\ | 
| 67917 | 658 | \quad~~\<open>verbose?: bool}\<close> \\[2ex] | 
| 67919 
dd90faed43b2
clarified signature: do not expose somewhat accidental internal options;
 wenzelm parents: 
67918diff
changeset | 659 |   \end{tabular}
 | 
| 67917 | 660 | |
| 67919 
dd90faed43b2
clarified signature: do not expose somewhat accidental internal options;
 wenzelm parents: 
67918diff
changeset | 661 |   \begin{tabular}{ll}
 | 
| 67917 | 662 | \<^bold>\<open>type\<close> \<open>session_build_result =\<close> \\ | 
| 663 |   \quad\<open>{session: string,\<close> \\
 | |
| 664 | \quad~~\<open>ok: bool,\<close> \\ | |
| 665 | \quad~~\<open>return_code: int,\<close> \\ | |
| 666 | \quad~~\<open>timeout: bool,\<close> \\ | |
| 67918 | 667 | \quad~~\<open>timing: timing}\<close> \\[2ex] | 
| 668 | ||
| 669 | \<^bold>\<open>type\<close> \<open>session_build_results =\<close> \\ | |
| 670 |   \quad\<open>{ok: bool,\<close> \\
 | |
| 671 | \quad~~\<open>return_code: int,\<close> \\ | |
| 672 | \quad~~\<open>sessions: [session_build_result]}\<close> \\ | |
| 67917 | 673 |   \end{tabular}
 | 
| 674 | \<close> | |
| 675 | ||
| 676 | text \<open> | |
| 67918 | 677 | The \<^verbatim>\<open>session_build\<close> command prepares a session image for interactive use of | 
| 678 |   theories. This is a limited version of command-line tool @{tool build}
 | |
| 679 |   (\secref{sec:tool-build}), with specific options to request a formal context
 | |
| 680 | for an interactive PIDE session. | |
| 67917 | 681 | |
| 682 | The build process is asynchronous, with notifications that inform about the | |
| 67918 | 683 | progress of loaded theories. Some further informative messages are output as | 
| 684 | well. | |
| 67917 | 685 | |
| 686 | Coordination of independent build processes is at the discretion of the | |
| 67918 | 687 |   client (or end-user), just as for @{tool build} and @{tool jedit}. There is
 | 
| 688 | no built-in coordination of conflicting builds with overlapping hierarchies | |
| 689 | of session images. In the worst case, a session image produced by one task | |
| 690 | may get overwritten by another task! | |
| 67917 | 691 | \<close> | 
| 692 | ||
| 693 | ||
| 694 | subsubsection \<open>Arguments\<close> | |
| 695 | ||
| 696 | text \<open> | |
| 67919 
dd90faed43b2
clarified signature: do not expose somewhat accidental internal options;
 wenzelm parents: 
67918diff
changeset | 697 | The \<open>session\<close> field specifies the target session name. The build process | 
| 
dd90faed43b2
clarified signature: do not expose somewhat accidental internal options;
 wenzelm parents: 
67918diff
changeset | 698 | will produce all required ancestor images according to the overall session | 
| 
dd90faed43b2
clarified signature: do not expose somewhat accidental internal options;
 wenzelm parents: 
67918diff
changeset | 699 | graph. | 
| 67917 | 700 | |
| 701 | \<^medskip> | |
| 702 | The environment of Isabelle system options is determined from \<open>preferences\<close> | |
| 703 | that are augmented by \<open>options\<close>, which is a list individual updates of the | |
| 704 | form the \<open>name\<close>\<^verbatim>\<open>=\<close>\<open>value\<close> or \<open>name\<close> (the latter abbreviates | |
| 705 |   \<open>name\<close>\<^verbatim>\<open>=true\<close>); see also command-line option \<^verbatim>\<open>-o\<close> for @{tool build}. The
 | |
| 706 | preferences are loaded from the file | |
| 707 | \<^path>\<open>$ISABELLE_HOME_USER/etc/preferences\<close> by default, but the client may | |
| 708 | provide alternative contents for it (as text, not a file-name). This could | |
| 709 | be relevant in situations where client and server run in different | |
| 710 | operating-system contexts. | |
| 711 | ||
| 712 | \<^medskip> | |
| 67918 | 713 | The \<open>dirs\<close> field specifies additional directories for session ROOT and ROOTS | 
| 714 |   files (\secref{sec:session-root}). This augments the name space of available
 | |
| 715 |   sessions; see also option \<^verbatim>\<open>-d\<close> in @{tool build}.
 | |
| 67917 | 716 | |
| 717 | \<^medskip> | |
| 67922 
9e668ae81f97
clarified signature: prefer selective include_sessions;
 wenzelm parents: 
67921diff
changeset | 718 | The \<open>include_sessions\<close> field specifies sessions whose theories should be | 
| 
9e668ae81f97
clarified signature: prefer selective include_sessions;
 wenzelm parents: 
67921diff
changeset | 719 | included in the overall name space of session-qualified theory names. This | 
| 
9e668ae81f97
clarified signature: prefer selective include_sessions;
 wenzelm parents: 
67921diff
changeset | 720 | corresponds to a \<^bold>\<open>sessions\<close> specification in ROOT files | 
| 
9e668ae81f97
clarified signature: prefer selective include_sessions;
 wenzelm parents: 
67921diff
changeset | 721 |   (\secref{sec:session-root}). It enables the \<^verbatim>\<open>use_theories\<close> command
 | 
| 
9e668ae81f97
clarified signature: prefer selective include_sessions;
 wenzelm parents: 
67921diff
changeset | 722 |   (\secref{sec:command-use-theories}) to refer to sources from other sessions
 | 
| 
9e668ae81f97
clarified signature: prefer selective include_sessions;
 wenzelm parents: 
67921diff
changeset | 723 | in a robust manner, instead of relying on directory locations. | 
| 67917 | 724 | |
| 725 | \<^medskip> | |
| 67918 | 726 | The \<open>verbose\<close> field set to \<^verbatim>\<open>true\<close> yields extra verbosity. The effect is | 
| 67917 | 727 |   similar to option \<^verbatim>\<open>-v\<close> in @{tool build}.
 | 
| 728 | \<close> | |
| 729 | ||
| 730 | ||
| 731 | subsubsection \<open>Intermediate output\<close> | |
| 732 | ||
| 733 | text \<open> | |
| 734 | The asynchronous notifications of command \<^verbatim>\<open>session_build\<close> mainly serve as | |
| 735 | progress indicator: the output resembles that of the session build window of | |
| 736 |   Isabelle/jEdit after startup @{cite "isabelle-jedit"}.
 | |
| 737 | ||
| 738 | For the client it is usually sufficient to print the messages in plain text, | |
| 67918 | 739 | but note that \<open>theory_progress\<close> also reveals formal \<open>theory\<close> and | 
| 740 | \<open>session\<close> names directly. | |
| 67917 | 741 | \<close> | 
| 742 | ||
| 743 | ||
| 744 | subsubsection \<open>Results\<close> | |
| 745 | ||
| 746 | text \<open> | |
| 67918 | 747 | The overall \<open>session_build_results\<close> contain both a summary and an entry | 
| 748 | \<open>session_build_result\<close> for each session in the build hierarchy. The result | |
| 749 | is always provided, independently of overall success (\<^verbatim>\<open>FINISHED\<close> task) or | |
| 750 | failure (\<^verbatim>\<open>FAILED\<close> task). | |
| 67917 | 751 | |
| 752 | The \<open>ok\<close> field tells abstractly, whether all required session builds came | |
| 67918 | 753 | out as \<open>ok\<close>, i.e.\ with zero \<open>return_code\<close>. A non-zero \<open>return_code\<close> | 
| 754 | indicates an error according to usual POSIX conventions for process exit. | |
| 755 | ||
| 756 | The individual \<open>session_build_result\<close> entries provide extra fields: | |
| 67917 | 757 | |
| 67918 | 758 | \<^item> \<open>timeout\<close> tells if the build process was aborted after running too long, | 
| 759 | ||
| 760 | \<^item> \<open>timing\<close> gives the overall process timing in the usual Isabelle format | |
| 761 | with elapsed, CPU, GC time. | |
| 67917 | 762 | \<close> | 
| 763 | ||
| 764 | ||
| 765 | subsubsection \<open>Examples\<close> | |
| 766 | ||
| 767 | text \<open> | |
| 768 | Build of a session image from the Isabelle distribution: | |
| 769 |   @{verbatim [display] \<open>session_build {"session": "HOL-Word"}\<close>}
 | |
| 770 | ||
| 771 | Build a session image from the Archive of Formal Proofs: | |
| 772 |   @{verbatim [display] \<open>session_build {"session": "Coinductive", "dirs": ["$AFP_BASE/thys"]}\<close>}
 | |
| 773 | \<close> | |
| 774 | ||
| 775 | ||
| 776 | subsection \<open>Command \<^verbatim>\<open>session_start\<close> \label{sec:command-session-start}\<close>
 | |
| 777 | ||
| 778 | text \<open> | |
| 779 |   \begin{tabular}{lll}
 | |
| 780 |   argument: & \<open>session_build_args \<oplus> {print_mode?: [string]}\<close> \\
 | |
| 781 | immediate result: & \<^verbatim>\<open>OK\<close> \<open>task\<close> \\ | |
| 782 | notifications: & \<^verbatim>\<open>NOTE\<close> \<open>task \<oplus> (theory_progress | message)\<close> \\ | |
| 67925 | 783 |   regular result: & \<^verbatim>\<open>FINISHED\<close> \<open>task \<oplus> session_id \<oplus> {tmp_dir: string}\<close> \\
 | 
| 67917 | 784 | error result: & \<^verbatim>\<open>FAILED\<close> \<open>task \<oplus> error_message\<close> \\[2ex] | 
| 785 |   \end{tabular}
 | |
| 786 | ||
| 787 | \<^medskip> | |
| 788 | The \<^verbatim>\<open>session_start\<close> command starts a new Isabelle/PIDE session with | |
| 789 | underlying Isabelle/ML process, based on a session image that it produces on | |
| 67918 | 790 | demand using \<^verbatim>\<open>session_build\<close>. Thus it accepts all \<open>session_build_args\<close> and | 
| 791 | produces similar notifications, but the detailed \<open>session_build_results\<close> are | |
| 792 | omitted. | |
| 67917 | 793 | |
| 794 | The session build and startup process is asynchronous: when the task is | |
| 67918 | 795 | finished, the session remains active for commands, until a \<^verbatim>\<open>session_stop\<close> | 
| 796 | or \<^verbatim>\<open>shutdown\<close> command is sent to the server. | |
| 67917 | 797 | |
| 798 | Sessions are independent of client connections: it is possible to start a | |
| 799 | session and later apply \<^verbatim>\<open>use_theories\<close> on different connections, as long as | |
| 67918 | 800 | the internal session identifier is known: shared theory imports will be used | 
| 801 | only once (and persist until purged explicitly). | |
| 67917 | 802 | \<close> | 
| 803 | ||
| 804 | ||
| 805 | subsubsection \<open>Arguments\<close> | |
| 806 | ||
| 807 | text \<open> | |
| 67918 | 808 | Most arguments are shared with \<^verbatim>\<open>session_build\<close> | 
| 67917 | 809 |   (\secref{sec:command-session-build}).
 | 
| 810 | ||
| 811 | \<^medskip> | |
| 812 | The \<open>print_mode\<close> field adds identifiers of print modes to be made active for | |
| 813 | this session. For example, \<^verbatim>\<open>"print_mode": ["ASCII"]\<close> prefers ASCII | |
| 814 | replacement syntax over mathematical Isabelle symbols. See also option \<^verbatim>\<open>-m\<close> | |
| 815 |   in @{tool process} (\secref{sec:tool-process}).
 | |
| 816 | \<close> | |
| 817 | ||
| 818 | ||
| 819 | subsubsection \<open>Results\<close> | |
| 820 | ||
| 821 | text \<open> | |
| 67921 | 822 | The \<open>session_id\<close> provides the internal identification of the session object | 
| 823 | within the sever process. It can remain active as long as the server is | |
| 824 | running, independently of the current client connection. | |
| 67925 | 825 | |
| 826 | \<^medskip> | |
| 67946 | 827 | The \<open>tmp_dir\<close> field refers to a temporary directory that is specifically | 
| 67925 | 828 | created for this session and deleted after it has been stopped. This may | 
| 829 | serve as auxiliary file-space for the \<^verbatim>\<open>use_theories\<close> command, but | |
| 830 | concurrent use requires some care in naming temporary files, e.g.\ by | |
| 831 | using sub-directories with globally unique names. | |
| 67946 | 832 | |
| 833 | As \<open>tmp_dir\<close> is the default \<open>master_dir\<close> for commands \<^verbatim>\<open>use_theories\<close> and | |
| 834 | \<^verbatim>\<open>purge_theories\<close>, theory files copied there may be used without further | |
| 835 | path specification. | |
| 67917 | 836 | \<close> | 
| 837 | ||
| 838 | ||
| 68145 | 839 | subsubsection \<open>Examples\<close> | 
| 67917 | 840 | |
| 841 | text \<open> | |
| 842 | Start a default Isabelle/HOL session: | |
| 843 |   @{verbatim [display] \<open>session_start {"session": "HOL"}\<close>}
 | |
| 67918 | 844 | |
| 845 | Start a session from the Archive of Formal Proofs: | |
| 846 |   @{verbatim [display] \<open>session_start {"session": "Coinductive", "dirs": ["$AFP_BASE/thys"]}\<close>}
 | |
| 67917 | 847 | \<close> | 
| 848 | ||
| 849 | ||
| 850 | subsection \<open>Command \<^verbatim>\<open>session_stop\<close>\<close> | |
| 851 | ||
| 852 | text \<open> | |
| 853 |   \begin{tabular}{ll}
 | |
| 67921 | 854 | argument: & \<open>session_id\<close> \\ | 
| 67917 | 855 | immediate result: & \<^verbatim>\<open>OK\<close> \<open>task\<close> \\ | 
| 856 | regular result: & \<^verbatim>\<open>FINISHED\<close> \<open>task \<oplus> session_stop_result\<close> \\ | |
| 857 | error result: & \<^verbatim>\<open>FAILED\<close> \<open>task \<oplus> error_message \<oplus> session_stop_result\<close> \\[2ex] | |
| 858 |   \end{tabular}
 | |
| 859 | ||
| 860 |   \begin{tabular}{l}
 | |
| 861 |   \<^bold>\<open>type\<close> \<open>session_stop_result = {ok: bool, return_code: int}\<close>
 | |
| 862 |   \end{tabular}
 | |
| 863 | ||
| 864 | \<^medskip> | |
| 67918 | 865 | The \<^verbatim>\<open>session_stop\<close> command forces a shutdown of the identified PIDE | 
| 866 | session. This asynchronous tasks usually finishes quickly. Failure only | |
| 867 | happens in unusual situations, according to the return code of the | |
| 67917 | 868 | underlying Isabelle/ML process. | 
| 869 | \<close> | |
| 870 | ||
| 871 | ||
| 872 | subsubsection \<open>Arguments\<close> | |
| 873 | ||
| 874 | text \<open> | |
| 67921 | 875 | The \<open>session_id\<close> provides the UUID originally created by the server for this | 
| 876 | session. | |
| 67917 | 877 | \<close> | 
| 878 | ||
| 879 | ||
| 880 | subsubsection \<open>Results\<close> | |
| 881 | ||
| 882 | text \<open> | |
| 67918 | 883 | The \<open>ok\<close> field tells abstractly, whether the Isabelle/ML process has | 
| 884 | terminated properly. | |
| 885 | ||
| 886 | The \<open>return_code\<close> field expresses this information according to usual POSIX | |
| 887 | conventions for process exit. | |
| 67917 | 888 | \<close> | 
| 889 | ||
| 890 | ||
| 891 | subsection \<open>Command \<^verbatim>\<open>use_theories\<close> \label{sec:command-use-theories}\<close>
 | |
| 892 | ||
| 893 | text \<open> | |
| 894 |   \begin{tabular}{ll}
 | |
| 895 | argument: & \<open>use_theories_arguments\<close> \\ | |
| 67941 | 896 | immediate result: & \<^verbatim>\<open>OK\<close> \<open>task\<close> \\ | 
| 897 | regular result: & \<^verbatim>\<open>FINISHED\<close> \<open>use_theories_results\<close> \\ | |
| 67917 | 898 |   \end{tabular}
 | 
| 899 | ||
| 900 |   \begin{tabular}{ll}
 | |
| 901 | \<^bold>\<open>type\<close> \<open>use_theories_arguments =\<close> \\ | |
| 902 |   \quad\<open>{session_id: uuid,\<close> \\
 | |
| 67940 
b4e80f062fbf
clarified signature -- eliminated somewhat pointless positions;
 wenzelm parents: 
67938diff
changeset | 903 | \quad~~\<open>theories: [string],\<close> \\ | 
| 67946 | 904 | \quad~~\<open>master_dir?: string,\<close> & \<^bold>\<open>default:\<close> session \<open>tmp_dir\<close> \\ | 
| 68152 
619de043389f
guard result exports via export_pattern -- avoid bombing client via huge blobs;
 wenzelm parents: 
68145diff
changeset | 905 | \quad~~\<open>pretty_margin?: double,\<close> & \<^bold>\<open>default:\<close> \<^verbatim>\<open>76\<close> \\ | 
| 
619de043389f
guard result exports via export_pattern -- avoid bombing client via huge blobs;
 wenzelm parents: 
68145diff
changeset | 906 | \quad~~\<open>unicode_symbols?: bool,\<close> \\ | 
| 68694 
03e104be99af
added check_delay / check_limit for more robust treatment of structurally broken theory sources (or genuine non-termination);
 wenzelm parents: 
68523diff
changeset | 907 | \quad~~\<open>export_pattern?: string,\<close> \\ | 
| 
03e104be99af
added check_delay / check_limit for more robust treatment of structurally broken theory sources (or genuine non-termination);
 wenzelm parents: 
68523diff
changeset | 908 | \quad~~\<open>check_delay?: double,\<close> & \<^bold>\<open>default:\<close> \<^verbatim>\<open>0.5\<close> \\ | 
| 68770 
add44e2b8cb0
optional notification of nodes_status (via progress);
 wenzelm parents: 
68695diff
changeset | 909 | \quad~~\<open>check_limit?: int,\<close> \\ | 
| 68947 | 910 | \quad~~\<open>watchdog_timeout?: double,\<close> & \<^bold>\<open>default:\<close> \<^verbatim>\<open>600.0\<close> \\ | 
| 68770 
add44e2b8cb0
optional notification of nodes_status (via progress);
 wenzelm parents: 
68695diff
changeset | 911 | \quad~~\<open>nodes_status_delay?: double}\<close> & \<^bold>\<open>default:\<close> \<^verbatim>\<open>-1.0\<close> \\ | 
| 67946 | 912 |   \end{tabular}
 | 
| 67917 | 913 | |
| 67946 | 914 |   \begin{tabular}{ll}
 | 
| 68106 | 915 | \<^bold>\<open>type\<close> \<open>export =\<close> \\ | 
| 916 |   \quad~~\<open>{name: string, base64: bool, body: string}\<close> \\
 | |
| 917 | \<^bold>\<open>type\<close> \<open>node_results =\<close> \\ | |
| 918 |   \quad~~\<open>{status: node_status, messages: [message], exports: [export]}\<close> \\
 | |
| 68770 
add44e2b8cb0
optional notification of nodes_status (via progress);
 wenzelm parents: 
68695diff
changeset | 919 | \<^bold>\<open>type\<close> \<open>nodes_status =\<close> \\ | 
| 
add44e2b8cb0
optional notification of nodes_status (via progress);
 wenzelm parents: 
68695diff
changeset | 920 |   \quad~~\<open>[node \<oplus> {status: node_status}]\<close> \\
 | 
| 67917 | 921 | \<^bold>\<open>type\<close> \<open>use_theories_results =\<close> \\ | 
| 922 |   \quad\<open>{ok: bool,\<close> \\
 | |
| 923 | \quad~~\<open>errors: [message],\<close> \\ | |
| 68106 | 924 | \quad~~\<open>nodes: [node \<oplus> node_results]}\<close> \\ | 
| 67917 | 925 |   \end{tabular}
 | 
| 926 | ||
| 927 | \<^medskip> | |
| 67918 | 928 | The \<^verbatim>\<open>use_theories\<close> command updates the identified session by adding the | 
| 929 | current version of theory files to it, while dependencies are resolved | |
| 68883 
3653b3ad729e
clarified Thy_Resources.Session.use_theories: "terminated" node status is sufficient;
 wenzelm parents: 
68882diff
changeset | 930 | implicitly. The command succeeds eventually, when all theories have status | 
| 
3653b3ad729e
clarified Thy_Resources.Session.use_theories: "terminated" node status is sufficient;
 wenzelm parents: 
68882diff
changeset | 931 | \<^emph>\<open>terminated\<close> or \<^emph>\<open>consolidated\<close> in the sense of \<open>node_status\<close> | 
| 
3653b3ad729e
clarified Thy_Resources.Session.use_theories: "terminated" node status is sufficient;
 wenzelm parents: 
68882diff
changeset | 932 |   (\secref{sec:json-types}).
 | 
| 67917 | 933 | |
| 67941 | 934 | Already used theories persist in the session until purged explicitly | 
| 935 |   (\secref{sec:command-purge-theories}). This also means that repeated
 | |
| 936 | invocations of \<^verbatim>\<open>use_theories\<close> are idempotent: it could make sense to do | |
| 937 | that with different values for \<open>pretty_margin\<close> or \<open>unicode_symbols\<close> to get | |
| 938 | different formatting for \<open>errors\<close> or \<open>messages\<close>. | |
| 68106 | 939 | |
| 68152 
619de043389f
guard result exports via export_pattern -- avoid bombing client via huge blobs;
 wenzelm parents: 
68145diff
changeset | 940 | \<^medskip> A non-empty \<open>export_pattern\<close> means that theory \<open>exports\<close> are retrieved | 
| 
619de043389f
guard result exports via export_pattern -- avoid bombing client via huge blobs;
 wenzelm parents: 
68145diff
changeset | 941 |   (see \secref{sec:tool-export}). An \<open>export\<close> \<open>name\<close> roughly follows
 | 
| 
619de043389f
guard result exports via export_pattern -- avoid bombing client via huge blobs;
 wenzelm parents: 
68145diff
changeset | 942 | file-system standards: ``\<^verbatim>\<open>/\<close>'' separated list of base names (excluding | 
| 
619de043389f
guard result exports via export_pattern -- avoid bombing client via huge blobs;
 wenzelm parents: 
68145diff
changeset | 943 | special names like ``\<^verbatim>\<open>.\<close>'' or ``\<^verbatim>\<open>..\<close>''). The \<open>base64\<close> field specifies the | 
| 
619de043389f
guard result exports via export_pattern -- avoid bombing client via huge blobs;
 wenzelm parents: 
68145diff
changeset | 944 | format of the \<open>body\<close> string: it is true for a byte vector that cannot be | 
| 
619de043389f
guard result exports via export_pattern -- avoid bombing client via huge blobs;
 wenzelm parents: 
68145diff
changeset | 945 | represented as plain text in UTF-8 encoding, which means the string needs to | 
| 
619de043389f
guard result exports via export_pattern -- avoid bombing client via huge blobs;
 wenzelm parents: 
68145diff
changeset | 946 | be decoded as in \<^verbatim>\<open>java.util.Base64.getDecoder.decode(String)\<close>. | 
| 68694 
03e104be99af
added check_delay / check_limit for more robust treatment of structurally broken theory sources (or genuine non-termination);
 wenzelm parents: 
68523diff
changeset | 947 | |
| 68883 
3653b3ad729e
clarified Thy_Resources.Session.use_theories: "terminated" node status is sufficient;
 wenzelm parents: 
68882diff
changeset | 948 | \<^medskip> The status of PIDE processing is checked every \<open>check_delay\<close> seconds, and | 
| 
3653b3ad729e
clarified Thy_Resources.Session.use_theories: "terminated" node status is sufficient;
 wenzelm parents: 
68882diff
changeset | 949 | bounded by \<open>check_limit\<close> attempts (default: 0, i.e.\ unbounded). A | 
| 68908 | 950 | \<open>check_limit > 0\<close> effectively specifies a global timeout of \<open>check_delay \<times> | 
| 68883 
3653b3ad729e
clarified Thy_Resources.Session.use_theories: "terminated" node status is sufficient;
 wenzelm parents: 
68882diff
changeset | 951 | check_limit\<close> seconds. | 
| 68770 
add44e2b8cb0
optional notification of nodes_status (via progress);
 wenzelm parents: 
68695diff
changeset | 952 | |
| 68908 | 953 | \<^medskip> If \<open>watchdog_timeout\<close> is greater than 0, it specifies the timespan (in | 
| 954 | seconds) after the last command status change of Isabelle/PIDE, before | |
| 955 | finishing with a potentially non-terminating or deadlocked execution. | |
| 956 | ||
| 68770 
add44e2b8cb0
optional notification of nodes_status (via progress);
 wenzelm parents: 
68695diff
changeset | 957 | \<^medskip> A non-negative \<open>nodes_status_delay\<close> enables continuous notifications of | 
| 
add44e2b8cb0
optional notification of nodes_status (via progress);
 wenzelm parents: 
68695diff
changeset | 958 | kind \<open>nodes_status\<close>, with a field of name and type \<open>nodes_status\<close>. The time | 
| 
add44e2b8cb0
optional notification of nodes_status (via progress);
 wenzelm parents: 
68695diff
changeset | 959 | interval is specified in seconds; by default it is negative and thus | 
| 
add44e2b8cb0
optional notification of nodes_status (via progress);
 wenzelm parents: 
68695diff
changeset | 960 | disabled. | 
| 67917 | 961 | \<close> | 
| 962 | ||
| 963 | ||
| 964 | subsubsection \<open>Arguments\<close> | |
| 965 | ||
| 966 | text \<open> | |
| 967 | The \<open>session_id\<close> is the identifier provided by the server, when the session | |
| 968 | was created (possibly on a different client connection). | |
| 969 | ||
| 970 | \<^medskip> | |
| 67918 | 971 | The \<open>theories\<close> field specifies theory names as in theory \<^theory_text>\<open>imports\<close> or in | 
| 67940 
b4e80f062fbf
clarified signature -- eliminated somewhat pointless positions;
 wenzelm parents: 
67938diff
changeset | 972 | ROOT \<^bold>\<open>theories\<close>. | 
| 67917 | 973 | |
| 67941 | 974 | \<^medskip> | 
| 975 | The \<open>master_dir\<close> field specifies the master directory of imported theories: | |
| 976 | it acts like the ``current working directory'' for locating theory files. | |
| 67946 | 977 | This is irrelevant for \<open>theories\<close> with an absolute path name (e.g.\ | 
| 71925 
bf085daea304
clarified sessions: "Notable Examples in Isabelle/HOL";
 wenzelm parents: 
71521diff
changeset | 978 | \<^verbatim>\<open>"~~/src/HOL/Examples/Seq.thy"\<close>) or session-qualified theory name (e.g.\ | 
| 
bf085daea304
clarified sessions: "Notable Examples in Isabelle/HOL";
 wenzelm parents: 
71521diff
changeset | 979 | \<^verbatim>\<open>"HOL-Examples.Seq"\<close>). | 
| 67917 | 980 | |
| 981 | \<^medskip> | |
| 982 | The \<open>pretty_margin\<close> field specifies the line width for pretty-printing. The | |
| 67918 | 983 | default is suitable for classic console output. Formatting happens at the | 
| 984 | end of \<^verbatim>\<open>use_theories\<close>, when all prover messages are exported to the client. | |
| 67917 | 985 | |
| 986 | \<^medskip> | |
| 67918 | 987 | The \<open>unicode_symbols\<close> field set to \<^verbatim>\<open>true\<close> renders message output for direct | 
| 988 | output on a Unicode capable channel, ideally with the Isabelle fonts as in | |
| 989 | Isabelle/jEdit. The default is to keep the symbolic representation of | |
| 990 | Isabelle text, e.g.\ \<^verbatim>\<open>\<forall>\<close> instead of its rendering as \<open>\<forall>\<close>. This means the | |
| 991 | client needs to perform its own rendering before presenting it to the | |
| 992 | end-user. | |
| 67917 | 993 | \<close> | 
| 994 | ||
| 67918 | 995 | |
| 67917 | 996 | subsubsection \<open>Results\<close> | 
| 997 | ||
| 998 | text \<open> | |
| 999 | The \<open>ok\<close> field indicates overall success of processing the specified | |
| 1000 | theories with all their dependencies. | |
| 1001 | ||
| 67918 | 1002 | When \<open>ok\<close> is \<^verbatim>\<open>false\<close>, the \<open>errors\<close> field lists all errors cumulatively | 
| 1003 | (including imported theories). The messages contain position information for | |
| 1004 | the original theory nodes. | |
| 67917 | 1005 | |
| 1006 | \<^medskip> | |
| 67918 | 1007 | The \<open>nodes\<close> field provides detailed information about each imported theory | 
| 1008 | node. The individual fields are as follows: | |
| 67917 | 1009 | |
| 67943 | 1010 | \<^item> \<open>node_name\<close>: the canonical name for the theory node, based on its | 
| 67918 | 1011 | file-system location; | 
| 67917 | 1012 | |
| 67943 | 1013 | \<^item> \<open>theory_name\<close>: the logical theory name; | 
| 67917 | 1014 | |
| 1015 | \<^item> \<open>status\<close>: the overall node status, e.g.\ see the visualization in the | |
| 1016 |   \<open>Theories\<close> panel of Isabelle/jEdit @{cite "isabelle-jedit"};
 | |
| 1017 | ||
| 67918 | 1018 | \<^item> \<open>messages\<close>: the main bulk of prover messages produced in this theory | 
| 67931 
f7917c15b566
field "kind" is always present, with default "writeln";
 wenzelm parents: 
67927diff
changeset | 1019 | (with kind \<^verbatim>\<open>writeln\<close>, \<^verbatim>\<open>warning\<close>, \<^verbatim>\<open>error\<close>). | 
| 67917 | 1020 | \<close> | 
| 1021 | ||
| 1022 | ||
| 1023 | subsubsection \<open>Examples\<close> | |
| 1024 | ||
| 1025 | text \<open> | |
| 1026 | Process some example theory from the Isabelle distribution, within the | |
| 1027 | context of an already started session for Isabelle/HOL (see also | |
| 1028 |   \secref{sec:command-session-start}):
 | |
| 71925 
bf085daea304
clarified sessions: "Notable Examples in Isabelle/HOL";
 wenzelm parents: 
71521diff
changeset | 1029 |   @{verbatim [display] \<open>use_theories {"session_id": ..., "theories": ["~~/src/HOL/Examples/Seq"]}\<close>}
 | 
| 67917 | 1030 | |
| 1031 | \<^medskip> | |
| 1032 | Process some example theories in the context of their (single) parent | |
| 1033 | session: | |
| 1034 | ||
| 1035 |   @{verbatim [display] \<open>session_start {"session": "HOL-Library"}
 | |
| 1036 | use_theories {"session_id": ..., "theories": ["~~/src/HOL/Unix/Unix"]}
 | |
| 1037 | session_stop {"session_id": ...}\<close>}
 | |
| 67922 
9e668ae81f97
clarified signature: prefer selective include_sessions;
 wenzelm parents: 
67921diff
changeset | 1038 | |
| 
9e668ae81f97
clarified signature: prefer selective include_sessions;
 wenzelm parents: 
67921diff
changeset | 1039 | \<^medskip> | 
| 
9e668ae81f97
clarified signature: prefer selective include_sessions;
 wenzelm parents: 
67921diff
changeset | 1040 | Process some example theories that import other theories via | 
| 
9e668ae81f97
clarified signature: prefer selective include_sessions;
 wenzelm parents: 
67921diff
changeset | 1041 | session-qualified theory names: | 
| 
9e668ae81f97
clarified signature: prefer selective include_sessions;
 wenzelm parents: 
67921diff
changeset | 1042 | |
| 
9e668ae81f97
clarified signature: prefer selective include_sessions;
 wenzelm parents: 
67921diff
changeset | 1043 |   @{verbatim [display] \<open>session_start {"session": "HOL", "include_sessions": ["HOL-Unix"]}
 | 
| 
9e668ae81f97
clarified signature: prefer selective include_sessions;
 wenzelm parents: 
67921diff
changeset | 1044 | use_theories {"session_id": ..., "theories": ["HOL-Unix.Unix"]}
 | 
| 
9e668ae81f97
clarified signature: prefer selective include_sessions;
 wenzelm parents: 
67921diff
changeset | 1045 | session_stop {"session_id": ...}\<close>}
 | 
| 67904 | 1046 | \<close> | 
| 1047 | ||
| 67941 | 1048 | |
| 1049 | subsection \<open>Command \<^verbatim>\<open>purge_theories\<close> \label{sec:command-purge-theories}\<close>
 | |
| 1050 | ||
| 1051 | text \<open> | |
| 1052 |   \begin{tabular}{ll}
 | |
| 1053 | argument: & \<open>purge_theories_arguments\<close> \\ | |
| 1054 | regular result: & \<^verbatim>\<open>OK\<close> \<open>purge_theories_result\<close> \\ | |
| 1055 |   \end{tabular}
 | |
| 1056 | ||
| 67946 | 1057 |   \begin{tabular}{lll}
 | 
| 67941 | 1058 | \<^bold>\<open>type\<close> \<open>purge_theories_arguments =\<close> \\ | 
| 1059 |   \quad\<open>{session_id: uuid,\<close> \\
 | |
| 1060 | \quad~~\<open>theories: [string],\<close> \\ | |
| 67946 | 1061 | \quad~~\<open>master_dir?: string,\<close> & \<^bold>\<open>default:\<close> session \<open>tmp_dir\<close> \\ | 
| 67941 | 1062 | \quad~~\<open>all?: bool}\<close> \\[2ex] | 
| 1063 |   \end{tabular}
 | |
| 1064 | ||
| 1065 |   \begin{tabular}{ll}
 | |
| 1066 |   \<^bold>\<open>type\<close> \<open>purge_theories_result = {purged: [string]}\<close> \\
 | |
| 1067 |   \end{tabular}
 | |
| 1068 | ||
| 1069 | \<^medskip> | |
| 1070 | The \<^verbatim>\<open>purge_theories\<close> command updates the identified session by removing | |
| 1071 | theories that are no longer required: theories that are used in pending | |
| 1072 | \<^verbatim>\<open>use_theories\<close> tasks or imported by other theories are retained. | |
| 1073 | \<close> | |
| 1074 | ||
| 1075 | ||
| 1076 | subsubsection \<open>Arguments\<close> | |
| 1077 | ||
| 1078 | text \<open> | |
| 1079 | The \<open>session_id\<close> is the identifier provided by the server, when the session | |
| 1080 | was created (possibly on a different client connection). | |
| 1081 | ||
| 1082 | \<^medskip> | |
| 1083 | The \<open>theories\<close> field specifies theory names to be purged: imported | |
| 1084 | dependencies are \<^emph>\<open>not\<close> completed. Instead it is possible to provide the | |
| 1085 | already completed import graph returned by \<^verbatim>\<open>use_theories\<close> as \<open>nodes\<close> / | |
| 1086 | \<open>node_name\<close>. | |
| 1087 | ||
| 1088 | \<^medskip> | |
| 67943 | 1089 | The \<open>master_dir\<close> field specifies the master directory as in \<^verbatim>\<open>use_theories\<close>. | 
| 67946 | 1090 | This is irrelevant, when passing fully-qualified theory node names (e.g.\ | 
| 67943 | 1091 | \<open>node_name\<close> from \<open>nodes\<close> in \<open>use_theories_results\<close>). | 
| 67941 | 1092 | |
| 1093 | \<^medskip> | |
| 1094 | The \<open>all\<close> field set to \<^verbatim>\<open>true\<close> attempts to purge all presently loaded | |
| 1095 | theories. | |
| 1096 | \<close> | |
| 1097 | ||
| 1098 | ||
| 1099 | subsubsection \<open>Results\<close> | |
| 1100 | ||
| 1101 | text \<open> | |
| 67943 | 1102 | The \<open>purged\<close> field gives the theory nodes that were actually removed. | 
| 1103 | ||
| 1104 | \<^medskip> | |
| 1105 | The \<open>retained\<close> field gives the remaining theory nodes, i.e.\ the complement | |
| 1106 | of \<open>purged\<close>. | |
| 67941 | 1107 | \<close> | 
| 1108 | ||
| 67904 | 1109 | end |