| author | aspinall | 
| Mon, 19 Nov 2007 13:42:09 +0100 | |
| changeset 25445 | 01f3686f4304 | 
| parent 12831 | a2a3896f9c48 | 
| child 28504 | 7ad7d7d6df47 | 
| permissions | -rw-r--r-- | 
| 3200 | 1 | |
| 104 | 2 | %% $Id$ | 
| 3108 | 3 | |
| 286 | 4 | \chapter{Basic Use of Isabelle}\index{sessions|(} 
 | 
| 3108 | 5 | The Reference Manual is a comprehensive description of Isabelle | 
| 6 | proper, including all \ML{} commands, functions and packages.  It
 | |
| 7 | really is intended for reference, perhaps for browsing, but not for | |
| 8 | reading through. It is not a tutorial, but assumes familiarity with | |
| 9 | the basic logical concepts of Isabelle. | |
| 104 | 10 | |
| 286 | 11 | When you are looking for a way of performing some task, scan the Table of | 
| 12 | Contents for a relevant heading. Functions are organized by their purpose, | |
| 13 | by their operands (subgoals, tactics, theorems), and by their usefulness. | |
| 14 | In each section, basic functions appear first, then advanced functions, and | |
| 322 | 15 | finally esoteric functions. Use the Index when you are looking for the | 
| 16 | definition of a particular Isabelle function. | |
| 104 | 17 | |
| 6568 | 18 | A few examples are presented. Many example files are distributed with | 
| 286 | 19 | Isabelle, however; please experiment interactively. | 
| 104 | 20 | |
| 21 | ||
| 22 | \section{Basic interaction with Isabelle}
 | |
| 2225 | 23 | \index{starting up|bold}\nobreak
 | 
| 24 | % | |
| 6568 | 25 | We assume that your local Isabelle administrator (this might be you!) has | 
| 26 | already installed the Isabelle system together with appropriate object-logics | |
| 27 | --- otherwise see the \texttt{README} and \texttt{INSTALL} files in the
 | |
| 28 | top-level directory of the distribution on how to do this. | |
| 3108 | 29 | |
| 30 | \medskip Let $\langle isabellehome \rangle$ denote the location where | |
| 3485 
f27a30a18a17
Now there are TWO spaces after each full stop, so that the Emacs sentence
 paulson parents: 
3200diff
changeset | 31 | the distribution has been installed. To run Isabelle from a the shell | 
| 4317 | 32 | prompt within an ordinary text terminal session, simply type | 
| 3108 | 33 | \begin{ttbox}
 | 
| 34 | \({\langle}isabellehome{\rangle}\)/bin/isabelle
 | |
| 35 | \end{ttbox}
 | |
| 6568 | 36 | This should start an interactive \ML{} session with the default object-logic
 | 
| 9695 | 37 | (usually HOL) already pre-loaded. | 
| 3108 | 38 | |
| 6568 | 39 | Subsequently, we assume that the \texttt{isabelle} executable is determined
 | 
| 40 | automatically by the shell, e.g.\ by adding {\tt \(\langle isabellehome
 | |
| 41 |   \rangle\)/bin} to your search path.\footnote{Depending on your installation,
 | |
| 7990 | 42 | there may be stand-alone binaries located in some global directory such as | 
| 43 |   \texttt{/usr/bin}.  Do not attempt to copy {\tt \(\langle isabellehome
 | |
| 44 |     \rangle\)/bin/isabelle}, though!  See \texttt{isatool install} in
 | |
| 45 |   \emph{The Isabelle System Manual} of how to do this properly.}
 | |
| 3108 | 46 | |
| 6571 | 47 | \medskip | 
| 48 | ||
| 6568 | 49 | The object-logic image to load may be also specified explicitly as an argument | 
| 50 | to the {\tt isabelle} command, e.g.
 | |
| 3108 | 51 | \begin{ttbox}
 | 
| 52 | isabelle FOL | |
| 53 | \end{ttbox}
 | |
| 6568 | 54 | This should put you into the world of polymorphic first-order logic (assuming | 
| 9695 | 55 | that an image of FOL has been pre-built). | 
| 2225 | 56 | |
| 6568 | 57 | \index{saving your session|bold} Isabelle provides no means of storing
 | 
| 58 | theorems or internal proof objects on files. Theorems are simply part of the | |
| 59 | \ML{} state.  To save your work between sessions, you may dump the \ML{}
 | |
| 60 | system state to a file. This is done automatically when ending the session | |
| 61 | normally (e.g.\ by typing control-D), provided that the image has been opened | |
| 62 | \emph{writable} in the first place.  The standard object-logic images are
 | |
| 63 | usually read-only, so you have to create a private working copy first. For | |
| 64 | example, the following shell command puts you into a writable Isabelle session | |
| 9695 | 65 | of name \texttt{Foo} that initially contains just plain HOL:
 | 
| 3108 | 66 | \begin{ttbox}
 | 
| 6568 | 67 | isabelle HOL Foo | 
| 3108 | 68 | \end{ttbox}
 | 
| 69 | Ending the \texttt{Foo} session with control-D will cause the complete
 | |
| 6568 | 70 | \ML-world to be saved somewhere in your home directory\footnote{The default
 | 
| 71 |   location is in \texttt{\~\relax/isabelle/heaps}, but this depends on your
 | |
| 72 | local configuration.}. Make sure there is enough space available! Then one | |
| 73 | may later continue at exactly the same point by running | |
| 3108 | 74 | \begin{ttbox}
 | 
| 75 | isabelle Foo | |
| 76 | \end{ttbox}
 | |
| 104 | 77 | |
| 6568 | 78 | \medskip Saving the {\ML} state is not enough.  Record, on a file, the
 | 
| 79 | top-level commands that generate your theories and proofs. Such a record | |
| 80 | allows you to replay the proofs whenever required, for instance after making | |
| 6571 | 81 | minor changes to the axioms. Ideally, these sources will be somewhat | 
| 6568 | 82 | intelligible to others as a formal description of your work. | 
| 3108 | 83 | |
| 6568 | 84 | It is good practice to put all source files that constitute a separate | 
| 85 | Isabelle session into an individual directory, together with an {\ML} file
 | |
| 86 | called \texttt{ROOT.ML} that contains appropriate commands to load all other
 | |
| 87 | files required.  Running \texttt{isabelle} with option \texttt{-u}
 | |
| 88 | automatically loads \texttt{ROOT.ML} on entering the session.  The
 | |
| 6571 | 89 | \texttt{isatool usedir} utility provides some more options to manage Isabelle
 | 
| 6568 | 90 | sessions, such as automatic generation of theory browsing information. | 
| 104 | 91 | |
| 6568 | 92 | \medskip More details about the \texttt{isabelle} and \texttt{isatool}
 | 
| 93 | commands may be found in \emph{The Isabelle System Manual}.
 | |
| 94 | ||
| 95 | \medskip There are more comfortable user interfaces than the bare-bones \ML{}
 | |
| 96 | top-level run from a text terminal.  The \texttt{Isabelle} executable (note
 | |
| 97 | the capital I) runs one such interface, depending on your local configuration. | |
| 98 | Again, see \emph{The Isabelle System Manual} for more information.
 | |
| 104 | 99 | |
| 100 | ||
| 101 | \section{Ending a session}
 | |
| 102 | \begin{ttbox} 
 | |
| 3108 | 103 | quit : unit -> unit | 
| 104 | exit : int -> unit | |
| 6067 | 105 | commit : unit -> bool | 
| 104 | 106 | \end{ttbox}
 | 
| 322 | 107 | \begin{ttdescription}
 | 
| 3108 | 108 | \item[\ttindexbold{quit}();] ends the Isabelle session, without saving
 | 
| 109 | the state. | |
| 4317 | 110 | |
| 111 | \item[\ttindexbold{exit} \(i\);] similar to {\tt quit}, passing return
 | |
| 112 | code \(i\) to the operating system. | |
| 104 | 113 | |
| 3108 | 114 | \item[\ttindexbold{commit}();] saves the current state without ending
 | 
| 6067 | 115 | the session, provided that the logic image is opened read-write; | 
| 116 |   return value {\tt false} indicates an error.
 | |
| 322 | 117 | \end{ttdescription}
 | 
| 104 | 118 | |
| 3108 | 119 | Typing control-D also finishes the session in essentially the same way | 
| 120 | as the sequence {\tt commit(); quit();} would.
 | |
| 104 | 121 | |
| 122 | ||
| 322 | 123 | \section{Reading ML files}
 | 
| 124 | \index{files!reading}
 | |
| 104 | 125 | \begin{ttbox} 
 | 
| 138 
9ba8bff1addc
added chapter "Defining Theories" and made changes for new Readthy functions
 clasohm parents: 
104diff
changeset | 126 | cd : string -> unit | 
| 884 | 127 | pwd : unit -> string | 
| 138 
9ba8bff1addc
added chapter "Defining Theories" and made changes for new Readthy functions
 clasohm parents: 
104diff
changeset | 128 | use : string -> unit | 
| 
9ba8bff1addc
added chapter "Defining Theories" and made changes for new Readthy functions
 clasohm parents: 
104diff
changeset | 129 | time_use : string -> unit | 
| 104 | 130 | \end{ttbox}
 | 
| 322 | 131 | \begin{ttdescription}
 | 
| 4317 | 132 | \item[\ttindexbold{cd} "{\it dir}";] changes the current directory to
 | 
| 133 |   {\it dir}.  This is the default directory for reading files.
 | |
| 134 | ||
| 135 | \item[\ttindexbold{pwd}();] returns the full path of the current
 | |
| 136 | directory. | |
| 884 | 137 | |
| 322 | 138 | \item[\ttindexbold{use} "$file$";]  
 | 
| 104 | 139 | reads the given {\it file} as input to the \ML{} session.  Reading a file
 | 
| 140 | of Isabelle commands is the usual way of replaying a proof. | |
| 141 | ||
| 322 | 142 | \item[\ttindexbold{time_use} "$file$";]  
 | 
| 104 | 143 | performs {\tt use~"$file$"} and prints the total execution time.
 | 
| 322 | 144 | \end{ttdescription}
 | 
| 104 | 145 | |
| 6343 | 146 | The $dir$ and $file$ specifications of the \texttt{cd} and \texttt{use}
 | 
| 147 | commands may contain path variables (e.g.\ \texttt{\$ISABELLE_HOME}) that are
 | |
| 148 | expanded appropriately.  Note that \texttt{\~\relax} abbreviates
 | |
| 149 | \texttt{\$HOME}, and \texttt{\~\relax\~\relax} abbreviates
 | |
| 6571 | 150 | \texttt{\$ISABELLE_HOME}\index{*\$ISABELLE_HOME}.  The syntax for path
 | 
| 151 | specifications follows Unix conventions. | |
| 6568 | 152 | |
| 153 | ||
| 154 | \section{Reading theories}\label{sec:intro-theories}
 | |
| 155 | \index{theories!reading}
 | |
| 156 | ||
| 157 | In Isabelle, any kind of declarations, definitions, etc.\ are organized around | |
| 158 | named \emph{theory} objects.  Logical reasoning always takes place within a
 | |
| 159 | certain theory context, which may be switched at any time. Theory $name$ is | |
| 160 | defined by a theory file $name$\texttt{.thy}, containing declarations of
 | |
| 161 | \texttt{consts}, \texttt{types}, \texttt{defs}, etc.\ (see
 | |
| 162 | \S\ref{sec:ref-defining-theories} for more details on concrete syntax).
 | |
| 163 | Furthermore, there may be an associated {\ML} file $name$\texttt{.ML} with
 | |
| 164 | proof scripts that are to be run in the context of the theory. | |
| 165 | ||
| 166 | \begin{ttbox}
 | |
| 167 | context : theory -> unit | |
| 168 | the_context : unit -> theory | |
| 169 | theory : string -> theory | |
| 170 | use_thy : string -> unit | |
| 171 | time_use_thy : string -> unit | |
| 7136 | 172 | update_thy : string -> unit | 
| 6568 | 173 | \end{ttbox}
 | 
| 174 | ||
| 175 | \begin{ttdescription}
 | |
| 176 | ||
| 177 | \item[\ttindexbold{context} $thy$;] switches the current theory context.  Any
 | |
| 178 |   subsequent command with ``implicit theory argument'' (e.g.\ \texttt{Goal})
 | |
| 179 | will refer to $thy$ as its theory. | |
| 180 | ||
| 181 | \item[\ttindexbold{the_context}();] obtains the current theory context, or
 | |
| 182 | raises an error if absent. | |
| 183 | ||
| 6569 | 184 | \item[\ttindexbold{theory} "$name$";] retrieves the theory called $name$ from
 | 
| 8136 | 185 | the internal data\-base of loaded theories, raising an error if absent. | 
| 6568 | 186 | |
| 6569 | 187 | \item[\ttindexbold{use_thy} "$name$";] reads theory $name$ from the file
 | 
| 6571 | 188 |   system, looking for $name$\texttt{.thy} and $name$\texttt{.ML} (the latter
 | 
| 189 | being optional). It also ensures that all parent theories are loaded as | |
| 190 | well. In case some older versions have already been present, | |
| 191 |   \texttt{use_thy} only tries to reload $name$ itself, but is content with any
 | |
| 192 | version of its ancestors. | |
| 6568 | 193 | |
| 6569 | 194 | \item[\ttindexbold{time_use_thy} "$name$";] same as \texttt{use_thy}, but
 | 
| 6568 | 195 |   reports the time taken to process the actual theory parts and {\ML} files
 | 
| 196 | separately. | |
| 7592 | 197 | |
| 7136 | 198 | \item[\ttindexbold{update_thy} "$name$";] is similar to \texttt{use_thy}, but
 | 
| 199 | ensures that theory $name$ is fully up-to-date with respect to the file | |
| 7592 | 200 | system --- apart from theory $name$ itself, any of its ancestors may be | 
| 201 | reloaded as well. | |
| 6568 | 202 | |
| 203 | \end{ttdescription}
 | |
| 204 | ||
| 9695 | 205 | Note that theories of pre-built logic images (e.g.\ HOL) are marked as | 
| 7282 | 206 | \emph{finished} and cannot be updated any more.  See \S\ref{sec:more-theories}
 | 
| 207 | for further information on Isabelle's theory loader. | |
| 4274 | 208 | |
| 104 | 209 | |
| 3108 | 210 | \section{Setting flags}
 | 
| 211 | \begin{ttbox}
 | |
| 212 | set : bool ref -> bool | |
| 213 | reset : bool ref -> bool | |
| 214 | toggle : bool ref -> bool | |
| 215 | \end{ttbox}\index{*set}\index{*reset}\index{*toggle}
 | |
| 3485 
f27a30a18a17
Now there are TWO spaces after each full stop, so that the Emacs sentence
 paulson parents: 
3200diff
changeset | 216 | These are some shorthands for manipulating boolean references. The new | 
| 3108 | 217 | value is returned. | 
| 218 | ||
| 219 | ||
| 508 | 220 | \section{Printing of terms and theorems}\label{sec:printing-control}
 | 
| 322 | 221 | \index{printing control|(}
 | 
| 104 | 222 | Isabelle's pretty printer is controlled by a number of parameters. | 
| 223 | ||
| 224 | \subsection{Printing limits}
 | |
| 225 | \begin{ttbox} 
 | |
| 226 | Pretty.setdepth : int -> unit | |
| 227 | Pretty.setmargin : int -> unit | |
| 228 | print_depth : int -> unit | |
| 229 | \end{ttbox}
 | |
| 4317 | 230 | These set limits for terminal output.  See also {\tt goals_limit},
 | 
| 231 | which limits the number of subgoals printed | |
| 232 | (\S\ref{sec:goals-printing}).
 | |
| 104 | 233 | |
| 322 | 234 | \begin{ttdescription}
 | 
| 6571 | 235 | \item[\ttindexbold{Pretty.setdepth} \(d\);] tells Isabelle's pretty printer to
 | 
| 236 | limit the printing depth to~$d$. This affects the display of theorems and | |
| 237 | terms. The default value is~0, which permits printing to an arbitrary | |
| 238 | depth. Useful values for $d$ are~10 and~20. | |
| 104 | 239 | |
| 322 | 240 | \item[\ttindexbold{Pretty.setmargin} \(m\);]  
 | 
| 241 | tells Isabelle's pretty printer to assume a right margin (page width) | |
| 4317 | 242 | of~$m$. The initial margin is~76. | 
| 104 | 243 | |
| 322 | 244 | \item[\ttindexbold{print_depth} \(n\);]  
 | 
| 245 |   limits the printing depth of complex \ML{} values, such as theorems and
 | |
| 246 |   terms.  This command affects the \ML{} top level and its effect is
 | |
| 247 | compiler-dependent. Typically $n$ should be less than~10. | |
| 248 | \end{ttdescription}
 | |
| 104 | 249 | |
| 250 | ||
| 4317 | 251 | \subsection{Printing of hypotheses, brackets, types etc.}
 | 
| 322 | 252 | \index{meta-assumptions!printing of}
 | 
| 253 | \index{types!printing of}\index{sorts!printing of}
 | |
| 104 | 254 | \begin{ttbox} 
 | 
| 12831 
a2a3896f9c48
reset show_hyps by default (in accordance to existing Isar practice);
 wenzelm parents: 
9695diff
changeset | 255 | show_hyps     : bool ref \hfill{\bf initially false}
 | 
| 6343 | 256 | show_tags     : bool ref \hfill{\bf initially false}
 | 
| 508 | 257 | show_brackets : bool ref \hfill{\bf initially false}
 | 
| 258 | show_types    : bool ref \hfill{\bf initially false}
 | |
| 259 | show_sorts    : bool ref \hfill{\bf initially false}
 | |
| 4317 | 260 | show_consts   : bool ref \hfill{\bf initially false}
 | 
| 4543 | 261 | long_names    : bool ref \hfill{\bf initially false}
 | 
| 104 | 262 | \end{ttbox}
 | 
| 322 | 263 | These flags allow you to control how much information is displayed for | 
| 4317 | 264 | types, terms and theorems.  The hypotheses of theorems \emph{are}
 | 
| 265 | normally shown. Superfluous parentheses of types and terms are not. | |
| 266 | Types and sorts of variables are normally hidden. | |
| 267 | ||
| 268 | Note that displaying types and sorts may explain why a polymorphic | |
| 269 | inference rule fails to resolve with some goal, or why a rewrite rule | |
| 270 | does not apply as expected. | |
| 104 | 271 | |
| 322 | 272 | \begin{ttdescription}
 | 
| 4543 | 273 | |
| 4317 | 274 | \item[reset \ttindexbold{show_hyps};] makes Isabelle show each
 | 
| 275 | meta-level hypothesis as a dot. | |
| 276 | ||
| 6343 | 277 | \item[set \ttindexbold{show_tags};] makes Isabelle show tags of theorems
 | 
| 278 | (which are basically just comments that may be attached by some tools). | |
| 279 | ||
| 4317 | 280 | \item[set \ttindexbold{show_brackets};] makes Isabelle show full
 | 
| 281 | bracketing. In particular, this reveals the grouping of infix | |
| 282 | operators. | |
| 283 | ||
| 284 | \item[set \ttindexbold{show_types};] makes Isabelle show types when
 | |
| 285 | printing a term or theorem. | |
| 286 | ||
| 287 | \item[set \ttindexbold{show_sorts};] makes Isabelle show both types
 | |
| 288 | and the sorts of type variables, independently of the value of | |
| 289 |   \texttt{show_types}.
 | |
| 8908 | 290 | |
| 291 | \item[set \ttindexbold{show_consts};] makes Isabelle show types of constants
 | |
| 292 | when printing proof states. Note that the output can be enormous as | |
| 293 | polymorphic constants often occur at several different type instances. | |
| 508 | 294 | |
| 4543 | 295 | \item[set \ttindexbold{long_names};] forces names of all objects
 | 
| 296 | (types, constants, theorems, etc.) to be printed in their fully | |
| 297 | qualified internal form. | |
| 298 | ||
| 322 | 299 | \end{ttdescription}
 | 
| 104 | 300 | |
| 301 | ||
| 6618 | 302 | \subsection{Eta-contraction before printing}
 | 
| 104 | 303 | \begin{ttbox} 
 | 
| 9231 | 304 | eta_contract: bool ref | 
| 104 | 305 | \end{ttbox}
 | 
| 306 | The {\bf $\eta$-contraction law} asserts $(\lambda x.f(x))\equiv f$,
 | |
| 307 | provided $x$ is not free in ~$f$.  It asserts {\bf extensionality} of
 | |
| 308 | functions: $f\equiv g$ if $f(x)\equiv g(x)$ for all~$x$. Higher-order | |
| 332 | 309 | unification frequently puts terms into a fully $\eta$-expanded form. For | 
| 158 | 310 | example, if $F$ has type $(\tau\To\tau)\To\tau$ then its expanded form is | 
| 311 | $\lambda h.F(\lambda x.h(x))$. By default, the user sees this expanded | |
| 312 | form. | |
| 104 | 313 | |
| 322 | 314 | \begin{ttdescription}
 | 
| 4317 | 315 | \item[set \ttindexbold{eta_contract};]
 | 
| 104 | 316 | makes Isabelle perform $\eta$-contractions before printing, so that | 
| 317 | $\lambda h.F(\lambda x.h(x))$ appears simply as~$F$. The | |
| 318 | distinction between a term and its $\eta$-expanded form occasionally | |
| 319 | matters. | |
| 322 | 320 | \end{ttdescription}
 | 
| 321 | \index{printing control|)}
 | |
| 104 | 322 | |
| 4317 | 323 | \section{Diagnostic messages}
 | 
| 324 | \index{error messages}
 | |
| 325 | \index{warnings}
 | |
| 326 | ||
| 6568 | 327 | Isabelle conceptually provides three output channels for different kinds of | 
| 328 | messages: ordinary text, warnings, errors. Depending on the user interface | |
| 329 | involved, these messages may appear in different text styles or colours. | |
| 4317 | 330 | |
| 331 | The default setup of an \texttt{isabelle} terminal session is as
 | |
| 332 | follows: plain output of ordinary text, warnings prefixed by | |
| 333 | \texttt{\#\#\#}'s, errors prefixed by \texttt{***}'s.  For example, a
 | |
| 334 | typical warning would look like this: | |
| 335 | \begin{ttbox}
 | |
| 336 | \#\#\# Beware the Jabberwock, my son! | |
| 337 | \#\#\# The jaws that bite, the claws that catch! | |
| 338 | \#\#\# Beware the Jubjub Bird, and shun | |
| 339 | \#\#\# The frumious Bandersnatch! | |
| 340 | \end{ttbox}
 | |
| 341 | ||
| 342 | \texttt{ML} programs may output diagnostic messages using the
 | |
| 343 | following functions: | |
| 344 | \begin{ttbox}
 | |
| 345 | writeln : string -> unit | |
| 346 | warning : string -> unit | |
| 347 | error : string -> 'a | |
| 348 | \end{ttbox}
 | |
| 349 | Note that \ttindex{error} fails by raising exception \ttindex{ERROR}
 | |
| 350 | after having output the text, while \ttindex{writeln} and
 | |
| 351 | \ttindex{warning} resume normal program execution.
 | |
| 352 | ||
| 104 | 353 | |
| 354 | \section{Displaying exceptions as error messages}
 | |
| 322 | 355 | \index{exceptions!printing of}
 | 
| 104 | 356 | \begin{ttbox} 
 | 
| 357 | print_exn: exn -> 'a | |
| 358 | \end{ttbox}
 | |
| 359 | Certain Isabelle primitives, such as the forward proof functions {\tt RS}
 | |
| 360 | and {\tt RSN}, are called both interactively and from programs.  They
 | |
| 361 | indicate errors not by printing messages, but by raising exceptions. For | |
| 4317 | 362 | interactive use, \ML's reporting of an uncaught exception may be | 
| 322 | 363 | uninformative.  The Poly/ML function {\tt exception_trace} can generate a
 | 
| 364 | backtrace.\index{Poly/{\ML} compiler}
 | |
| 104 | 365 | |
| 322 | 366 | \begin{ttdescription}
 | 
| 104 | 367 | \item[\ttindexbold{print_exn} $e$] 
 | 
| 368 | displays the exception~$e$ in a readable manner, and then re-raises~$e$. | |
| 322 | 369 | Typical usage is~\hbox{\tt $EXP$ handle e => print_exn e;}, where
 | 
| 370 | $EXP$ is an expression that may raise an exception. | |
| 104 | 371 | |
| 372 | {\tt print_exn} can display the following common exceptions, which concern
 | |
| 373 | types, terms, theorems and theories, respectively. Each carries a message | |
| 374 | and related information. | |
| 375 | \begin{ttbox} 
 | |
| 376 | exception TYPE of string * typ list * term list | |
| 377 | exception TERM of string * term list | |
| 378 | exception THM of string * int * thm list | |
| 379 | exception THEORY of string * theory list | |
| 380 | \end{ttbox}
 | |
| 322 | 381 | \end{ttdescription}
 | 
| 382 | \begin{warn}
 | |
| 383 |   {\tt print_exn} prints terms by calling \ttindex{prin}, which obtains
 | |
| 384 | pretty printing information from the proof state last stored in the | |
| 385 | subgoal module. The appearance of the output thus depends upon the | |
| 386 | theory used in the last interactive proof. | |
| 387 | \end{warn}
 | |
| 104 | 388 | |
| 389 | \index{sessions|)}
 | |
| 5371 | 390 | |
| 391 | ||
| 392 | %%% Local Variables: | |
| 393 | %%% mode: latex | |
| 394 | %%% TeX-master: "ref" | |
| 395 | %%% End: |