doc-src/TutorialI/Fun/document/fun0.tex
author nipkow
Thu, 08 Nov 2007 13:23:19 +0100
changeset 25339 ef2a8a3bae4a
parent 25265 3a5d33e8a019
child 27015 f8537d69f514
permissions -rw-r--r--
tuned
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%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    26
\ fib\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    27
\ \ {\isachardoublequoteopen}fib\ {\isadigit{0}}\ {\isacharequal}\ {\isadigit{0}}{\isachardoublequoteclose}\ {\isacharbar}\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    28
\ \ {\isachardoublequoteopen}fib\ {\isacharparenleft}Suc\ {\isadigit{0}}{\isacharparenright}\ {\isacharequal}\ {\isadigit{1}}{\isachardoublequoteclose}\ {\isacharbar}\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    29
\ \ {\isachardoublequoteopen}fib\ {\isacharparenleft}Suc{\isacharparenleft}Suc\ x{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ fib\ x\ {\isacharplus}\ fib\ {\isacharparenleft}Suc\ x{\isacharparenright}{\isachardoublequoteclose}%
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%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    42
\ sep\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ list{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    43
\ \ {\isachardoublequoteopen}sep\ a\ {\isacharbrackleft}{\isacharbrackright}\ \ \ \ \ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}{\isachardoublequoteclose}\ {\isacharbar}\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    44
\ \ {\isachardoublequoteopen}sep\ a\ {\isacharbrackleft}x{\isacharbrackright}\ \ \ \ {\isacharequal}\ {\isacharbrackleft}x{\isacharbrackright}{\isachardoublequoteclose}\ {\isacharbar}\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    45
\ \ {\isachardoublequoteopen}sep\ a\ {\isacharparenleft}x{\isacharhash}y{\isacharhash}zs{\isacharparenright}\ {\isacharequal}\ x\ {\isacharhash}\ a\ {\isacharhash}\ sep\ a\ {\isacharparenleft}y{\isacharhash}zs{\isacharparenright}{\isachardoublequoteclose}%
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%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    56
\ last\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    57
\ \ {\isachardoublequoteopen}last\ {\isacharbrackleft}x{\isacharbrackright}\ \ \ \ \ \ {\isacharequal}\ x{\isachardoublequoteclose}\ {\isacharbar}\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    58
\ \ {\isachardoublequoteopen}last\ {\isacharparenleft}{\isacharunderscore}{\isacharhash}y{\isacharhash}zs{\isacharparenright}\ {\isacharequal}\ last\ {\isacharparenleft}y{\isacharhash}zs{\isacharparenright}{\isachardoublequoteclose}%
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%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    65
\ sep{\isadigit{1}}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ list{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    66
\ \ {\isachardoublequoteopen}sep{\isadigit{1}}\ a\ {\isacharparenleft}x{\isacharhash}y{\isacharhash}zs{\isacharparenright}\ {\isacharequal}\ x\ {\isacharhash}\ a\ {\isacharhash}\ sep{\isadigit{1}}\ a\ {\isacharparenleft}y{\isacharhash}zs{\isacharparenright}{\isachardoublequoteclose}\ {\isacharbar}\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    67
\ \ {\isachardoublequoteopen}sep{\isadigit{1}}\ {\isacharunderscore}\ xs\ \ \ \ \ \ \ {\isacharequal}\ xs{\isachardoublequoteclose}%
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
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    72
by the two possibilities that are left: \isa{sep{\isadigit{1}}\ a\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}} and
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    73
\isa{sep{\isadigit{1}}\ a\ {\isacharbrackleft}x{\isacharbrackright}\ {\isacharequal}\ {\isacharbrackleft}x{\isacharbrackright}}.  Thus the functions \isa{sep} and
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%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    81
\ swap{\isadigit{1}}{\isadigit{2}}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ list{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    82
\ \ {\isachardoublequoteopen}swap{\isadigit{1}}{\isadigit{2}}\ {\isacharparenleft}x{\isacharhash}y{\isacharhash}zs{\isacharparenright}\ {\isacharequal}\ y{\isacharhash}x{\isacharhash}zs{\isachardoublequoteclose}\ {\isacharbar}\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    83
\ \ {\isachardoublequoteopen}swap{\isadigit{1}}{\isadigit{2}}\ zs\ \ \ \ \ \ \ {\isacharequal}\ zs{\isachardoublequoteclose}%
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
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    87
under the name $f$\isa{{\isachardot}simps} as theorems.
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    88
For example, look (via \isacommand{thm}) at
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
    89
\isa{sep{\isachardot}simps} and \isa{sep{\isadigit{1}}{\isachardot}simps} to see that they define
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%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   110
\ ack{\isadigit{2}}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   111
\ \ {\isachardoublequoteopen}ack{\isadigit{2}}\ n\ {\isadigit{0}}\ {\isacharequal}\ Suc\ n{\isachardoublequoteclose}\ {\isacharbar}\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   112
\ \ {\isachardoublequoteopen}ack{\isadigit{2}}\ {\isadigit{0}}\ {\isacharparenleft}Suc\ m{\isacharparenright}\ {\isacharequal}\ ack{\isadigit{2}}\ {\isacharparenleft}Suc\ {\isadigit{0}}{\isacharparenright}\ m{\isachardoublequoteclose}\ {\isacharbar}\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   113
\ \ {\isachardoublequoteopen}ack{\isadigit{2}}\ {\isacharparenleft}Suc\ n{\isacharparenright}\ {\isacharparenleft}Suc\ m{\isacharparenright}\ {\isacharequal}\ ack{\isadigit{2}}\ {\isacharparenleft}ack{\isadigit{2}}\ n\ {\isacharparenleft}Suc\ m{\isacharparenright}{\isacharparenright}\ m{\isachardoublequoteclose}%
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%
25261
3dc292be0b54 recdef -> fun
nipkow
parents: 25260
diff changeset
   132
\ gcd\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
3dc292be0b54 recdef -> fun
nipkow
parents: 25260
diff changeset
   133
\ \ {\isachardoublequoteopen}gcd\ m\ n\ {\isacharequal}\ {\isacharparenleft}if\ n{\isacharequal}{\isadigit{0}}\ then\ m\ else\ gcd\ n\ {\isacharparenleft}m\ mod\ n{\isacharparenright}{\isacharparenright}{\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}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   139
\ \ \ \ \ n\ {\isasymnoteq}\ {\isadigit{0}}\ {\isasymLongrightarrow}\ m\ mod\ n\ {\isacharless}\ n%
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}%
25261
3dc292be0b54 recdef -> fun
nipkow
parents: 25260
diff changeset
   151
\ \ \ \ \ gcd\ m\ n\ {\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}%
25261
3dc292be0b54 recdef -> fun
nipkow
parents: 25260
diff changeset
   155
\ \ \ \ \ {\isacharparenleft}if\ n\ {\isacharequal}\ {\isadigit{0}}\ then\ m\ else\ gcd\ n\ {\isacharparenleft}m\ mod\ n{\isacharparenright}{\isacharparenright}\ {\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}%
25261
3dc292be0b54 recdef -> fun
nipkow
parents: 25260
diff changeset
   159
\ \ \ \ \ {\isacharparenleft}n\ {\isacharequal}\ {\isadigit{0}}\ {\isasymlongrightarrow}\ m\ {\isacharequal}\ k{\isacharparenright}\ {\isasymand}\ {\isacharparenleft}n\ {\isasymnoteq}\ {\isadigit{0}}\ {\isasymlongrightarrow}\ gcd\ n\ {\isacharparenleft}m\ mod\ n{\isacharparenright}\ {\isacharequal}\ k{\isacharparenright}%
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   160
\end{isabelle}
25261
3dc292be0b54 recdef -> fun
nipkow
parents: 25260
diff changeset
   161
Since the recursive call \isa{gcd\ n\ {\isacharparenleft}m\ mod\ n{\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
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   167
\isa{split{\isacharunderscore}if},
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%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   178
\ gcd{\isadigit{1}}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   179
\ \ {\isachardoublequoteopen}gcd{\isadigit{1}}\ m\ {\isadigit{0}}\ {\isacharequal}\ m{\isachardoublequoteclose}\ {\isacharbar}\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   180
\ \ {\isachardoublequoteopen}gcd{\isadigit{1}}\ m\ n\ {\isacharequal}\ gcd{\isadigit{1}}\ n\ {\isacharparenleft}m\ mod\ n{\isacharparenright}{\isachardoublequoteclose}%
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
25263
b54744935036 *** empty log message ***
nipkow
parents: 25261
diff changeset
   184
\isa{n\ {\isasymnoteq}\ {\isadigit{0}}}.  Unfortunately, not all conditionals can be
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%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   192
\ gcd{\isadigit{2}}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   193
\ \ {\isachardoublequoteopen}gcd{\isadigit{2}}\ m\ n\ {\isacharequal}\ {\isacharparenleft}case\ n{\isacharequal}{\isadigit{0}}\ of\ True\ {\isasymRightarrow}\ m\ {\isacharbar}\ False\ {\isasymRightarrow}\ gcd{\isadigit{2}}\ n\ {\isacharparenleft}m\ mod\ n{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}%
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%
25261
3dc292be0b54 recdef -> fun
nipkow
parents: 25260
diff changeset
   205
\ {\isacharbrackleft}simp{\isacharbrackright}{\isacharcolon}\ {\isachardoublequoteopen}gcd\ m\ {\isadigit{0}}\ {\isacharequal}\ m{\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%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   213
{\isacharparenleft}simp{\isacharparenright}\isanewline
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%
25261
3dc292be0b54 recdef -> fun
nipkow
parents: 25260
diff changeset
   225
\ {\isacharbrackleft}simp{\isacharbrackright}{\isacharcolon}\ {\isachardoublequoteopen}n\ {\isasymnoteq}\ {\isadigit{0}}\ {\isasymLongrightarrow}\ gcd\ m\ n\ {\isacharequal}\ gcd\ n\ {\isacharparenleft}m\ mod\ n{\isacharparenright}{\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%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   233
{\isacharparenleft}simp{\isacharparenright}\isanewline
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%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   250
\ gcd{\isachardot}simps\ {\isacharbrackleft}simp\ del{\isacharbrackright}%
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
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   263
proves a suitable induction rule $f$\isa{{\isachardot}induct} that follows the
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%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   273
\ {\isachardoublequoteopen}map\ f\ {\isacharparenleft}sep\ x\ xs{\isacharparenright}\ {\isacharequal}\ sep\ {\isacharparenleft}f\ x{\isacharparenright}\ {\isacharparenleft}map\ f\ xs{\isacharparenright}{\isachardoublequoteclose}%
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%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   288
{\isacharparenleft}induct{\isacharunderscore}tac\ x\ xs\ rule{\isacharcolon}\ sep{\isachardot}induct{\isacharparenright}%
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}%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   294
\ {\isadigit{1}}{\isachardot}\ {\isasymAnd}a{\isachardot}\ map\ f\ {\isacharparenleft}sep\ a\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\ sep\ {\isacharparenleft}f\ a{\isacharparenright}\ {\isacharparenleft}map\ f\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   295
\ {\isadigit{2}}{\isachardot}\ {\isasymAnd}a\ x{\isachardot}\ map\ f\ {\isacharparenleft}sep\ a\ {\isacharbrackleft}x{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\ sep\ {\isacharparenleft}f\ a{\isacharparenright}\ {\isacharparenleft}map\ f\ {\isacharbrackleft}x{\isacharbrackright}{\isacharparenright}\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   296
\ {\isadigit{3}}{\isachardot}\ {\isasymAnd}a\ x\ y\ zs{\isachardot}\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   297
\isaindent{\ {\isadigit{3}}{\isachardot}\ \ \ \ }map\ f\ {\isacharparenleft}sep\ a\ {\isacharparenleft}y\ {\isacharhash}\ zs{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ sep\ {\isacharparenleft}f\ a{\isacharparenright}\ {\isacharparenleft}map\ f\ {\isacharparenleft}y\ {\isacharhash}\ zs{\isacharparenright}{\isacharparenright}\ {\isasymLongrightarrow}\isanewline
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   298
\isaindent{\ {\isadigit{3}}{\isachardot}\ \ \ \ }map\ f\ {\isacharparenleft}sep\ a\ {\isacharparenleft}x\ {\isacharhash}\ y\ {\isacharhash}\ zs{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ sep\ {\isacharparenleft}f\ a{\isacharparenright}\ {\isacharparenleft}map\ f\ {\isacharparenleft}x\ {\isacharhash}\ y\ {\isacharhash}\ zs{\isacharparenright}{\isacharparenright}%
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%
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   304
\ simp{\isacharunderscore}all\isanewline
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}
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   322
\isacommand{apply}\isa{{\isacharparenleft}induct{\isacharunderscore}tac} $x@1 \dots x@n$ \isa{rule{\isacharcolon}} $f$\isa{{\isachardot}induct{\isacharparenright}}
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
25263
b54744935036 *** empty log message ***
nipkow
parents: 25261
diff changeset
   325
name of a function that takes an $n$ arguments. Usually the subgoal will
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
25260
71b2a1fefb84 added Fun
nipkow
parents:
diff changeset
   327
induction rules do not mention $f$ at all. Here is \isa{sep{\isachardot}induct}:
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: