doc-src/TutorialI/IsarOverview/Isar/Logic.thy
author berghofe
Mon, 30 Sep 2002 16:34:56 +0200
changeset 13604 57bfacbbaeda
parent 13580 a0febf6b0e9f
child 13613 531f1f524848
permissions -rw-r--r--
- eliminated thin_leading_eqs_tac - gen_hyp_subst_tac now uses asm_lr_simp_tac instead of asm_full_simp_tac, in order to avoid divergence of new simplifier
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
     1
(*<*)theory Logic = Main:(*>*)
13310
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
     2
text{* We begin by looking at a simplified grammar for Isar proofs
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
     3
where parentheses are used for grouping and $^?$ indicates an optional item:
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
     4
\begin{center}
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
     5
\begin{tabular}{lrl}
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
     6
\emph{proof} & ::= & \isakeyword{proof} \emph{method}$^?$
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
     7
                     \emph{statement}*
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
     8
                     \isakeyword{qed} \\
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
     9
                 &$\mid$& \isakeyword{by} \emph{method}\\[1ex]
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
    10
\emph{statement} &::= & \isakeyword{fix} \emph{variables} \\
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
    11
             &$\mid$& \isakeyword{assume} \emph{propositions} \\
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
    12
             &$\mid$& (\isakeyword{from} \emph{facts})$^?$ 
13310
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
    13
                    (\isakeyword{show} $\mid$ \isakeyword{have})
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
    14
                      \emph{propositions} \emph{proof} \\[1ex]
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
    15
\emph{proposition} &::=& (\emph{label}{\bf:})$^?$ \emph{string} \\[1ex]
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
    16
\emph{fact} &::=& \emph{label}
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    17
\end{tabular}
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    18
\end{center}
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    19
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    20
This is a typical proof skeleton:
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    21
\begin{center}
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    22
\begin{tabular}{@ {}ll}
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
    23
\isakeyword{proof}\\
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
    24
\hspace*{3ex}\isakeyword{assume} @{text"\""}\emph{the-assm}@{text"\""}\\
13347
867f876589e7 *** empty log message ***
nipkow
parents: 13338
diff changeset
    25
\hspace*{3ex}\isakeyword{have} @{text"\""}\dots@{text"\""}  & --- intermediate result\\
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    26
\hspace*{3ex}\vdots\\
13347
867f876589e7 *** empty log message ***
nipkow
parents: 13338
diff changeset
    27
\hspace*{3ex}\isakeyword{have} @{text"\""}\dots@{text"\""}  & --- intermediate result\\
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
    28
\hspace*{3ex}\isakeyword{show} @{text"\""}\emph{the-concl}@{text"\""}\\
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
    29
\isakeyword{qed}
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    30
\end{tabular}
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    31
\end{center}
13310
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
    32
It proves \emph{the-assm}~@{text"\<Longrightarrow>"}~\emph{the-concl}.
13347
867f876589e7 *** empty log message ***
nipkow
parents: 13338
diff changeset
    33
Text starting with ``---'' is a comment.
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
    34
13347
867f876589e7 *** empty log message ***
nipkow
parents: 13338
diff changeset
    35
Note that \emph{propositions} (following \isakeyword{assume} etc)
867f876589e7 *** empty log message ***
nipkow
parents: 13338
diff changeset
    36
may but need not be
867f876589e7 *** empty log message ***
nipkow
parents: 13338
diff changeset
    37
separated by \isakeyword{and}, whose purpose is to structure them
867f876589e7 *** empty log message ***
nipkow
parents: 13338
diff changeset
    38
into possibly named blocks. For example in
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
    39
\begin{center}
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
    40
\isakeyword{assume} @{text"A:"} $A_1$ $A_2$ \isakeyword{and} @{text"B:"} $A_3$
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
    41
\isakeyword{and} $A_4$
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
    42
\end{center}
13329
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
    43
label @{text A} refers to the list of propositions $A_1$ $A_2$ and
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
    44
label @{text B} to $A_3$.
13310
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
    45
*}
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    46
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    47
section{*Logic*}
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    48
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    49
subsection{*Propositional logic*}
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    50
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
    51
subsubsection{*Introduction rules*}
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
    52
13310
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
    53
text{* We start with a really trivial toy proof to introduce the basic
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
    54
features of structured proofs. *}
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    55
lemma "A \<longrightarrow> A"
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    56
proof (rule impI)
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
    57
  assume a: "A"
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
    58
  show "A" by(rule a)
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    59
qed
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    60
text{*\noindent
13310
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
    61
The operational reading: the \isakeyword{assume}-\isakeyword{show} block
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
    62
proves @{prop"A \<Longrightarrow> A"},
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    63
which rule @{thm[source]impI} turns into the desired @{prop"A \<longrightarrow> A"}.
13330
c9e9b6add754 *** empty log message ***
nipkow
parents: 13329
diff changeset
    64
However, this text is much too detailed for comfort. Therefore Isar
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    65
implements the following principle:
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    66
\begin{quote}\em
13310
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
    67
Command \isakeyword{proof} automatically tries to select an introduction rule
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
    68
based on the goal and a predefined list of rules.
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    69
\end{quote}
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    70
Here @{thm[source]impI} is applied automatically:
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    71
*}
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    72
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    73
lemma "A \<longrightarrow> A"
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    74
proof
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
    75
  assume a: "A"
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
    76
  show "A" by(rule a)
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    77
qed
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    78
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
    79
text{* Trivial proofs, in particular those by assumption, should be trivial
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
    80
to perform. Proof ``.'' does just that (and a bit more). Thus
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
    81
naming of assumptions is often superfluous: *}
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    82
lemma "A \<longrightarrow> A"
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    83
proof
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    84
  assume "A"
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
    85
  show "A" .
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    86
qed
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    87
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
    88
text{* To hide proofs by assumption further, \isakeyword{by}@{text"(method)"}
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
    89
first applies @{text method} and then tries to solve all remaining subgoals
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
    90
by assumption: *}
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
    91
lemma "A \<longrightarrow> A \<and> A"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    92
proof
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    93
  assume A
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
    94
  show "A \<and> A" by(rule conjI)
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    95
qed
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
    96
text{*\noindent A drawback of these implicit proofs by assumption is that it
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
    97
is no longer obvious where an assumption is used.
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
    98
13310
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
    99
Proofs of the form \isakeyword{by}@{text"(rule"}~\emph{name}@{text")"} can be
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   100
abbreviated to ``..''
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   101
if \emph{name} refers to one of the predefined introduction rules:
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   102
*}
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   103
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   104
lemma "A \<longrightarrow> A \<and> A"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   105
proof
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   106
  assume A
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   107
  show "A \<and> A" ..
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   108
qed
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   109
text{*\noindent
13310
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   110
This is what happens: first the matching introduction rule @{thm[source]conjI}
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   111
is applied (first ``.''), then the two subgoals are solved by assumption
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   112
(second ``.''). *}
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   113
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   114
subsubsection{*Elimination rules*}
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   115
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   116
text{*A typical elimination rule is @{thm[source]conjE}, $\land$-elimination:
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   117
@{thm[display,indent=5]conjE[no_vars]}  In the following proof it is applied
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   118
by hand, after its first (``\emph{major}'') premise has been eliminated via
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   119
@{text"[OF AB]"}: *}
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   120
lemma "A \<and> B \<longrightarrow> B \<and> A"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   121
proof
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   122
  assume AB: "A \<and> B"
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   123
  show "B \<and> A"
13347
867f876589e7 *** empty log message ***
nipkow
parents: 13338
diff changeset
   124
  proof (rule conjE[OF AB])  -- {*@{text"conjE[OF AB]"}: @{thm conjE[OF AB]} *}
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   125
    assume A and B
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   126
    show ?thesis ..
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   127
  qed
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   128
qed
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   129
text{*\noindent Note that the term @{text"?thesis"} always stands for the
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   130
``current goal'', i.e.\ the enclosing \isakeyword{show} (or
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   131
\isakeyword{have}) statement.
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   132
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   133
This is too much proof text. Elimination rules should be selected
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   134
automatically based on their major premise, the formula or rather connective
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   135
to be eliminated. In Isar they are triggered by propositions being fed
13519
36ee816b5ee3 *** empty log message ***
nipkow
parents: 13351
diff changeset
   136
\emph{into} a proof. Syntax:
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   137
\begin{center}
13519
36ee816b5ee3 *** empty log message ***
nipkow
parents: 13351
diff changeset
   138
\isakeyword{from} \emph{fact} \isakeyword{show} \emph{proposition} \emph{proof}
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   139
\end{center}
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   140
where \emph{fact} stands for the name of a previously proved
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   141
proposition, e.g.\ an assumption, an intermediate result or some global
13519
36ee816b5ee3 *** empty log message ***
nipkow
parents: 13351
diff changeset
   142
theorem, which may also be modified with @{text of}, @{text OF} etc.
36ee816b5ee3 *** empty log message ***
nipkow
parents: 13351
diff changeset
   143
The \emph{fact} is ``piped'' into the \emph{proof}, which can deal with it
36ee816b5ee3 *** empty log message ***
nipkow
parents: 13351
diff changeset
   144
how it choses. If the \emph{proof} starts with a plain \isakeyword{proof},
36ee816b5ee3 *** empty log message ***
nipkow
parents: 13351
diff changeset
   145
an elimination rule (from a predefined list) is applied
36ee816b5ee3 *** empty log message ***
nipkow
parents: 13351
diff changeset
   146
whose first premise is solved by the \emph{fact}. Thus the proof above
36ee816b5ee3 *** empty log message ***
nipkow
parents: 13351
diff changeset
   147
is equivalent to the following one: *}
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   148
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   149
lemma "A \<and> B \<longrightarrow> B \<and> A"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   150
proof
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   151
  assume AB: "A \<and> B"
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   152
  from AB show "B \<and> A"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   153
  proof
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   154
    assume A and B
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   155
    show ?thesis ..
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   156
  qed
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   157
qed
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   158
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   159
text{* Now we come a second important principle:
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   160
\begin{quote}\em
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   161
Try to arrange the sequence of propositions in a UNIX-like pipe,
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   162
such that the proof of each proposition builds on the previous proposition.
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   163
\end{quote}
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   164
The previous proposition can be referred to via the fact @{text this}.
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   165
This greatly reduces the need for explicit naming of propositions:
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   166
*}
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   167
lemma "A \<and> B \<longrightarrow> B \<and> A"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   168
proof
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   169
  assume "A \<and> B"
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   170
  from this show "B \<and> A"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   171
  proof
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   172
    assume A and B
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   173
    show ?thesis ..
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   174
  qed
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   175
qed
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   176
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   177
text{*\noindent Because of the frequency of \isakeyword{from}~@{text
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   178
this} Isar provides two abbreviations:
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   179
\begin{center}
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   180
\begin{tabular}{rcl}
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   181
\isakeyword{then} &=& \isakeyword{from} @{text this} \\
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   182
\isakeyword{thus} &=& \isakeyword{then} \isakeyword{show}
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   183
\end{tabular}
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   184
\end{center}
13310
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   185
\medskip
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   186
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   187
Here is an alternative proof that operates purely by forward reasoning: *}
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   188
lemma "A \<and> B \<longrightarrow> B \<and> A"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   189
proof
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   190
  assume ab: "A \<and> B"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   191
  from ab have a: A ..
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   192
  from ab have b: B ..
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   193
  from b a show "B \<and> A" ..
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   194
qed
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   195
text{*\noindent
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   196
It is worth examining this text in detail because it exhibits a number of new concepts.
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   197
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   198
For a start, this is the first time we have proved intermediate propositions
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   199
(\isakeyword{have}) on the way to the final \isakeyword{show}. This is the
13330
c9e9b6add754 *** empty log message ***
nipkow
parents: 13329
diff changeset
   200
norm in any nontrivial proof where one cannot bridge the gap between the
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   201
assumptions and the conclusion in one step. Both \isakeyword{have}s above are
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   202
proved automatically via @{thm[source]conjE} triggered by
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   203
\isakeyword{from}~@{text ab}.
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   204
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   205
The \isakeyword{show} command illustrates two things:
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   206
\begin{itemize}
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   207
\item \isakeyword{from} can be followed by any number of facts.
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   208
Given \isakeyword{from}~@{text f}$_1$~\dots~@{text f}$_n$, the
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   209
\isakeyword{proof} step after \isakeyword{show}
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   210
tries to find an elimination rule whose first $n$ premises can be proved
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   211
by the given facts in the given order.
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   212
\item If there is no matching elimination rule, introduction rules are tried,
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   213
again using the facts to prove the premises.
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   214
\end{itemize}
13310
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   215
In this case, the proof succeeds with @{thm[source]conjI}. Note that the proof
13519
36ee816b5ee3 *** empty log message ***
nipkow
parents: 13351
diff changeset
   216
would fail had we written \isakeyword{from}~@{text"a b"}
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   217
instead of \isakeyword{from}~@{text"b a"}.
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   218
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   219
This treatment of facts fed into a proof is not restricted to implicit
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   220
application of introduction and elimination rules but applies to explicit
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   221
application of rules as well. Thus you could replace the final ``..'' above
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   222
with \isakeyword{by}@{text"(rule conjI)"}. 
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   223
*}
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   224
13555
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   225
subsection{*More constructs*}
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   226
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   227
text{* In the previous proof of @{prop"A \<and> B \<longrightarrow> B \<and> A"} we needed to feed
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   228
more than one fact into a proof step, a frequent situation. Then the
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   229
UNIX-pipe model appears to break down and we need to name the different
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   230
facts to refer to them. But this can be avoided:
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   231
*}
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   232
lemma "A \<and> B \<longrightarrow> B \<and> A"
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   233
proof
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   234
  assume ab: "A \<and> B"
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   235
  from ab have B ..
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   236
  moreover
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   237
  from ab have A ..
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   238
  ultimately show "B \<and> A" ..
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   239
qed
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   240
text{*\noindent You can combine any number of facts @{term A1} \dots\ @{term
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   241
An} into a sequence by separating their proofs with
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   242
\isakeyword{moreover}. After the final fact, \isakeyword{ultimately} stands
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   243
for \isakeyword{from}~@{term A1}~\dots~@{term An}.  This avoids having to
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   244
introduce names for all of the sequence elements.  *}
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   245
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   246
text{* Although we have only seen a few introduction and elemination rules so
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   247
far, Isar's predefined rules include all the usual natural deduction
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   248
rules. We conclude our exposition of propositional logic with an extended
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   249
example --- which rules are used implicitly where? *}
13326
900f220c800d *** empty log message ***
nipkow
parents: 13322
diff changeset
   250
lemma "\<not> (A \<and> B) \<longrightarrow> \<not> A \<or> \<not> B"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   251
proof
13326
900f220c800d *** empty log message ***
nipkow
parents: 13322
diff changeset
   252
  assume n: "\<not> (A \<and> B)"
900f220c800d *** empty log message ***
nipkow
parents: 13322
diff changeset
   253
  show "\<not> A \<or> \<not> B"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   254
  proof (rule ccontr)
13326
900f220c800d *** empty log message ***
nipkow
parents: 13322
diff changeset
   255
    assume nn: "\<not> (\<not> A \<or> \<not> B)"
900f220c800d *** empty log message ***
nipkow
parents: 13322
diff changeset
   256
    have "\<not> A"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   257
    proof
13326
900f220c800d *** empty log message ***
nipkow
parents: 13322
diff changeset
   258
      assume A
900f220c800d *** empty log message ***
nipkow
parents: 13322
diff changeset
   259
      have "\<not> B"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   260
      proof
13326
900f220c800d *** empty log message ***
nipkow
parents: 13322
diff changeset
   261
        assume B
900f220c800d *** empty log message ***
nipkow
parents: 13322
diff changeset
   262
        have "A \<and> B" ..
900f220c800d *** empty log message ***
nipkow
parents: 13322
diff changeset
   263
        with n show False ..
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   264
      qed
13326
900f220c800d *** empty log message ***
nipkow
parents: 13322
diff changeset
   265
      hence "\<not> A \<or> \<not> B" ..
900f220c800d *** empty log message ***
nipkow
parents: 13322
diff changeset
   266
      with nn show False ..
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   267
    qed
13326
900f220c800d *** empty log message ***
nipkow
parents: 13322
diff changeset
   268
    hence "\<not> A \<or> \<not> B" ..
900f220c800d *** empty log message ***
nipkow
parents: 13322
diff changeset
   269
    with nn show False ..
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   270
  qed
13326
900f220c800d *** empty log message ***
nipkow
parents: 13322
diff changeset
   271
qed
13555
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   272
text{*\noindent
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   273
Rule @{thm[source]ccontr} (``classical contradiction'') is
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   274
@{thm ccontr[no_vars]}.
fc529625b494 *** empty log message ***
nipkow
parents: 13519
diff changeset
   275
Apart from demonstrating the strangeness of classical
13329
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   276
arguments by contradiction, this example also introduces two new
13330
c9e9b6add754 *** empty log message ***
nipkow
parents: 13329
diff changeset
   277
abbreviations:
13329
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   278
\begin{center}
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   279
\begin{tabular}{lcl}
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   280
\isakeyword{hence} &=& \isakeyword{then} \isakeyword{have} \\
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   281
\isakeyword{with}~\emph{facts} &=&
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   282
\isakeyword{from}~\emph{facts} \isakeyword{and} @{text this}
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   283
\end{tabular}
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   284
\end{center}
13326
900f220c800d *** empty log message ***
nipkow
parents: 13322
diff changeset
   285
*}
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   286
13310
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   287
subsection{*Avoiding duplication*}
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   288
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   289
text{* So far our examples have been a bit unnatural: normally we want to
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   290
prove rules expressed with @{text"\<Longrightarrow>"}, not @{text"\<longrightarrow>"}. Here is an example:
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   291
*}
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   292
lemma "A \<and> B \<Longrightarrow> B \<and> A"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   293
proof
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   294
  assume "A \<and> B" thus "B" ..
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   295
next
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   296
  assume "A \<and> B" thus "A" ..
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   297
qed
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   298
text{*\noindent The \isakeyword{proof} always works on the conclusion,
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   299
@{prop"B \<and> A"} in our case, thus selecting $\land$-introduction. Hence
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   300
we must show @{prop B} and @{prop A}; both are proved by
13329
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   301
$\land$-elimination and the proofs are separated by \isakeyword{next}:
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   302
\begin{description}
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   303
\item[\isakeyword{next}] deals with multiple subgoals. For example,
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   304
when showing @{term"A \<and> B"} we need to show both @{term A} and @{term
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   305
B}.  Each subgoal is proved separately, in \emph{any} order. The
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   306
individual proofs are separated by \isakeyword{next}.
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   307
\end{description}
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   308
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   309
This is all very well as long as formulae are small. Let us now look at some
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   310
devices to avoid repeating (possibly large) formulae. A very general method
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   311
is pattern matching: *}
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   312
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   313
lemma "large_A \<and> large_B \<Longrightarrow> large_B \<and> large_A"
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   314
      (is "?AB \<Longrightarrow> ?B \<and> ?A")
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   315
proof
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   316
  assume ?AB thus ?B ..
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   317
next
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   318
  assume ?AB thus ?A ..
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   319
qed
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   320
text{*\noindent Any formula may be followed by
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   321
@{text"("}\isakeyword{is}~\emph{pattern}@{text")"} which causes the pattern
13310
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   322
to be matched against the formula, instantiating the @{text"?"}-variables in
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   323
the pattern. Subsequent uses of these variables in other terms simply causes
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   324
them to be replaced by the terms they stand for.
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   325
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   326
We can simplify things even more by stating the theorem by means of the
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   327
\isakeyword{assumes} and \isakeyword{shows} elements which allow direct
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   328
naming of assumptions: *}
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   329
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   330
lemma assumes AB: "large_A \<and> large_B"
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   331
  shows "large_B \<and> large_A" (is "?B \<and> ?A")
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   332
proof
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   333
  from AB show ?B ..
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   334
next
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   335
  from AB show ?A ..
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   336
qed
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   337
text{*\noindent Note the difference between @{text ?AB}, a term, and
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   338
@{text AB}, a fact.
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   339
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   340
Finally we want to start the proof with $\land$-elimination so we
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   341
don't have to perform it twice, as above. Here is a slick way to
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   342
achieve this: *}
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   343
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   344
lemma assumes AB: "large_A \<and> large_B"
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   345
  shows "large_B \<and> large_A" (is "?B \<and> ?A")
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   346
using AB
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   347
proof
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   348
  assume ?A and ?B show ?thesis ..
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   349
qed
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   350
text{*\noindent Command \isakeyword{using} can appear before a proof
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   351
and adds further facts to those piped into the proof. Here @{text AB}
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   352
is the only such fact and it triggers $\land$-elimination. Another
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   353
frequent usage is as follows:
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   354
\begin{center}
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   355
\isakeyword{from} \emph{important facts}
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   356
\isakeyword{show} \emph{something}
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   357
\isakeyword{using} \emph{minor facts}
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   358
\end{center}
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   359
\medskip
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   360
13330
c9e9b6add754 *** empty log message ***
nipkow
parents: 13329
diff changeset
   361
Sometimes it is necessary to suppress the implicit application of rules in a
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   362
\isakeyword{proof}. For example \isakeyword{show}~@{prop"A \<or> B"} would
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   363
trigger $\lor$-introduction, requiring us to prove @{prop A}. A simple
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   364
``@{text"-"}'' prevents this \emph{faut pas}: *}
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   365
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   366
lemma assumes AB: "A \<or> B" shows "B \<or> A"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   367
proof -
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   368
  from AB show ?thesis
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   369
  proof
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   370
    assume A show ?thesis ..
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   371
  next
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   372
    assume B show ?thesis ..
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   373
  qed
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   374
qed
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   375
text{*\noindent Could \isakeyword{using} help to eliminate this ``@{text"-"}''? *}
13317
bb74918cc0dd *** empty log message ***
nipkow
parents: 13313
diff changeset
   376
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   377
subsection{*Predicate calculus*}
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   378
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   379
text{* Command \isakeyword{fix} introduces new local variables into a
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   380
proof. The pair \isakeyword{fix}-\isakeyword{show} corresponds to @{text"\<And>"}
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   381
(the universal quantifier at the
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   382
meta-level) just like \isakeyword{assume}-\isakeyword{show} corresponds to
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   383
@{text"\<Longrightarrow>"}. Here is a sample proof, annotated with the rules that are
13330
c9e9b6add754 *** empty log message ***
nipkow
parents: 13329
diff changeset
   384
applied implicitly: *}
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   385
lemma assumes P: "\<forall>x. P x" shows "\<forall>x. P(f x)"
13351
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   386
proof                       --"@{thm[source]allI}: @{thm allI}"
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   387
  fix a
13351
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   388
  from P show "P(f a)" ..  --"@{thm[source]allE}: @{thm allE}"
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   389
qed
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   390
text{*\noindent Note that in the proof we have chosen to call the bound
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   391
variable @{term a} instead of @{term x} merely to show that the choice of
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   392
local names is irrelevant.
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   393
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   394
Next we look at @{text"\<exists>"} which is a bit more tricky.
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   395
*}
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   396
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   397
lemma assumes Pf: "\<exists>x. P(f x)" shows "\<exists>y. P y"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   398
proof -
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   399
  from Pf show ?thesis
13351
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   400
  proof              -- "@{thm[source]exE}: @{thm exE}"
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   401
    fix x
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   402
    assume "P(f x)"
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   403
    show ?thesis ..  -- "@{thm[source]exI}: @{thm exI}"
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   404
  qed
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   405
qed
13317
bb74918cc0dd *** empty log message ***
nipkow
parents: 13313
diff changeset
   406
text{*\noindent Explicit $\exists$-elimination as seen above can become
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   407
cumbersome in practice.  The derived Isar language element
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   408
\isakeyword{obtain} provides a more appealing form of generalized
13317
bb74918cc0dd *** empty log message ***
nipkow
parents: 13313
diff changeset
   409
existence reasoning: *}
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   410
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   411
lemma assumes Pf: "\<exists>x. P(f x)" shows "\<exists>y. P y"
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   412
proof -
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   413
  from Pf obtain x where "P(f x)" ..
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   414
  thus "\<exists>y. P y" ..
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   415
qed
13317
bb74918cc0dd *** empty log message ***
nipkow
parents: 13313
diff changeset
   416
text{*\noindent Note how the proof text follows the usual mathematical style
13310
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   417
of concluding $P(x)$ from $\exists x. P(x)$, while carefully introducing $x$
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   418
as a new local variable.  Technically, \isakeyword{obtain} is similar to
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   419
\isakeyword{fix} and \isakeyword{assume} together with a soundness proof of
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   420
the elimination involved.
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   421
13329
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   422
Here is a proof of a well known tautology.
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   423
Figure out which rule is used where!  *}
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   424
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   425
lemma assumes ex: "\<exists>x. \<forall>y. P x y" shows "\<forall>y. \<exists>x. P x y"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   426
proof
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   427
  fix y
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   428
  from ex obtain x where "\<forall>y. P x y" ..
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   429
  hence "P x y" ..
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   430
  thus "\<exists>x. P x y" ..
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   431
qed
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   432
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   433
text{* So far we have confined ourselves to single step proofs. Of course
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   434
powerful automatic methods can be used just as well. Here is an example,
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   435
Cantor's theorem that there is no surjective function from a set to its
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   436
powerset: *}
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   437
theorem "\<exists>S. S \<notin> range (f :: 'a \<Rightarrow> 'a set)"
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   438
proof
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   439
  let ?S = "{x. x \<notin> f x}"
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   440
  show "?S \<notin> range f"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   441
  proof
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   442
    assume "?S \<in> range f"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   443
    then obtain y where fy: "?S = f y" ..
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   444
    show False
13310
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   445
    proof cases
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   446
      assume "y \<in> ?S"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   447
      with fy show False by blast
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   448
    next
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   449
      assume "y \<notin> ?S"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   450
      with fy show False by blast
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   451
    qed
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   452
  qed
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   453
qed
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   454
text{*\noindent
13329
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   455
For a start, the example demonstrates two new constructs:
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   456
\begin{itemize}
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   457
\item \isakeyword{let} introduces an abbreviation for a term, in our case
13580
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   458
the witness for the claim.
13310
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   459
\item Proof by @{text"cases"} starts a proof by cases. Note that it remains
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   460
implicit what the two cases are: it is merely expected that the two subproofs
13580
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   461
prove @{text"P \<Longrightarrow> ?thesis"} and @{text"\<not>P \<Longrightarrow> ?thesis"} (in that order)
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   462
for some @{term P}.
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   463
\end{itemize}
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   464
If you wonder how to \isakeyword{obtain} @{term y}:
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   465
via the predefined elimination rule @{thm rangeE[no_vars]}.
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   466
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   467
Method @{text blast} is used because the contradiction does not follow easily
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   468
by just a single rule. If you find the proof too cryptic for human
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   469
consumption, here is a more detailed version; the beginning up to
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   470
\isakeyword{obtain} stays unchanged. *}
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   471
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   472
theorem "\<exists>S. S \<notin> range (f :: 'a \<Rightarrow> 'a set)"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   473
proof
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   474
  let ?S = "{x. x \<notin> f x}"
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   475
  show "?S \<notin> range f"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   476
  proof
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   477
    assume "?S \<in> range f"
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   478
    then obtain y where fy: "?S = f y" ..
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   479
    show False
13310
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   480
    proof cases
13580
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   481
      assume "y \<in> ?S"
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   482
      hence "y \<notin> f y"   by simp
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   483
      hence "y \<notin> ?S"    by(simp add:fy)
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   484
      thus False        by contradiction
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   485
    next
13580
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   486
      assume "y \<notin> ?S"
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   487
      hence "y \<in> f y"   by simp
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   488
      hence "y \<in> ?S"    by(simp add:fy)
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   489
      thus False        by contradiction
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   490
    qed
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   491
  qed
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   492
qed
13317
bb74918cc0dd *** empty log message ***
nipkow
parents: 13313
diff changeset
   493
text{*\noindent Method @{text contradiction} succeeds if both $P$ and
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   494
$\neg P$ are among the assumptions and the facts fed into that step, in any order.
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   495
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   496
As it happens, Cantor's theorem can be proved automatically by best-first
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   497
search. Depth-first search would diverge, but best-first search successfully
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   498
navigates through the large search space:
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   499
*}
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   500
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   501
theorem "\<exists>S. S \<notin> range (f :: 'a \<Rightarrow> 'a set)"
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   502
by best
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   503
text{*\noindent Of course this only works in the context of HOL's carefully
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   504
constructed introduction and elimination rules for set theory.
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   505
13519
36ee816b5ee3 *** empty log message ***
nipkow
parents: 13351
diff changeset
   506
Finally, whole ``scripts'' (unstructured proofs in the style of
36ee816b5ee3 *** empty log message ***
nipkow
parents: 13351
diff changeset
   507
\cite{LNCS2283}) may appear in the leaves of the proof tree, although this is
36ee816b5ee3 *** empty log message ***
nipkow
parents: 13351
diff changeset
   508
best avoided.  Here is a contrived example: *}
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   509
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   510
lemma "A \<longrightarrow> (A \<longrightarrow> B) \<longrightarrow> B"
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   511
proof
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   512
  assume a: A
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   513
  show "(A \<longrightarrow>B) \<longrightarrow> B"
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   514
    apply(rule impI)
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   515
    apply(erule impE)
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   516
    apply(rule a)
13267
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   517
    apply assumption
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   518
    done
502f69ea6627 *** empty log message ***
nipkow
parents:
diff changeset
   519
qed
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   520
text{*\noindent You may need to resort to this technique if an automatic step
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   521
fails to prove the desired proposition. *}
13305
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   522
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   523
section{*Case distinction and induction*}
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   524
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   525
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   526
subsection{*Case distinction*}
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   527
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   528
text{* We have already met the @{text cases} method for performing
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   529
binary case splits. Here is another example: *}
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   530
lemma "P \<or> \<not> P"
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   531
proof cases
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   532
  assume "P" thus ?thesis ..
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   533
next
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   534
  assume "\<not> P" thus ?thesis ..
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   535
qed
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   536
text{*\noindent Note that the two cases must come in this order.
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   537
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   538
This form is appropriate if @{term P} is textually small.  However, if
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   539
@{term P} is large, we don't want to repeat it. This can be avoided by
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   540
the following idiom *}
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   541
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   542
lemma "P \<or> \<not> P"
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   543
proof (cases "P")
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   544
  case True thus ?thesis ..
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   545
next
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   546
  case False thus ?thesis ..
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   547
qed
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   548
text{*\noindent which is simply a shorthand for the previous
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   549
proof. More precisely, the phrases \isakeyword{case}~@{prop
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   550
True}/@{prop False} abbreviate the corresponding assumptions @{prop P}
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   551
and @{prop"\<not>P"}. In contrast to the previous proof we can prove the cases
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   552
in arbitrary order.
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   553
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   554
The same game can be played with other datatypes, for example lists:
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   555
*}
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   556
(*<*)declare length_tl[simp del](*>*)
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   557
lemma "length(tl xs) = length xs - 1"
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   558
proof (cases xs)
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   559
  case Nil thus ?thesis by simp
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   560
next
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   561
  case Cons thus ?thesis by simp
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   562
qed
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   563
text{*\noindent Here \isakeyword{case}~@{text Nil} abbreviates
13347
867f876589e7 *** empty log message ***
nipkow
parents: 13338
diff changeset
   564
\isakeyword{assume}~@{prop"xs = []"} and \isakeyword{case}~@{text Cons}
13580
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   565
abbreviates \isakeyword{fix}~@{text"? ??"}
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   566
\isakeyword{assume}~@{text"xs = ? # ??"} where @{text"?"} and @{text"??"}
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   567
stand for variable names that have been chosen by the system.
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   568
Therefore we cannot
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   569
refer to them (this would lead to obscure proofs) and have not even shown
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   570
them. Luckily, this proof is simple enough we do not need to refer to them.
13580
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   571
However, sometimes one may have to. Hence Isar offers a simple scheme for
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   572
naming those variables: replace the anonymous @{text Cons} by, for example,
13310
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   573
@{text"(Cons y ys)"}, which abbreviates \isakeyword{fix}~@{text"y ys"}
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   574
\isakeyword{assume}~@{text"xs = Cons y ys"}, i.e.\ @{prop"xs = y # ys"}. Here
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   575
is a (somewhat contrived) example: *}
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   576
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   577
lemma "length(tl xs) = length xs - 1"
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   578
proof (cases xs)
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   579
  case Nil thus ?thesis by simp
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   580
next
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   581
  case (Cons y ys)
13310
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   582
  hence "length(tl xs) = length ys  \<and>  length xs = length ys + 1"
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   583
    by simp
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   584
  thus ?thesis by simp
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   585
qed
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   586
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   587
13347
867f876589e7 *** empty log message ***
nipkow
parents: 13338
diff changeset
   588
subsection{*Structural induction*}
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   589
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   590
text{* We start with a simple inductive proof where both cases are proved automatically: *}
13305
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   591
lemma "2 * (\<Sum>i<n+1. i) = n*(n+1)"
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   592
by (induct n, simp_all)
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   593
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   594
text{*\noindent If we want to expose more of the structure of the
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   595
proof, we can use pattern matching to avoid having to repeat the goal
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   596
statement: *}
13305
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   597
lemma "2 * (\<Sum>i<n+1. i) = n*(n+1)" (is "?P n")
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   598
proof (induct n)
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   599
  show "?P 0" by simp
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   600
next
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   601
  fix n assume "?P n"
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   602
  thus "?P(Suc n)" by simp
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   603
qed
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   604
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   605
text{* \noindent We could refine this further to show more of the equational
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   606
proof. Instead we explore the same avenue as for case distinctions:
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   607
introducing context via the \isakeyword{case} command: *}
13305
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   608
lemma "2 * (\<Sum>i<n+1. i) = n*(n+1)"
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   609
proof (induct n)
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   610
  case 0 show ?case by simp
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   611
next
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   612
  case Suc thus ?case by simp
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   613
qed
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   614
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   615
text{* \noindent The implicitly defined @{text ?case} refers to the
13310
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   616
corresponding case to be proved, i.e.\ @{text"?P 0"} in the first case and
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   617
@{text"?P(Suc n)"} in the second case. Context \isakeyword{case}~@{text 0} is
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   618
empty whereas \isakeyword{case}~@{text Suc} assumes @{text"?P n"}. Again we
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   619
have the same problem as with case distinctions: we cannot refer to an anonymous @{term n}
13310
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   620
in the induction step because it has not been introduced via \isakeyword{fix}
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   621
(in contrast to the previous proof). The solution is the same as above:
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   622
replace @{term Suc} by @{text"(Suc i)"}: *}
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   623
lemma fixes n::nat shows "n < n*n + 1"
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   624
proof (induct n)
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   625
  case 0 show ?case by simp
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   626
next
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   627
  case (Suc i) thus "Suc i < Suc i * Suc i + 1" by simp
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   628
qed
13305
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   629
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   630
text{* \noindent Of course we could again have written
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   631
\isakeyword{thus}~@{text ?case} instead of giving the term explicitly
13351
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   632
but we wanted to use @{term i} somewhere. *}
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   633
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   634
subsection{*Induction formulae involving @{text"\<And>"} or @{text"\<Longrightarrow>"}*}
13305
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   635
13351
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   636
text{* Let us now consider the situation where the goal to be proved contains
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   637
@{text"\<And>"} or @{text"\<Longrightarrow>"}, say @{prop"\<And>x. P x \<Longrightarrow> Q x"} --- motivation and a
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   638
real example follow shortly.  This means that in each case of the induction,
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   639
@{text ?case} would be of the same form @{prop"\<And>x. P' x \<Longrightarrow> Q' x"}.  Thus the
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   640
first proof steps will be the canonical ones, fixing @{text x} and assuming
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   641
@{prop"P' x"}. To avoid this tedium, induction performs these steps
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   642
automatically: for example in case @{text"(Suc n)"}, @{text ?case} is only
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   643
@{prop"Q' x"} whereas the assumptions (named @{term Suc}) contain both the
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   644
usual induction hypothesis \emph{and} @{prop"P' x"}. To fix the name of the
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   645
bound variable @{term x} you may write @{text"(Suc n x)"}, thus abbreviating
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   646
\isakeyword{fix}~@{term x}.
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   647
It should be clear how this example generalizes to more complex formulae.
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   648
13580
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   649
As a concrete example we will now prove complete induction via
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   650
structural induction: *}
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   651
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   652
lemma assumes A: "(\<And>n. (\<And>m. m < n \<Longrightarrow> P m) \<Longrightarrow> P n)"
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   653
  shows "P(n::nat)"
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   654
proof (rule A)
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   655
  show "\<And>m. m < n \<Longrightarrow> P m"
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   656
  proof (induct n)
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   657
    case 0 thus ?case by simp
13305
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   658
  next
13580
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   659
    case (Suc n m)    -- {*@{text"?m < n \<Longrightarrow> P ?m"}  and  @{prop"m < Suc n"}*}
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   660
    show ?case       -- {*@{term ?case}*}
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   661
    proof cases
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   662
      assume eq: "m = n"
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   663
      from Suc A have "P n" by blast
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   664
      with eq show "P m" by simp
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   665
    next
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   666
      assume "m \<noteq> n"
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   667
      with Suc have "m < n" by arith
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   668
      thus "P m" by(rule Suc)
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   669
    qed
13305
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   670
  qed
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   671
qed
13351
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   672
text{* \noindent Given the explanations above and the comments in
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   673
the proof text, the proof should be quite readable.
13305
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   674
13580
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   675
The statement of the lemma is interesting because it deviates from the style in
13351
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   676
the Tutorial~\cite{LNCS2283}, which suggests to introduce @{text"\<forall>"} or
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   677
@{text"\<longrightarrow>"} into a theorem to strengthen it for induction. In structured Isar
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   678
proofs we can use @{text"\<And>"} and @{text"\<Longrightarrow>"} instead. This simplifies the
13580
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   679
proof and means we do not have to convert between the two kinds of
a0febf6b0e9f *** empty log message ***
nipkow
parents: 13555
diff changeset
   680
connectives.
13351
bc1fb6941b54 *** empty log message ***
nipkow
parents: 13347
diff changeset
   681
*}
13305
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   682
13347
867f876589e7 *** empty log message ***
nipkow
parents: 13338
diff changeset
   683
subsection{*Rule induction*}
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   684
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   685
text{* We define our own version of reflexive transitive closure of a
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   686
relation *}
13305
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   687
consts rtc :: "('a \<times> 'a)set \<Rightarrow> ('a \<times> 'a)set"   ("_*" [1000] 999)
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   688
inductive "r*"
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   689
intros
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   690
refl:  "(x,x) \<in> r*"
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   691
step:  "\<lbrakk> (x,y) \<in> r; (y,z) \<in> r* \<rbrakk> \<Longrightarrow> (x,z) \<in> r*"
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   692
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   693
text{* \noindent and prove that @{term"r*"} is indeed transitive: *}
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   694
lemma assumes A: "(x,y) \<in> r*" shows "(y,z) \<in> r* \<Longrightarrow> (x,z) \<in> r*"
13317
bb74918cc0dd *** empty log message ***
nipkow
parents: 13313
diff changeset
   695
using A
bb74918cc0dd *** empty log message ***
nipkow
parents: 13313
diff changeset
   696
proof induct
bb74918cc0dd *** empty log message ***
nipkow
parents: 13313
diff changeset
   697
  case refl thus ?case .
bb74918cc0dd *** empty log message ***
nipkow
parents: 13313
diff changeset
   698
next
bb74918cc0dd *** empty log message ***
nipkow
parents: 13313
diff changeset
   699
  case step thus ?case by(blast intro: rtc.step)
bb74918cc0dd *** empty log message ***
nipkow
parents: 13313
diff changeset
   700
qed
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   701
text{*\noindent Rule induction is triggered by a fact $(x_1,\dots,x_n)
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   702
\in R$ piped into the proof, here \isakeyword{using}~@{text A}. The
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   703
proof itself follows the inductive definition very
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   704
closely: there is one case for each rule, and it has the same name as
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   705
the rule, analogous to structural induction.
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   706
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   707
However, this proof is rather terse. Here is a more readable version:
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   708
*}
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   709
13310
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   710
lemma assumes A: "(x,y) \<in> r*" and B: "(y,z) \<in> r*"
d694e65127ba *** empty log message ***
nipkow
parents: 13307
diff changeset
   711
  shows "(x,z) \<in> r*"
13305
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   712
proof -
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   713
  from A B show ?thesis
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   714
  proof induct
13312
ad91cf279f06 *** empty log message ***
nipkow
parents: 13311
diff changeset
   715
    fix x assume "(x,z) \<in> r*"  -- {*@{text B}[@{text y} := @{text x}]*}
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   716
    thus "(x,z) \<in> r*" .
13305
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   717
  next
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   718
    fix x' x y
13313
e4dc78f4e51e *** empty log message ***
nipkow
parents: 13312
diff changeset
   719
    assume 1: "(x',x) \<in> r" and
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   720
           IH: "(y,z) \<in> r* \<Longrightarrow> (x,z) \<in> r*" and
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   721
           B:  "(y,z) \<in> r*"
13313
e4dc78f4e51e *** empty log message ***
nipkow
parents: 13312
diff changeset
   722
    from 1 IH[OF B] show "(x',z) \<in> r*" by(rule rtc.step)
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   723
  qed
13305
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   724
qed
13307
cf076cdcfbf3 *** empty log message ***
nipkow
parents: 13305
diff changeset
   725
text{*\noindent We start the proof with \isakeyword{from}~@{text"A
13322
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   726
B"}. Only @{text A} is ``consumed'' by the induction step.
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   727
Since @{text B} is left over we don't just prove @{text
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   728
?thesis} but @{text"B \<Longrightarrow> ?thesis"}, just as in the previous proof. The
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   729
base case is trivial. In the assumptions for the induction step we can
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   730
see very clearly how things fit together and permit ourselves the
3323ecc0b97c *** empty log message ***
nipkow
parents: 13317
diff changeset
   731
obvious forward step @{text"IH[OF B]"}. *}
13305
f88d0c363582 *** empty log message ***
nipkow
parents: 13294
diff changeset
   732
13330
c9e9b6add754 *** empty log message ***
nipkow
parents: 13329
diff changeset
   733
subsection{*More induction*}
c9e9b6add754 *** empty log message ***
nipkow
parents: 13329
diff changeset
   734
c9e9b6add754 *** empty log message ***
nipkow
parents: 13329
diff changeset
   735
text{* We close the section by demonstrating how arbitrary induction rules
13347
867f876589e7 *** empty log message ***
nipkow
parents: 13338
diff changeset
   736
are applied. As a simple example we have chosen recursion induction, i.e.\
13330
c9e9b6add754 *** empty log message ***
nipkow
parents: 13329
diff changeset
   737
induction based on a recursive function definition. The example is an unusual
13347
867f876589e7 *** empty log message ***
nipkow
parents: 13338
diff changeset
   738
definition of rotation: *}
13330
c9e9b6add754 *** empty log message ***
nipkow
parents: 13329
diff changeset
   739
13329
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   740
consts rot :: "'a list \<Rightarrow> 'a list"
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   741
recdef rot "measure length"
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   742
"rot [] = []"
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   743
"rot [x] = [x]"
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   744
"rot (x#y#zs) = y # rot(x#zs)"
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   745
13338
20ca66539bef *** empty log message ***
nipkow
parents: 13330
diff changeset
   746
text{* In the first proof we set up each case explicitly, merely using
20ca66539bef *** empty log message ***
nipkow
parents: 13330
diff changeset
   747
pattern matching to abbreviate the statement: *}
20ca66539bef *** empty log message ***
nipkow
parents: 13330
diff changeset
   748
13329
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   749
lemma "length(rot xs) = length xs" (is "?P xs")
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   750
proof (induct xs rule: rot.induct)
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   751
  show "?P []" by simp
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   752
next
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   753
  fix x show "?P [x]" by simp
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   754
next
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   755
  fix x y zs assume "?P (x#zs)"
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   756
  thus "?P (x#y#zs)" by simp
53c4ec15cae0 *** empty log message ***
nipkow
parents: 13326
diff changeset
   757
qed
13347
867f876589e7 *** empty log message ***
nipkow
parents: 13338
diff changeset
   758
text{*\noindent
867f876589e7 *** empty log message ***
nipkow
parents: 13338
diff changeset
   759
This proof skeleton works for arbitrary induction rules, not just
13330
c9e9b6add754 *** empty log message ***
nipkow
parents: 13329
diff changeset
   760
@{thm[source]rot.induct}.
c9e9b6add754 *** empty log message ***
nipkow
parents: 13329
diff changeset
   761
13338
20ca66539bef *** empty log message ***
nipkow
parents: 13330
diff changeset
   762
In the following proof we rely on a default naming scheme for cases: they are
20ca66539bef *** empty log message ***
nipkow
parents: 13330
diff changeset
   763
called 1, 2, etc, unless they have been named explicitly. The latter happens
20ca66539bef *** empty log message ***
nipkow
parents: 13330
diff changeset
   764
only with datatypes and inductively defined sets, but not with recursive
20ca66539bef *** empty log message ***
nipkow
parents: 13330
diff changeset
   765
functions. *}
20ca66539bef *** empty log message ***
nipkow
parents: 13330
diff changeset
   766
20ca66539bef *** empty log message ***
nipkow
parents: 13330
diff changeset
   767
lemma "xs \<noteq> [] \<Longrightarrow> rot xs = tl xs @ [hd xs]"
20ca66539bef *** empty log message ***
nipkow
parents: 13330
diff changeset
   768
proof (induct xs rule: rot.induct)
20ca66539bef *** empty log message ***
nipkow
parents: 13330
diff changeset
   769
  case 1 thus ?case by simp
20ca66539bef *** empty log message ***
nipkow
parents: 13330
diff changeset
   770
next
20ca66539bef *** empty log message ***
nipkow
parents: 13330
diff changeset
   771
  case 2 show ?case by simp
20ca66539bef *** empty log message ***
nipkow
parents: 13330
diff changeset
   772
next
20ca66539bef *** empty log message ***
nipkow
parents: 13330
diff changeset
   773
  case 3 thus ?case by simp
20ca66539bef *** empty log message ***
nipkow
parents: 13330
diff changeset
   774
qed
20ca66539bef *** empty log message ***
nipkow
parents: 13330
diff changeset
   775
13347
867f876589e7 *** empty log message ***
nipkow
parents: 13338
diff changeset
   776
text{*\noindent Why can case 2 get away with \isakeyword{show} instead of
867f876589e7 *** empty log message ***
nipkow
parents: 13338
diff changeset
   777
\isakeyword{thus}?
867f876589e7 *** empty log message ***
nipkow
parents: 13338
diff changeset
   778
867f876589e7 *** empty log message ***
nipkow
parents: 13338
diff changeset
   779
Of course both proofs are so simple that they can be condensed to*}
13338
20ca66539bef *** empty log message ***
nipkow
parents: 13330
diff changeset
   780
(*<*)lemma "xs \<noteq> [] \<Longrightarrow> rot xs = tl xs @ [hd xs]"(*>*)
13330
c9e9b6add754 *** empty log message ***
nipkow
parents: 13329
diff changeset
   781
by (induct xs rule: rot.induct, simp_all)
13294
5e2016d151bd *** empty log message ***
nipkow
parents: 13267
diff changeset
   782
(*<*)end(*>*)