doc-src/TutorialI/Recdef/document/examples.tex
author haftmann
Mon, 31 May 2010 17:31:33 +0200
changeset 37212 b8e02ce2559f
parent 17187 45bee2f6e61f
permissions -rw-r--r--
updated generated files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9722
a5f86aed785b *** empty log message ***
nipkow
parents: 9721
diff changeset
     1
%
a5f86aed785b *** empty log message ***
nipkow
parents: 9721
diff changeset
     2
\begin{isabellebody}%
9924
3370f6aa3200 updated;
wenzelm
parents: 9792
diff changeset
     3
\def\isabellecontext{examples}%
17056
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
     4
%
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
     5
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
     6
%
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
     7
\endisadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
     8
%
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
     9
\isatagtheory
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
    10
%
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
    11
\endisatagtheory
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
    12
{\isafoldtheory}%
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
    13
%
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
    14
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
    15
%
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
    16
\endisadelimtheory
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    17
%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    18
\begin{isamarkuptext}%
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11231
diff changeset
    19
Here is a simple example, the \rmindex{Fibonacci function}:%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    20
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    21
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    22
\isacommand{consts}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    23
\ fib\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    24
\isacommand{recdef}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    25
\ fib\ {\isachardoublequoteopen}measure{\isacharparenleft}{\isasymlambda}n{\isachardot}\ n{\isacharparenright}{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    26
\ \ {\isachardoublequoteopen}fib\ {\isadigit{0}}\ {\isacharequal}\ {\isadigit{0}}{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    27
\ \ {\isachardoublequoteopen}fib\ {\isacharparenleft}Suc\ {\isadigit{0}}{\isacharparenright}\ {\isacharequal}\ {\isadigit{1}}{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    28
\ \ {\isachardoublequoteopen}fib\ {\isacharparenleft}Suc{\isacharparenleft}Suc\ x{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ fib\ x\ {\isacharplus}\ fib\ {\isacharparenleft}Suc\ x{\isacharparenright}{\isachardoublequoteclose}%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    29
\begin{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    30
\noindent
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11231
diff changeset
    31
\index{measure functions}%
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11231
diff changeset
    32
The definition of \isa{fib} is accompanied by a \textbf{measure function}
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9722
diff changeset
    33
\isa{{\isasymlambda}n{\isachardot}\ n} which maps the argument of \isa{fib} to a
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    34
natural number. The requirement is that in each equation the measure of the
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    35
argument on the left-hand side is strictly greater than the measure of the
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    36
argument of each recursive call. In the case of \isa{fib} this is
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    37
obviously true because the measure function is the identity and
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9722
diff changeset
    38
\isa{Suc\ {\isacharparenleft}Suc\ x{\isacharparenright}} is strictly greater than both \isa{x} and
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9722
diff changeset
    39
\isa{Suc\ x}.
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    40
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    41
Slightly more interesting is the insertion of a fixed element
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    42
between any two elements of a list:%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    43
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    44
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    45
\isacommand{consts}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    46
\ sep\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ {\isasymtimes}\ {\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ list{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    47
\isacommand{recdef}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    48
\ sep\ {\isachardoublequoteopen}measure\ {\isacharparenleft}{\isasymlambda}{\isacharparenleft}a{\isacharcomma}xs{\isacharparenright}{\isachardot}\ length\ xs{\isacharparenright}{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    49
\ \ {\isachardoublequoteopen}sep{\isacharparenleft}a{\isacharcomma}\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ \ \ \ \ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    50
\ \ {\isachardoublequoteopen}sep{\isacharparenleft}a{\isacharcomma}\ {\isacharbrackleft}x{\isacharbrackright}{\isacharparenright}\ \ \ \ {\isacharequal}\ {\isacharbrackleft}x{\isacharbrackright}{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    51
\ \ {\isachardoublequoteopen}sep{\isacharparenleft}a{\isacharcomma}\ x{\isacharhash}y{\isacharhash}zs{\isacharparenright}\ {\isacharequal}\ x\ {\isacharhash}\ a\ {\isacharhash}\ sep{\isacharparenleft}a{\isacharcomma}y{\isacharhash}zs{\isacharparenright}{\isachardoublequoteclose}%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    52
\begin{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    53
\noindent
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    54
This time the measure is the length of the list, which decreases with the
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    55
recursive call; the first component of the argument tuple is irrelevant.
10654
458068404143 *** empty log message ***
nipkow
parents: 10362
diff changeset
    56
The details of tupled $\lambda$-abstractions \isa{{\isasymlambda}{\isacharparenleft}x\isactrlsub {\isadigit{1}}{\isacharcomma}{\isasymdots}{\isacharcomma}x\isactrlsub n{\isacharparenright}} are
458068404143 *** empty log message ***
nipkow
parents: 10362
diff changeset
    57
explained in \S\ref{sec:products}, but for now your intuition is all you need.
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    58
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11231
diff changeset
    59
Pattern matching\index{pattern matching!and \isacommand{recdef}}
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11231
diff changeset
    60
need not be exhaustive:%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    61
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    62
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    63
\isacommand{consts}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    64
\ last\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    65
\isacommand{recdef}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    66
\ last\ {\isachardoublequoteopen}measure\ {\isacharparenleft}{\isasymlambda}xs{\isachardot}\ length\ xs{\isacharparenright}{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    67
\ \ {\isachardoublequoteopen}last\ {\isacharbrackleft}x{\isacharbrackright}\ \ \ \ \ \ {\isacharequal}\ x{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    68
\ \ {\isachardoublequoteopen}last\ {\isacharparenleft}x{\isacharhash}y{\isacharhash}zs{\isacharparenright}\ {\isacharequal}\ last\ {\isacharparenleft}y{\isacharhash}zs{\isacharparenright}{\isachardoublequoteclose}%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    69
\begin{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    70
Overlapping patterns are disambiguated by taking the order of equations into
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    71
account, just as in functional programming:%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    72
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    73
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    74
\isacommand{consts}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    75
\ sep{\isadigit{1}}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ {\isasymtimes}\ {\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ list{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    76
\isacommand{recdef}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    77
\ sep{\isadigit{1}}\ {\isachardoublequoteopen}measure\ {\isacharparenleft}{\isasymlambda}{\isacharparenleft}a{\isacharcomma}xs{\isacharparenright}{\isachardot}\ length\ xs{\isacharparenright}{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    78
\ \ {\isachardoublequoteopen}sep{\isadigit{1}}{\isacharparenleft}a{\isacharcomma}\ x{\isacharhash}y{\isacharhash}zs{\isacharparenright}\ {\isacharequal}\ x\ {\isacharhash}\ a\ {\isacharhash}\ sep{\isadigit{1}}{\isacharparenleft}a{\isacharcomma}y{\isacharhash}zs{\isacharparenright}{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    79
\ \ {\isachardoublequoteopen}sep{\isadigit{1}}{\isacharparenleft}a{\isacharcomma}\ xs{\isacharparenright}\ \ \ \ \ {\isacharequal}\ xs{\isachardoublequoteclose}%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    80
\begin{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    81
\noindent
11160
e0ab13bec5c8 *** empty log message ***
nipkow
parents: 10654
diff changeset
    82
To guarantee that the second equation can only be applied if the first
e0ab13bec5c8 *** empty log message ***
nipkow
parents: 10654
diff changeset
    83
one does not match, Isabelle internally replaces the second equation
e0ab13bec5c8 *** empty log message ***
nipkow
parents: 10654
diff changeset
    84
by the two possibilities that are left: \isa{sep{\isadigit{1}}\ {\isacharparenleft}a{\isacharcomma}\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}} and
e0ab13bec5c8 *** empty log message ***
nipkow
parents: 10654
diff changeset
    85
\isa{sep{\isadigit{1}}\ {\isacharparenleft}a{\isacharcomma}\ {\isacharbrackleft}x{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\ {\isacharbrackleft}x{\isacharbrackright}}.  Thus the functions \isa{sep} and
e0ab13bec5c8 *** empty log message ***
nipkow
parents: 10654
diff changeset
    86
\isa{sep{\isadigit{1}}} are identical.
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    87
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    88
\begin{warn}
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    89
  \isacommand{recdef} only takes the first argument of a (curried)
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    90
  recursive function into account. This means both the termination measure
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    91
  and pattern matching can only use that first argument. In general, you will
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    92
  therefore have to combine several arguments into a tuple. In case only one
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    93
  argument is relevant for termination, you can also rearrange the order of
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    94
  arguments as in the following definition:
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    95
\end{warn}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    96
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    97
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    98
\isacommand{consts}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    99
\ sep{\isadigit{2}}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a\ list{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   100
\isacommand{recdef}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   101
\ sep{\isadigit{2}}\ {\isachardoublequoteopen}measure\ length{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   102
\ \ {\isachardoublequoteopen}sep{\isadigit{2}}\ {\isacharparenleft}x{\isacharhash}y{\isacharhash}zs{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}{\isasymlambda}a{\isachardot}\ x\ {\isacharhash}\ a\ {\isacharhash}\ sep{\isadigit{2}}\ {\isacharparenleft}y{\isacharhash}zs{\isacharparenright}\ a{\isacharparenright}{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   103
\ \ {\isachardoublequoteopen}sep{\isadigit{2}}\ xs\ \ \ \ \ \ \ {\isacharequal}\ {\isacharparenleft}{\isasymlambda}a{\isachardot}\ xs{\isacharparenright}{\isachardoublequoteclose}%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
   104
\begin{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
   105
Because of its pattern-matching syntax, \isacommand{recdef} is also useful
11231
30d96882f915 *** empty log message ***
nipkow
parents: 11160
diff changeset
   106
for the definition of non-recursive functions, where the termination measure
30d96882f915 *** empty log message ***
nipkow
parents: 11160
diff changeset
   107
degenerates to the empty set \isa{{\isacharbraceleft}{\isacharbraceright}}:%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
   108
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   109
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   110
\isacommand{consts}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   111
\ swap{\isadigit{1}}{\isadigit{2}}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ list{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   112
\isacommand{recdef}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   113
\ swap{\isadigit{1}}{\isadigit{2}}\ {\isachardoublequoteopen}{\isacharbraceleft}{\isacharbraceright}{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   114
\ \ {\isachardoublequoteopen}swap{\isadigit{1}}{\isadigit{2}}\ {\isacharparenleft}x{\isacharhash}y{\isacharhash}zs{\isacharparenright}\ {\isacharequal}\ y{\isacharhash}x{\isacharhash}zs{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   115
\ \ {\isachardoublequoteopen}swap{\isadigit{1}}{\isadigit{2}}\ zs\ \ \ \ \ \ \ {\isacharequal}\ zs{\isachardoublequoteclose}\isanewline
17056
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
   116
%
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
   117
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
   118
%
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
   119
\endisadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
   120
%
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
   121
\isatagtheory
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
   122
%
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
   123
\endisatagtheory
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
   124
{\isafoldtheory}%
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
   125
%
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
   126
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
   127
%
05fc32a23b8b updated;
wenzelm
parents: 13791
diff changeset
   128
\endisadelimtheory
9722
a5f86aed785b *** empty log message ***
nipkow
parents: 9721
diff changeset
   129
\end{isabellebody}%
9145
9f7b8de5bfaf updated;
wenzelm
parents: 8771
diff changeset
   130
%%% Local Variables:
9f7b8de5bfaf updated;
wenzelm
parents: 8771
diff changeset
   131
%%% mode: latex
9f7b8de5bfaf updated;
wenzelm
parents: 8771
diff changeset
   132
%%% TeX-master: "root"
9f7b8de5bfaf updated;
wenzelm
parents: 8771
diff changeset
   133
%%% End: