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