doc-src/TutorialI/Misc/document/AdvancedInd.tex
author paulson
Fri, 21 Nov 2008 13:17:43 +0100
changeset 28869 191cbfac6c9a
parent 27319 6584901d694c
child 40406 313a24b66a8d
permissions -rw-r--r--
Strange. The proof worked in the 2008 release. In order to make it work now, the last line of the proof must be moved up two places. In other words, the first proof step is now returning its subgoals in a different order from before.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9722
a5f86aed785b *** empty log message ***
nipkow
parents: 9721
diff changeset
     1
%
a5f86aed785b *** empty log message ***
nipkow
parents: 9721
diff changeset
     2
\begin{isabellebody}%
9924
3370f6aa3200 updated;
wenzelm
parents: 9834
diff changeset
     3
\def\isabellecontext{AdvancedInd}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
     4
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
     5
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
     6
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
     7
\endisadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
     8
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
     9
\isatagtheory
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    10
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    11
\endisatagtheory
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    12
{\isafoldtheory}%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    13
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    14
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    15
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    16
\endisadelimtheory
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
    17
%
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
    18
\begin{isamarkuptext}%
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
    19
\noindent
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
    20
Now that we have learned about rules and logic, we take another look at the
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
    21
finer points of induction.  We consider two questions: what to do if the
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
    22
proposition to be proved is not directly amenable to induction
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
    23
(\S\ref{sec:ind-var-in-prems}), and how to utilize (\S\ref{sec:complete-ind})
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
    24
and even derive (\S\ref{sec:derive-ind}) new induction schemas. We conclude
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
    25
with an extended example of induction (\S\ref{sec:CTL-revisited}).%
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
    26
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    27
\isamarkuptrue%
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
    28
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
    29
\isamarkupsubsection{Massaging the Proposition%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
    30
}
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    31
\isamarkuptrue%
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
    32
%
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
    33
\begin{isamarkuptext}%
10217
e61e7e1eacaf *** empty log message ***
nipkow
parents: 10187
diff changeset
    34
\label{sec:ind-var-in-prems}
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
    35
Often we have assumed that the theorem to be proved is already in a form
10878
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
    36
that is amenable to induction, but sometimes it isn't.
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
    37
Here is an example.
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
    38
Since \isa{hd} and \isa{last} return the first and last element of a
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
    39
non-empty list, this lemma looks easy to prove:%
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
    40
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    41
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    42
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    43
\ {\isachardoublequoteopen}xs\ {\isasymnoteq}\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymLongrightarrow}\ hd{\isacharparenleft}rev\ xs{\isacharparenright}\ {\isacharequal}\ last\ xs{\isachardoublequoteclose}\isanewline
17056
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    44
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    45
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    46
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    47
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    48
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    49
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    50
\isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    51
{\isacharparenleft}induct{\isacharunderscore}tac\ xs{\isacharparenright}%
16069
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    52
\begin{isamarkuptxt}%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    53
\noindent
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    54
But induction produces the warning
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    55
\begin{quote}\tt
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    56
Induction variable occurs also among premises!
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    57
\end{quote}
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    58
and leads to the base case
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    59
\begin{isabelle}%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    60
\ {\isadigit{1}}{\isachardot}\ xs\ {\isasymnoteq}\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymLongrightarrow}\ hd\ {\isacharparenleft}rev\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\ last\ {\isacharbrackleft}{\isacharbrackright}%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    61
\end{isabelle}
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    62
Simplification reduces the base case to this:
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    63
\begin{isabelle}
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    64
\ 1.\ xs\ {\isasymnoteq}\ []\ {\isasymLongrightarrow}\ hd\ []\ =\ last\ []
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    65
\end{isabelle}
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    66
We cannot prove this equality because we do not know what \isa{hd} and
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    67
\isa{last} return when applied to \isa{{\isacharbrackleft}{\isacharbrackright}}.
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    68
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    69
We should not have ignored the warning. Because the induction
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    70
formula is only the conclusion, induction does not affect the occurrence of \isa{xs} in the premises.  
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    71
Thus the case that should have been trivial
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    72
becomes unprovable. Fortunately, the solution is easy:\footnote{A similar
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    73
heuristic applies to rule inductions; see \S\ref{sec:rtc}.}
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    74
\begin{quote}
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    75
\emph{Pull all occurrences of the induction variable into the conclusion
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    76
using \isa{{\isasymlongrightarrow}}.}
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    77
\end{quote}
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    78
Thus we should state the lemma as an ordinary 
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    79
implication~(\isa{{\isasymlongrightarrow}}), letting
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    80
\attrdx{rule_format} (\S\ref{sec:forward}) convert the
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    81
result to the usual \isa{{\isasymLongrightarrow}} form:%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    82
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    83
\isamarkuptrue%
17056
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    84
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    85
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    86
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    87
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    88
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    89
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    90
\endisadelimproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    91
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    92
\ hd{\isacharunderscore}rev\ {\isacharbrackleft}rule{\isacharunderscore}format{\isacharbrackright}{\isacharcolon}\ {\isachardoublequoteopen}xs\ {\isasymnoteq}\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymlongrightarrow}\ hd{\isacharparenleft}rev\ xs{\isacharparenright}\ {\isacharequal}\ last\ xs{\isachardoublequoteclose}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    93
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    94
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    95
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    96
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    97
\isatagproof
16069
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    98
%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
    99
\begin{isamarkuptxt}%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   100
\noindent
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   101
This time, induction leaves us with a trivial base case:
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   102
\begin{isabelle}%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   103
\ {\isadigit{1}}{\isachardot}\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymnoteq}\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymlongrightarrow}\ hd\ {\isacharparenleft}rev\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\ last\ {\isacharbrackleft}{\isacharbrackright}%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   104
\end{isabelle}
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   105
And \isa{auto} completes the proof.
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   106
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   107
If there are multiple premises $A@1$, \dots, $A@n$ containing the
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   108
induction variable, you should turn the conclusion $C$ into
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   109
\[ A@1 \longrightarrow \cdots A@n \longrightarrow C. \]
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   110
Additionally, you may also have to universally quantify some other variables,
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   111
which can yield a fairly complex conclusion.  However, \isa{rule{\isacharunderscore}format} 
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   112
can remove any number of occurrences of \isa{{\isasymforall}} and
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   113
\isa{{\isasymlongrightarrow}}.
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   114
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   115
\index{induction!on a term}%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   116
A second reason why your proposition may not be amenable to induction is that
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   117
you want to induct on a complex term, rather than a variable. In
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   118
general, induction on a term~$t$ requires rephrasing the conclusion~$C$
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   119
as
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   120
\begin{equation}\label{eqn:ind-over-term}
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   121
\forall y@1 \dots y@n.~ x = t \longrightarrow C.
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   122
\end{equation}
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   123
where $y@1 \dots y@n$ are the free variables in $t$ and $x$ is a new variable.
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   124
Now you can perform induction on~$x$. An example appears in
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   125
\S\ref{sec:complete-ind} below.
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   126
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   127
The very same problem may occur in connection with rule induction. Remember
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   128
that it requires a premise of the form $(x@1,\dots,x@k) \in R$, where $R$ is
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   129
some inductively defined set and the $x@i$ are variables.  If instead we have
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   130
a premise $t \in R$, where $t$ is not just an $n$-tuple of variables, we
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   131
replace it with $(x@1,\dots,x@k) \in R$, and rephrase the conclusion $C$ as
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   132
\[ \forall y@1 \dots y@n.~ (x@1,\dots,x@k) = t \longrightarrow C. \]
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   133
For an example see \S\ref{sec:CTL-revisited} below.
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   134
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   135
Of course, all premises that share free variables with $t$ need to be pulled into
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   136
the conclusion as well, under the \isa{{\isasymforall}}, again using \isa{{\isasymlongrightarrow}} as shown above.
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   137
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   138
Readers who are puzzled by the form of statement
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   139
(\ref{eqn:ind-over-term}) above should remember that the
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   140
transformation is only performed to permit induction. Once induction
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   141
has been applied, the statement can be transformed back into something quite
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   142
intuitive. For example, applying wellfounded induction on $x$ (w.r.t.\
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   143
$\prec$) to (\ref{eqn:ind-over-term}) and transforming the result a
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   144
little leads to the goal
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   145
\[ \bigwedge\overline{y}.\ 
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   146
   \forall \overline{z}.\ t\,\overline{z} \prec t\,\overline{y}\ \longrightarrow\ C\,\overline{z}
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   147
    \ \Longrightarrow\ C\,\overline{y} \]
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   148
where $\overline{y}$ stands for $y@1 \dots y@n$ and the dependence of $t$ and
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   149
$C$ on the free variables of $t$ has been made explicit.
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   150
Unfortunately, this induction schema cannot be expressed as a
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   151
single theorem because it depends on the number of free variables in $t$ ---
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   152
the notation $\overline{y}$ is merely an informal device.%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   153
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   154
\isamarkuptrue%
17056
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   155
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   156
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   157
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   158
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   159
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   160
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   161
\endisadelimproof
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   162
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
   163
\isamarkupsubsection{Beyond Structural and Recursion Induction%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
   164
}
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   165
\isamarkuptrue%
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   166
%
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   167
\begin{isamarkuptext}%
10217
e61e7e1eacaf *** empty log message ***
nipkow
parents: 10187
diff changeset
   168
\label{sec:complete-ind}
10878
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
   169
So far, inductive proofs were by structural induction for
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   170
primitive recursive functions and recursion induction for total recursive
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   171
functions. But sometimes structural induction is awkward and there is no
10878
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
   172
recursive function that could furnish a more appropriate
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
   173
induction schema. In such cases a general-purpose induction schema can
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   174
be helpful. We show how to apply such induction schemas by an example.
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   175
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   176
Structural induction on \isa{nat} is
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   177
usually known as mathematical induction. There is also \textbf{complete}
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   178
\index{induction!complete}%
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   179
induction, where you prove $P(n)$ under the assumption that $P(m)$
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   180
holds for all $m<n$. In Isabelle, this is the theorem \tdx{nat_less_induct}:
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   181
\begin{isabelle}%
19654
2c02a8054616 updated;
wenzelm
parents: 19288
diff changeset
   182
\ \ \ \ \ {\isacharparenleft}{\isasymAnd}n{\isachardot}\ {\isasymforall}m{\isacharless}n{\isachardot}\ P\ m\ {\isasymLongrightarrow}\ P\ n{\isacharparenright}\ {\isasymLongrightarrow}\ P\ n%
9924
3370f6aa3200 updated;
wenzelm
parents: 9834
diff changeset
   183
\end{isabelle}
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   184
As an application, we prove a property of the following
11278
9710486b886b *** empty log message ***
nipkow
parents: 11277
diff changeset
   185
function:%
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   186
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   187
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   188
\isacommand{consts}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   189
\ f\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   190
\isacommand{axioms}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   191
\ f{\isacharunderscore}ax{\isacharcolon}\ {\isachardoublequoteopen}f{\isacharparenleft}f{\isacharparenleft}n{\isacharparenright}{\isacharparenright}\ {\isacharless}\ f{\isacharparenleft}Suc{\isacharparenleft}n{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}%
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   192
\begin{isamarkuptext}%
11256
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   193
\begin{warn}
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   194
We discourage the use of axioms because of the danger of
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   195
inconsistencies.  Axiom \isa{f{\isacharunderscore}ax} does
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   196
not introduce an inconsistency because, for example, the identity function
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   197
satisfies it.  Axioms can be useful in exploratory developments, say when 
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   198
you assume some well-known theorems so that you can quickly demonstrate some
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   199
point about methodology.  If your example turns into a substantial proof
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   200
development, you should replace axioms by theorems.
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   201
\end{warn}\noindent
10878
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
   202
The axiom for \isa{f} implies \isa{n\ {\isasymle}\ f\ n}, which can
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10950
diff changeset
   203
