doc-src/TutorialI/Recdef/document/examples.tex
author wenzelm
Mon, 11 Sep 2000 18:00:47 +0200
changeset 9924 3370f6aa3200
parent 9792 bbefb6ce5cb2
child 9933 9feb1e0c4cb3
permissions -rw-r--r--
updated;
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}%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
     4
%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
     5
\begin{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
     6
Here is a simple example, the Fibonacci function:%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
     7
\end{isamarkuptext}%
9674
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
     8
\isacommand{consts}\ fib\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequote}nat\ {\isasymRightarrow}\ nat{\isachardoublequote}\isanewline
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
     9
\isacommand{recdef}\ fib\ {\isachardoublequote}measure{\isacharparenleft}{\isasymlambda}n{\isachardot}\ n{\isacharparenright}{\isachardoublequote}\isanewline
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    10
\ \ {\isachardoublequote}fib\ \isadigit{0}\ {\isacharequal}\ \isadigit{0}{\isachardoublequote}\isanewline
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    11
\ \ {\isachardoublequote}fib\ \isadigit{1}\ {\isacharequal}\ \isadigit{1}{\isachardoublequote}\isanewline
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    12
\ \ {\isachardoublequote}fib\ {\isacharparenleft}Suc{\isacharparenleft}Suc\ x{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ fib\ x\ {\isacharplus}\ fib\ {\isacharparenleft}Suc\ x{\isacharparenright}{\isachardoublequote}%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    13
\begin{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    14
\noindent
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    15
The definition of \isa{fib} is accompanied by a \bfindex{measure function}
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9722
diff changeset
    16
\isa{{\isasymlambda}n{\isachardot}\ n} which maps the argument of \isa{fib} to a
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    17
natural number. The requirement is that in each equation the measure of the
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    18
argument on the left-hand side is strictly greater than the measure of the
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    19
argument of each recursive call. In the case of \isa{fib} this is
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    20
obviously true because the measure function is the identity and
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9722
diff changeset
    21
\isa{Suc\ {\isacharparenleft}Suc\ x{\isacharparenright}} is strictly greater than both \isa{x} and
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9722
diff changeset
    22
\isa{Suc\ x}.
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    23
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    24
Slightly more interesting is the insertion of a fixed element
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    25
between any two elements of a list:%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    26
\end{isamarkuptext}%
9674
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    27
\isacommand{consts}\ sep\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequote}{\isacharprime}a\ {\isacharasterisk}\ {\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ list{\isachardoublequote}\isanewline
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    28
\isacommand{recdef}\ sep\ {\isachardoublequote}measure\ {\isacharparenleft}{\isasymlambda}{\isacharparenleft}a{\isacharcomma}xs{\isacharparenright}{\isachardot}\ length\ xs{\isacharparenright}{\isachardoublequote}\isanewline
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    29
\ \ {\isachardoublequote}sep{\isacharparenleft}a{\isacharcomma}\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ \ \ \ \ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}{\isachardoublequote}\isanewline
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    30
\ \ {\isachardoublequote}sep{\isacharparenleft}a{\isacharcomma}\ {\isacharbrackleft}x{\isacharbrackright}{\isacharparenright}\ \ \ \ {\isacharequal}\ {\isacharbrackleft}x{\isacharbrackright}{\isachardoublequote}\isanewline
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    31
\ \ {\isachardoublequote}sep{\isacharparenleft}a{\isacharcomma}\ x{\isacharhash}y{\isacharhash}zs{\isacharparenright}\ {\isacharequal}\ x\ {\isacharhash}\ a\ {\isacharhash}\ sep{\isacharparenleft}a{\isacharcomma}y{\isacharhash}zs{\isacharparenright}{\isachardoublequote}%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    32
\begin{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    33
\noindent
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    34
This time the measure is the length of the list, which decreases with the
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    35
recursive call; the first component of the argument tuple is irrelevant.
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    36
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    37
Pattern matching need not be exhaustive:%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    38
\end{isamarkuptext}%
9674
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    39
\isacommand{consts}\ last\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequote}{\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a{\isachardoublequote}\isanewline
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    40
\isacommand{recdef}\ last\ {\isachardoublequote}measure\ {\isacharparenleft}{\isasymlambda}xs{\isachardot}\ length\ xs{\isacharparenright}{\isachardoublequote}\isanewline
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    41
\ \ {\isachardoublequote}last\ {\isacharbrackleft}x{\isacharbrackright}\ \ \ \ \ \ {\isacharequal}\ x{\isachardoublequote}\isanewline
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    42
\ \ {\isachardoublequote}last\ {\isacharparenleft}x{\isacharhash}y{\isacharhash}zs{\isacharparenright}\ {\isacharequal}\ last\ {\isacharparenleft}y{\isacharhash}zs{\isacharparenright}{\isachardoublequote}%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    43
\begin{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    44
Overlapping patterns are disambiguated by taking the order of equations into
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    45
account, just as in functional programming:%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    46
\end{isamarkuptext}%
9674
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    47
\isacommand{consts}\ sep\isadigit{1}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequote}{\isacharprime}a\ {\isacharasterisk}\ {\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ list{\isachardoublequote}\isanewline
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    48
\isacommand{recdef}\ sep\isadigit{1}\ {\isachardoublequote}measure\ {\isacharparenleft}{\isasymlambda}{\isacharparenleft}a{\isacharcomma}xs{\isacharparenright}{\isachardot}\ length\ xs{\isacharparenright}{\isachardoublequote}\isanewline
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    49
\ \ {\isachardoublequote}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}{\isachardoublequote}\isanewline
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    50
\ \ {\isachardoublequote}sep\isadigit{1}{\isacharparenleft}a{\isacharcomma}\ xs{\isacharparenright}\ \ \ \ \ {\isacharequal}\ xs{\isachardoublequote}%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    51
\begin{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    52
\noindent
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    53
This defines exactly the same function as \isa{sep} above, i.e.\
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9722
diff changeset
    54
\isa{sep\isadigit{1}\ {\isacharequal}\ sep}.
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    55
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    56
\begin{warn}
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    57
  \isacommand{recdef} only takes the first argument of a (curried)
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    58
  recursive function into account. This means both the termination measure
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    59
  and pattern matching can only use that first argument. In general, you will
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    60
  therefore have to combine several arguments into a tuple. In case only one
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    61
  argument is relevant for termination, you can also rearrange the order of
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    62
  arguments as in the following definition:
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    63
\end{warn}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    64
\end{isamarkuptext}%
9674
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    65
\isacommand{consts}\ sep\isadigit{2}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequote}{\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a\ list{\isachardoublequote}\isanewline
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    66
\isacommand{recdef}\ sep\isadigit{2}\ {\isachardoublequote}measure\ length{\isachardoublequote}\isanewline
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    67
\ \ {\isachardoublequote}sep\isadigit{2}\ {\isacharparenleft}x{\isacharhash}y{\isacharhash}zs{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}{\isasymlambda}a{\isachardot}\ x\ {\isacharhash}\ a\ {\isacharhash}\ sep\isadigit{2}\ zs\ a{\isacharparenright}{\isachardoublequote}\isanewline
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    68
\ \ {\isachardoublequote}sep\isadigit{2}\ xs\ \ \ \ \ \ \ {\isacharequal}\ {\isacharparenleft}{\isasymlambda}a{\isachardot}\ xs{\isacharparenright}{\isachardoublequote}%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    69
\begin{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    70
Because of its pattern-matching syntax, \isacommand{recdef} is also useful
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    71
for the definition of non-recursive functions:%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    72
\end{isamarkuptext}%
9674
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    73
\isacommand{consts}\ swap\isadigit{1}\isadigit{2}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequote}{\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ list{\isachardoublequote}\isanewline
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    74
\isacommand{recdef}\ swap\isadigit{1}\isadigit{2}\ {\isachardoublequote}{\isacharbraceleft}{\isacharbraceright}{\isachardoublequote}\isanewline
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    75
\ \ {\isachardoublequote}swap\isadigit{1}\isadigit{2}\ {\isacharparenleft}x{\isacharhash}y{\isacharhash}zs{\isacharparenright}\ {\isacharequal}\ y{\isacharhash}x{\isacharhash}zs{\isachardoublequote}\isanewline
f789d2490669 updated;
wenzelm
parents: 9644
diff changeset
    76
\ \ {\isachardoublequote}swap\isadigit{1}\isadigit{2}\ zs\ \ \ \ \ \ \ {\isacharequal}\ zs{\isachardoublequote}%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    77
\begin{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    78
\noindent
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8749
diff changeset
    79
For non-recursive functions the termination measure degenerates to the empty
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9722
diff changeset
    80
set \isa{{\isacharbraceleft}{\isacharbraceright}}.%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    81
\end{isamarkuptext}%
9722
a5f86aed785b *** empty log message ***
nipkow
parents: 9721
diff changeset
    82
\end{isabellebody}%
9145
9f7b8de5bfaf updated;
wenzelm
parents: 8771
diff changeset
    83
%%% Local Variables:
9f7b8de5bfaf updated;
wenzelm
parents: 8771
diff changeset
    84
%%% mode: latex
9f7b8de5bfaf updated;
wenzelm
parents: 8771
diff changeset
    85
%%% TeX-master: "root"
9f7b8de5bfaf updated;
wenzelm
parents: 8771
diff changeset
    86
%%% End: