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