be proved by induction on \mbox{\isa{f\ n}}. Following the recipe outlined
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   204
above, we have to phrase the proposition as follows to allow induction:%
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   205
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   206
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   207
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   208
\ f{\isacharunderscore}incr{\isacharunderscore}lem{\isacharcolon}\ {\isachardoublequoteopen}{\isasymforall}i{\isachardot}\ k\ {\isacharequal}\ f\ i\ {\isasymlongrightarrow}\ i\ {\isasymle}\ f\ i{\isachardoublequoteclose}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   209
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   210
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   211
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   212
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   213
\isatagproof
16069
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   214
%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   215
\begin{isamarkuptxt}%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   216
\noindent
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   217
To perform induction on \isa{k} using \isa{nat{\isacharunderscore}less{\isacharunderscore}induct}, we use
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   218
the same general induction method as for recursion induction (see
25258
22d16596c306 recdef -> fun
nipkow
parents: 25056
diff changeset
   219
\S\ref{sec:fun-induction}):%
16069
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   220
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   221
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   222
\isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   223
{\isacharparenleft}induct{\isacharunderscore}tac\ k\ rule{\isacharcolon}\ nat{\isacharunderscore}less{\isacharunderscore}induct{\isacharparenright}%
16069
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   224
\begin{isamarkuptxt}%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   225
\noindent
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   226
We get the following proof state:
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   227
\begin{isabelle}%
19654
2c02a8054616 updated;
wenzelm
parents: 19288
diff changeset
   228
\ {\isadigit{1}}{\isachardot}\ {\isasymAnd}n{\isachardot}\ {\isasymforall}m{\isacharless}n{\isachardot}\ {\isasymforall}i{\isachardot}\ m\ {\isacharequal}\ f\ i\ {\isasymlongrightarrow}\ i\ {\isasymle}\ f\ i\ {\isasymLongrightarrow}\ {\isasymforall}i{\isachardot}\ n\ {\isacharequal}\ f\ i\ {\isasymlongrightarrow}\ i\ {\isasymle}\ f\ i%
16069
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   229
\end{isabelle}
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   230
After stripping the \isa{{\isasymforall}i}, the proof continues with a case
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   231
distinction on \isa{i}. The case \isa{i\ {\isacharequal}\ {\isadigit{0}}} is trivial and we focus on
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   232
the other case:%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   233
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   234
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   235
\isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   236
{\isacharparenleft}rule\ allI{\isacharparenright}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   237
\isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   238
{\isacharparenleft}case{\isacharunderscore}tac\ i{\isacharparenright}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   239
\ \isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   240
{\isacharparenleft}simp{\isacharparenright}%
16069
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   241
\begin{isamarkuptxt}%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   242
\begin{isabelle}%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   243
\ {\isadigit{1}}{\isachardot}\ {\isasymAnd}n\ i\ nat{\isachardot}\isanewline
19654
2c02a8054616 updated;
wenzelm
parents: 19288
diff changeset
   244
\isaindent{\ {\isadigit{1}}{\isachardot}\ \ \ \ }{\isasymlbrakk}{\isasymforall}m{\isacharless}n{\isachardot}\ {\isasymforall}i{\isachardot}\ m\ {\isacharequal}\ f\ i\ {\isasymlongrightarrow}\ i\ {\isasymle}\ f\ i{\isacharsemicolon}\ i\ {\isacharequal}\ Suc\ nat{\isasymrbrakk}\ {\isasymLongrightarrow}\ n\ {\isacharequal}\ f\ i\ {\isasymlongrightarrow}\ i\ {\isasymle}\ f\ i%
16069
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   245
\end{isabelle}%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   246
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   247
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   248
\isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   249
{\isacharparenleft}blast\ intro{\isacharbang}{\isacharcolon}\ f{\isacharunderscore}ax\ Suc{\isacharunderscore}leI\ intro{\isacharcolon}\ le{\isacharunderscore}less{\isacharunderscore}trans{\isacharparenright}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   250
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   251
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   252
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   253
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   254
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   255
\endisadelimproof
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   256
%
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   257
\begin{isamarkuptext}%
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   258
\noindent
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10950
diff changeset
   259
If you find the last step puzzling, here are the two lemmas it employs:
10878
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
   260
\begin{isabelle}
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
   261
\isa{m\ {\isacharless}\ n\ {\isasymLongrightarrow}\ Suc\ m\ {\isasymle}\ n}
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
   262
\rulename{Suc_leI}\isanewline
25056
743f3603ba8b updated;
wenzelm
parents: 19654
diff changeset
   263
\isa{{\isasymlbrakk}x\ {\isasymle}\ y{\isacharsemicolon}\ y\ {\isacharless}\ z{\isasymrbrakk}\ {\isasymLongrightarrow}\ x\ {\isacharless}\ z}
10878
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
   264
\rulename{le_less_trans}
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
   265
\end{isabelle}
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
   266
%
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   267
The proof goes like this (writing \isa{j} instead of \isa{nat}).
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
   268
Since \isa{i\ {\isacharequal}\ Suc\ j} it suffices to show
10878
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
   269
\hbox{\isa{j\ {\isacharless}\ f\ {\isacharparenleft}Suc\ j{\isacharparenright}}},
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
   270
by \isa{Suc{\isacharunderscore}leI}\@.  This is
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
   271
proved as follows. From \isa{f{\isacharunderscore}ax} we have \isa{f\ {\isacharparenleft}f\ j{\isacharparenright}\ {\isacharless}\ f\ {\isacharparenleft}Suc\ j{\isacharparenright}}
10878
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
   272
(1) which implies \isa{f\ j\ {\isasymle}\ f\ {\isacharparenleft}f\ j{\isacharparenright}} by the induction hypothesis.
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
   273
Using (1) once more we obtain \isa{f\ j\ {\isacharless}\ f\ {\isacharparenleft}Suc\ j{\isacharparenright}} (2) by the transitivity
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
   274
rule \isa{le{\isacharunderscore}less{\isacharunderscore}trans}.
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
   275
Using the induction hypothesis once more we obtain \isa{j\ {\isasymle}\ f\ j}
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
   276
which, together with (2) yields \isa{j\ {\isacharless}\ f\ {\isacharparenleft}Suc\ j{\isacharparenright}} (again by
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
   277
\isa{le{\isacharunderscore}less{\isacharunderscore}trans}).
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   278
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   279
This last step shows both the power and the danger of automatic proofs.  They
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   280
will usually not tell you how the proof goes, because it can be hard to
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   281
translate the internal proof into a human-readable format.  Automatic
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   282
proofs are easy to write but hard to read and understand.
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   283
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   284
The desired result, \isa{i\ {\isasymle}\ f\ i}, follows from \isa{f{\isacharunderscore}incr{\isacharunderscore}lem}:%
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   285
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   286
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   287
\isacommand{lemmas}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   288
\ f{\isacharunderscore}incr\ {\isacharequal}\ f{\isacharunderscore}incr{\isacharunderscore}lem{\isacharbrackleft}rule{\isacharunderscore}format{\isacharcomma}\ OF\ refl{\isacharbrackright}%
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   289
\begin{isamarkuptext}%
9698
f0740137a65d updated;
wenzelm
parents: 9673
diff changeset
   290
\noindent
10878
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
   291
The final \isa{refl} gets rid of the premise \isa{{\isacharquery}k\ {\isacharequal}\ f\ {\isacharquery}i}. 
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
   292
We could have included this derivation in the original statement of the lemma:%
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   293
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   294
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   295
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   296
\ f{\isacharunderscore}incr{\isacharbrackleft}rule{\isacharunderscore}format{\isacharcomma}\ OF\ refl{\isacharbrackright}{\isacharcolon}\ {\isachardoublequoteopen}{\isasymforall}i{\isachardot}\ k\ {\isacharequal}\ f\ i\ {\isasymlongrightarrow}\ i\ {\isasymle}\ f\ i{\isachardoublequoteclose}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   297
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   298
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   299
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   300
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   301
\isatagproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   302
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   303
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   304
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   305
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   306
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   307
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   308
\endisadelimproof
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   309
%
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   310
\begin{isamarkuptext}%
11256
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   311
\begin{exercise}
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   312
From the axiom and lemma for \isa{f}, show that \isa{f} is the
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   313
identity function.
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   314
\end{exercise}
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   315
11428
332347b9b942 tidying the index
paulson
parents: 11278
diff changeset
   316
Method \methdx{induct_tac} can be applied with any rule $r$
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
   317
whose conclusion is of the form ${?}P~?x@1 \dots ?x@n$, in which case the
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   318
format is
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
   319
\begin{quote}
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
   320
\isacommand{apply}\isa{{\isacharparenleft}induct{\isacharunderscore}tac} $y@1 \dots y@n$ \isa{rule{\isacharcolon}} $r$\isa{{\isacharparenright}}
11428
332347b9b942 tidying the index
paulson
parents: 11278
diff changeset
   321
\end{quote}
27319
6584901d694c updated generated file;
wenzelm
parents: 25258
diff changeset
   322
where $y@1, \dots, y@n$ are variables in the conclusion of the first subgoal.
10878
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
   323
11256
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   324
A further useful induction rule is \isa{length{\isacharunderscore}induct},
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   325
induction on the length of a list\indexbold{*length_induct}
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   326
\begin{isabelle}%
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   327
\ \ \ \ \ {\isacharparenleft}{\isasymAnd}xs{\isachardot}\ {\isasymforall}ys{\isachardot}\ length\ ys\ {\isacharless}\ length\ xs\ {\isasymlongrightarrow}\ P\ ys\ {\isasymLongrightarrow}\ P\ xs{\isacharparenright}\ {\isasymLongrightarrow}\ P\ xs%
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   328
\end{isabelle}
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   329
which is a special case of \isa{measure{\isacharunderscore}induct}
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   330
\begin{isabelle}%
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   331
\ \ \ \ \ {\isacharparenleft}{\isasymAnd}x{\isachardot}\ {\isasymforall}y{\isachardot}\ f\ y\ {\isacharless}\ f\ x\ {\isasymlongrightarrow}\ P\ y\ {\isasymLongrightarrow}\ P\ x{\isacharparenright}\ {\isasymLongrightarrow}\ P\ a%
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   332
\end{isabelle}
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   333
where \isa{f} may be any function into type \isa{nat}.%
9698
f0740137a65d updated;
wenzelm
parents: 9673
diff changeset
   334
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   335
\isamarkuptrue%
9698
f0740137a65d updated;
wenzelm
parents: 9673
diff changeset
   336
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
   337
\isamarkupsubsection{Derivation of New Induction Schemas%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
   338
}
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   339
\isamarkuptrue%
9698
f0740137a65d updated;
wenzelm
parents: 9673
diff changeset
   340
%
f0740137a65d updated;
wenzelm
parents: 9673
diff changeset
   341
\begin{isamarkuptext}%
f0740137a65d updated;
wenzelm
parents: 9673
diff changeset
   342
\label{sec:derive-ind}
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   343
\index{induction!deriving new schemas}%
9698
f0740137a65d updated;
wenzelm
parents: 9673
diff changeset
   344
Induction schemas are ordinary theorems and you can derive new ones
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   345
whenever you wish.  This section shows you how, using the example
9924
3370f6aa3200 updated;
wenzelm
parents: 9834
diff changeset
   346
of \isa{nat{\isacharunderscore}less{\isacharunderscore}induct}. Assume we only have structural induction
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   347
available for \isa{nat} and want to derive complete induction.  We
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   348
must generalize the statement as shown:%
9698
f0740137a65d updated;
wenzelm
parents: 9673
diff changeset
   349
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   350
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   351
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   352
\ induct{\isacharunderscore}lem{\isacharcolon}\ {\isachardoublequoteopen}{\isacharparenleft}{\isasymAnd}n{\isacharcolon}{\isacharcolon}nat{\isachardot}\ {\isasymforall}m{\isacharless}n{\isachardot}\ P\ m\ {\isasymLongrightarrow}\ P\ n{\isacharparenright}\ {\isasymLongrightarrow}\ {\isasymforall}m{\isacharless}n{\isachardot}\ P\ m{\isachardoublequoteclose}\isanewline
17056
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   353
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   354
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   355
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   356
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   357
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   358
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   359
\isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   360
{\isacharparenleft}induct{\isacharunderscore}tac\ n{\isacharparenright}%
16069
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   361
\begin{isamarkuptxt}%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   362
\noindent
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   363
The base case is vacuously true. For the induction step (\isa{m\ {\isacharless}\ Suc\ n}) we distinguish two cases: case \isa{m\ {\isacharless}\ n} is true by induction
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   364
hypothesis and case \isa{m\ {\isacharequal}\ n} follows from the assumption, again using
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   365
the induction hypothesis:%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15481
diff changeset
   366
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   367
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   368
\ \isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   369
{\isacharparenleft}blast{\isacharparenright}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   370
\isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   371
{\isacharparenleft}blast\ elim{\isacharcolon}\ less{\isacharunderscore}SucE{\isacharparenright}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   372
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   373
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   374
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   375
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   376
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   377
\endisadelimproof
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   378
%
9698
f0740137a65d updated;
wenzelm
parents: 9673
diff changeset
   379
\begin{isamarkuptext}%
f0740137a65d updated;
wenzelm
parents: 9673
diff changeset
   380
\noindent
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10950
diff changeset
   381
The elimination rule \isa{less{\isacharunderscore}SucE} expresses the case distinction:
9698
f0740137a65d updated;
wenzelm
parents: 9673
diff changeset
   382
\begin{isabelle}%
10696
76d7f6c9a14c *** empty log message ***
nipkow
parents: 10668
diff changeset
   383
\ \ \ \ \ {\isasymlbrakk}m\ {\isacharless}\ Suc\ n{\isacharsemicolon}\ m\ {\isacharless}\ n\ {\isasymLongrightarrow}\ P{\isacharsemicolon}\ m\ {\isacharequal}\ n\ {\isasymLongrightarrow}\ P{\isasymrbrakk}\ {\isasymLongrightarrow}\ P%
9924
3370f6aa3200 updated;
wenzelm
parents: 9834
diff changeset
   384
\end{isabelle}
9698
f0740137a65d updated;
wenzelm
parents: 9673
diff changeset
   385
f0740137a65d updated;
wenzelm
parents: 9673
diff changeset
   386
Now it is straightforward to derive the original version of
11256
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   387
\isa{nat{\isacharunderscore}less{\isacharunderscore}induct} by manipulating the conclusion of the above
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   388
lemma: instantiate \isa{n} by \isa{Suc\ n} and \isa{m} by \isa{n}
49afcce3bada *** empty log message ***
nipkow
parents: 11196
diff changeset
   389
and remove the trivial condition \isa{n\ {\isacharless}\ Suc\ n}. Fortunately, this
9698
f0740137a65d updated;
wenzelm
parents: 9673
diff changeset
   390
happens automatically when we add the lemma as a new premise to the
f0740137a65d updated;
wenzelm
parents: 9673
diff changeset
   391
desired goal:%
f0740137a65d updated;
wenzelm
parents: 9673
diff changeset
   392
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   393
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   394
\isacommand{theorem}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   395
\ nat{\isacharunderscore}less{\isacharunderscore}induct{\isacharcolon}\ {\isachardoublequoteopen}{\isacharparenleft}{\isasymAnd}n{\isacharcolon}{\isacharcolon}nat{\isachardot}\ {\isasymforall}m{\isacharless}n{\isachardot}\ P\ m\ {\isasymLongrightarrow}\ P\ n{\isacharparenright}\ {\isasymLongrightarrow}\ P\ n{\isachardoublequoteclose}\isanewline
17056
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   396
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   397
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   398
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   399
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   400
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   401
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   402
\isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   403
{\isacharparenleft}insert\ induct{\isacharunderscore}lem{\isacharcomma}\ blast{\isacharparenright}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   404
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   405
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   406
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   407
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   408
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   409
\endisadelimproof
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   410
%
9698
f0740137a65d updated;
wenzelm
parents: 9673
diff changeset
   411
\begin{isamarkuptext}%
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   412
HOL already provides the mother of
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   413
all inductions, well-founded induction (see \S\ref{sec:Well-founded}).  For
10878
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
   414
example theorem \isa{nat{\isacharunderscore}less{\isacharunderscore}induct} is
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   415
a special case of \isa{wf{\isacharunderscore}induct} where \isa{r} is \isa{{\isacharless}} on
10878
b254d5ad6dd4 auto update
paulson
parents: 10696
diff changeset
   416
\isa{nat}. The details can be found in theory \isa{Wellfounded_Recursion}.%
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   417
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   418
\isamarkuptrue%
17056
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   419
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   420
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   421
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   422
\endisadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   423
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   424
\isatagtheory
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   425
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   426
\endisatagtheory
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   427
{\isafoldtheory}%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   428
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   429
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   430
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   431
\endisadelimtheory
9722
a5f86aed785b *** empty log message ***
nipkow
parents: 9721
diff changeset
   432
\end{isabellebody}%
9670
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   433
%%% Local Variables:
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   434
%%% mode: latex
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   435
%%% TeX-master: "root"
820cca8573f8 *** empty log message ***
nipkow
parents:
diff changeset
   436
%%% End: