doc-src/TutorialI/fp.tex
author paulson
Fri, 18 May 2001 17:18:43 +0200
changeset 11309 d666f11ca2d4
parent 11302 9e0708bb15f7
child 11419 9577530e8a5a
permissions -rw-r--r--
minor suggestions by Tanja Vos
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11309
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11302
diff changeset
     1
\chapter{Functional Programming in HOL}

Although on the surface this chapter is mainly concerned with how to write
functional programs in HOL and how to verify them, most of the constructs and
proof procedures introduced are general purpose and recur in any specification
or verification task. In fact, we really should speak of functional
\emph{modelling} rather than \emph{programming}: our primary aim is not
to write programs but to design abstract models of systems.  HOL is
a specification language that goes well beyond what can be expressed as a
program. However, for the time being we concentrate on the computable.

The dedicated functional programmer should be warned: HOL offers only
\emph{total functional programming} --- all functions in HOL must be total,
i.e.\ they must terminate for all inputs; lazy data structures are not
directly available.

\section{An Introductory Theory}
\label{sec:intro-theory}

Functional programming needs datatypes and functions. Both of them can be
defined in a theory with a syntax reminiscent of languages like ML or
Haskell. As an example consider the theory in figure~\ref{fig:ToyList}.
We will now examine it line by line.

\begin{figure}[htbp]
\begin{ttbox}\makeatother
\input{ToyList2/ToyList1}\end{ttbox}
\caption{A theory of lists}
\label{fig:ToyList}
\end{figure}

{\makeatother\input{ToyList/document/ToyList.tex}}

The complete proof script is shown in Fig.\ts\ref{fig:ToyList-proofs}. The
concatenation of Figs.\ts\ref{fig:ToyList} and~\ref{fig:ToyList-proofs}
constitutes the complete theory \texttt{ToyList} and should reside in file
\texttt{ToyList.thy}. It is good practice to present all declarations and
definitions at the beginning of a theory to facilitate browsing.

\begin{figure}[htbp]
\begin{ttbox}\makeatother
\input{ToyList2/ToyList2}\end{ttbox}
\caption{Proofs about lists}
\label{fig:ToyList-proofs}
\end{figure}

\subsubsection*{Review}

This is the end of our toy proof. It should have familiarized you with
\begin{itemize}
\item the standard theorem proving procedure:
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
     2
state a goal (lemma or theorem); proceed with proof until a separate lemma is
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
     3
required; prove that lemma; come back to the original goal.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
     4
\item a specific procedure that works well for functional programs:
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
     5
induction followed by all-out simplification via \isa{auto}.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
     6
\item a basic repertoire of proof commands.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
     7
\end{itemize}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
     8
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
     9
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10824
diff changeset
    10
\section{Some Helpful Commands}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    11
\label{sec:commands-and-hints}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    12
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    13
This section discusses a few basic commands for manipulating the proof state
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    14
and can be skipped by casual readers.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    15
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    16
There are two kinds of commands used during a proof: the actual proof
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    17
commands and auxiliary commands for examining the proof state and controlling
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    18
the display. Simple proof commands are of the form
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    19
\isacommand{apply}\isa{(method)}\indexbold{apply} where \bfindex{method} is a
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    20
synonym for ``theorem proving function''. Typical examples are
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    21
\isa{induct_tac} and \isa{auto}. Further methods are introduced throughout
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    22
the tutorial.  Unless stated otherwise you may assume that a method attacks
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    23
merely the first subgoal. An exception is \isa{auto} which tries to solve all
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    24
subgoals.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    25
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    26
The most useful auxiliary commands are:
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    27
\begin{description}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    28
\item[Undoing:] \isacommand{undo}\indexbold{*undo} undoes the effect of the
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    29
  last command; \isacommand{undo} can be undone by
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    30
  \isacommand{redo}\indexbold{*redo}.  Both are only needed at the shell
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    31
  level and should not occur in the final theory.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    32
\item[Printing the current state:] \isacommand{pr}\indexbold{*pr} redisplays
11302
9e0708bb15f7 minor revisons
paulson
parents: 11294
diff changeset
    33
  the current proof state, for example when it has scrolled past the top of
9e0708bb15f7 minor revisons
paulson
parents: 11294
diff changeset
    34
  the screen.
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    35
\item[Limiting the number of subgoals:] \isacommand{pr}~$n$ tells Isabelle to
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    36
  print only the first $n$ subgoals from now on and redisplays the current
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    37
  proof state. This is helpful when there are many subgoals.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    38
\item[Modifying the order of subgoals:]
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    39
\isacommand{defer}\indexbold{*defer} moves the first subgoal to the end and
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    40
\isacommand{prefer}\indexbold{*prefer}~$n$ moves subgoal $n$ to the front.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    41
\item[Printing theorems:]
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    42
  \isacommand{thm}\indexbold{*thm}~\textit{name}$@1$~\dots~\textit{name}$@n$
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    43
  prints the named theorems.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    44
\item[Displaying types:] We have already mentioned the flag
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    45
  \ttindex{show_types} above. It can also be useful for detecting typos in
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    46
  formulae early on. For example, if \texttt{show_types} is set and the goal
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    47
  \isa{rev(rev xs) = xs} is started, Isabelle prints the additional output
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    48
\par\noindent
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    49
\begin{isabelle}%
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    50
Variables:\isanewline
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    51
~~xs~::~'a~list
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    52
\end{isabelle}%
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    53
\par\noindent
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    54
which tells us that Isabelle has correctly inferred that
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    55
\isa{xs} is a variable of list type. On the other hand, had we
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    56
made a typo as in \isa{rev(re xs) = xs}, the response
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    57
\par\noindent
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    58
\begin{isabelle}%
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    59
Variables:\isanewline
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    60
~~re~::~'a~list~{\isasymRightarrow}~'a~list\isanewline
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    61
~~xs~::~'a~list%
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    62
\end{isabelle}%
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    63
\par\noindent
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    64
would have alerted us because of the unexpected variable \isa{re}.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    65
\item[Reading terms and types:] \isacommand{term}\indexbold{*term}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    66
  \textit{string} reads, type-checks and prints the given string as a term in
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    67
  the current context; the inferred type is output as well.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    68
  \isacommand{typ}\indexbold{*typ} \textit{string} reads and prints the given
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    69
  string as a type in the current context.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    70
\item[(Re)loading theories:] When you start your interaction you must open a
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
    71
  named theory with the line \isa{\isacommand{theory}~T~=~\dots~:}. Isabelle
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
    72
  automatically loads all the required parent theories from their respective
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
    73
  files (which may take a moment, unless the theories are already loaded and
9541
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 9494
diff changeset
    74
  the files have not been modified).
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    75
  
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    76
  If you suddenly discover that you need to modify a parent theory of your
10971
6852682eaf16 *** empty log message ***
nipkow
parents: 10885
diff changeset
    77
  current theory, you must first abandon your current theory\indexbold{abandon
9494
44fefb6e9994 *** empty log message ***
nipkow
parents: 9493
diff changeset
    78
  theory}\indexbold{theory!abandon} (at the shell
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    79
  level type \isacommand{kill}\indexbold{*kill}). After the parent theory has
10971
6852682eaf16 *** empty log message ***
nipkow
parents: 10885
diff changeset
    80
  been modified, you go back to your original theory. When its first line
6852682eaf16 *** empty log message ***
nipkow
parents: 10885
diff changeset
    81
  \isa{\isacommand{theory}~T~=~\dots~:} is processed, the
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    82
  modified parent is reloaded automatically.
9541
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 9494
diff changeset
    83
  
10978
5eebea8f359f *** empty log message ***
nipkow
parents: 10971
diff changeset
    84
%  The only time when you need to load a theory by hand is when you simply
5eebea8f359f *** empty log message ***
nipkow
parents: 10971
diff changeset
    85
%  want to check if it loads successfully without wanting to make use of the
5eebea8f359f *** empty log message ***
nipkow
parents: 10971
diff changeset
    86
%  theory itself. This you can do by typing
5eebea8f359f *** empty log message ***
nipkow
parents: 10971
diff changeset
    87
%  \isa{\isacommand{use\_thy}\indexbold{*use_thy}~"T"}.
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    88
\end{description}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    89
Further commands are found in the Isabelle/Isar Reference Manual.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    90
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
    91
We now examine Isabelle's functional programming constructs systematically,
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
    92
starting with inductive datatypes.
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
    93
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    94
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    95
\section{Datatypes}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    96
\label{sec:datatype}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    97
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    98
Inductive datatypes are part of almost every non-trivial application of HOL.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
    99
First we take another look at a very important example, the datatype of
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   100
lists, before we turn to datatypes in general. The section closes with a
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   101
case study.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   102
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   103
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   104
\subsection{Lists}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   105
\indexbold{*list}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   106
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   107
Lists are one of the essential datatypes in computing. Readers of this
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   108
tutorial and users of HOL need to be familiar with their basic operations.
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   109
Theory \isa{ToyList} is only a small fragment of HOL's predefined theory
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   110
\isa{List}\footnote{\url{http://isabelle.in.tum.de/library/HOL/List.html}}.
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   111
The latter contains many further operations. For example, the functions
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   112
\isaindexbold{hd} (``head'') and \isaindexbold{tl} (``tail'') return the first
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   113
element and the remainder of a list. (However, pattern-matching is usually
10795
9e888d60d3e5 minor edits to Chapters 1-3
paulson
parents: 10654
diff changeset
   114
preferable to \isa{hd} and \isa{tl}.)  
10800
2d4c058749a7 *** empty log message ***
nipkow
parents: 10795
diff changeset
   115
Also available are higher-order functions like \isa{map} and \isa{filter}.
10795
9e888d60d3e5 minor edits to Chapters 1-3
paulson
parents: 10654
diff changeset
   116
Theory \isa{List} also contains
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   117
more syntactic sugar: \isa{[}$x@1$\isa{,}\dots\isa{,}$x@n$\isa{]} abbreviates
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   118
$x@1$\isa{\#}\dots\isa{\#}$x@n$\isa{\#[]}.  In the rest of the tutorial we
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   119
always use HOL's predefined lists.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   120
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   121
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10824
diff changeset
   122
\subsection{The General Format}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   123
\label{sec:general-datatype}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   124
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   125
The general HOL \isacommand{datatype} definition is of the form
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   126
\[
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   127
\isacommand{datatype}~(\alpha@1, \dots, \alpha@n) \, t ~=~
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   128
C@1~\tau@{11}~\dots~\tau@{1k@1} ~\mid~ \dots ~\mid~
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   129
C@m~\tau@{m1}~\dots~\tau@{mk@m}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   130
\]
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   131
where $\alpha@i$ are distinct type variables (the parameters), $C@i$ are distinct
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   132
constructor names and $\tau@{ij}$ are types; it is customary to capitalize
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   133
the first letter in constructor names. There are a number of
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   134
restrictions (such as that the type should not be empty) detailed
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   135
elsewhere~\cite{isabelle-HOL}. Isabelle notifies you if you violate them.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   136
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   137
Laws about datatypes, such as \isa{[] \isasymnoteq~x\#xs} and
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   138
\isa{(x\#xs = y\#ys) = (x=y \isasymand~xs=ys)}, are used automatically
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   139
during proofs by simplification.  The same is true for the equations in
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   140
primitive recursive function definitions.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   141
9644
6b0b6b471855 *** empty log message ***
nipkow
parents: 9541
diff changeset
   142
Every datatype $t$ comes equipped with a \isa{size} function from $t$ into
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10522
diff changeset
   143
the natural numbers (see~{\S}\ref{sec:nat} below). For lists, \isa{size} is
9644
6b0b6b471855 *** empty log message ***
nipkow
parents: 9541
diff changeset
   144
just the length, i.e.\ \isa{size [] = 0} and \isa{size(x \# xs) = size xs +
10237
875bf54b5d74 *** empty log message ***
nipkow
parents: 10181
diff changeset
   145
  1}.  In general, \isaindexbold{size} returns \isa{0} for all constructors
875bf54b5d74 *** empty log message ***
nipkow
parents: 10181
diff changeset
   146
that do not have an argument of type $t$, and for all other constructors
875bf54b5d74 *** empty log message ***
nipkow
parents: 10181
diff changeset
   147
\isa{1 +} the sum of the sizes of all arguments of type $t$. Note that because
9644
6b0b6b471855 *** empty log message ***
nipkow
parents: 9541
diff changeset
   148
\isa{size} is defined on every datatype, it is overloaded; on lists
10237
875bf54b5d74 *** empty log message ***
nipkow
parents: 10181
diff changeset
   149
\isa{size} is also called \isaindexbold{length}, which is not overloaded.
10795
9e888d60d3e5 minor edits to Chapters 1-3
paulson
parents: 10654
diff changeset
   150
Isabelle will always show \isa{size} on lists as \isa{length}.
9644
6b0b6b471855 *** empty log message ***
nipkow
parents: 9541
diff changeset
   151
6b0b6b471855 *** empty log message ***
nipkow
parents: 9541
diff changeset
   152
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10824
diff changeset
   153
\subsection{Primitive Recursion}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   154
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   155
Functions on datatypes are usually defined by recursion. In fact, most of the
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   156
time they are defined by what is called \bfindex{primitive recursion}.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   157
The keyword \isacommand{primrec}\indexbold{*primrec} is followed by a list of
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   158
equations
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   159
\[ f \, x@1 \, \dots \, (C \, y@1 \, \dots \, y@k)\, \dots \, x@n = r \]
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   160
such that $C$ is a constructor of the datatype $t$ and all recursive calls of
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   161
$f$ in $r$ are of the form $f \, \dots \, y@i \, \dots$ for some $i$. Thus
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   162
Isabelle immediately sees that $f$ terminates because one (fixed!) argument
10654
458068404143 *** empty log message ***
nipkow
parents: 10608
diff changeset
   163
becomes smaller with every recursive call. There must be at most one equation
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   164
for each constructor.  Their order is immaterial.
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   165
A more general method for defining total recursive functions is introduced in
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10522
diff changeset
   166
{\S}\ref{sec:recdef}.
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   167
9493
494f8cd34df7 *** empty log message ***
nipkow
parents: 9458
diff changeset
   168
\begin{exercise}\label{ex:Tree}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   169
\input{Misc/document/Tree.tex}%
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   170
\end{exercise}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   171
9721
7e51c9f3d5a0 *** empty log message ***
nipkow
parents: 9689
diff changeset
   172
\input{Misc/document/case_exprs.tex}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   173
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   174
\input{Ifexpr/document/Ifexpr.tex}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   175
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10824
diff changeset
   176
\section{Some Basic Types}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   177
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   178
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10824
diff changeset
   179
\subsection{Natural Numbers}
9644
6b0b6b471855 *** empty log message ***
nipkow
parents: 9541
diff changeset
   180
\label{sec:nat}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   181
\index{arithmetic|(}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   182
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   183
\input{Misc/document/fakenat.tex}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   184
\input{Misc/document/natsum.tex}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   185
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   186
\index{arithmetic|)}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   187
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   188
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10237
diff changeset
   189
\subsection{Pairs}
9541
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 9494
diff changeset
   190
\input{Misc/document/pairs.tex}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   191
10608
620647438780 *** empty log message ***
nipkow
parents: 10543
diff changeset
   192
\subsection{Datatype {\tt\slshape option}}
10543
8e4307d1207a *** empty log message ***
nipkow
parents: 10538
diff changeset
   193
\label{sec:option}
8e4307d1207a *** empty log message ***
nipkow
parents: 10538
diff changeset
   194
\input{Misc/document/Option2.tex}
8e4307d1207a *** empty log message ***
nipkow
parents: 10538
diff changeset
   195
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   196
\section{Definitions}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   197
\label{sec:Definitions}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   198
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   199
A definition is simply an abbreviation, i.e.\ a new name for an existing
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   200
construction. In particular, definitions cannot be recursive. Isabelle offers
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   201
definitions on the level of types and terms. Those on the type level are
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   202
called type synonyms, those on the term level are called (constant)
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   203
definitions.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   204
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   205
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10824
diff changeset
   206
\subsection{Type Synonyms}
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   207
\indexbold{type synonym}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   208
10795
9e888d60d3e5 minor edits to Chapters 1-3
paulson
parents: 10654
diff changeset
   209
Type synonyms are similar to those found in ML\@. Their syntax is fairly self
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   210
explanatory:
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   211
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   212
\input{Misc/document/types.tex}%
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   213
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   214
Note that pattern-matching is not allowed, i.e.\ each definition must be of
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   215
the form $f\,x@1\,\dots\,x@n~\isasymequiv~t$.
11215
b44ad7e4c4d2 *** empty log message ***
nipkow
parents: 11214
diff changeset
   216
Section~{\S}\ref{sec:Simp-with-Defs} explains how definitions are used
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   217
in proofs.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   218
9844
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
   219
\input{Misc/document/prime_def.tex}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   220
11203
881222d48777 *** empty log message ***
nipkow
parents: 11201
diff changeset
   221
\input{Misc/document/Translations.tex}
881222d48777 *** empty log message ***
nipkow
parents: 11201
diff changeset
   222
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   223
11201
eddc69b55fac *** empty log message ***
nipkow
parents: 11159
diff changeset
   224
\section{The Definitional Approach}
eddc69b55fac *** empty log message ***
nipkow
parents: 11159
diff changeset
   225
\label{sec:definitional}
eddc69b55fac *** empty log message ***
nipkow
parents: 11159
diff changeset
   226
eddc69b55fac *** empty log message ***
nipkow
parents: 11159
diff changeset
   227
As we pointed out at the beginning of the chapter, asserting arbitrary
eddc69b55fac *** empty log message ***
nipkow
parents: 11159
diff changeset
   228
axioms, e.g. $f(n) = f(n) + 1$, may easily lead to contradictions. In order
eddc69b55fac *** empty log message ***
nipkow
parents: 11159
diff changeset
   229
to avoid this danger, this tutorial advocates the definitional rather than
eddc69b55fac *** empty log message ***
nipkow
parents: 11159
diff changeset
   230
the axiomatic approach: introduce new concepts by definitions, thus
eddc69b55fac *** empty log message ***
nipkow
parents: 11159
diff changeset
   231
preserving consistency. However, on the face of it, Isabelle/HOL seems to
eddc69b55fac *** empty log message ***
nipkow
parents: 11159
diff changeset
   232
support many more constructs than just definitions, for example
eddc69b55fac *** empty log message ***
nipkow
parents: 11159
diff changeset
   233
\isacommand{primrec}. The crucial point is that internally, everything
eddc69b55fac *** empty log message ***
nipkow
parents: 11159
diff changeset
   234
(except real axioms) is reduced to a definition. For example, given some
eddc69b55fac *** empty log message ***
nipkow
parents: 11159
diff changeset
   235
\isacommand{primrec} function definition, this is turned into a proper
eddc69b55fac *** empty log message ***
nipkow
parents: 11159
diff changeset
   236
(nonrecursive!) definition, and the user-supplied recursion equations are
11213
aeb5c72dd72a *** empty log message ***
nipkow
parents: 11203
diff changeset
   237
derived as theorems from that definition. This tricky process is completely
11201
eddc69b55fac *** empty log message ***
nipkow
parents: 11159
diff changeset
   238
hidden from the user and it is not necessary to understand the details. The
eddc69b55fac *** empty log message ***
nipkow
parents: 11159
diff changeset
   239
result of the definitional approach is that \isacommand{primrec} is as safe
eddc69b55fac *** empty log message ***
nipkow
parents: 11159
diff changeset
   240
as pure \isacommand{defs} are, but more convenient. And this is not just the
eddc69b55fac *** empty log message ***
nipkow
parents: 11159
diff changeset
   241
case for \isacommand{primrec} but also for the other commands described
eddc69b55fac *** empty log message ***
nipkow
parents: 11159
diff changeset
   242
later, like \isacommand{recdef} and \isacommand{inductive}.
11203
881222d48777 *** empty log message ***
nipkow
parents: 11201
diff changeset
   243
This strict adherence to the definitional approach reduces the risk of 
881222d48777 *** empty log message ***
nipkow
parents: 11201
diff changeset
   244
soundness errors inside Isabelle/HOL.
11201
eddc69b55fac *** empty log message ***
nipkow
parents: 11159
diff changeset
   245
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   246
\chapter{More Functional Programming}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   247
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   248
The purpose of this chapter is to deepen the reader's understanding of the
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   249
concepts encountered so far and to introduce advanced forms of datatypes and
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   250
recursive functions. The first two sections give a structured presentation of
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10522
diff changeset
   251
theorem proving by simplification ({\S}\ref{sec:Simplification}) and discuss
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10522
diff changeset
   252
important heuristics for induction ({\S}\ref{sec:InductionHeuristics}). They can
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   253
be skipped by readers less interested in proofs. They are followed by a case
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10522
diff changeset
   254
study, a compiler for expressions ({\S}\ref{sec:ExprCompiler}). Advanced
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   255
datatypes, including those involving function spaces, are covered in
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10522
diff changeset
   256
{\S}\ref{sec:advanced-datatypes}, which closes with another case study, search
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   257
trees (``tries'').  Finally we introduce \isacommand{recdef}, a very general
026f37a86ea7 *** empty log message ***
nipkow
parents: 8743
diff changeset
   258
form of recursive function definition which goes well beyond what
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10522
diff changeset
   259
\isacommand{primrec} allows ({\S}\ref{sec:recdef}).
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   260
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   261
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   262
\section{Simplification}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   263
\label{sec:Simplification}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   264
\index{simplification|(}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   265
10795
9e888d60d3e5 minor edits to Chapters 1-3
paulson
parents: 10654
diff changeset
   266
So far we have proved our theorems by \isa{auto}, which simplifies
9541
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 9494
diff changeset
   267
\emph{all} subgoals. In fact, \isa{auto} can do much more than that, except
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 9494
diff changeset
   268
that it did not need to so far. However, when you go beyond toy examples, you
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 9494
diff changeset
   269
need to understand the ingredients of \isa{auto}.  This section covers the
10971
6852682eaf16 *** empty log message ***
nipkow
parents: 10885
diff changeset
   270
method that \isa{auto} always applies first, simplification.
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   271
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   272
Simplification is one of the central theorem proving tools in Isabelle and
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   273
many other systems. The tool itself is called the \bfindex{simplifier}. The
11159
07b13770c4d6 *** empty log message ***
nipkow
parents: 10983
diff changeset
   274
purpose of this section is to introduce the many features of the simplifier.
10971
6852682eaf16 *** empty log message ***
nipkow
parents: 10885
diff changeset
   275
Anybody intending to perform proofs in HOL should read this section. Later on
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10522
diff changeset
   276
({\S}\ref{sec:simplification-II}) we explain some more advanced features and a
9754
a123a64cadeb *** empty log message ***
nipkow
parents: 9742
diff changeset
   277
little bit of how the simplifier works. The serious student should read that
a123a64cadeb *** empty log message ***
nipkow
parents: 9742
diff changeset
   278
section as well, in particular in order to understand what happened if things
a123a64cadeb *** empty log message ***
nipkow
parents: 9742
diff changeset
   279
do not simplify as expected.
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   280
11214
3b3cc0cf533f *** empty log message ***
nipkow
parents: 11213
diff changeset
   281
\subsection{What is Simplification}
9458
c613cd06d5cf apply. -> by
nipkow
parents: 8771
diff changeset
   282
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   283
In its most basic form, simplification means repeated application of
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   284
equations from left to right. For example, taking the rules for \isa{\at}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   285
and applying them to the term \isa{[0,1] \at\ []} results in a sequence of
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   286
simplification steps:
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   287
\begin{ttbox}\makeatother
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   288
(0#1#[]) @ []  \(\leadsto\)  0#((1#[]) @ [])  \(\leadsto\)  0#(1#([] @ []))  \(\leadsto\)  0#1#[]
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   289
\end{ttbox}
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9844
diff changeset
   290
This is also known as \bfindex{term rewriting}\indexbold{rewriting} and the
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9844
diff changeset
   291
equations are referred to as \textbf{rewrite rules}\indexbold{rewrite rule}.
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9844
diff changeset
   292
``Rewriting'' is more honest than ``simplification'' because the terms do not
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9844
diff changeset
   293
necessarily become simpler in the process.
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   294
9844
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
   295
\input{Misc/document/simp.tex}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   296
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   297
\index{simplification|)}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   298
9844
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
   299
\input{Misc/document/Itrev.tex}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   300
9493
494f8cd34df7 *** empty log message ***
nipkow
parents: 9458
diff changeset
   301
\begin{exercise}
494f8cd34df7 *** empty log message ***
nipkow
parents: 9458
diff changeset
   302
\input{Misc/document/Tree2.tex}%
494f8cd34df7 *** empty log message ***
nipkow
parents: 9458
diff changeset
   303
\end{exercise}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   304
9844
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
   305
\input{CodeGen/document/CodeGen.tex}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   306
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   307
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10824
diff changeset
   308
\section{Advanced Datatypes}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   309
\label{sec:advanced-datatypes}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   310
\index{*datatype|(}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   311
\index{*primrec|(}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   312
%|)
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   313
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   314
This section presents advanced forms of \isacommand{datatype}s.
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   315
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10824
diff changeset
   316
\subsection{Mutual Recursion}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   317
\label{sec:datatype-mut-rec}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   318
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   319
\input{Datatype/document/ABexpr.tex}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   320
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10824
diff changeset
   321
\subsection{Nested Recursion}
9644
6b0b6b471855 *** empty log message ***
nipkow
parents: 9541
diff changeset
   322
\label{sec:nested-datatype}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   323
9644
6b0b6b471855 *** empty log message ***
nipkow
parents: 9541
diff changeset
   324
{\makeatother\input{Datatype/document/Nested.tex}}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   325
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   326
11309
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11302
diff changeset
   327
\subsection{The Limits of Nested Recursion}

How far can we push nested recursion? By the unfolding argument above, we can
reduce nested to mutual recursion provided the nested recursion only involves
previously defined datatypes. This does not include functions:
\begin{isabelle}
\isacommand{datatype} t = C "t \isasymRightarrow\ bool"
\end{isabelle}
This declaration is a real can of worms.
In HOL it must be ruled out because it requires a type
\isa{t} such that \isa{t} and its power set \isa{t \isasymFun\ bool} have the
same cardinality --- an impossibility. For the same reason it is not possible
to allow recursion involving the type \isa{set}, which is isomorphic to
\isa{t \isasymFun\ bool}.

Fortunately, a limited form of recursion
involving function spaces is permitted: the recursive type may occur on the
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

If you need nested recursion on the left of a function arrow, there are
alternatives to pure HOL\@.  In the Logic for Computable Functions 
(LCF), types like
\begin{isabelle}
\isacommand{datatype} lam = C "lam \isasymrightarrow\ lam"
\end{isabelle}
do indeed make sense~\cite{paulson87}.  Note the different arrow,
\isa{\isasymrightarrow} instead of \isa{\isasymRightarrow},
expressing the type of \emph{continuous} functions. 
There is even a version of LCF on top of HOL,
called HOLCF~\cite{MuellerNvOS99}.

\index{*primrec|)}
\index{*datatype|)}

\subsection{Case Study: Tries}
\label{sec:Trie}

Tries are a classic search tree data structure~\cite{Knuth3-75} for fast
indexing with strings. Figure~\ref{fig:trie} gives a graphical example of a
trie containing the words ``all'', ``an'', ``ape'', ``can'', ``car'' and
``cat''.  When searching a string in a trie, the letters of the string are
examined sequentially. Each letter determines which subtrie to search next.
In this case study we model tries as a datatype, define a lookup and an
update function, and prove that they behave as expected.

\begin{figure}[htbp]
\begin{center}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   328
\unitlength1mm
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   329
\begin{picture}(60,30)
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   330
\put( 5, 0){\makebox(0,0)[b]{l}}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   331
\put(25, 0){\makebox(0,0)[b]{e}}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   332
\put(35, 0){\makebox(0,0)[b]{n}}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   333
\put(45, 0){\makebox(0,0)[b]{r}}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   334
\put(55, 0){\makebox(0,0)[b]{t}}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   335
%
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   336
\put( 5, 9){\line(0,-1){5}}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   337
\put(25, 9){\line(0,-1){5}}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   338
\put(44, 9){\line(-3,-2){9}}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   339
\put(45, 9){\line(0,-1){5}}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   340
\put(46, 9){\line(3,-2){9}}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   341
%
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   342
\put( 5,10){\makebox(0,0)[b]{l}}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   343
\put(15,10){\makebox(0,0)[b]{n}}
11309
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11302
diff changeset
   344
\put(25,10){\makebox(0,0)[b]{p}}
\put(45,10){\makebox(0,0)[b]{a}}
%
\put(14,19){\line(-3,-2){9}}
\put(15,19){\line(0,-1){5}}
\put(16,19){\line(3,-2){9}}
\put(45,19){\line(0,-1){5}}
%
\put(15,20){\makebox(0,0)[b]{a}}
\put(45,20){\makebox(0,0)[b]{c}}
%
\put(30,30){\line(-3,-2){13}}
\put(30,30){\line(3,-2){13}}
\end{picture}
\end{center}
\caption{A sample trie}
\label{fig:trie}
\end{figure}

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 modeled with the help
of the predefined datatype \isa{option} (see {\S}\ref{sec:option}).
\input{Trie/document/Trie.tex}

\section{Total Recursive Functions}
\label{sec:recdef}
\index{*recdef|(}

Although many total functions have a natural primitive recursive definition,
this is not always the case. Arbitrary total recursive functions can be
defined by means of \isacommand{recdef}: you can use full pattern-matching,
recursion need not involve datatypes, and termination is proved by showing
that the arguments of all recursive calls are smaller in a suitable (user
supplied) sense. In this section we restrict ourselves to measure functions;
more advanced termination proofs are discussed in {\S}\ref{sec:beyond-measure}.

\subsection{Defining Recursive Functions}
\label{sec:recdef-examples}
\input{Recdef/document/examples.tex}

\subsection{Proving Termination}

\input{Recdef/document/termination.tex}

\subsection{Simplification with Recdef}
\label{sec:recdef-simplification}

\input{Recdef/document/simplification.tex}

\subsection{Induction}
\index{induction!recursion|(}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   345
\index{recursion induction|(}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   346
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   347
\input{Recdef/document/Induction.tex}
9644
6b0b6b471855 *** empty log message ***
nipkow
parents: 9541
diff changeset
   348
\label{sec:recdef-induction}
8743
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   349
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   350
\index{induction!recursion|)}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   351
\index{recursion induction|)}
3253c6046d57 I wonder if that's all?
nipkow
parents:
diff changeset
   352
\index{*recdef|)}