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