doc-src/TutorialI/Fun/document/fun0.tex
author blanchet
Thu, 26 Jul 2012 16:08:16 +0200
changeset 48535 619531d87ce4
parent 40406 313a24b66a8d
permissions -rw-r--r--
[1] goes after any attributes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
     1
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
     2
\begin{isabellebody}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
     3
\def\isabellecontext{fun{\isadigit{0}}}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
     4
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
     5
\isadelimtheory
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
     6
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
     7
\endisadelimtheory
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
     8
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
     9
\isatagtheory
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    10
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    11
\endisatagtheory
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    12
{\isafoldtheory}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    13
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    14
\isadelimtheory
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    15
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    16
\endisadelimtheory
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    17
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    18
\begin{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    19
\subsection{Definition}
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    20
\label{sec:fun-examples}
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    21
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    22
Here is a simple example, the \rmindex{Fibonacci function}:%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    23
\end{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    24
\isamarkuptrue%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    25
\isacommand{fun}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
    26
\ fib\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}nat\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ nat{\isaliteral{22}{\isachardoublequoteclose}}\ \isakeyword{where}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
    27
{\isaliteral{22}{\isachardoublequoteopen}}fib\ {\isadigit{0}}\ {\isaliteral{3D}{\isacharequal}}\ {\isadigit{0}}{\isaliteral{22}{\isachardoublequoteclose}}\ {\isaliteral{7C}{\isacharbar}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
    28
{\isaliteral{22}{\isachardoublequoteopen}}fib\ {\isaliteral{28}{\isacharparenleft}}Suc\ {\isadigit{0}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isadigit{1}}{\isaliteral{22}{\isachardoublequoteclose}}\ {\isaliteral{7C}{\isacharbar}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
    29
{\isaliteral{22}{\isachardoublequoteopen}}fib\ {\isaliteral{28}{\isacharparenleft}}Suc{\isaliteral{28}{\isacharparenleft}}Suc\ x{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ fib\ x\ {\isaliteral{2B}{\isacharplus}}\ fib\ {\isaliteral{28}{\isacharparenleft}}Suc\ x{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}%
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    30
\begin{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    31
\noindent
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    32
This resembles ordinary functional programming languages. Note the obligatory
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    33
\isacommand{where} and \isa{|}. Command \isacommand{fun} declares and
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    34
defines the function in one go. Isabelle establishes termination automatically
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    35
because \isa{fib}'s argument decreases in every recursive call.
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    36
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    37
Slightly more interesting is the insertion of a fixed element
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    38
between any two elements of a list:%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    39
\end{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    40
\isamarkuptrue%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    41
\isacommand{fun}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
    42
\ sep\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ list\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ list{\isaliteral{22}{\isachardoublequoteclose}}\ \isakeyword{where}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
    43
{\isaliteral{22}{\isachardoublequoteopen}}sep\ a\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}\ \ \ \ \ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{22}{\isachardoublequoteclose}}\ {\isaliteral{7C}{\isacharbar}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
    44
{\isaliteral{22}{\isachardoublequoteopen}}sep\ a\ {\isaliteral{5B}{\isacharbrackleft}}x{\isaliteral{5D}{\isacharbrackright}}\ \ \ \ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{5B}{\isacharbrackleft}}x{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{22}{\isachardoublequoteclose}}\ {\isaliteral{7C}{\isacharbar}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
    45
{\isaliteral{22}{\isachardoublequoteopen}}sep\ a\ {\isaliteral{28}{\isacharparenleft}}x{\isaliteral{23}{\isacharhash}}y{\isaliteral{23}{\isacharhash}}zs{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ x\ {\isaliteral{23}{\isacharhash}}\ a\ {\isaliteral{23}{\isacharhash}}\ sep\ a\ {\isaliteral{28}{\isacharparenleft}}y{\isaliteral{23}{\isacharhash}}zs{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}%
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    46
\begin{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    47
\noindent
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    48
This time the length of the list decreases with the
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    49
recursive call; the first argument is irrelevant for termination.
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    50
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    51
Pattern matching\index{pattern matching!and \isacommand{fun}}
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    52
need not be exhaustive and may employ wildcards:%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    53
\end{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    54
\isamarkuptrue%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    55
\isacommand{fun}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
    56
\ last\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ list\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a{\isaliteral{22}{\isachardoublequoteclose}}\ \isakeyword{where}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
    57
{\isaliteral{22}{\isachardoublequoteopen}}last\ {\isaliteral{5B}{\isacharbrackleft}}x{\isaliteral{5D}{\isacharbrackright}}\ \ \ \ \ \ {\isaliteral{3D}{\isacharequal}}\ x{\isaliteral{22}{\isachardoublequoteclose}}\ {\isaliteral{7C}{\isacharbar}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
    58
{\isaliteral{22}{\isachardoublequoteopen}}last\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{5F}{\isacharunderscore}}{\isaliteral{23}{\isacharhash}}y{\isaliteral{23}{\isacharhash}}zs{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ last\ {\isaliteral{28}{\isacharparenleft}}y{\isaliteral{23}{\isacharhash}}zs{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}%
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    59
\begin{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    60
Overlapping patterns are disambiguated by taking the order of equations into
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    61
account, just as in functional programming:%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    62
\end{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    63
\isamarkuptrue%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    64
\isacommand{fun}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
    65
\ sep{\isadigit{1}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ list\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ list{\isaliteral{22}{\isachardoublequoteclose}}\ \isakeyword{where}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
    66
{\isaliteral{22}{\isachardoublequoteopen}}sep{\isadigit{1}}\ a\ {\isaliteral{28}{\isacharparenleft}}x{\isaliteral{23}{\isacharhash}}y{\isaliteral{23}{\isacharhash}}zs{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ x\ {\isaliteral{23}{\isacharhash}}\ a\ {\isaliteral{23}{\isacharhash}}\ sep{\isadigit{1}}\ a\ {\isaliteral{28}{\isacharparenleft}}y{\isaliteral{23}{\isacharhash}}zs{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\ {\isaliteral{7C}{\isacharbar}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
    67
{\isaliteral{22}{\isachardoublequoteopen}}sep{\isadigit{1}}\ {\isaliteral{5F}{\isacharunderscore}}\ xs\ \ \ \ \ \ \ {\isaliteral{3D}{\isacharequal}}\ xs{\isaliteral{22}{\isachardoublequoteclose}}%
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    68
\begin{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    69
\noindent
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    70
To guarantee that the second equation can only be applied if the first
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    71
one does not match, Isabelle internally replaces the second equation
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
    72
by the two possibilities that are left: \isa{sep{\isadigit{1}}\ a\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}} and
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
    73
\isa{sep{\isadigit{1}}\ a\ {\isaliteral{5B}{\isacharbrackleft}}x{\isaliteral{5D}{\isacharbrackright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{5B}{\isacharbrackleft}}x{\isaliteral{5D}{\isacharbrackright}}}.  Thus the functions \isa{sep} and
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    74
\isa{sep{\isadigit{1}}} are identical.
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    75
25263
b54744935036 *** empty log message ***
nipkow
parents: 25261
diff changeset
    76
Because of its pattern matching syntax, \isacommand{fun} is also useful
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    77
for the definition of non-recursive functions:%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    78
\end{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    79
\isamarkuptrue%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    80
\isacommand{fun}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
    81
\ swap{\isadigit{1}}{\isadigit{2}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ list\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ list{\isaliteral{22}{\isachardoublequoteclose}}\ \isakeyword{where}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
    82
{\isaliteral{22}{\isachardoublequoteopen}}swap{\isadigit{1}}{\isadigit{2}}\ {\isaliteral{28}{\isacharparenleft}}x{\isaliteral{23}{\isacharhash}}y{\isaliteral{23}{\isacharhash}}zs{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ y{\isaliteral{23}{\isacharhash}}x{\isaliteral{23}{\isacharhash}}zs{\isaliteral{22}{\isachardoublequoteclose}}\ {\isaliteral{7C}{\isacharbar}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
    83
{\isaliteral{22}{\isachardoublequoteopen}}swap{\isadigit{1}}{\isadigit{2}}\ zs\ \ \ \ \ \ \ {\isaliteral{3D}{\isacharequal}}\ zs{\isaliteral{22}{\isachardoublequoteclose}}%
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    84
\begin{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    85
After a function~$f$ has been defined via \isacommand{fun},
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    86
its defining equations (or variants derived from them) are available
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
    87
under the name $f$\isa{{\isaliteral{2E}{\isachardot}}simps} as theorems.
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    88
For example, look (via \isacommand{thm}) at
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
    89
\isa{sep{\isaliteral{2E}{\isachardot}}simps} and \isa{sep{\isadigit{1}}{\isaliteral{2E}{\isachardot}}simps} to see that they define
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    90
the same function. What is more, those equations are automatically declared as
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    91
simplification rules.
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    92
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    93
\subsection{Termination}
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    94
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    95
Isabelle's automatic termination prover for \isacommand{fun} has a
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    96
fixed notion of the \emph{size} (of type \isa{nat}) of an
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    97
argument. The size of a natural number is the number itself. The size
25339
nipkow
parents: 25265
diff changeset
    98
of a list is its length. For the general case see \S\ref{sec:general-datatype}.
nipkow
parents: 25265
diff changeset
    99
A recursive function is accepted if \isacommand{fun} can
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   100
show that the size of one fixed argument becomes smaller with each
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   101
recursive call.
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   102
25261
3dc292be0b54 recdef -> fun
nipkow
parents: 25260
diff changeset
   103
More generally, \isacommand{fun} allows any \emph{lexicographic
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   104
combination} of size measures in case there are multiple
25261
3dc292be0b54 recdef -> fun
nipkow
parents: 25260
diff changeset
   105
arguments. For example, the following version of \rmindex{Ackermann's
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   106
function} is accepted:%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   107
\end{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   108
\isamarkuptrue%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   109
\isacommand{fun}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   110
\ ack{\isadigit{2}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}nat\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ nat\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ nat{\isaliteral{22}{\isachardoublequoteclose}}\ \isakeyword{where}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   111
{\isaliteral{22}{\isachardoublequoteopen}}ack{\isadigit{2}}\ n\ {\isadigit{0}}\ {\isaliteral{3D}{\isacharequal}}\ Suc\ n{\isaliteral{22}{\isachardoublequoteclose}}\ {\isaliteral{7C}{\isacharbar}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   112
{\isaliteral{22}{\isachardoublequoteopen}}ack{\isadigit{2}}\ {\isadigit{0}}\ {\isaliteral{28}{\isacharparenleft}}Suc\ m{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ ack{\isadigit{2}}\ {\isaliteral{28}{\isacharparenleft}}Suc\ {\isadigit{0}}{\isaliteral{29}{\isacharparenright}}\ m{\isaliteral{22}{\isachardoublequoteclose}}\ {\isaliteral{7C}{\isacharbar}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   113
{\isaliteral{22}{\isachardoublequoteopen}}ack{\isadigit{2}}\ {\isaliteral{28}{\isacharparenleft}}Suc\ n{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{28}{\isacharparenleft}}Suc\ m{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ ack{\isadigit{2}}\ {\isaliteral{28}{\isacharparenleft}}ack{\isadigit{2}}\ n\ {\isaliteral{28}{\isacharparenleft}}Suc\ m{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\ m{\isaliteral{22}{\isachardoublequoteclose}}%
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   114
\begin{isamarkuptext}%
25263
b54744935036 *** empty log message ***
nipkow
parents: 25261
diff changeset
   115
The order of arguments has no influence on whether
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   116
\isacommand{fun} can prove termination of a function. For more details
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   117
see elsewhere~\cite{bulwahnKN07}.
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   118
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   119
\subsection{Simplification}
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   120
\label{sec:fun-simplification}
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   121
25265
3a5d33e8a019 tweaked
paulson
parents: 25263
diff changeset
   122
Upon a successful termination proof, the recursion equations become
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   123
simplification rules, just as with \isacommand{primrec}.
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   124
In most cases this works fine, but there is a subtle
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   125
problem that must be mentioned: simplification may not
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   126
terminate because of automatic splitting of \isa{if}.
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   127
\index{*if expressions!splitting of}
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   128
Let us look at an example:%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   129
\end{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   130
\isamarkuptrue%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   131
\isacommand{fun}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   132
\ gcd\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}nat\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ nat\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ nat{\isaliteral{22}{\isachardoublequoteclose}}\ \isakeyword{where}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   133
{\isaliteral{22}{\isachardoublequoteopen}}gcd\ m\ n\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}if\ n{\isaliteral{3D}{\isacharequal}}{\isadigit{0}}\ then\ m\ else\ gcd\ n\ {\isaliteral{28}{\isacharparenleft}}m\ mod\ n{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}%
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   134
\begin{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   135
\noindent
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   136
The second argument decreases with each recursive call.
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   137
The termination condition
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   138
\begin{isabelle}%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   139
\ \ \ \ \ n\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ {\isadigit{0}}\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ m\ mod\ n\ {\isaliteral{3C}{\isacharless}}\ n%
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   140
\end{isabelle}
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   141
is proved automatically because it is already present as a lemma in
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   142
HOL\@.  Thus the recursion equation becomes a simplification
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   143
rule. Of course the equation is nonterminating if we are allowed to unfold
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   144
the recursive call inside the \isa{else} branch, which is why programming
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   145
languages and our simplifier don't do that. Unfortunately the simplifier does
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   146
something else that leads to the same problem: it splits 
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   147
each \isa{if}-expression unless its
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   148
condition simplifies to \isa{True} or \isa{False}.  For
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   149
example, simplification reduces
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   150
\begin{isabelle}%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   151
\ \ \ \ \ gcd\ m\ n\ {\isaliteral{3D}{\isacharequal}}\ k%
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   152
\end{isabelle}
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   153
in one step to
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   154
\begin{isabelle}%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   155
\ \ \ \ \ {\isaliteral{28}{\isacharparenleft}}if\ n\ {\isaliteral{3D}{\isacharequal}}\ {\isadigit{0}}\ then\ m\ else\ gcd\ n\ {\isaliteral{28}{\isacharparenleft}}m\ mod\ n{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ k%
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   156
\end{isabelle}
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   157
where the condition cannot be reduced further, and splitting leads to
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   158
\begin{isabelle}%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   159
\ \ \ \ \ {\isaliteral{28}{\isacharparenleft}}n\ {\isaliteral{3D}{\isacharequal}}\ {\isadigit{0}}\ {\isaliteral{5C3C6C6F6E6772696768746172726F773E}{\isasymlongrightarrow}}\ m\ {\isaliteral{3D}{\isacharequal}}\ k{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C616E643E}{\isasymand}}\ {\isaliteral{28}{\isacharparenleft}}n\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ {\isadigit{0}}\ {\isaliteral{5C3C6C6F6E6772696768746172726F773E}{\isasymlongrightarrow}}\ gcd\ n\ {\isaliteral{28}{\isacharparenleft}}m\ mod\ n{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ k{\isaliteral{29}{\isacharparenright}}%
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   160
\end{isabelle}
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   161
Since the recursive call \isa{gcd\ n\ {\isaliteral{28}{\isacharparenleft}}m\ mod\ n{\isaliteral{29}{\isacharparenright}}} is no longer protected by
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   162
an \isa{if}, it is unfolded again, which leads to an infinite chain of
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   163
simplification steps. Fortunately, this problem can be avoided in many
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   164
different ways.
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   165
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   166
The most radical solution is to disable the offending theorem
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   167
\isa{split{\isaliteral{5F}{\isacharunderscore}}if},
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   168
as shown in \S\ref{sec:AutoCaseSplits}.  However, we do not recommend this
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   169
approach: you will often have to invoke the rule explicitly when
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   170
\isa{if} is involved.
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   171
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   172
If possible, the definition should be given by pattern matching on the left
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   173
rather than \isa{if} on the right. In the case of \isa{gcd} the
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   174
following alternative definition suggests itself:%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   175
\end{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   176
\isamarkuptrue%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   177
\isacommand{fun}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   178
\ gcd{\isadigit{1}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}nat\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ nat\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ nat{\isaliteral{22}{\isachardoublequoteclose}}\ \isakeyword{where}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   179
{\isaliteral{22}{\isachardoublequoteopen}}gcd{\isadigit{1}}\ m\ {\isadigit{0}}\ {\isaliteral{3D}{\isacharequal}}\ m{\isaliteral{22}{\isachardoublequoteclose}}\ {\isaliteral{7C}{\isacharbar}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   180
{\isaliteral{22}{\isachardoublequoteopen}}gcd{\isadigit{1}}\ m\ n\ {\isaliteral{3D}{\isacharequal}}\ gcd{\isadigit{1}}\ n\ {\isaliteral{28}{\isacharparenleft}}m\ mod\ n{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}%
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   181
\begin{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   182
\noindent
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   183
The order of equations is important: it hides the side condition
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   184
\isa{n\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ {\isadigit{0}}}.  Unfortunately, not all conditionals can be
25263
b54744935036 *** empty log message ***
nipkow
parents: 25261
diff changeset
   185
expressed by pattern matching.
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   186
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   187
A simple alternative is to replace \isa{if} by \isa{case}, 
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   188
which is also available for \isa{bool} and is not split automatically:%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   189
\end{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   190
\isamarkuptrue%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   191
\isacommand{fun}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   192
\ gcd{\isadigit{2}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}nat\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ nat\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ nat{\isaliteral{22}{\isachardoublequoteclose}}\ \isakeyword{where}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   193
{\isaliteral{22}{\isachardoublequoteopen}}gcd{\isadigit{2}}\ m\ n\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}case\ n{\isaliteral{3D}{\isacharequal}}{\isadigit{0}}\ of\ True\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ m\ {\isaliteral{7C}{\isacharbar}}\ False\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ gcd{\isadigit{2}}\ n\ {\isaliteral{28}{\isacharparenleft}}m\ mod\ n{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}%
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   194
\begin{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   195
\noindent
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   196
This is probably the neatest solution next to pattern matching, and it is
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   197
always available.
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   198
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   199
A final alternative is to replace the offending simplification rules by
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   200
derived conditional ones. For \isa{gcd} it means we have to prove
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   201
these lemmas:%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   202
\end{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   203
\isamarkuptrue%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   204
\isacommand{lemma}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   205
\ {\isaliteral{5B}{\isacharbrackleft}}simp{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}gcd\ m\ {\isadigit{0}}\ {\isaliteral{3D}{\isacharequal}}\ m{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   206
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   207
\isadelimproof
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   208
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   209
\endisadelimproof
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   210
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   211
\isatagproof
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   212
\isacommand{apply}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   213
{\isaliteral{28}{\isacharparenleft}}simp{\isaliteral{29}{\isacharparenright}}\isanewline
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   214
\isacommand{done}\isamarkupfalse%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   215
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   216
\endisatagproof
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   217
{\isafoldproof}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   218
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   219
\isadelimproof
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   220
\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   221
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   222
\endisadelimproof
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   223
\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   224
\isacommand{lemma}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   225
\ {\isaliteral{5B}{\isacharbrackleft}}simp{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}n\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ {\isadigit{0}}\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ gcd\ m\ n\ {\isaliteral{3D}{\isacharequal}}\ gcd\ n\ {\isaliteral{28}{\isacharparenleft}}m\ mod\ n{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   226
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   227
\isadelimproof
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   228
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   229
\endisadelimproof
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   230
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   231
\isatagproof
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   232
\isacommand{apply}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   233
{\isaliteral{28}{\isacharparenleft}}simp{\isaliteral{29}{\isacharparenright}}\isanewline
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   234
\isacommand{done}\isamarkupfalse%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   235
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   236
\endisatagproof
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   237
{\isafoldproof}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   238
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   239
\isadelimproof
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   240
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   241
\endisadelimproof
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   242
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   243
\begin{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   244
\noindent
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   245
Simplification terminates for these proofs because the condition of the \isa{if} simplifies to \isa{True} or \isa{False}.
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   246
Now we can disable the original simplification rule:%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   247
\end{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   248
\isamarkuptrue%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   249
\isacommand{declare}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   250
\ gcd{\isaliteral{2E}{\isachardot}}simps\ {\isaliteral{5B}{\isacharbrackleft}}simp\ del{\isaliteral{5D}{\isacharbrackright}}%
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   251
\begin{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   252
\index{induction!recursion|(}
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   253
\index{recursion induction|(}
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   254
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   255
\subsection{Induction}
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   256
\label{sec:fun-induction}
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   257
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   258
Having defined a function we might like to prove something about it.
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   259
Since the function is recursive, the natural proof principle is
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   260
again induction. But this time the structural form of induction that comes
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   261
with datatypes is unlikely to work well --- otherwise we could have defined the
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   262
function by \isacommand{primrec}. Therefore \isacommand{fun} automatically
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   263
proves a suitable induction rule $f$\isa{{\isaliteral{2E}{\isachardot}}induct} that follows the
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   264
recursion pattern of the particular function $f$. We call this
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   265
\textbf{recursion induction}. Roughly speaking, it
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   266
requires you to prove for each \isacommand{fun} equation that the property
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   267
you are trying to establish holds for the left-hand side provided it holds
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   268
for all recursive calls on the right-hand side. Here is a simple example
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   269
involving the predefined \isa{map} functional on lists:%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   270
\end{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   271
\isamarkuptrue%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   272
\isacommand{lemma}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   273
\ {\isaliteral{22}{\isachardoublequoteopen}}map\ f\ {\isaliteral{28}{\isacharparenleft}}sep\ x\ xs{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ sep\ {\isaliteral{28}{\isacharparenleft}}f\ x{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{28}{\isacharparenleft}}map\ f\ xs{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}%
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   274
\isadelimproof
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   275
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   276
\endisadelimproof
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   277
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   278
\isatagproof
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   279
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   280
\begin{isamarkuptxt}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   281
\noindent
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   282
Note that \isa{map\ f\ xs}
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   283
is the result of applying \isa{f} to all elements of \isa{xs}. We prove
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   284
this lemma by recursion induction over \isa{sep}:%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   285
\end{isamarkuptxt}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   286
\isamarkuptrue%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   287
\isacommand{apply}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   288
{\isaliteral{28}{\isacharparenleft}}induct{\isaliteral{5F}{\isacharunderscore}}tac\ x\ xs\ rule{\isaliteral{3A}{\isacharcolon}}\ sep{\isaliteral{2E}{\isachardot}}induct{\isaliteral{29}{\isacharparenright}}%
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   289
\begin{isamarkuptxt}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   290
\noindent
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   291
The resulting proof state has three subgoals corresponding to the three
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   292
clauses for \isa{sep}:
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   293
\begin{isabelle}%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   294
\ {\isadigit{1}}{\isaliteral{2E}{\isachardot}}\ {\isaliteral{5C3C416E643E}{\isasymAnd}}a{\isaliteral{2E}{\isachardot}}\ map\ f\ {\isaliteral{28}{\isacharparenleft}}sep\ a\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ sep\ {\isaliteral{28}{\isacharparenleft}}f\ a{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{28}{\isacharparenleft}}map\ f\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{29}{\isacharparenright}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   295
\ {\isadigit{2}}{\isaliteral{2E}{\isachardot}}\ {\isaliteral{5C3C416E643E}{\isasymAnd}}a\ x{\isaliteral{2E}{\isachardot}}\ map\ f\ {\isaliteral{28}{\isacharparenleft}}sep\ a\ {\isaliteral{5B}{\isacharbrackleft}}x{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ sep\ {\isaliteral{28}{\isacharparenleft}}f\ a{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{28}{\isacharparenleft}}map\ f\ {\isaliteral{5B}{\isacharbrackleft}}x{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{29}{\isacharparenright}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   296
\ {\isadigit{3}}{\isaliteral{2E}{\isachardot}}\ {\isaliteral{5C3C416E643E}{\isasymAnd}}a\ x\ y\ zs{\isaliteral{2E}{\isachardot}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   297
\isaindent{\ {\isadigit{3}}{\isaliteral{2E}{\isachardot}}\ \ \ \ }map\ f\ {\isaliteral{28}{\isacharparenleft}}sep\ a\ {\isaliteral{28}{\isacharparenleft}}y\ {\isaliteral{23}{\isacharhash}}\ zs{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ sep\ {\isaliteral{28}{\isacharparenleft}}f\ a{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{28}{\isacharparenleft}}map\ f\ {\isaliteral{28}{\isacharparenleft}}y\ {\isaliteral{23}{\isacharhash}}\ zs{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   298
\isaindent{\ {\isadigit{3}}{\isaliteral{2E}{\isachardot}}\ \ \ \ }map\ f\ {\isaliteral{28}{\isacharparenleft}}sep\ a\ {\isaliteral{28}{\isacharparenleft}}x\ {\isaliteral{23}{\isacharhash}}\ y\ {\isaliteral{23}{\isacharhash}}\ zs{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ sep\ {\isaliteral{28}{\isacharparenleft}}f\ a{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{28}{\isacharparenleft}}map\ f\ {\isaliteral{28}{\isacharparenleft}}x\ {\isaliteral{23}{\isacharhash}}\ y\ {\isaliteral{23}{\isacharhash}}\ zs{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}%
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   299
\end{isabelle}
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   300
The rest is pure simplification:%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   301
\end{isamarkuptxt}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   302
\isamarkuptrue%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   303
\isacommand{apply}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   304
\ simp{\isaliteral{5F}{\isacharunderscore}}all\isanewline
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   305
\isacommand{done}\isamarkupfalse%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   306
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   307
\endisatagproof
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   308
{\isafoldproof}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   309
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   310
\isadelimproof
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   311
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   312
\endisadelimproof
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   313
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   314
\begin{isamarkuptext}%
25263
b54744935036 *** empty log message ***
nipkow
parents: 25261
diff changeset
   315
\noindent The proof goes smoothly because the induction rule
b54744935036 *** empty log message ***
nipkow
parents: 25261
diff changeset
   316
follows the recursion of \isa{sep}.  Try proving the above lemma by
b54744935036 *** empty log message ***
nipkow
parents: 25261
diff changeset
   317
structural induction, and you find that you need an additional case
b54744935036 *** empty log message ***
nipkow
parents: 25261
diff changeset
   318
distinction.
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   319
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   320
In general, the format of invoking recursion induction is
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   321
\begin{quote}
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   322
\isacommand{apply}\isa{{\isaliteral{28}{\isacharparenleft}}induct{\isaliteral{5F}{\isacharunderscore}}tac} $x@1 \dots x@n$ \isa{rule{\isaliteral{3A}{\isacharcolon}}} $f$\isa{{\isaliteral{2E}{\isachardot}}induct{\isaliteral{29}{\isacharparenright}}}
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   323
\end{quote}\index{*induct_tac (method)}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   324
where $x@1~\dots~x@n$ is a list of free variables in the subgoal and $f$ the
27167
nipkow
parents: 27015
diff changeset
   325
name of a function that takes $n$ arguments. Usually the subgoal will
25263
b54744935036 *** empty log message ***
nipkow
parents: 25261
diff changeset
   326
contain the term $f x@1 \dots x@n$ but this need not be the case. The
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27167
diff changeset
   327
induction rules do not mention $f$ at all. Here is \isa{sep{\isaliteral{2E}{\isachardot}}induct}:
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   328
\begin{isabelle}
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   329
{\isasymlbrakk}~{\isasymAnd}a.~P~a~[];\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   330
~~{\isasymAnd}a~x.~P~a~[x];\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   331
~~{\isasymAnd}a~x~y~zs.~P~a~(y~\#~zs)~{\isasymLongrightarrow}~P~a~(x~\#~y~\#~zs){\isasymrbrakk}\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   332
{\isasymLongrightarrow}~P~u~v%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   333
\end{isabelle}
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   334
It merely says that in order to prove a property \isa{P} of \isa{u} and
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   335
\isa{v} you need to prove it for the three cases where \isa{v} is the
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   336
empty list, the singleton list, and the list with at least two elements.
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   337
The final case has an induction hypothesis:  you may assume that \isa{P}
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   338
holds for the tail of that list.
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   339
\index{induction!recursion|)}
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   340
\index{recursion induction|)}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   341
\end{isamarkuptext}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   342
\isamarkuptrue%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   343
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   344
\isadelimtheory
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   345
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   346
\endisadelimtheory
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   347
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   348
\isatagtheory
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   349
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   350
\endisatagtheory
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   351
{\isafoldtheory}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   352
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   353
\isadelimtheory
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   354
%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   355
\endisadelimtheory
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   356
\end{isabellebody}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   357
%%% Local Variables:
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   358
%%% mode: latex
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   359
%%% TeX-master: "root"
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   360
%%% End: