doc-src/TutorialI/fp.tex
 changeset 8771 026f37a86ea7 parent 8743 3253c6046d57 child 9458 c613cd06d5cf
--- a/doc-src/TutorialI/fp.tex	Sun Apr 23 11:41:45 2000 +0200
+++ b/doc-src/TutorialI/fp.tex	Tue Apr 25 08:09:10 2000 +0200
@@ -116,14 +116,13 @@
\isacommand{typ}\indexbold{*typ} \textit{string} reads and prints the given
string as a type in the current context.
-  named theory with the line
-  \isacommand{theory}\texttt{~T~=}~\dots~\texttt{:}. Isabelle automatically
-  loads all the required parent theories from their respective files (which
-  may take a moment, unless the theories are already loaded and the files
-  have not been modified). The only time when you need to load a theory by
-  hand is when you simply want to check if it loads successfully without
-  wanting to make use of the theory itself. This you can do by typing
-  \isacommand{use\_thy}\indexbold{*use_thy}~\texttt{"T"}.
+  named theory with the line \isa{\isacommand{theory}~T~=~\dots~:}. Isabelle
+  automatically loads all the required parent theories from their respective
+  files (which may take a moment, unless the theories are already loaded and
+  the files have not been modified). The only time when you need to load a
+  theory by hand is when you simply want to check if it loads successfully
+  without wanting to make use of the theory itself. This you can do by typing
+  \isa{\isacommand{use\_thy}\indexbold{*use_thy}~"T"}.

If you suddenly discover that you need to modify a parent theory of your
current theory you must first abandon your current theory (at the shell
@@ -134,6 +133,9 @@
\end{description}
Further commands are found in the Isabelle/Isar Reference Manual.

+We now examine Isabelle's functional programming constructs systematically,
+starting with inductive datatypes.
+

\section{Datatypes}
\label{sec:datatype}
@@ -149,12 +151,12 @@

Lists are one of the essential datatypes in computing. Readers of this
tutorial and users of HOL need to be familiar with their basic operations.
-Theory \texttt{ToyList} is only a small fragment of HOL's predefined theory
-\texttt{List}\footnote{\url{http://isabelle.in.tum.de/library/HOL/List.html}}.
+Theory \isa{ToyList} is only a small fragment of HOL's predefined theory
+\isa{List}\footnote{\url{http://isabelle.in.tum.de/library/HOL/List.html}}.
The latter contains many further operations. For example, the functions
-\isaindexbold{hd} (head') and \isaindexbold{tl} (tail') return the first
+\isaindexbold{hd} (head'') and \isaindexbold{tl} (tail'') return the first
element and the remainder of a list. (However, pattern-matching is usually
-preferable to \isa{hd} and \isa{tl}.)  Theory \texttt{List} also contains
+preferable to \isa{hd} and \isa{tl}.)  Theory \isa{List} also contains
more syntactic sugar: \isa{[}$x@1$\isa{,}\dots\isa{,}$x@n$\isa{]} abbreviates
$x@1$\isa{\#}\dots\isa{\#}$x@n$\isa{\#[]}.  In the rest of the tutorial we
always use HOL's predefined lists.
@@ -169,7 +171,7 @@
C@1~\tau@{11}~\dots~\tau@{1k@1} ~\mid~ \dots ~\mid~
C@m~\tau@{m1}~\dots~\tau@{mk@m}
\]
-where $\alpha@i$ are type variables (the parameters), $C@i$ are distinct
+where $\alpha@i$ are distinct type variables (the parameters), $C@i$ are distinct
constructor names and $\tau@{ij}$ are types; it is customary to capitalize
the first letter in constructor names. There are a number of
restrictions (such as that the type should not be empty) detailed
@@ -192,7 +194,7 @@
Isabelle immediately sees that $f$ terminates because one (fixed!) argument
becomes smaller with every recursive call. There must be exactly one equation
for each constructor.  Their order is immaterial.
-A more general method for defining total recursive functions is explained in
+A more general method for defining total recursive functions is introduced in
\S\ref{sec:recdef}.

\begin{exercise}
@@ -276,6 +278,7 @@
the constructs introduced above.

\input{Ifexpr/document/Ifexpr.tex}
+\medskip

How does one come up with the required lemmas? Try to prove the main theorems
without them and study carefully what \isa{auto} leaves unproved. This has
@@ -368,7 +371,7 @@

\subsection{Products}

-HOL also has pairs: \isa{($a@1$,$a@2$)} is of type \texttt{$\tau@1$ *
+HOL also has pairs: \isa{($a@1$,$a@2$)} is of type \isa{$\tau@1$ *
$\tau@2$} provided each $a@i$ is of type $\tau@i$. The components of a pair
are extracted by \isa{fst} and \isa{snd}: \isa{fst($x$,$y$) = $x$} and
\isa{snd($x$,$y$) = $y$}. Tuples are simulated by pairs nested to the right:
@@ -411,7 +414,7 @@

\subsection{Type synonyms}
-\indexbold{type synonyms}
+\indexbold{type synonym}

Type synonyms are similar to those found in ML. Their syntax is fairly self
explanatory:
@@ -420,7 +423,6 @@

Note that pattern-matching is not allowed, i.e.\ each definition must be of
the form $f\,x@1\,\dots\,x@n~\isasymequiv~t$.
-
Section~\S\ref{sec:Simplification} explains how definitions are used
in proofs.

@@ -434,17 +436,17 @@
\chapter{More Functional Programming}

The purpose of this chapter is to deepen the reader's understanding of the
-concepts encountered so far and to introduce an advanced forms of datatypes
-and recursive functions. The first two sections give a structured
-presentation of theorem proving by simplification
-(\S\ref{sec:Simplification}) and discuss important heuristics for induction
-(\S\ref{sec:InductionHeuristics}). They can be skipped by readers less
-interested in proofs. They are followed by a case study, a compiler for
-expressions (\S\ref{sec:ExprCompiler}). Advanced datatypes, including those
-involving function spaces, are covered in \S\ref{sec:advanced-datatypes},
-which closes with another case study, search trees (tries'').  Finally we
-introduce a very general form of recursive function definition which goes
-well beyond what \isacommand{primrec} allows (\S\ref{sec:recdef}).
+concepts encountered so far and to introduce advanced forms of datatypes and
+recursive functions. The first two sections give a structured presentation of
+theorem proving by simplification (\S\ref{sec:Simplification}) and discuss
+important heuristics for induction (\S\ref{sec:InductionHeuristics}). They can
+be skipped by readers less interested in proofs. They are followed by a case
+study, a compiler for expressions (\S\ref{sec:ExprCompiler}). Advanced
+datatypes, including those involving function spaces, are covered in
+\S\ref{sec:advanced-datatypes}, which closes with another case study, search
+trees (tries'').  Finally we introduce \isacommand{recdef}, a very general
+form of recursive function definition which goes well beyond what
+\isacommand{primrec} allows (\S\ref{sec:recdef}).

\section{Simplification}
@@ -478,7 +480,7 @@
(0#1#[]) @ []  $$\leadsto$$  0#((1#[]) @ [])  $$\leadsto$$  0#(1#([] @ []))  $$\leadsto$$  0#1#[]
\end{ttbox}
This is also known as \bfindex{term rewriting} and the equations are referred
-to as \bfindex{rewrite rules}. This is more honest than simplification''
+to as \bfindex{rewrite rules}. Rewriting'' is more honest than simplification''
because the terms do not necessarily become simpler in the process.

\subsubsection{Simplification rules}
@@ -487,7 +489,7 @@
To facilitate simplification, theorems can be declared to be simplification
rules (with the help of the attribute \isa{[simp]}\index{*simp
(attribute)}), in which case proofs by simplification make use of these
-rules by default. In addition the constructs \isacommand{datatype} and
+rules automatically. In addition the constructs \isacommand{datatype} and
\isacommand{primrec} (and a few others) invisibly declare useful
simplification rules. Explicit definitions are \emph{not} declared
simplification rules automatically!
@@ -502,14 +504,14 @@
theorems [simp] = $$list of theorem names$$;
theorems [simp del] = $$list of theorem names$$;
\end{ttbox}
-As a rule of thumb, rules that really simplify (like \isa{rev(rev xs) =
+As a rule of thumb, equations that really simplify (like \isa{rev(rev xs) =
xs} and \mbox{\isa{xs \at\ [] = xs}}) should be made simplification
rules.  Those of a more specific nature (e.g.\ distributivity laws, which
alter the structure of terms considerably) should only be used selectively,
i.e.\ they should not be default simplification rules.  Conversely, it may
also happen that a simplification rule needs to be disabled in certain
proofs.  Frequent changes in the simplification status of a theorem may
\begin{warn}
Simplification may not terminate, for example if both $f(x) = g(x)$ and
$g(x) = f(x)$ are simplification rules. It is the user's responsibility not
@@ -568,7 +570,7 @@

Proving a goal containing \isaindex{let}-expressions almost invariably
requires the \isa{let}-con\-structs to be expanded at some point. Since
-\isa{let}-\isa{in} is just syntactic sugar for a defined constant (called
+\isa{let}-\isa{in} is just syntactic sugar for a predefined constant (called
\isa{Let}), expanding \isa{let}-constructs means rewriting with
\isa{Let_def}:

@@ -600,7 +602,7 @@
\index{arithmetic}

The simplifier routinely solves a small class of linear arithmetic formulae
-(over types \isa{nat} and \isa{int}): it only takes into account
+(over type \isa{nat} and other numeric types): it only takes into account
assumptions and conclusions that are (possibly negated) (in)equalities

@@ -673,7 +675,7 @@
\end{quote}
The heuristic is tricky to apply because it is not obvious that
\isa{rev xs \at\ ys} is simpler than \isa{itrev xs ys}. But see what
-happens if you try to prove the symmetric equation!
+happens if you try to prove \isa{rev xs \at\ ys = itrev xs ys}!

\section{Case study: compiling expressions}
@@ -719,6 +721,7 @@
right of a function arrow, but never on the left. Hence the above can of worms
is ruled out but the following example of a potentially infinitely branching tree is
accepted:
+\smallskip

\input{Datatype/document/Fundata.tex}
\bigskip
@@ -728,7 +731,7 @@
\begin{ttbox}
datatype lam = C (lam -> lam)
\end{ttbox}
-do indeed make sense (note the intentionally different arrow \isa{->}!).
+do indeed make sense (note the intentionally different arrow \isa{->}).
There is even a version of LCF on top of HOL, called
HOLCF~\cite{MuellerNvOS99}.

@@ -785,11 +788,11 @@
Proper tries associate some value with each string. Since the
information is stored only in the final node associated with the string, many
nodes do not carry any value. This distinction is captured by the
-following predefined datatype (from theory \texttt{Option}, which is a parent
-of \texttt{Main}):
+following predefined datatype (from theory \isa{Option}, which is a parent
+of \isa{Main}):
+\smallskip
\input{Trie/document/Option2.tex}
-\indexbold{*option}\indexbold{*None}\indexbold{*Some}
-
+\indexbold{*option}\indexbold{*None}\indexbold{*Some}%
\input{Trie/document/Trie.tex}

\begin{exercise}