doc-src/TutorialI/basics.tex
author chaieb
Wed, 19 May 2004 11:23:59 +0200
changeset 14758 af3b71a46a1c
parent 13814 5402c2eaf393
child 15136 1275417e3930
permissions -rw-r--r--
A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller. the tactic has also changed and allows the abstaction over fuction occurences whose type is nat or int.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12668
b839bd6e06c6 \chapter{The Basics};
wenzelm
parents: 12473
diff changeset
     1
\chapter{The Basics}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
     2
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
     3
\section{Introduction}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
     4
11405
paulson
parents: 11301
diff changeset
     5
This book is a tutorial on how to use the theorem prover Isabelle/HOL as a
paulson
parents: 11301
diff changeset
     6
specification and verification system. Isabelle is a generic system for
paulson
parents: 11301
diff changeset
     7
implementing logical formalisms, and Isabelle/HOL is the specialization
paulson
parents: 11301
diff changeset
     8
of Isabelle for HOL, which abbreviates Higher-Order Logic. We introduce
paulson
parents: 11301
diff changeset
     9
HOL step by step following the equation
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    10
\[ \mbox{HOL} = \mbox{Functional Programming} + \mbox{Logic}. \]
11456
7eb63f63e6c6 revisions and indexing
paulson
parents: 11450
diff changeset
    11
We do not assume that you are familiar with mathematical logic. 
7eb63f63e6c6 revisions and indexing
paulson
parents: 11450
diff changeset
    12
However, we do assume that
7eb63f63e6c6 revisions and indexing
paulson
parents: 11450
diff changeset
    13
you are used to logical and set theoretic notation, as covered
7eb63f63e6c6 revisions and indexing
paulson
parents: 11450
diff changeset
    14
in a good discrete mathematics course~\cite{Rosen-DMA}, and
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
    15
that you are familiar with the basic concepts of functional
11209
a8cb33f6cf9c *** empty log message ***
nipkow
parents: 11205
diff changeset
    16
programming~\cite{Bird-Haskell,Hudak-Haskell,paulson-ml2,Thompson-Haskell}.
a8cb33f6cf9c *** empty log message ***
nipkow
parents: 11205
diff changeset
    17
Although this tutorial initially concentrates on functional programming, do
a8cb33f6cf9c *** empty log message ***
nipkow
parents: 11205
diff changeset
    18
not be misled: HOL can express most mathematical concepts, and functional
a8cb33f6cf9c *** empty log message ***
nipkow
parents: 11205
diff changeset
    19
programming is just one particularly simple and ubiquitous instance.
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    20
11205
67cec35dbc58 *** empty log message ***
nipkow
parents: 10983
diff changeset
    21
Isabelle~\cite{paulson-isa-book} is implemented in ML~\cite{SML}.  This has
67cec35dbc58 *** empty log message ***
nipkow
parents: 10983
diff changeset
    22
influenced some of Isabelle/HOL's concrete syntax but is otherwise irrelevant
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
    23
for us: this tutorial is based on
11213
aeb5c72dd72a *** empty log message ***
nipkow
parents: 11209
diff changeset
    24
Isabelle/Isar~\cite{isabelle-isar-ref}, an extension of Isabelle which hides
aeb5c72dd72a *** empty log message ***
nipkow
parents: 11209
diff changeset
    25
the implementation language almost completely.  Thus the full name of the
aeb5c72dd72a *** empty log message ***
nipkow
parents: 11209
diff changeset
    26
system should be Isabelle/Isar/HOL, but that is a bit of a mouthful.
aeb5c72dd72a *** empty log message ***
nipkow
parents: 11209
diff changeset
    27
aeb5c72dd72a *** empty log message ***
nipkow
parents: 11209
diff changeset
    28
There are other implementations of HOL, in particular the one by Mike Gordon
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
    29
\index{Gordon, Mike}%
11213
aeb5c72dd72a *** empty log message ***
nipkow
parents: 11209
diff changeset
    30
\emph{et al.}, which is usually referred to as ``the HOL system''
aeb5c72dd72a *** empty log message ***
nipkow
parents: 11209
diff changeset
    31
\cite{mgordon-hol}. For us, HOL refers to the logical system, and sometimes
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
    32
its incarnation Isabelle/HOL\@.
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    33
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    34
A tutorial is by definition incomplete.  Currently the tutorial only
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    35
introduces the rudiments of Isar's proof language. To fully exploit the power
11213
aeb5c72dd72a *** empty log message ***
nipkow
parents: 11209
diff changeset
    36
of Isar, in particular the ability to write readable and structured proofs,
aeb5c72dd72a *** empty log message ***
nipkow
parents: 11209
diff changeset
    37
you need to consult the Isabelle/Isar Reference
12327
5a4d78204492 *** empty log message ***
nipkow
parents: 11456
diff changeset
    38
Manual~\cite{isabelle-isar-ref} and Wenzel's PhD thesis~\cite{Wenzel-PhD}
5a4d78204492 *** empty log message ***
nipkow
parents: 11456
diff changeset
    39
which discusses many proof patterns. If you want to use Isabelle's ML level
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    40
directly (for example for writing your own proof procedures) see the Isabelle
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    41
Reference Manual~\cite{isabelle-ref}; for details relating to HOL see the
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    42
Isabelle/HOL manual~\cite{isabelle-HOL}. All manuals have a comprehensive
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    43
index.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    44
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    45
\section{Theories}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    46
\label{sec:Basic:Theories}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    47
11428
332347b9b942 tidying the index
paulson
parents: 11420
diff changeset
    48
\index{theories|(}%
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    49
Working with Isabelle means creating theories. Roughly speaking, a
11428
332347b9b942 tidying the index
paulson
parents: 11420
diff changeset
    50
\textbf{theory} is a named collection of types, functions, and theorems,
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    51
much like a module in a programming language or a specification in a
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    52
specification language. In fact, theories in HOL can be either. The general
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    53
format of a theory \texttt{T} is
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    54
\begin{ttbox}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    55
theory T = B\(@1\) + \(\cdots\) + B\(@n\):
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
    56
{\rmfamily\textit{declarations, definitions, and proofs}}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    57
end
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    58
\end{ttbox}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    59
where \texttt{B}$@1$, \dots, \texttt{B}$@n$ are the names of existing
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
    60
theories that \texttt{T} is based on and \textit{declarations,
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
    61
    definitions, and proofs} represents the newly introduced concepts
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
    62
(types, functions etc.) and proofs about them. The \texttt{B}$@i$ are the
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
    63
direct \textbf{parent theories}\indexbold{parent theories} of~\texttt{T}\@.
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
    64
Everything defined in the parent theories (and their parents, recursively) is
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    65
automatically visible. To avoid name clashes, identifiers can be
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
    66
\textbf{qualified}\indexbold{identifiers!qualified}
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
    67
by theory names as in \texttt{T.f} and~\texttt{B.f}. 
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
    68
Each theory \texttt{T} must
11428
332347b9b942 tidying the index
paulson
parents: 11420
diff changeset
    69
reside in a \textbf{theory file}\index{theory files} named \texttt{T.thy}.
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    70
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    71
This tutorial is concerned with introducing you to the different linguistic
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
    72
constructs that can fill the \textit{declarations, definitions, and
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
    73
    proofs} above.  A complete grammar of the basic
12327
5a4d78204492 *** empty log message ***
nipkow
parents: 11456
diff changeset
    74
constructs is found in the Isabelle/Isar Reference
5a4d78204492 *** empty log message ***
nipkow
parents: 11456
diff changeset
    75
Manual~\cite{isabelle-isar-ref}.
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    76
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10795
diff changeset
    77
HOL's theory collection is available online at
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    78
\begin{center}\small
10978
5eebea8f359f *** empty log message ***
nipkow
parents: 10971
diff changeset
    79
    \url{http://isabelle.in.tum.de/library/HOL/}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    80
\end{center}
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10795
diff changeset
    81
and is recommended browsing. Note that most of the theories 
9541
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 8771
diff changeset
    82
are based on classical Isabelle without the Isar extension. This means that
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 8771
diff changeset
    83
they look slightly different than the theories in this tutorial, and that all
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 8771
diff changeset
    84
proofs are in separate ML files.
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 8771
diff changeset
    85
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    86
\begin{warn}
11428
332347b9b942 tidying the index
paulson
parents: 11420
diff changeset
    87
  HOL contains a theory \thydx{Main}, the union of all the basic
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10795
diff changeset
    88
  predefined theories like arithmetic, lists, sets, etc.  
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10795
diff changeset
    89
  Unless you know what you are doing, always include \isa{Main}
10971
6852682eaf16 *** empty log message ***
nipkow
parents: 10885
diff changeset
    90
  as a direct or indirect parent of all your theories.
12332
aea72a834c85 *** empty log message ***
nipkow
parents: 12327
diff changeset
    91
\end{warn}
12473
f41e477576b9 *** empty log message ***
nipkow
parents: 12332
diff changeset
    92
There is also a growing Library~\cite{HOL-Library}\index{Library}
13814
5402c2eaf393 *** empty log message ***
nipkow
parents: 13439
diff changeset
    93
of useful theories that are not part of \isa{Main} but can be included
12473
f41e477576b9 *** empty log message ***
nipkow
parents: 12332
diff changeset
    94
among the parents of a theory and will then be loaded automatically.%
11428
332347b9b942 tidying the index
paulson
parents: 11420
diff changeset
    95
\index{theories|)}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    96
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    97
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10795
diff changeset
    98
\section{Types, Terms and Formulae}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    99
\label{sec:TypesTermsForms}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   100
10795
9e888d60d3e5 minor edits to Chapters 1-3
paulson
parents: 10695
diff changeset
   101
Embedded in a theory are the types, terms and formulae of HOL\@. HOL is a typed
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   102
logic whose type system resembles that of functional programming languages
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   103
like ML or Haskell. Thus there are
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   104
\index{types|(}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   105
\begin{description}
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   106
\item[base types,] 
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   107
in particular \tydx{bool}, the type of truth values,
11428
332347b9b942 tidying the index
paulson
parents: 11420
diff changeset
   108
and \tydx{nat}, the type of natural numbers.
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   109
\item[type constructors,]\index{type constructors}
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   110
 in particular \tydx{list}, the type of
11428
332347b9b942 tidying the index
paulson
parents: 11420
diff changeset
   111
lists, and \tydx{set}, the type of sets. Type constructors are written
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   112
postfix, e.g.\ \isa{(nat)list} is the type of lists whose elements are
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   113
natural numbers. Parentheses around single arguments can be dropped (as in
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   114
\isa{nat list}), multiple arguments are separated by commas (as in
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   115
\isa{(bool,nat)ty}).
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   116
\item[function types,]\index{function types}
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   117
denoted by \isasymFun\indexbold{$IsaFun@\isasymFun}.
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   118
  In HOL \isasymFun\ represents \emph{total} functions only. As is customary,
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   119
  \isa{$\tau@1$ \isasymFun~$\tau@2$ \isasymFun~$\tau@3$} means
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   120
  \isa{$\tau@1$ \isasymFun~($\tau@2$ \isasymFun~$\tau@3$)}. Isabelle also
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   121
  supports the notation \isa{[$\tau@1,\dots,\tau@n$] \isasymFun~$\tau$}
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   122
  which abbreviates \isa{$\tau@1$ \isasymFun~$\cdots$ \isasymFun~$\tau@n$
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   123
    \isasymFun~$\tau$}.
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   124
\item[type variables,]\index{type variables}\index{variables!type}
10795
9e888d60d3e5 minor edits to Chapters 1-3
paulson
parents: 10695
diff changeset
   125
  denoted by \ttindexboldpos{'a}{$Isatype}, \isa{'b} etc., just like in ML\@. They give rise
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   126
  to polymorphic types like \isa{'a \isasymFun~'a}, the type of the identity
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   127
  function.
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   128
\end{description}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   129
\begin{warn}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   130
  Types are extremely important because they prevent us from writing
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   131
  nonsense.  Isabelle insists that all terms and formulae must be well-typed
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   132
  and will print an error message if a type mismatch is encountered. To
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   133
  reduce the amount of explicit type information that needs to be provided by
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   134
  the user, Isabelle infers the type of all variables automatically (this is
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   135
  called \bfindex{type inference}) and keeps quiet about it. Occasionally
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   136
  this may lead to misunderstandings between you and the system. If anything
11428
332347b9b942 tidying the index
paulson
parents: 11420
diff changeset
   137
  strange happens, we recommend that you set the flag\index{flags}
332347b9b942 tidying the index
paulson
parents: 11420
diff changeset
   138
  \isa{show_types}\index{*show_types (flag)}.  
332347b9b942 tidying the index
paulson
parents: 11420
diff changeset
   139
  Isabelle will then display type information
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   140
  that is usually suppressed.  Simply type
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   141
\begin{ttbox}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   142
ML "set show_types"
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   143
\end{ttbox}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   144
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   145
\noindent
10971
6852682eaf16 *** empty log message ***
nipkow
parents: 10885
diff changeset
   146
This can be reversed by \texttt{ML "reset show_types"}. Various other flags,
11428
332347b9b942 tidying the index
paulson
parents: 11420
diff changeset
   147
which we introduce as we go along, can be set and reset in the same manner.%
332347b9b942 tidying the index
paulson
parents: 11420
diff changeset
   148
\index{flags!setting and resetting}
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   149
\end{warn}%
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   150
\index{types|)}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   151
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   152
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   153
\index{terms|(}
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   154
\textbf{Terms} are formed as in functional programming by
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   155
applying functions to arguments. If \isa{f} is a function of type
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   156
\isa{$\tau@1$ \isasymFun~$\tau@2$} and \isa{t} is a term of type
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   157
$\tau@1$ then \isa{f~t} is a term of type $\tau@2$. HOL also supports
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   158
infix functions like \isa{+} and some basic constructs from functional
11428
332347b9b942 tidying the index
paulson
parents: 11420
diff changeset
   159
programming, such as conditional expressions:
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   160
\begin{description}
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   161
\item[\isa{if $b$ then $t@1$ else $t@2$}]\index{*if expressions}
11428
332347b9b942 tidying the index
paulson
parents: 11420
diff changeset
   162
Here $b$ is of type \isa{bool} and $t@1$ and $t@2$ are of the same type.
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   163
\item[\isa{let $x$ = $t$ in $u$}]\index{*let expressions}
13814
5402c2eaf393 *** empty log message ***
nipkow
parents: 13439
diff changeset
   164
is equivalent to $u$ where all free occurrences of $x$ have been replaced by
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   165
$t$. For example,
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   166
\isa{let x = 0 in x+x} is equivalent to \isa{0+0}. Multiple bindings are separated
13814
5402c2eaf393 *** empty log message ***
nipkow
parents: 13439
diff changeset
   167
by semicolons: \isa{let $x@1$ = $t@1$;\dots; $x@n$ = $t@n$ in $u$}.
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   168
\item[\isa{case $e$ of $c@1$ \isasymFun~$e@1$ |~\dots~| $c@n$ \isasymFun~$e@n$}]
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   169
\index{*case expressions}
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   170
evaluates to $e@i$ if $e$ is of the form $c@i$.
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   171
\end{description}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   172
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   173
Terms may also contain
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   174
\isasymlambda-abstractions.\index{lambda@$\lambda$ expressions}
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   175
For example,
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   176
\isa{\isasymlambda{}x.~x+1} is the function that takes an argument \isa{x} and
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   177
returns \isa{x+1}. Instead of
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   178
\isa{\isasymlambda{}x.\isasymlambda{}y.\isasymlambda{}z.~$t$} we can write
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   179
\isa{\isasymlambda{}x~y~z.~$t$}.%
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   180
\index{terms|)}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   181
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   182
\index{formulae|(}%
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   183
\textbf{Formulae} are terms of type \tydx{bool}.
11428
332347b9b942 tidying the index
paulson
parents: 11420
diff changeset
   184
There are the basic constants \cdx{True} and \cdx{False} and
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   185
the usual logical connectives (in decreasing order of priority):
11420
9529d31f39e0 added\\protect
paulson
parents: 11405
diff changeset
   186
\indexboldpos{\protect\isasymnot}{$HOL0not}, \indexboldpos{\protect\isasymand}{$HOL0and},
9529d31f39e0 added\\protect
paulson
parents: 11405
diff changeset
   187
\indexboldpos{\protect\isasymor}{$HOL0or}, and \indexboldpos{\protect\isasymimp}{$HOL0imp},
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   188
all of which (except the unary \isasymnot) associate to the right. In
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   189
particular \isa{A \isasymimp~B \isasymimp~C} means \isa{A \isasymimp~(B
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   190
  \isasymimp~C)} and is thus logically equivalent to \isa{A \isasymand~B
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   191
  \isasymimp~C} (which is \isa{(A \isasymand~B) \isasymimp~C}).
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   192
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   193
Equality\index{equality} is available in the form of the infix function
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   194
\isa{=} of type \isa{'a \isasymFun~'a
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   195
  \isasymFun~bool}. Thus \isa{$t@1$ = $t@2$} is a formula provided $t@1$
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   196
and $t@2$ are terms of the same type. If $t@1$ and $t@2$ are of type
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   197
\isa{bool} then \isa{=} acts as \rmindex{if-and-only-if}.
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   198
The formula
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   199
\isa{$t@1$~\isasymnoteq~$t@2$} is merely an abbreviation for
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   200
\isa{\isasymnot($t@1$ = $t@2$)}.
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   201
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   202
Quantifiers\index{quantifiers} are written as
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   203
\isa{\isasymforall{}x.~$P$} and \isa{\isasymexists{}x.~$P$}. 
11420
9529d31f39e0 added\\protect
paulson
parents: 11405
diff changeset
   204
There is even
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   205
\isa{\isasymuniqex{}x.~$P$}, which
11420
9529d31f39e0 added\\protect
paulson
parents: 11405
diff changeset
   206
means that there exists exactly one \isa{x} that satisfies \isa{$P$}. 
9529d31f39e0 added\\protect
paulson
parents: 11405
diff changeset
   207
Nested quantifications can be abbreviated:
9529d31f39e0 added\\protect
paulson
parents: 11405
diff changeset
   208
\isa{\isasymforall{}x~y~z.~$P$} means
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   209
\isa{\isasymforall{}x.\isasymforall{}y.\isasymforall{}z.~$P$}.%
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   210
\index{formulae|)}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   211
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   212
Despite type inference, it is sometimes necessary to attach explicit
11428
332347b9b942 tidying the index
paulson
parents: 11420
diff changeset
   213
\bfindex{type constraints} to a term.  The syntax is
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   214
\isa{$t$::$\tau$} as in \isa{x < (y::nat)}. Note that
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10396
diff changeset
   215
\ttindexboldpos{::}{$Isatype} binds weakly and should therefore be enclosed
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   216
in parentheses.  For instance,
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   217
\isa{x < y::nat} is ill-typed because it is interpreted as
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   218
\isa{(x < y)::nat}.  Type constraints may be needed to disambiguate
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   219
expressions
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   220
involving overloaded functions such as~\isa{+}, 
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   221
\isa{*} and~\isa{<}.  Section~\ref{sec:overloading} 
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   222
discusses overloading, while Table~\ref{tab:overloading} presents the most
10695
ffb153ef6366 *** empty log message ***
nipkow
parents: 10538
diff changeset
   223
important overloaded function symbols.
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   224
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   225
In general, HOL's concrete \rmindex{syntax} tries to follow the conventions of
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   226
functional programming and mathematics.  Here are the main rules that you
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   227
should be familiar with to avoid certain syntactic traps:
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   228
\begin{itemize}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   229
\item
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   230
Remember that \isa{f t u} means \isa{(f t) u} and not \isa{f(t u)}!
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   231
\item
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   232
Isabelle allows infix functions like \isa{+}. The prefix form of function
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   233
application binds more strongly than anything else and hence \isa{f~x + y}
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   234
means \isa{(f~x)~+~y} and not \isa{f(x+y)}.
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   235
\item Remember that in HOL if-and-only-if is expressed using equality.  But
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   236
  equality has a high priority, as befitting a relation, while if-and-only-if
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   237
  typically has the lowest priority.  Thus, \isa{\isasymnot~\isasymnot~P =
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   238
    P} means \isa{\isasymnot\isasymnot(P = P)} and not
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   239
  \isa{(\isasymnot\isasymnot P) = P}. When using \isa{=} to mean
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   240
  logical equivalence, enclose both operands in parentheses, as in \isa{(A
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   241
    \isasymand~B) = (B \isasymand~A)}.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   242
\item
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   243
Constructs with an opening but without a closing delimiter bind very weakly
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   244
and should therefore be enclosed in parentheses if they appear in subterms, as
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   245
in \isa{(\isasymlambda{}x.~x) = f}.  This includes 
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   246
\isa{if},\index{*if expressions}
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   247
\isa{let},\index{*let expressions}
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   248
\isa{case},\index{*case expressions}
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   249
\isa{\isasymlambda}, and quantifiers.
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   250
\item
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   251
Never write \isa{\isasymlambda{}x.x} or \isa{\isasymforall{}x.x=x}
12327
5a4d78204492 *** empty log message ***
nipkow
parents: 11456
diff changeset
   252
because \isa{x.x} is always taken as a single qualified identifier. Write
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   253
\isa{\isasymlambda{}x.~x} and \isa{\isasymforall{}x.~x=x} instead.
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   254
\item Identifiers\indexbold{identifiers} may contain the characters \isa{_} 
12327
5a4d78204492 *** empty log message ***
nipkow
parents: 11456
diff changeset
   255
and~\isa{'}, except at the beginning.
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   256
\end{itemize}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   257
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   258
For the sake of readability, we use the usual mathematical symbols throughout
10983
59961d32b1ae *** empty log message ***
nipkow
parents: 10978
diff changeset
   259
the tutorial. Their \textsc{ascii}-equivalents are shown in table~\ref{tab:ascii} in
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   260
the appendix.
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   261
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   262
\begin{warn}
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   263
A particular
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   264
problem for novices can be the priority of operators. If you are unsure, use
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   265
additional parentheses. In those cases where Isabelle echoes your
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   266
input, you can see which parentheses are dropped --- they were superfluous. If
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   267
you are unsure how to interpret Isabelle's output because you don't know
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   268
where the (dropped) parentheses go, set the flag\index{flags}
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   269
\isa{show_brackets}\index{*show_brackets (flag)}:
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   270
\begin{ttbox}
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   271
ML "set show_brackets"; \(\dots\); ML "reset show_brackets";
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   272
\end{ttbox}
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   273
\end{warn}
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   274
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   275
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   276
\section{Variables}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   277
\label{sec:variables}
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   278
\index{variables|(}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   279
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   280
Isabelle distinguishes free and bound variables, as is customary. Bound
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   281
variables are automatically renamed to avoid clashes with free variables. In
11428
332347b9b942 tidying the index
paulson
parents: 11420
diff changeset
   282
addition, Isabelle has a third kind of variable, called a \textbf{schematic
332347b9b942 tidying the index
paulson
parents: 11420
diff changeset
   283
  variable}\index{variables!schematic} or \textbf{unknown}\index{unknowns}, 
13439
2f98365f57a8 *** empty log message ***
nipkow
parents: 12668
diff changeset
   284
which must have a~\isa{?} as its first character.  
11428
332347b9b942 tidying the index
paulson
parents: 11420
diff changeset
   285
Logically, an unknown is a free variable. But it may be
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   286
instantiated by another term during the proof process. For example, the
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   287
mathematical theorem $x = x$ is represented in Isabelle as \isa{?x = ?x},
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   288
which means that Isabelle can instantiate it arbitrarily. This is in contrast
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   289
to ordinary variables, which remain fixed. The programming language Prolog
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   290
calls unknowns {\em logical\/} variables.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   291
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   292
Most of the time you can and should ignore unknowns and work with ordinary
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   293
variables. Just don't be surprised that after you have finished the proof of
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   294
a theorem, Isabelle will turn your free variables into unknowns.  It
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   295
indicates that Isabelle will automatically instantiate those unknowns
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   296
suitably when the theorem is used in some other proof.
9689
751fde5307e4 *** empty log message ***
nipkow
parents: 9541
diff changeset
   297
Note that for readability we often drop the \isa{?}s when displaying a theorem.
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   298
\begin{warn}
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   299
  For historical reasons, Isabelle accepts \isa{?} as an ASCII representation
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   300
  of the \(\exists\) symbol.  However, the \isa{?} character must then be followed
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   301
  by a space, as in \isa{?~x. f(x) = 0}.  Otherwise, \isa{?x} is
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   302
  interpreted as a schematic variable.  The preferred ASCII representation of
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   303
  the \(\exists\) symbol is \isa{EX}\@. 
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   304
\end{warn}%
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   305
\index{variables|)}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   306
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10795
diff changeset
   307
\section{Interaction and Interfaces}
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   308
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   309
Interaction with Isabelle can either occur at the shell level or through more
11301
be4163219703 spelling
paulson
parents: 11213
diff changeset
   310
advanced interfaces. To keep the tutorial independent of the interface, we
be4163219703 spelling
paulson
parents: 11213
diff changeset
   311
have phrased the description of the interaction in a neutral language. For
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   312
example, the phrase ``to abandon a proof'' means to type \isacommand{oops} at the
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   313
shell level, which is explained the first time the phrase is used. Other
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   314
interfaces perform the same act by cursor movements and/or mouse clicks.
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   315
Although shell-based interaction is quite feasible for the kind of proof
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   316
scripts currently presented in this tutorial, the recommended interface for
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   317
Isabelle/Isar is the Emacs-based \bfindex{Proof
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   318
  General}~\cite{proofgeneral,Aspinall:TACAS:2000}.
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   319
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   320
Some interfaces (including the shell level) offer special fonts with
10983
59961d32b1ae *** empty log message ***
nipkow
parents: 10978
diff changeset
   321
mathematical symbols. For those that do not, remember that \textsc{ascii}-equivalents
10978
5eebea8f359f *** empty log message ***
nipkow
parents: 10971
diff changeset
   322
are shown in table~\ref{tab:ascii} in the appendix.
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   323
9541
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 8771
diff changeset
   324
Finally, a word about semicolons.\indexbold{$Isar@\texttt{;}} 
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 8771
diff changeset
   325
Commands may but need not be terminated by semicolons.
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 8771
diff changeset
   326
At the shell level it is advisable to use semicolons to enforce that a command
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   327
is executed immediately; otherwise Isabelle may wait for the next keyword
9541
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 8771
diff changeset
   328
before it knows that the command is complete.
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   329
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   330
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10795
diff changeset
   331
\section{Getting Started}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   332
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   333
Assuming you have installed Isabelle, you start it by typing \texttt{isabelle
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   334
  -I HOL} in a shell window.\footnote{Simply executing \texttt{isabelle -I}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   335
  starts the default logic, which usually is already \texttt{HOL}.  This is
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   336
  controlled by the \texttt{ISABELLE_LOGIC} setting, see \emph{The Isabelle
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   337
    System Manual} for more details.} This presents you with Isabelle's most
10983
59961d32b1ae *** empty log message ***
nipkow
parents: 10978
diff changeset
   338
basic \textsc{ascii} interface.  In addition you need to open an editor window to
11450
1b02a6c4032f tweaks and indexing
paulson
parents: 11428
diff changeset
   339
create theory files.  While you are developing a theory, we recommend that you
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   340
type each command into the file first and then enter it into Isabelle by
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   341
copy-and-paste, thus ensuring that you have a complete record of your theory.
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   342
As mentioned above, Proof General offers a much superior interface.
10795
9e888d60d3e5 minor edits to Chapters 1-3
paulson
parents: 10695
diff changeset
   343
If you have installed Proof General, you can start it by typing \texttt{Isabelle}.