| author | haftmann | 
| Tue, 24 Jul 2007 15:20:53 +0200 | |
| changeset 23955 | f1ba12c117ec | 
| 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: 
3200 
diff
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: 
104 
diff
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: 
104 
diff
changeset
 | 
128  | 
use : string -> unit  | 
| 
 
9ba8bff1addc
added chapter "Defining Theories" and made changes for new Readthy functions
 
clasohm 
parents: 
104 
diff
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: 
3200 
diff
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: 
9695 
diff
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:  |