doc-src/TutorialI/Misc/document/Itrev.tex
author blanchet
Tue, 17 Feb 2009 14:01:54 +0100
changeset 29956 62f931b257b7
parent 27015 f8537d69f514
child 40406 313a24b66a8d
permissions -rw-r--r--
Reintroduce set_interpreter for Collect and op :. I removed them by accident when removing old code that dealt with the "set" type. Incidentally, there is still some broken "set" code in Refute that should be fixed (see TODO in refute.ML).
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: 9844
diff changeset
     3
\def\isabellecontext{Itrev}%
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
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    17
%
17327
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
    18
\isadelimML
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
    19
%
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
    20
\endisadelimML
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
    21
%
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
    22
\isatagML
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
    23
%
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
    24
\endisatagML
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
    25
{\isafoldML}%
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
    26
%
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
    27
\isadelimML
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
    28
%
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
    29
\endisadelimML
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
    30
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10795
diff changeset
    31
\isamarkupsection{Induction Heuristics%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
    32
}
11866
fbd097aec213 updated;
wenzelm
parents: 11458
diff changeset
    33
\isamarkuptrue%
9844
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
    34
%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    35
\begin{isamarkuptext}%
9844
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
    36
\label{sec:InductionHeuristics}
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
    37
\index{induction heuristics|(}%
9844
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
    38
The purpose of this section is to illustrate some simple heuristics for
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
    39
inductive proofs. The first one we have already mentioned in our initial
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
    40
example:
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
    41
\begin{quote}
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
    42
\emph{Theorems about recursive functions are proved by induction.}
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
    43
\end{quote}
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
    44
In case the function has more than one argument
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
    45
\begin{quote}
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
    46
\emph{Do induction on argument number $i$ if the function is defined by
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
    47
recursion in argument number $i$.}
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
    48
\end{quote}
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
    49
When we look at the proof of \isa{{\isacharparenleft}xs{\isacharat}ys{\isacharparenright}\ {\isacharat}\ zs\ {\isacharequal}\ xs\ {\isacharat}\ {\isacharparenleft}ys{\isacharat}zs{\isacharparenright}}
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
    50
in \S\ref{sec:intro-proof} we find
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
    51
\begin{itemize}
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
    52
\item \isa{{\isacharat}} is recursive in
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
    53
the first argument
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
    54
\item \isa{xs}  occurs only as the first argument of
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
    55
\isa{{\isacharat}}
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
    56
\item both \isa{ys} and \isa{zs} occur at least once as
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
    57
the second argument of \isa{{\isacharat}}
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
    58
\end{itemize}
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
    59
Hence it is natural to perform induction on~\isa{xs}.
9844
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
    60
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
    61
The key heuristic, and the main point of this section, is to
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
    62
\emph{generalize the goal before induction}.
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
    63
The reason is simple: if the goal is
9844
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
    64
too specific, the induction hypothesis is too weak to allow the induction
10971
6852682eaf16 *** empty log message ***
nipkow
parents: 10950
diff changeset
    65
step to go through. Let us illustrate the idea with an example.
9844
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
    66
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
    67
Function \cdx{rev} has quadratic worst-case running time
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9754
diff changeset
    68
because it calls function \isa{{\isacharat}} for each element of the list and
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9754
diff changeset
    69
\isa{{\isacharat}} is linear in its first argument.  A linear time version of
9493
494f8cd34df7 *** empty log message ***
nipkow
parents: 9145
diff changeset
    70
\isa{rev} reqires an extra argument where the result is accumulated
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
    71
gradually, using only~\isa{{\isacharhash}}:%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    72
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17100
diff changeset
    73
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17100
diff changeset
    74
\isacommand{primrec}\isamarkupfalse%
27015
f8537d69f514 *** empty log message ***
nipkow
parents: 17327
diff changeset
    75
\ itrev\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ list{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
f8537d69f514 *** empty log message ***
nipkow
parents: 17327
diff changeset
    76
{\isachardoublequoteopen}itrev\ {\isacharbrackleft}{\isacharbrackright}\ \ \ \ \ ys\ {\isacharequal}\ ys{\isachardoublequoteclose}\ {\isacharbar}\isanewline
17175
1eced27ee0e1 updated;
wenzelm
parents: 17100
diff changeset
    77
{\isachardoublequoteopen}itrev\ {\isacharparenleft}x{\isacharhash}xs{\isacharparenright}\ ys\ {\isacharequal}\ itrev\ xs\ {\isacharparenleft}x{\isacharhash}ys{\isacharparenright}{\isachardoublequoteclose}%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    78
\begin{isamarkuptext}%
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9754
diff changeset
    79
\noindent
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
    80
The behaviour of \cdx{itrev} is simple: it reverses
9493
494f8cd34df7 *** empty log message ***
nipkow
parents: 9145
diff changeset
    81
its first argument by stacking its elements onto the second argument,
494f8cd34df7 *** empty log message ***
nipkow
parents: 9145
diff changeset
    82
and returning that second argument when the first one becomes
17327
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
    83
empty. Note that \isa{itrev} is tail-recursive: it can be
9493
494f8cd34df7 *** empty log message ***
nipkow
parents: 9145
diff changeset
    84
compiled into a loop.
494f8cd34df7 *** empty log message ***
nipkow
parents: 9145
diff changeset
    85
17327
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
    86
Naturally, we would like to show that \isa{itrev} does indeed reverse
9493
494f8cd34df7 *** empty log message ***
nipkow
parents: 9145
diff changeset
    87
its first argument provided the second one is empty:%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    88
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17100
diff changeset
    89
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17100
diff changeset
    90
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17100
diff changeset
    91
\ {\isachardoublequoteopen}itrev\ xs\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharequal}\ rev\ xs{\isachardoublequoteclose}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    92
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    93
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    94
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    95
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
    96
\isatagproof
16069
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
    97
%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
    98
\begin{isamarkuptxt}%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
    99
\noindent
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   100
There is no choice as to the induction variable, and we immediately simplify:%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   101
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17100
diff changeset
   102
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17100
diff changeset
   103
\isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17100
diff changeset
   104
{\isacharparenleft}induct{\isacharunderscore}tac\ xs{\isacharcomma}\ simp{\isacharunderscore}all{\isacharparenright}%
16069
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   105
\begin{isamarkuptxt}%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   106
\noindent
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   107
Unfortunately, this attempt does not prove
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   108
the induction step:
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   109
\begin{isabelle}%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   110
\ {\isadigit{1}}{\isachardot}\ {\isasymAnd}a\ list{\isachardot}\isanewline
17327
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
   111
\isaindent{\ {\isadigit{1}}{\isachardot}\ \ \ \ }itrev\ list\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharequal}\ rev\ list\ {\isasymLongrightarrow}\ itrev\ list\ {\isacharbrackleft}a{\isacharbrackright}\ {\isacharequal}\ rev\ list\ {\isacharat}\ {\isacharbrackleft}a{\isacharbrackright}%
16069
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   112
\end{isabelle}
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   113
The induction hypothesis is too weak.  The fixed
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   114
argument,~\isa{{\isacharbrackleft}{\isacharbrackright}}, prevents it from rewriting the conclusion.  
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   115
This example suggests a heuristic:
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   116
\begin{quote}\index{generalizing induction formulae}%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   117
\emph{Generalize goals for induction by replacing constants by variables.}
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   118
\end{quote}
17327
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
   119
Of course one cannot do this na\"{\i}vely: \isa{itrev\ xs\ ys\ {\isacharequal}\ rev\ xs} is
16069
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   120
just not true.  The correct generalization is%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   121
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17100
diff changeset
   122
\isamarkuptrue%
17056
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   123
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   124
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   125
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   126
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   127
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   128
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   129
\endisadelimproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17100
diff changeset
   130
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17100
diff changeset
   131
\ {\isachardoublequoteopen}itrev\ xs\ ys\ {\isacharequal}\ rev\ xs\ {\isacharat}\ ys{\isachardoublequoteclose}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   132
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   133
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   134
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   135
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   136
\isatagproof
16069
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   137
%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   138
\begin{isamarkuptxt}%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   139
\noindent
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   140
If \isa{ys} is replaced by \isa{{\isacharbrackleft}{\isacharbrackright}}, the right-hand side simplifies to
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   141
\isa{rev\ xs}, as required.
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   142
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   143
In this instance it was easy to guess the right generalization.
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   144
Other situations can require a good deal of creativity.  
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   145
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   146
Although we now have two variables, only \isa{xs} is suitable for
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   147
induction, and we repeat our proof attempt. Unfortunately, we are still
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   148
not there:
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   149
\begin{isabelle}%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   150
\ {\isadigit{1}}{\isachardot}\ {\isasymAnd}a\ list{\isachardot}\isanewline
17327
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
   151
\isaindent{\ {\isadigit{1}}{\isachardot}\ \ \ \ }itrev\ list\ ys\ {\isacharequal}\ rev\ list\ {\isacharat}\ ys\ {\isasymLongrightarrow}\isanewline
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
   152
\isaindent{\ {\isadigit{1}}{\isachardot}\ \ \ \ }itrev\ list\ {\isacharparenleft}a\ {\isacharhash}\ ys{\isacharparenright}\ {\isacharequal}\ rev\ list\ {\isacharat}\ a\ {\isacharhash}\ ys%
16069
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   153
\end{isabelle}
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   154
The induction hypothesis is still too weak, but this time it takes no
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   155
intuition to generalize: the problem is that \isa{ys} is fixed throughout
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   156
the subgoal, but the induction hypothesis needs to be applied with
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   157
\isa{a\ {\isacharhash}\ ys} instead of \isa{ys}. Hence we prove the theorem
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   158
for all \isa{ys} instead of a fixed one:%
3f2a9f400168 *** empty log message ***
nipkow
parents: 15614
diff changeset
   159
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17100
diff changeset
   160
\isamarkuptrue%
17056
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   161
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   162
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   163
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   164
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   165
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   166
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   167
\endisadelimproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17100
diff changeset
   168
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17100
diff changeset
   169
\ {\isachardoublequoteopen}{\isasymforall}ys{\isachardot}\ itrev\ xs\ ys\ {\isacharequal}\ rev\ xs\ {\isacharat}\ ys{\isachardoublequoteclose}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   170
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   171
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   172
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   173
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   174
\isatagproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   175
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   176
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   177
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   178
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   179
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   180
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   181
\endisadelimproof
11866
fbd097aec213 updated;
wenzelm
parents: 11458
diff changeset
   182
%
9844
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
   183
\begin{isamarkuptext}%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
   184
\noindent
2665170f104a Adding generated files
nipkow
parents:
diff changeset
   185
This time induction on \isa{xs} followed by simplification succeeds. This
2665170f104a Adding generated files
nipkow
parents:
diff changeset
   186
leads to another heuristic for generalization:
2665170f104a Adding generated files
nipkow
parents:
diff changeset
   187
\begin{quote}
9754
a123a64cadeb *** empty log message ***
nipkow
parents: 9723
diff changeset
   188
\emph{Generalize goals for induction by universally quantifying all free
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
   189
variables {\em(except the induction variable itself!)}.}
2665170f104a Adding generated files
nipkow
parents:
diff changeset
   190
\end{quote}
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
   191
This prevents trivial failures like the one above and does not affect the
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
   192
validity of the goal.  However, this heuristic should not be applied blindly.
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
   193
It is not always required, and the additional quantifiers can complicate
13081
ab4a3aef3591 *** empty log message ***
nipkow
parents: 11866
diff changeset
   194
matters in some cases. The variables that should be quantified are typically
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
   195
those that change in recursive calls.
9644
6b0b6b471855 *** empty log message ***
nipkow
parents: 9541
diff changeset
   196
9844
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
   197
A final point worth mentioning is the orientation of the equation we just
17327
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
   198
proved: the more complex notion (\isa{itrev}) is on the left-hand
9844
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
   199
side, the simpler one (\isa{rev}) on the right-hand side. This constitutes
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
   200
another, albeit weak heuristic that is not restricted to induction:
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
   201
\begin{quote}
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
   202
  \emph{The right-hand side of an equation should (in some sense) be simpler
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
   203
    than the left-hand side.}
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
   204
\end{quote}
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
   205
This heuristic is tricky to apply because it is not obvious that
17327
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
   206
\isa{rev\ xs\ {\isacharat}\ ys} is simpler than \isa{itrev\ xs\ ys}. But see what
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
   207
happens if you try to prove \isa{rev\ xs\ {\isacharat}\ ys\ {\isacharequal}\ itrev\ xs\ ys}!
10971
6852682eaf16 *** empty log message ***
nipkow
parents: 10950
diff changeset
   208
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
   209
If you have tried these heuristics and still find your
10971
6852682eaf16 *** empty log message ***
nipkow
parents: 10950
diff changeset
   210
induction does not go through, and no obvious lemma suggests itself, you may
6852682eaf16 *** empty log message ***
nipkow
parents: 10950
diff changeset
   211
need to generalize your proposition even further. This requires insight into
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
   212
the problem at hand and is beyond simple rules of thumb.  
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
   213
Additionally, you can read \S\ref{sec:advanced-ind}
10971
6852682eaf16 *** empty log message ***
nipkow
parents: 10950
diff changeset
   214
to learn about some advanced techniques for inductive proofs.%
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 10971
diff changeset
   215
\index{induction heuristics|)}%
9844
8016321c7de1 *** empty log message ***
nipkow
parents: 9792
diff changeset
   216
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17100
diff changeset
   217
\isamarkuptrue%
17056
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   218
%
17327
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
   219
\isadelimML
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
   220
%
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
   221
\endisadelimML
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
   222
%
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
   223
\isatagML
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
   224
%
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
   225
\endisatagML
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
   226
{\isafoldML}%
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
   227
%
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
   228
\isadelimML
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
   229
%
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
   230
\endisadelimML
9008633b237e name conflict with global itrev resolved
nipkow
parents: 17187
diff changeset
   231
%
17056
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   232
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   233
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   234
\endisadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   235
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   236
\isatagtheory
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   237
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   238
\endisatagtheory
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   239
{\isafoldtheory}%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   240
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   241
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   242
%
05fc32a23b8b updated;
wenzelm
parents: 16069
diff changeset
   243
\endisadelimtheory
9722
a5f86aed785b *** empty log message ***
nipkow
parents: 9721
diff changeset
   244
\end{isabellebody}%
9145
9f7b8de5bfaf updated;
wenzelm
parents: 8749
diff changeset
   245
%%% Local Variables:
9f7b8de5bfaf updated;
wenzelm
parents: 8749
diff changeset
   246
%%% mode: latex
9f7b8de5bfaf updated;
wenzelm
parents: 8749
diff changeset
   247
%%% TeX-master: "root"
9f7b8de5bfaf updated;
wenzelm
parents: 8749
diff changeset
   248
%%% End: