| author | nipkow | 
| Thu, 02 Dec 2004 14:47:07 +0100 | |
| changeset 15364 | 0c3891c3528f | 
| parent 14403 | 32d1526d3237 | 
| child 15617 | 4c7bba41483a | 
| permissions | -rw-r--r-- | 
| 10792 | 1  | 
% $Id$  | 
| 10295 | 2  | 
\chapter{The Rules of the Game}
 | 
3  | 
\label{chap:rules}
 | 
|
4  | 
||
| 11077 | 5  | 
This chapter outlines the concepts and techniques that underlie reasoning  | 
6  | 
in Isabelle. Until now, we have proved everything using only induction and  | 
|
| 13439 | 7  | 
simplification, but any serious verification project requires more elaborate  | 
| 11077 | 8  | 
forms of inference. The chapter also introduces the fundamentals of  | 
9  | 
predicate logic. The first examples in this chapter will consist of  | 
|
10  | 
detailed, low-level proof steps. Later, we shall see how to automate such  | 
|
11  | 
reasoning using the methods  | 
|
12  | 
\isa{blast},
 | 
|
13  | 
\isa{auto} and others.  Backward or goal-directed proof is our usual style,
 | 
|
14  | 
but the chapter also introduces forward reasoning, where one theorem is  | 
|
15  | 
transformed to yield another.  | 
|
| 10295 | 16  | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
17  | 
\section{Natural Deduction}
 | 
| 10295 | 18  | 
|
| 11077 | 19  | 
\index{natural deduction|(}%
 | 
| 10295 | 20  | 
In Isabelle, proofs are constructed using inference rules. The  | 
| 11406 | 21  | 
most familiar inference rule is probably \emph{modus ponens}:%
 | 
22  | 
\index{modus ponens@\emph{modus ponens}} 
 | 
|
| 10295 | 23  | 
\[ \infer{Q}{P\imp Q & P} \]
 | 
| 11406 | 24  | 
This rule says that from $P\imp Q$ and $P$ we may infer~$Q$.  | 
| 10295 | 25  | 
|
| 11406 | 26  | 
\textbf{Natural deduction} is an attempt to formalize logic in a way 
 | 
| 10295 | 27  | 
that mirrors human reasoning patterns.  | 
28  | 
For each logical symbol (say, $\conj$), there  | 
|
| 11406 | 29  | 
are two kinds of rules: \textbf{introduction} and \textbf{elimination} rules. 
 | 
| 10295 | 30  | 
The introduction rules allow us to infer this symbol (say, to  | 
31  | 
infer conjunctions). The elimination rules allow us to deduce  | 
|
32  | 
consequences from this symbol. Ideally each rule should mention  | 
|
33  | 
one symbol only. For predicate logic this can be  | 
|
34  | 
done, but when users define their own concepts they typically  | 
|
| 11255 | 35  | 
have to refer to other symbols as well. It is best not to be dogmatic.  | 
| 10295 | 36  | 
|
37  | 
Natural deduction generally deserves its name. It is easy to use. Each  | 
|
38  | 
proof step consists of identifying the outermost symbol of a formula and  | 
|
39  | 
applying the corresponding rule. It creates new subgoals in  | 
|
40  | 
an obvious way from parts of the chosen formula. Expanding the  | 
|
41  | 
definitions of constants can blow up the goal enormously. Deriving natural  | 
|
42  | 
deduction rules for such constants lets us reason in terms of their key  | 
|
43  | 
properties, which might otherwise be obscured by the technicalities of its  | 
|
44  | 
definition. Natural deduction rules also lend themselves to automation.  | 
|
45  | 
Isabelle's  | 
|
| 11406 | 46  | 
\textbf{classical reasoner} accepts any suitable  collection of natural deduction
 | 
| 10295 | 47  | 
rules and uses them to search for proofs automatically. Isabelle is designed around  | 
| 11077 | 48  | 
natural deduction and many of its tools use the terminology of introduction  | 
49  | 
and elimination rules.%  | 
|
50  | 
\index{natural deduction|)}
 | 
|
| 10295 | 51  | 
|
52  | 
||
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
53  | 
\section{Introduction Rules}
 | 
| 10295 | 54  | 
|
| 11077 | 55  | 
\index{introduction rules|(}%
 | 
56  | 
An introduction rule tells us when we can infer a formula  | 
|
| 10295 | 57  | 
containing a specific logical symbol. For example, the conjunction  | 
58  | 
introduction rule says that if we have $P$ and if we have $Q$ then  | 
|
59  | 
we have $P\conj Q$. In a mathematics text, it is typically shown  | 
|
60  | 
like this:  | 
|
61  | 
\[  \infer{P\conj Q}{P & Q} \]
 | 
|
62  | 
The rule introduces the conjunction  | 
|
| 10971 | 63  | 
symbol~($\conj$) in its conclusion. In Isabelle proofs we  | 
| 10295 | 64  | 
mainly reason backwards. When we apply this rule, the subgoal already has  | 
65  | 
the form of a conjunction; the proof step makes this conjunction symbol  | 
|
66  | 
disappear.  | 
|
67  | 
||
68  | 
In Isabelle notation, the rule looks like this:  | 
|
69  | 
\begin{isabelle}
 | 
|
| 11417 | 70  | 
\isasymlbrakk?P;\ ?Q\isasymrbrakk\ \isasymLongrightarrow\ ?P\ \isasymand\ ?Q\rulenamedx{conjI}
 | 
| 10295 | 71  | 
\end{isabelle}
 | 
72  | 
Carefully examine the syntax. The premises appear to the  | 
|
73  | 
left of the arrow and the conclusion to the right. The premises (if  | 
|
74  | 
more than one) are grouped using the fat brackets. The question marks  | 
|
| 11406 | 75  | 
indicate \textbf{schematic variables} (also called
 | 
76  | 
\textbf{unknowns}):\index{unknowns|bold} they may
 | 
|
| 10295 | 77  | 
be replaced by arbitrary formulas. If we use the rule backwards, Isabelle  | 
78  | 
tries to unify the current subgoal with the conclusion of the rule, which  | 
|
79  | 
has the form \isa{?P\ \isasymand\ ?Q}.  (Unification is discussed below,
 | 
|
| 11428 | 80  | 
{\S}\ref{sec:unification}.)  If successful,
 | 
| 10295 | 81  | 
it yields new subgoals given by the formulas assigned to  | 
82  | 
\isa{?P} and \isa{?Q}.
 | 
|
83  | 
||
| 12333 | 84  | 
The following trivial proof illustrates how rules work. It also introduces a  | 
85  | 
style of indentation. If a command adds a new subgoal, then the next  | 
|
86  | 
command's indentation is increased by one space; if it proves a subgoal, then  | 
|
87  | 
the indentation is reduced. This provides the reader with hints about the  | 
|
88  | 
subgoal structure.  | 
|
| 10295 | 89  | 
\begin{isabelle}
 | 
| 10596 | 90  | 
\isacommand{lemma}\ conj_rule:\ "\isasymlbrakk P;\
 | 
| 10295 | 91  | 
Q\isasymrbrakk\ \isasymLongrightarrow\ P\ \isasymand\  | 
| 10301 | 92  | 
(Q\ \isasymand\ P)"\isanewline  | 
| 10295 | 93  | 
\isacommand{apply}\ (rule\ conjI)\isanewline
 | 
94  | 
\ \isacommand{apply}\ assumption\isanewline
 | 
|
95  | 
\isacommand{apply}\ (rule\ conjI)\isanewline
 | 
|
96  | 
\ \isacommand{apply}\ assumption\isanewline
 | 
|
97  | 
\isacommand{apply}\ assumption
 | 
|
98  | 
\end{isabelle}
 | 
|
99  | 
At the start, Isabelle presents  | 
|
100  | 
us with the assumptions (\isa{P} and~\isa{Q}) and with the goal to be proved,
 | 
|
101  | 
\isa{P\ \isasymand\
 | 
|
102  | 
(Q\ \isasymand\ P)}. We are working backwards, so when we  | 
|
103  | 
apply conjunction introduction, the rule removes the outermost occurrence  | 
|
104  | 
of the \isa{\isasymand} symbol.  To apply a  rule to a subgoal, we apply
 | 
|
| 11406 | 105  | 
the proof method \isa{rule} --- here with \isa{conjI}, the  conjunction
 | 
| 10295 | 106  | 
introduction rule.  | 
107  | 
\begin{isabelle}
 | 
|
| 10596 | 108  | 
%\isasymlbrakk P;\ Q\isasymrbrakk\ \isasymLongrightarrow\ P\ \isasymand\ Q\  | 
| 10295 | 109  | 
%\isasymand\ P\isanewline  | 
| 10596 | 110  | 
\ 1.\ \isasymlbrakk P;\ Q\isasymrbrakk\ \isasymLongrightarrow\ P\isanewline  | 
111  | 
\ 2.\ \isasymlbrakk P;\ Q\isasymrbrakk\ \isasymLongrightarrow\ Q\ \isasymand\ P  | 
|
| 10295 | 112  | 
\end{isabelle}
 | 
113  | 
Isabelle leaves two new subgoals: the two halves of the original conjunction.  | 
|
114  | 
The first is simply \isa{P}, which is trivial, since \isa{P} is among 
 | 
|
| 11406 | 115  | 
the assumptions.  We can apply the \methdx{assumption} 
 | 
| 10295 | 116  | 
method, which proves a subgoal by finding a matching assumption.  | 
117  | 
\begin{isabelle}
 | 
|
| 10596 | 118  | 
\ 1.\ \isasymlbrakk P;\ Q\isasymrbrakk\ \isasymLongrightarrow\  | 
| 10295 | 119  | 
Q\ \isasymand\ P  | 
120  | 
\end{isabelle}
 | 
|
121  | 
We are left with the subgoal of proving  | 
|
122  | 
\isa{Q\ \isasymand\ P} from the assumptions \isa{P} and~\isa{Q}.  We apply
 | 
|
123  | 
\isa{rule conjI} again. 
 | 
|
124  | 
\begin{isabelle}
 | 
|
| 10596 | 125  | 
\ 1.\ \isasymlbrakk P;\ Q\isasymrbrakk\ \isasymLongrightarrow\ Q\isanewline  | 
126  | 
\ 2.\ \isasymlbrakk P;\ Q\isasymrbrakk\ \isasymLongrightarrow\ P  | 
|
| 10295 | 127  | 
\end{isabelle}
 | 
128  | 
We are left with two new subgoals, \isa{Q} and~\isa{P}, each of which can be proved
 | 
|
| 11077 | 129  | 
using the \isa{assumption} method.%
 | 
130  | 
\index{introduction rules|)}
 | 
|
| 10295 | 131  | 
|
132  | 
||
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
133  | 
\section{Elimination Rules}
 | 
| 10295 | 134  | 
|
| 11077 | 135  | 
\index{elimination rules|(}%
 | 
136  | 
Elimination rules work in the opposite direction from introduction  | 
|
| 10295 | 137  | 
rules. In the case of conjunction, there are two such rules.  | 
138  | 
From $P\conj Q$ we infer $P$. also, from $P\conj Q$  | 
|
139  | 
we infer $Q$:  | 
|
140  | 
\[ \infer{P}{P\conj Q} \qquad \infer{Q}{P\conj Q}  \]
 | 
|
141  | 
||
142  | 
Now consider disjunction. There are two introduction rules, which resemble inverted forms of the  | 
|
143  | 
conjunction elimination rules:  | 
|
144  | 
\[ \infer{P\disj Q}{P} \qquad \infer{P\disj Q}{Q}  \]
 | 
|
145  | 
||
146  | 
What is the disjunction elimination rule? The situation is rather different from  | 
|
147  | 
conjunction. From $P\disj Q$ we cannot conclude that $P$ is true and we  | 
|
148  | 
cannot conclude that $Q$ is true; there are no direct  | 
|
149  | 
elimination rules of the sort that we have seen for conjunction. Instead,  | 
|
150  | 
there is an elimination rule that works indirectly. If we are trying to prove  | 
|
151  | 
something else, say $R$, and we know that $P\disj Q$ holds, then we have to consider  | 
|
152  | 
two cases. We can assume that $P$ is true and prove $R$ and then assume that $Q$ is  | 
|
153  | 
true and prove $R$ a second time. Here we see a fundamental concept used in natural  | 
|
| 11406 | 154  | 
deduction:  that of the \textbf{assumptions}. We have to prove $R$ twice, under
 | 
| 10295 | 155  | 
different assumptions. The assumptions are local to these subproofs and are visible  | 
156  | 
nowhere else.  | 
|
157  | 
||
158  | 
In a logic text, the disjunction elimination rule might be shown  | 
|
159  | 
like this:  | 
|
160  | 
\[ \infer{R}{P\disj Q & \infer*{R}{[P]} & \infer*{R}{[Q]}} \]
 | 
|
161  | 
The assumptions $[P]$ and $[Q]$ are bracketed  | 
|
162  | 
to emphasize that they are local to their subproofs. In Isabelle  | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
163  | 
notation, the already-familiar \isa{\isasymLongrightarrow} syntax serves the
 | 
| 10295 | 164  | 
same purpose:  | 
165  | 
\begin{isabelle}
 | 
|
| 11417 | 166  | 
\isasymlbrakk?P\ \isasymor\ ?Q;\ ?P\ \isasymLongrightarrow\ ?R;\ ?Q\ \isasymLongrightarrow\ ?R\isasymrbrakk\ \isasymLongrightarrow\ ?R\rulenamedx{disjE}
 | 
| 10295 | 167  | 
\end{isabelle}
 | 
168  | 
When we use this sort of elimination rule backwards, it produces  | 
|
| 10971 | 169  | 
a case split. (We have seen this before, in proofs by induction.) The following proof  | 
| 10295 | 170  | 
illustrates the use of disjunction elimination.  | 
171  | 
\begin{isabelle}
 | 
|
| 10301 | 172  | 
\isacommand{lemma}\ disj_swap:\ "P\ \isasymor\ Q\ 
 | 
| 10295 | 173  | 
\isasymLongrightarrow\ Q\ \isasymor\ P"\isanewline  | 
174  | 
\isacommand{apply}\ (erule\ disjE)\isanewline
 | 
|
175  | 
\ \isacommand{apply}\ (rule\ disjI2)\isanewline
 | 
|
176  | 
\ \isacommand{apply}\ assumption\isanewline
 | 
|
177  | 
\isacommand{apply}\ (rule\ disjI1)\isanewline
 | 
|
178  | 
\isacommand{apply}\ assumption
 | 
|
179  | 
\end{isabelle}
 | 
|
180  | 
We assume \isa{P\ \isasymor\ Q} and
 | 
|
181  | 
must prove \isa{Q\ \isasymor\ P}\@.  Our first step uses the disjunction
 | 
|
| 11428 | 182  | 
elimination rule, \isa{disjE}\@.  We invoke it using \methdx{erule}, a
 | 
| 11406 | 183  | 
method designed to work with elimination rules. It looks for an assumption that  | 
| 11077 | 184  | 
matches the rule's first premise. It deletes the matching assumption,  | 
185  | 
regards the first premise as proved and returns subgoals corresponding to  | 
|
186  | 
the remaining premises.  When we apply \isa{erule} to \isa{disjE}, only two
 | 
|
187  | 
subgoals result.  This is better than applying it using \isa{rule}
 | 
|
188  | 
to get three subgoals, then proving the first by assumption: the other  | 
|
189  | 
subgoals would have the redundant assumption  | 
|
190  | 
\hbox{\isa{P\ \isasymor\ Q}}.
 | 
|
| 11406 | 191  | 
Most of the time, \isa{erule} is  the best way to use elimination rules, since it
 | 
192  | 
replaces an assumption by its subformulas; only rarely does the original  | 
|
193  | 
assumption remain useful.  | 
|
| 10295 | 194  | 
|
195  | 
\begin{isabelle}
 | 
|
196  | 
%P\ \isasymor\ Q\ \isasymLongrightarrow\ Q\ \isasymor\ P\isanewline  | 
|
197  | 
\ 1.\ P\ \isasymLongrightarrow\ Q\ \isasymor\ P\isanewline  | 
|
198  | 
\ 2.\ Q\ \isasymLongrightarrow\ Q\ \isasymor\ P  | 
|
199  | 
\end{isabelle}
 | 
|
| 11077 | 200  | 
These are the two subgoals returned by \isa{erule}.  The first assumes
 | 
201  | 
\isa{P} and the  second assumes \isa{Q}.  Tackling the first subgoal, we
 | 
|
202  | 
need to  show \isa{Q\ \isasymor\ P}\@.  The second introduction rule
 | 
|
203  | 
(\isa{disjI2}) can reduce this  to \isa{P}, which matches the assumption.
 | 
|
204  | 
So, we apply the  | 
|
| 10596 | 205  | 
\isa{rule}  method with \isa{disjI2} \ldots
 | 
| 10295 | 206  | 
\begin{isabelle}
 | 
207  | 
\ 1.\ P\ \isasymLongrightarrow\ P\isanewline  | 
|
208  | 
\ 2.\ Q\ \isasymLongrightarrow\ Q\ \isasymor\ P  | 
|
209  | 
\end{isabelle}
 | 
|
| 10596 | 210  | 
\ldots and finish off with the \isa{assumption} 
 | 
| 10295 | 211  | 
method. We are left with the other subgoal, which  | 
212  | 
assumes \isa{Q}.  
 | 
|
213  | 
\begin{isabelle}
 | 
|
214  | 
\ 1.\ Q\ \isasymLongrightarrow\ Q\ \isasymor\ P  | 
|
215  | 
\end{isabelle}
 | 
|
216  | 
Its proof is similar, using the introduction  | 
|
217  | 
rule \isa{disjI1}. 
 | 
|
218  | 
||
219  | 
The result of this proof is a new inference rule \isa{disj_swap}, which is neither 
 | 
|
220  | 
an introduction nor an elimination rule, but which might  | 
|
221  | 
be useful. We can use it to replace any goal of the form $Q\disj P$  | 
|
| 11077 | 222  | 
by a one of the form $P\disj Q$.%  | 
223  | 
\index{elimination rules|)}
 | 
|
| 10295 | 224  | 
|
225  | 
||
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
226  | 
\section{Destruction Rules: Some Examples}
 | 
| 10295 | 227  | 
|
| 11077 | 228  | 
\index{destruction rules|(}%
 | 
| 10295 | 229  | 
Now let us examine the analogous proof for conjunction.  | 
230  | 
\begin{isabelle}
 | 
|
| 10301 | 231  | 
\isacommand{lemma}\ conj_swap:\ "P\ \isasymand\ Q\ \isasymLongrightarrow\ Q\ \isasymand\ P"\isanewline
 | 
| 10295 | 232  | 
\isacommand{apply}\ (rule\ conjI)\isanewline
 | 
233  | 
\ \isacommand{apply}\ (drule\ conjunct2)\isanewline
 | 
|
234  | 
\ \isacommand{apply}\ assumption\isanewline
 | 
|
235  | 
\isacommand{apply}\ (drule\ conjunct1)\isanewline
 | 
|
236  | 
\isacommand{apply}\ assumption
 | 
|
237  | 
\end{isabelle}
 | 
|
238  | 
Recall that the conjunction elimination rules --- whose Isabelle names are  | 
|
239  | 
\isa{conjunct1} and \isa{conjunct2} --- simply return the first or second half
 | 
|
240  | 
of a conjunction. Rules of this sort (where the conclusion is a subformula of a  | 
|
| 11406 | 241  | 
premise) are called \textbf{destruction} rules because they take apart and destroy
 | 
| 10978 | 242  | 
a premise.%  | 
| 10295 | 243  | 
\footnote{This Isabelle terminology has no counterpart in standard logic texts, 
 | 
244  | 
although the distinction between the two forms of elimination rule is well known.  | 
|
| 11406 | 245  | 
Girard \cite[page 74]{girard89},\index{Girard, Jean-Yves|fnote}
 | 
246  | 
for example, writes ``The elimination rules  | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
247  | 
[for $\disj$ and $\exists$] are very  | 
| 10295 | 248  | 
bad. What is catastrophic about them is the parasitic presence of a formula [$R$]  | 
249  | 
which has no structural link with the formula which is eliminated.''}  | 
|
250  | 
||
251  | 
The first proof step applies conjunction introduction, leaving  | 
|
252  | 
two subgoals:  | 
|
253  | 
\begin{isabelle}
 | 
|
254  | 
%P\ \isasymand\ Q\ \isasymLongrightarrow\ Q\ \isasymand\ P\isanewline  | 
|
255  | 
\ 1.\ P\ \isasymand\ Q\ \isasymLongrightarrow\ Q\isanewline  | 
|
256  | 
\ 2.\ P\ \isasymand\ Q\ \isasymLongrightarrow\ P  | 
|
257  | 
\end{isabelle}
 | 
|
258  | 
||
259  | 
To invoke the elimination rule, we apply a new method, \isa{drule}. 
 | 
|
| 11406 | 260  | 
Think of the \isa{d} as standing for \textbf{destruction} (or \textbf{direct}, if
 | 
| 10295 | 261  | 
you prefer). Applying the  | 
262  | 
second conjunction rule using \isa{drule} replaces the assumption 
 | 
|
263  | 
\isa{P\ \isasymand\ Q} by \isa{Q}. 
 | 
|
264  | 
\begin{isabelle}
 | 
|
265  | 
\ 1.\ Q\ \isasymLongrightarrow\ Q\isanewline  | 
|
266  | 
\ 2.\ P\ \isasymand\ Q\ \isasymLongrightarrow\ P  | 
|
267  | 
\end{isabelle}
 | 
|
268  | 
The resulting subgoal can be proved by applying \isa{assumption}.
 | 
|
269  | 
The other subgoal is similarly proved, using the \isa{conjunct1} rule and the 
 | 
|
270  | 
\isa{assumption} method.
 | 
|
271  | 
||
272  | 
Choosing among the methods \isa{rule}, \isa{erule} and \isa{drule} is up to 
 | 
|
273  | 
you. Isabelle does not attempt to work out whether a rule  | 
|
274  | 
is an introduction rule or an elimination rule. The  | 
|
275  | 
method determines how the rule will be interpreted. Many rules  | 
|
276  | 
can be used in more than one way.  For example, \isa{disj_swap} can 
 | 
|
277  | 
be applied to assumptions as well as to goals; it replaces any  | 
|
278  | 
assumption of the form  | 
|
279  | 
$P\disj Q$ by a one of the form $Q\disj P$.  | 
|
280  | 
||
281  | 
Destruction rules are simpler in form than indirect rules such as \isa{disjE},
 | 
|
282  | 
but they can be inconvenient. Each of the conjunction rules discards half  | 
|
283  | 
of the formula, when usually we want to take both parts of the conjunction as new  | 
|
284  | 
assumptions. The easiest way to do so is by using an  | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
285  | 
alternative conjunction elimination rule that resembles \isa{disjE}\@.  It is
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
286  | 
seldom, if ever, seen in logic books. In Isabelle syntax it looks like this:  | 
| 10295 | 287  | 
\begin{isabelle}
 | 
| 11417 | 288  | 
\isasymlbrakk?P\ \isasymand\ ?Q;\ \isasymlbrakk?P;\ ?Q\isasymrbrakk\ \isasymLongrightarrow\ ?R\isasymrbrakk\ \isasymLongrightarrow\ ?R\rulenamedx{conjE}
 | 
| 10295 | 289  | 
\end{isabelle}
 | 
| 11077 | 290  | 
\index{destruction rules|)}
 | 
| 10295 | 291  | 
|
292  | 
\begin{exercise}
 | 
|
| 11077 | 293  | 
Use the rule \isa{conjE} to shorten the proof above. 
 | 
| 10295 | 294  | 
\end{exercise}
 | 
295  | 
||
296  | 
||
297  | 
\section{Implication}
 | 
|
298  | 
||
| 11077 | 299  | 
\index{implication|(}%
 | 
| 11406 | 300  | 
At the start of this chapter, we saw the rule \emph{modus ponens}.  It is, in fact,
 | 
| 10295 | 301  | 
a destruction rule. The matching introduction rule looks like this  | 
302  | 
in Isabelle:  | 
|
303  | 
\begin{isabelle}
 | 
|
304  | 
(?P\ \isasymLongrightarrow\ ?Q)\ \isasymLongrightarrow\ ?P\  | 
|
| 11417 | 305  | 
\isasymlongrightarrow\ ?Q\rulenamedx{impI}
 | 
| 10295 | 306  | 
\end{isabelle}
 | 
| 12535 | 307  | 
And this is \emph{modus ponens}\index{modus ponens@\emph{modus ponens}}:
 | 
| 10295 | 308  | 
\begin{isabelle}
 | 
309  | 
\isasymlbrakk?P\ \isasymlongrightarrow\ ?Q;\ ?P\isasymrbrakk\  | 
|
310  | 
\isasymLongrightarrow\ ?Q  | 
|
| 11417 | 311  | 
\rulenamedx{mp}
 | 
| 10295 | 312  | 
\end{isabelle}
 | 
313  | 
||
| 11077 | 314  | 
Here is a proof using the implication rules. This  | 
| 10295 | 315  | 
lemma performs a sort of uncurrying, replacing the two antecedents  | 
| 11077 | 316  | 
of a nested implication by a conjunction. The proof illustrates  | 
317  | 
how assumptions work. At each proof step, the subgoals inherit the previous  | 
|
318  | 
assumptions, perhaps with additions or deletions. Rules such as  | 
|
319  | 
\isa{impI} and \isa{disjE} add assumptions, while applying \isa{erule} or
 | 
|
320  | 
\isa{drule} deletes the matching assumption.
 | 
|
| 10295 | 321  | 
\begin{isabelle}
 | 
322  | 
\isacommand{lemma}\ imp_uncurry:\
 | 
|
| 10301 | 323  | 
"P\ \isasymlongrightarrow\ (Q\  | 
| 10295 | 324  | 
\isasymlongrightarrow\ R)\ \isasymLongrightarrow\ P\  | 
325  | 
\isasymand\ Q\ \isasymlongrightarrow\  | 
|
326  | 
R"\isanewline  | 
|
327  | 
\isacommand{apply}\ (rule\ impI)\isanewline
 | 
|
328  | 
\isacommand{apply}\ (erule\ conjE)\isanewline
 | 
|
329  | 
\isacommand{apply}\ (drule\ mp)\isanewline
 | 
|
330  | 
\ \isacommand{apply}\ assumption\isanewline
 | 
|
331  | 
\isacommand{apply}\ (drule\ mp)\isanewline
 | 
|
332  | 
\ \ \isacommand{apply}\ assumption\isanewline
 | 
|
333  | 
\ \isacommand{apply}\ assumption
 | 
|
334  | 
\end{isabelle}
 | 
|
335  | 
First, we state the lemma and apply implication introduction (\isa{rule impI}), 
 | 
|
336  | 
which moves the conjunction to the assumptions.  | 
|
337  | 
\begin{isabelle}
 | 
|
338  | 
%P\ \isasymlongrightarrow\ Q\ \isasymlongrightarrow\ R\ \isasymLongrightarrow\ P\  | 
|
339  | 
%\isasymand\ Q\ \isasymlongrightarrow\ R\isanewline  | 
|
| 10596 | 340  | 
\ 1.\ \isasymlbrakk P\ \isasymlongrightarrow\ Q\ \isasymlongrightarrow\ R;\ P\ \isasymand\ Q\isasymrbrakk\ \isasymLongrightarrow\ R  | 
| 10295 | 341  | 
\end{isabelle}
 | 
342  | 
Next, we apply conjunction elimination (\isa{erule conjE}), which splits this
 | 
|
343  | 
conjunction into two parts.  | 
|
344  | 
\begin{isabelle}
 | 
|
| 10596 | 345  | 
\ 1.\ \isasymlbrakk P\ \isasymlongrightarrow\ Q\ \isasymlongrightarrow\ R;\ P;\  | 
| 10295 | 346  | 
Q\isasymrbrakk\ \isasymLongrightarrow\ R  | 
347  | 
\end{isabelle}
 | 
|
348  | 
Now, we work on the assumption \isa{P\ \isasymlongrightarrow\ (Q\
 | 
|
349  | 
\isasymlongrightarrow\ R)}, where the parentheses have been inserted for  | 
|
350  | 
clarity. The nested implication requires two applications of  | 
|
351  | 
\textit{modus ponens}: \isa{drule mp}.  The first use  yields the
 | 
|
352  | 
implication \isa{Q\
 | 
|
353  | 
\isasymlongrightarrow\ R}, but first we must prove the extra subgoal  | 
|
354  | 
\isa{P}, which we do by assumption. 
 | 
|
355  | 
\begin{isabelle}
 | 
|
| 10596 | 356  | 
\ 1.\ \isasymlbrakk P;\ Q\isasymrbrakk\ \isasymLongrightarrow\ P\isanewline  | 
357  | 
\ 2.\ \isasymlbrakk P;\ Q;\ Q\ \isasymlongrightarrow\ R\isasymrbrakk\ \isasymLongrightarrow\ R  | 
|
| 10295 | 358  | 
\end{isabelle}
 | 
359  | 
Repeating these steps for \isa{Q\
 | 
|
360  | 
\isasymlongrightarrow\ R} yields the conclusion we seek, namely~\isa{R}.
 | 
|
361  | 
\begin{isabelle}
 | 
|
| 10596 | 362  | 
\ 1.\ \isasymlbrakk P;\ Q;\ Q\ \isasymlongrightarrow\ R\isasymrbrakk\  | 
| 10295 | 363  | 
\isasymLongrightarrow\ R  | 
364  | 
\end{isabelle}
 | 
|
365  | 
||
366  | 
The symbols \isa{\isasymLongrightarrow} and \isa{\isasymlongrightarrow}
 | 
|
367  | 
both stand for implication, but they differ in many respects. Isabelle  | 
|
368  | 
uses \isa{\isasymLongrightarrow} to express inference rules; the symbol is
 | 
|
369  | 
built-in and Isabelle's inference mechanisms treat it specially. On the  | 
|
370  | 
other hand, \isa{\isasymlongrightarrow} is just one of the many connectives
 | 
|
371  | 
available in higher-order logic. We reason about it using inference rules  | 
|
372  | 
such as \isa{impI} and \isa{mp}, just as we reason about the other
 | 
|
373  | 
connectives.  You will have to use \isa{\isasymlongrightarrow} in any
 | 
|
374  | 
context that requires a formula of higher-order logic. Use  | 
|
375  | 
\isa{\isasymLongrightarrow} to separate a theorem's preconditions from its
 | 
|
| 11077 | 376  | 
conclusion.%  | 
377  | 
\index{implication|)}
 | 
|
| 10295 | 378  | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
379  | 
\medskip  | 
| 11406 | 380  | 
\index{by@\isacommand{by} (command)|(}%
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
381  | 
The \isacommand{by} command is useful for proofs like these that use
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
382  | 
\isa{assumption} heavily.  It executes an
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
383  | 
\isacommand{apply} command, then tries to prove all remaining subgoals using
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
384  | 
\isa{assumption}.  Since (if successful) it ends the proof, it also replaces the 
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
385  | 
\isacommand{done} symbol.  For example, the proof above can be shortened:
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
386  | 
\begin{isabelle}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
387  | 
\isacommand{lemma}\ imp_uncurry:\
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
388  | 
"P\ \isasymlongrightarrow\ (Q\  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
389  | 
\isasymlongrightarrow\ R)\ \isasymLongrightarrow\ P\  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
390  | 
\isasymand\ Q\ \isasymlongrightarrow\  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
391  | 
R"\isanewline  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
392  | 
\isacommand{apply}\ (rule\ impI)\isanewline
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
393  | 
\isacommand{apply}\ (erule\ conjE)\isanewline
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
394  | 
\isacommand{apply}\ (drule\ mp)\isanewline
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
395  | 
\ \isacommand{apply}\ assumption\isanewline
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
396  | 
\isacommand{by}\ (drule\ mp)
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
397  | 
\end{isabelle}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
398  | 
We could use \isacommand{by} to replace the final \isacommand{apply} and
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
399  | 
\isacommand{done} in any proof, but typically we use it
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
400  | 
to eliminate calls to \isa{assumption}.  It is also a nice way of expressing a
 | 
| 11406 | 401  | 
one-line proof.%  | 
402  | 
\index{by@\isacommand{by} (command)|)}
 | 
|
403  | 
||
| 10295 | 404  | 
|
405  | 
||
406  | 
\section{Negation}
 | 
|
407  | 
||
| 11077 | 408  | 
\index{negation|(}%
 | 
| 10295 | 409  | 
Negation causes surprising complexity in proofs. Its natural  | 
410  | 
deduction rules are straightforward, but additional rules seem  | 
|
| 11077 | 411  | 
necessary in order to handle negated assumptions gracefully. This section  | 
412  | 
also illustrates the \isa{intro} method: a convenient way of
 | 
|
413  | 
applying introduction rules.  | 
|
| 10295 | 414  | 
|
| 11428 | 415  | 
Negation introduction deduces $\lnot P$ if assuming $P$ leads to a  | 
| 10295 | 416  | 
contradiction. Negation elimination deduces any formula in the  | 
| 11428 | 417  | 
presence of $\lnot P$ together with~$P$:  | 
| 10295 | 418  | 
\begin{isabelle}
 | 
419  | 
(?P\ \isasymLongrightarrow\ False)\ \isasymLongrightarrow\ \isasymnot\ ?P%  | 
|
| 11417 | 420  | 
\rulenamedx{notI}\isanewline
 | 
| 10295 | 421  | 
\isasymlbrakk{\isasymnot}\ ?P;\ ?P\isasymrbrakk\ \isasymLongrightarrow\ ?R%
 | 
| 11417 | 422  | 
\rulenamedx{notE}
 | 
| 10295 | 423  | 
\end{isabelle}
 | 
424  | 
%  | 
|
| 11428 | 425  | 
Classical logic allows us to assume $\lnot P$  | 
| 10295 | 426  | 
when attempting to prove~$P$:  | 
427  | 
\begin{isabelle}
 | 
|
428  | 
(\isasymnot\ ?P\ \isasymLongrightarrow\ ?P)\ \isasymLongrightarrow\ ?P%  | 
|
| 11417 | 429  | 
\rulenamedx{classical}
 | 
| 10295 | 430  | 
\end{isabelle}
 | 
| 11077 | 431  | 
|
| 11406 | 432  | 
\index{contrapositives|(}%
 | 
| 11428 | 433  | 
The implications $P\imp Q$ and $\lnot Q\imp\lnot P$ are logically  | 
| 11077 | 434  | 
equivalent, and each is called the  | 
| 11406 | 435  | 
\textbf{contrapositive} of the other.  Four further rules support
 | 
| 11077 | 436  | 
reasoning about contrapositives. They differ in the placement of the  | 
437  | 
negation symbols:  | 
|
| 10295 | 438  | 
\begin{isabelle}
 | 
439  | 
\isasymlbrakk?Q;\ \isasymnot\ ?P\ \isasymLongrightarrow\ \isasymnot\ ?Q\isasymrbrakk\ \isasymLongrightarrow\ ?P%  | 
|
440  | 
\rulename{contrapos_pp}\isanewline
 | 
|
| 11406 | 441  | 
\isasymlbrakk?Q;\ ?P\ \isasymLongrightarrow\ \isasymnot\ ?Q\isasymrbrakk\ \isasymLongrightarrow\  | 
442  | 
\isasymnot\ ?P%  | 
|
443  | 
\rulename{contrapos_pn}\isanewline
 | 
|
| 10295 | 444  | 
\isasymlbrakk{\isasymnot}\ ?Q;\ \isasymnot\ ?P\ \isasymLongrightarrow\ ?Q\isasymrbrakk\ \isasymLongrightarrow\ ?P%
 | 
445  | 
\rulename{contrapos_np}\isanewline
 | 
|
446  | 
\isasymlbrakk{\isasymnot}\ ?Q;\ ?P\ \isasymLongrightarrow\ ?Q\isasymrbrakk\ \isasymLongrightarrow\ \isasymnot\ ?P%
 | 
|
447  | 
\rulename{contrapos_nn}
 | 
|
448  | 
\end{isabelle}
 | 
|
449  | 
%  | 
|
| 11077 | 450  | 
These rules are typically applied using the \isa{erule} method, where 
 | 
| 10295 | 451  | 
their effect is to form a contrapositive from an  | 
| 11406 | 452  | 
assumption and the goal's conclusion.%  | 
453  | 
\index{contrapositives|)}
 | 
|
| 10295 | 454  | 
|
455  | 
The most important of these is \isa{contrapos_np}.  It is useful
 | 
|
456  | 
for applying introduction rules to negated assumptions. For instance,  | 
|
| 11428 | 457  | 
the assumption $\lnot(P\imp Q)$ is equivalent to the conclusion $P\imp Q$ and we  | 
| 10295 | 458  | 
might want to use conjunction introduction on it.  | 
459  | 
Before we can do so, we must move that assumption so that it  | 
|
460  | 
becomes the conclusion. The following proof demonstrates this  | 
|
461  | 
technique:  | 
|
462  | 
\begin{isabelle}
 | 
|
463  | 
\isacommand{lemma}\ "\isasymlbrakk{\isasymnot}(P{\isasymlongrightarrow}Q);\
 | 
|
464  | 
\isasymnot(R{\isasymlongrightarrow}Q)\isasymrbrakk\ \isasymLongrightarrow\
 | 
|
465  | 
R"\isanewline  | 
|
| 10971 | 466  | 
\isacommand{apply}\ (erule_tac\ Q = "R{\isasymlongrightarrow}Q"\ \isakeyword{in}\
 | 
| 10295 | 467  | 
contrapos_np)\isanewline  | 
| 12408 | 468  | 
\isacommand{apply}\ (intro\ impI)\isanewline
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
469  | 
\isacommand{by}\ (erule\ notE)
 | 
| 10295 | 470  | 
\end{isabelle}
 | 
471  | 
%  | 
|
472  | 
There are two negated assumptions and we need to exchange the conclusion with the  | 
|
473  | 
second one.  The method \isa{erule contrapos_np} would select the first assumption,
 | 
|
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
474  | 
which we do not want. So we specify the desired assumption explicitly  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
475  | 
using a new method, \isa{erule_tac}.  This is the resulting subgoal: 
 | 
| 10295 | 476  | 
\begin{isabelle}
 | 
477  | 
\ 1.\ \isasymlbrakk{\isasymnot}\ (P\ \isasymlongrightarrow\ Q);\ \isasymnot\
 | 
|
478  | 
R\isasymrbrakk\ \isasymLongrightarrow\ R\ \isasymlongrightarrow\ Q%  | 
|
479  | 
\end{isabelle}
 | 
|
480  | 
The former conclusion, namely \isa{R}, now appears negated among the assumptions,
 | 
|
481  | 
while the negated formula \isa{R\ \isasymlongrightarrow\ Q} becomes the new
 | 
|
482  | 
conclusion.  | 
|
483  | 
||
| 11406 | 484  | 
We can now apply introduction rules.  We use the \methdx{intro} method, which
 | 
| 12408 | 485  | 
repeatedly applies the given introduction rules. Here its effect is equivalent  | 
| 10596 | 486  | 
to \isa{rule impI}.
 | 
487  | 
\begin{isabelle}
 | 
|
| 10295 | 488  | 
\ 1.\ \isasymlbrakk{\isasymnot}\ (P\ \isasymlongrightarrow\ Q);\ \isasymnot\ R;\
 | 
489  | 
R\isasymrbrakk\ \isasymLongrightarrow\ Q%  | 
|
490  | 
\end{isabelle}
 | 
|
491  | 
We can see a contradiction in the form of assumptions \isa{\isasymnot\ R}
 | 
|
492  | 
and~\isa{R}, which suggests using negation elimination.  If applied on its own,
 | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
493  | 
\isa{notE} will select the first negated assumption, which is useless.  
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
494  | 
Instead, we invoke the rule using the  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
495  | 
\isa{by} command.
 | 
| 10295 | 496  | 
Now when Isabelle selects the first assumption, it tries to prove \isa{P\
 | 
497  | 
\isasymlongrightarrow\ Q} and fails; it then backtracks, finds the  | 
|
| 10971 | 498  | 
assumption \isa{\isasymnot~R} and finally proves \isa{R} by assumption.  That
 | 
| 10295 | 499  | 
concludes the proof.  | 
500  | 
||
501  | 
\medskip  | 
|
502  | 
||
| 11077 | 503  | 
The following example may be skipped on a first reading. It involves a  | 
504  | 
peculiar but important rule, a form of disjunction introduction:  | 
|
505  | 
\begin{isabelle}
 | 
|
506  | 
(\isasymnot \ ?Q\ \isasymLongrightarrow \ ?P)\ \isasymLongrightarrow \ ?P\ \isasymor \ ?Q%  | 
|
| 11417 | 507  | 
\rulenamedx{disjCI}
 | 
| 11077 | 508  | 
\end{isabelle}
 | 
509  | 
This rule combines the effects of \isa{disjI1} and \isa{disjI2}.  Its great
 | 
|
510  | 
advantage is that we can remove the disjunction symbol without deciding  | 
|
| 11406 | 511  | 
which disjunction to prove. This treatment of disjunction is standard in sequent  | 
512  | 
and tableau calculi.  | 
|
| 11077 | 513  | 
|
| 10295 | 514  | 
\begin{isabelle}
 | 
515  | 
\isacommand{lemma}\ "(P\ \isasymor\ Q)\ \isasymand\ R\
 | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
516  | 
\isasymLongrightarrow\ P\ \isasymor\ (Q\ \isasymand\ R)"\isanewline  | 
| 12408 | 517  | 
\isacommand{apply}\ (intro\ disjCI\ conjI)\isanewline
 | 
| 10295 | 518  | 
\isacommand{apply}\ (elim\ conjE\ disjE)\isanewline
 | 
519  | 
\ \isacommand{apply}\ assumption
 | 
|
520  | 
\isanewline  | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
521  | 
\isacommand{by}\ (erule\ contrapos_np,\ rule\ conjI)
 | 
| 10295 | 522  | 
\end{isabelle}
 | 
523  | 
%  | 
|
| 12408 | 524  | 
The first proof step uses \isa{intro} to apply
 | 
525  | 
the introduction rules \isa{disjCI} and \isa{conjI}.  The resulting
 | 
|
526  | 
subgoal has the negative assumption  | 
|
| 11077 | 527  | 
\hbox{\isa{\isasymnot(Q\ \isasymand\ R)}}.  
 | 
528  | 
||
| 10295 | 529  | 
\begin{isabelle}
 | 
530  | 
\ 1.\ \isasymlbrakk(P\ \isasymor\ Q)\ \isasymand\ R;\ \isasymnot\ (Q\ \isasymand\  | 
|
531  | 
R)\isasymrbrakk\ \isasymLongrightarrow\ P%  | 
|
532  | 
\end{isabelle}
 | 
|
| 11077 | 533  | 
Next we apply the \isa{elim} method, which repeatedly applies 
 | 
| 10295 | 534  | 
elimination rules; here, the elimination rules given  | 
| 10971 | 535  | 
in the command.  One of the subgoals is trivial (\isa{\isacommand{apply} assumption}),
 | 
536  | 
leaving us with one other:  | 
|
| 10295 | 537  | 
\begin{isabelle}
 | 
538  | 
\ 1.\ \isasymlbrakk{\isasymnot}\ (Q\ \isasymand\ R);\ R;\ Q\isasymrbrakk\ \isasymLongrightarrow\ P%
 | 
|
539  | 
\end{isabelle}
 | 
|
540  | 
%  | 
|
541  | 
Now we must move the formula \isa{Q\ \isasymand\ R} to be the conclusion.  The
 | 
|
542  | 
combination  | 
|
543  | 
\begin{isabelle}
 | 
|
544  | 
\ \ \ \ \ (erule\ contrapos_np,\ rule\ conjI)  | 
|
545  | 
\end{isabelle}
 | 
|
546  | 
is robust: the \isa{conjI} forces the \isa{erule} to select a
 | 
|
| 10301 | 547  | 
conjunction. The two subgoals are the ones we would expect from applying  | 
| 10295 | 548  | 
conjunction introduction to  | 
| 10971 | 549  | 
\isa{Q~\isasymand~R}:  
 | 
| 10295 | 550  | 
\begin{isabelle}
 | 
| 10596 | 551  | 
\ 1.\ \isasymlbrakk R;\ Q;\ \isasymnot\ P\isasymrbrakk\ \isasymLongrightarrow\  | 
| 10295 | 552  | 
Q\isanewline  | 
| 10596 | 553  | 
\ 2.\ \isasymlbrakk R;\ Q;\ \isasymnot\ P\isasymrbrakk\ \isasymLongrightarrow\ R%  | 
| 10295 | 554  | 
\end{isabelle}
 | 
| 11077 | 555  | 
They are proved by assumption, which is implicit in the \isacommand{by}
 | 
556  | 
command.%  | 
|
557  | 
\index{negation|)}
 | 
|
558  | 
||
559  | 
||
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
560  | 
\section{Interlude: the Basic Methods for Rules}
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
561  | 
|
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
562  | 
We have seen examples of many tactics that operate on individual rules. It  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
563  | 
may be helpful to review how they work given an arbitrary rule such as this:  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
564  | 
\[ \infer{Q}{P@1 & \ldots & P@n} \]
 | 
| 11406 | 565  | 
Below, we refer to $P@1$ as the \bfindex{major premise}.  This concept
 | 
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
566  | 
applies only to elimination and destruction rules. These rules act upon an  | 
| 11406 | 567  | 
instance of their major premise, typically to replace it by subformulas of itself.  | 
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
568  | 
|
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
569  | 
Suppose that the rule above is called~\isa{R}\@.  Here are the basic rule
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
570  | 
methods, most of which we have already seen:  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
571  | 
\begin{itemize}
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
572  | 
\item  | 
| 11406 | 573  | 
Method \isa{rule\ R} unifies~$Q$ with the current subgoal, replacing it
 | 
574  | 
by $n$ new subgoals: instances of $P@1$, \ldots,~$P@n$.  | 
|
575  | 
This is backward reasoning and is appropriate for introduction rules.  | 
|
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
576  | 
\item  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
577  | 
Method \isa{erule\ R} unifies~$Q$ with the current subgoal and
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
578  | 
simultaneously unifies $P@1$ with some assumption. The subgoal is  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
579  | 
replaced by the $n-1$ new subgoals of proving  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
580  | 
instances of $P@2$,  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
581  | 
\ldots,~$P@n$, with the matching assumption deleted. It is appropriate for  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
582  | 
elimination rules. The method  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
583  | 
\isa{(rule\ R,\ assumption)} is similar, but it does not delete an
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
584  | 
assumption.  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
585  | 
\item  | 
| 11406 | 586  | 
Method \isa{drule\ R} unifies $P@1$ with some assumption, which it
 | 
587  | 
then deletes. The subgoal is  | 
|
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
588  | 
replaced by the $n-1$ new subgoals of proving $P@2$, \ldots,~$P@n$; an  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
589  | 
$n$th subgoal is like the original one but has an additional assumption: an  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
590  | 
instance of~$Q$. It is appropriate for destruction rules.  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
591  | 
\item  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
592  | 
Method \isa{frule\ R} is like \isa{drule\ R} except that the matching
 | 
| 11428 | 593  | 
assumption is not deleted.  (See {\S}\ref{sec:frule} below.)
 | 
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
594  | 
\end{itemize}
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
595  | 
|
| 11406 | 596  | 
Other methods apply a rule while constraining some of its  | 
597  | 
variables. The typical form is  | 
|
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
598  | 
\begin{isabelle}
 | 
| 11406 | 599  | 
\ \ \ \ \ \methdx{rule_tac}\ $v@1$ = $t@1$ \isakeyword{and} \ldots \isakeyword{and}
 | 
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
600  | 
$v@k$ =  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
601  | 
$t@k$ \isakeyword{in} R
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
602  | 
\end{isabelle}
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
603  | 
This method behaves like \isa{rule R}, while instantiating the variables
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
604  | 
$v@1$, \ldots,  | 
| 11406 | 605  | 
$v@k$ as specified.  We similarly have \methdx{erule_tac}, \methdx{drule_tac} and
 | 
606  | 
\methdx{frule_tac}.  These methods also let us specify which subgoal to
 | 
|
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
607  | 
operate on. By default it is the first subgoal, as with nearly all  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
608  | 
methods, but we can specify that rule \isa{R} should be applied to subgoal
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
609  | 
number~$i$:  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
610  | 
\begin{isabelle}
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
611  | 
\ \ \ \ \ rule_tac\ [$i$] R  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
612  | 
\end{isabelle}
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
613  | 
|
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
614  | 
|
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
615  | 
|
| 11077 | 616  | 
\section{Unification and Substitution}\label{sec:unification}
 | 
617  | 
||
618  | 
\index{unification|(}%
 | 
|
| 11406 | 619  | 
As we have seen, Isabelle rules involve schematic variables, which begin with  | 
| 11077 | 620  | 
a question mark and act as  | 
| 13751 | 621  | 
placeholders for terms.  \textbf{Unification} --- well known to Prolog programmers --- is the act of
 | 
622  | 
making two terms identical, possibly replacing their schematic variables by  | 
|
| 11406 | 623  | 
terms. The simplest case is when the two terms are already the same. Next  | 
624  | 
simplest is \textbf{pattern-matching}, which replaces variables in only one of the
 | 
|
625  | 
terms. The  | 
|
| 11077 | 626  | 
\isa{rule} method typically  matches the rule's conclusion
 | 
| 13751 | 627  | 
against the current subgoal. The  | 
628  | 
\isa{assumption} method matches the current subgoal's conclusion
 | 
|
629  | 
against each of its assumptions.   Unification can instantiate variables in both terms; the \isa{rule} method can do this if the goal
 | 
|
| 11077 | 630  | 
itself contains schematic variables. Other occurrences of the variables in  | 
631  | 
the rule or proof state are updated at the same time.  | 
|
632  | 
||
633  | 
Schematic variables in goals represent unknown terms. Given a goal such  | 
|
634  | 
as $\exists x.\,P$, they let us proceed with a proof. They can be  | 
|
635  | 
filled in later, sometimes in stages and often automatically.  | 
|
636  | 
||
| 15364 | 637  | 
If unification fails when you think it should succeed, try setting the flag \index{flags}\isa{trace_unify_fail}\index{*trace_unify_fail (flag)},
 | 
| 13751 | 638  | 
which makes Isabelle show the cause of unification failures. For example, suppose we are trying to prove this subgoal by assumption:  | 
639  | 
\begin{isabelle}
 | 
|
640  | 
\ 1.\ P\ (a,\ f\ (b,\ g\ (e,\ a),\ b),\ a)\ \isasymLongrightarrow \ P\ (a,\ f\ (b,\ g\ (c,\ a),\ b),\ a)  | 
|
641  | 
\end{isabelle}
 | 
|
642  | 
The \isa{assumption} method having failed, we try again with the flag set:
 | 
|
643  | 
\begin{isabelle}
 | 
|
644  | 
\isacommand{ML}\ "set\ trace\_unify\_fail"\isanewline
 | 
|
645  | 
\isacommand{apply} assumption
 | 
|
646  | 
\end{isabelle}
 | 
|
647  | 
Even in this trivial case, the output is unexpectedly verbose, but it yields the necessary information:  | 
|
648  | 
\begin{isabelle}
 | 
|
649  | 
Clash: e =/= c\isanewline  | 
|
650  | 
Clash: == =/= Trueprop  | 
|
651  | 
\end{isabelle}
 | 
|
652  | 
||
653  | 
Isabelle uses  | 
|
| 11406 | 654  | 
\textbf{higher-order} unification, which works in the
 | 
| 13751 | 655  | 
typed $\lambda$-calculus. The procedure requires search and is potentially  | 
656  | 
undecidable. For our purposes, however, the differences from ordinary  | 
|
657  | 
unification are straightforward. It handles bound variables  | 
|
658  | 
correctly, avoiding capture. The two terms  | 
|
659  | 
\isa{{\isasymlambda}x.\ f(x,z)} and \isa{{\isasymlambda}y.\ f(y,z)} are
 | 
|
660  | 
trivially unifiable because they differ only by a bound variable renaming.  The two terms \isa{{\isasymlambda}x.\ ?P} and
 | 
|
| 11077 | 661  | 
\isa{{\isasymlambda}x.\ t x}  are not unifiable; replacing \isa{?P} by
 | 
662  | 
\isa{t x} is forbidden because the free occurrence of~\isa{x} would become
 | 
|
| 13751 | 663  | 
bound.  Unfortunately, even if \isa{trace_unify_fail} is set, Isabelle displays no information about this type of failure.
 | 
| 11406 | 664  | 
|
| 11077 | 665  | 
\begin{warn}
 | 
666  | 
Higher-order unification sometimes must invent  | 
|
667  | 
$\lambda$-terms to replace function variables,  | 
|
668  | 
which can lead to a combinatorial explosion. However, Isabelle proofs tend  | 
|
669  | 
to involve easy cases where there are few possibilities for the  | 
|
670  | 
$\lambda$-term being constructed. In the easiest case, the  | 
|
671  | 
function variable is applied only to bound variables,  | 
|
672  | 
as when we try to unify \isa{{\isasymlambda}x\ y.\ f(?h x y)} and
 | 
|
673  | 
\isa{{\isasymlambda}x\ y.\ f(x+y+a)}.  The only solution is to replace
 | 
|
674  | 
\isa{?h} by \isa{{\isasymlambda}x\ y.\ x+y+a}.  Such cases admit at most
 | 
|
675  | 
one unifier, like ordinary unification. A harder case is  | 
|
676  | 
unifying \isa{?h a} with~\isa{a+b}; it admits two solutions for \isa{?h},
 | 
|
677  | 
namely \isa{{\isasymlambda}x.~a+b} and \isa{{\isasymlambda}x.~x+b}. 
 | 
|
678  | 
Unifying \isa{?h a} with~\isa{a+a+b} admits four solutions; their number is
 | 
|
679  | 
exponential in the number of occurrences of~\isa{a} in the second term.
 | 
|
680  | 
\end{warn}
 | 
|
681  | 
||
682  | 
||
| 11406 | 683  | 
|
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
684  | 
\subsection{Substitution and the {\tt\slshape subst} Method}
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
685  | 
\label{sec:subst}
 | 
| 11077 | 686  | 
|
687  | 
\index{substitution|(}%
 | 
|
| 11406 | 688  | 
Isabelle also uses function variables to express \textbf{substitution}. 
 | 
| 11077 | 689  | 
A typical substitution rule allows us to replace one term by  | 
690  | 
another if we know that two terms are equal.  | 
|
691  | 
\[ \infer{P[t/x]}{s=t & P[s/x]} \]
 | 
|
692  | 
The rule uses a notation for substitution: $P[t/x]$ is the result of  | 
|
693  | 
replacing $x$ by~$t$ in~$P$. The rule only substitutes in the positions  | 
|
694  | 
designated by~$x$. For example, it can  | 
|
695  | 
derive symmetry of equality from reflexivity. Using $x=s$ for~$P$  | 
|
696  | 
replaces just the first $s$ in $s=s$ by~$t$:  | 
|
697  | 
\[ \infer{t=s}{s=t & \infer{s=s}{}} \]
 | 
|
698  | 
||
699  | 
The Isabelle version of the substitution rule looks like this:  | 
|
700  | 
\begin{isabelle}
 | 
|
701  | 
\isasymlbrakk?t\ =\ ?s;\ ?P\ ?s\isasymrbrakk\ \isasymLongrightarrow\ ?P\  | 
|
702  | 
?t  | 
|
| 11417 | 703  | 
\rulenamedx{ssubst}
 | 
| 11077 | 704  | 
\end{isabelle}
 | 
705  | 
Crucially, \isa{?P} is a function 
 | 
|
| 11406 | 706  | 
variable. It can be replaced by a $\lambda$-term  | 
707  | 
with one bound variable, whose occurrences identify the places  | 
|
| 11077 | 708  | 
in which $s$ will be replaced by~$t$. The proof above requires  | 
| 11406 | 709  | 
the term \isa{{\isasymlambda}x.~x=s}.
 | 
| 11077 | 710  | 
|
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
711  | 
The \isa{simp} method replaces equals by equals, but the substitution
 | 
| 11406 | 712  | 
rule gives us more control.  The \methdx{subst} method is the easiest way to
 | 
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
713  | 
use the substitution rule. Suppose a  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
714  | 
proof has reached this point:  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
715  | 
\begin{isabelle}
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
716  | 
\ 1.\ \isasymlbrakk P\ x\ y\ z;\ Suc\ x\ <\ y\isasymrbrakk \ \isasymLongrightarrow \ f\ z\ =\ x\ *\ y%  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
717  | 
\end{isabelle}
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
718  | 
Now we wish to apply a commutative law:  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
719  | 
\begin{isabelle}
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
720  | 
?m\ *\ ?n\ =\ ?n\ *\ ?m%  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
721  | 
\rulename{mult_commute}
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
722  | 
\end{isabelle}
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
723  | 
Isabelle rejects our first attempt:  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
724  | 
\begin{isabelle}
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
725  | 
apply (simp add: mult_commute)  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
726  | 
\end{isabelle}
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
727  | 
The simplifier notices the danger of looping and refuses to apply the  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
728  | 
rule.%  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
729  | 
\footnote{More precisely, it only applies such a rule if the new term is
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
730  | 
smaller under a specified ordering; here, \isa{x\ *\ y}
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
731  | 
is already smaller than  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
732  | 
\isa{y\ *\ x}.}
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
733  | 
%  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
734  | 
The \isa{subst} method applies \isa{mult_commute} exactly once.  
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
735  | 
\begin{isabelle}
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
736  | 
\isacommand{apply}\ (subst\ mult_commute)\isanewline
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
737  | 
\ 1.\ \isasymlbrakk P\ x\ y\ z;\ Suc\ x\ <\ y\isasymrbrakk \  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
738  | 
\isasymLongrightarrow \ f\ z\ =\ y\ *\ x%  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
739  | 
\end{isabelle}
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
740  | 
As we wanted, \isa{x\ *\ y} has become \isa{y\ *\ x}.
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
741  | 
|
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
742  | 
\medskip  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
743  | 
The \isa{subst} method is convenient, but to see how it works, let us
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
744  | 
examine an explicit use of the rule \isa{ssubst}.
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
745  | 
Consider this proof:  | 
| 11077 | 746  | 
\begin{isabelle}
 | 
747  | 
\isacommand{lemma}\
 | 
|
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
748  | 
"\isasymlbrakk x\ =\ f\ x;\ odd(f\ x)\isasymrbrakk\ \isasymLongrightarrow\  | 
| 11077 | 749  | 
odd\ x"\isanewline  | 
750  | 
\isacommand{by}\ (erule\ ssubst)
 | 
|
751  | 
\end{isabelle}
 | 
|
752  | 
%  | 
|
753  | 
The simplifier might loop, replacing \isa{x} by \isa{f x} and then by
 | 
|
754  | 
\isa{f(f x)} and so forth. (Here \isa{simp} 
 | 
|
755  | 
can see the danger and would re-orient the equality, but in more complicated  | 
|
756  | 
cases it can be fooled.) When we apply substitution, Isabelle replaces every  | 
|
757  | 
\isa{x} in the subgoal by \isa{f x} just once: it cannot loop.  The
 | 
|
758  | 
resulting subgoal is trivial by assumption, so the \isacommand{by} command
 | 
|
759  | 
proves it implicitly.  | 
|
760  | 
||
| 13791 | 761  | 
We are using the \isa{erule} method in a novel way. Hitherto, 
 | 
| 11077 | 762  | 
the conclusion of the rule was just a variable such as~\isa{?R}, but it may
 | 
763  | 
be any term. The conclusion is unified with the subgoal just as  | 
|
764  | 
it would be with the \isa{rule} method. At the same time \isa{erule} looks 
 | 
|
765  | 
for an assumption that matches the rule's first premise, as usual. With  | 
|
766  | 
\isa{ssubst} the effect is to find, use and delete an equality 
 | 
|
767  | 
assumption.  | 
|
768  | 
||
769  | 
||
770  | 
\subsection{Unification and Its Pitfalls}
 | 
|
771  | 
||
772  | 
Higher-order unification can be tricky. Here is an example, which you may  | 
|
773  | 
want to skip on your first reading:  | 
|
774  | 
\begin{isabelle}
 | 
|
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
775  | 
\isacommand{lemma}\ "\isasymlbrakk x\ =\
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
776  | 
f\ x;\ triple\ (f\ x)\ (f\ x)\ x\isasymrbrakk\  | 
| 11077 | 777  | 
\isasymLongrightarrow\ triple\ x\ x\ x"\isanewline  | 
778  | 
\isacommand{apply}\ (erule\ ssubst)\isanewline
 | 
|
779  | 
\isacommand{back}\isanewline
 | 
|
780  | 
\isacommand{back}\isanewline
 | 
|
781  | 
\isacommand{back}\isanewline
 | 
|
782  | 
\isacommand{back}\isanewline
 | 
|
783  | 
\isacommand{apply}\ assumption\isanewline
 | 
|
784  | 
\isacommand{done}
 | 
|
785  | 
\end{isabelle}
 | 
|
786  | 
%  | 
|
787  | 
By default, Isabelle tries to substitute for all the  | 
|
788  | 
occurrences.  Applying \isa{erule\ ssubst} yields this subgoal:
 | 
|
789  | 
\begin{isabelle}
 | 
|
790  | 
\ 1.\ triple\ (f\ x)\ (f\ x)\ x\ \isasymLongrightarrow\ triple\ (f\ x)\ (f\ x)\ (f\ x)  | 
|
791  | 
\end{isabelle}
 | 
|
792  | 
The substitution should have been done in the first two occurrences  | 
|
| 11406 | 793  | 
of~\isa{x} only. Isabelle has gone too far. The \commdx{back}
 | 
794  | 
command allows us to reject this possibility and demand a new one:  | 
|
| 11077 | 795  | 
\begin{isabelle}
 | 
796  | 
\ 1.\ triple\ (f\ x)\ (f\ x)\ x\ \isasymLongrightarrow\ triple\ x\ (f\ x)\ (f\ x)  | 
|
797  | 
\end{isabelle}
 | 
|
798  | 
%  | 
|
799  | 
Now Isabelle has left the first occurrence of~\isa{x} alone. That is 
 | 
|
| 11406 | 800  | 
promising but it is not the desired combination. So we use \isacommand{back} 
 | 
| 11077 | 801  | 
again:  | 
802  | 
\begin{isabelle}
 | 
|
803  | 
\ 1.\ triple\ (f\ x)\ (f\ x)\ x\ \isasymLongrightarrow\ triple\ (f\ x)\ x\ (f\ x)  | 
|
804  | 
\end{isabelle}
 | 
|
805  | 
%  | 
|
| 11406 | 806  | 
This also is wrong, so we use \isacommand{back} again: 
 | 
| 11077 | 807  | 
\begin{isabelle}
 | 
808  | 
\ 1.\ triple\ (f\ x)\ (f\ x)\ x\ \isasymLongrightarrow\ triple\ x\ x\ (f\ x)  | 
|
809  | 
\end{isabelle}
 | 
|
810  | 
%  | 
|
811  | 
And this one is wrong too. Looking carefully at the series  | 
|
812  | 
of alternatives, we see a binary countdown with reversed bits: 111,  | 
|
| 11406 | 813  | 
011, 101, 001.  Invoke \isacommand{back} again: 
 | 
| 11077 | 814  | 
\begin{isabelle}
 | 
815  | 
\ 1.\ triple\ (f\ x)\ (f\ x)\ x\ \isasymLongrightarrow\ triple\ (f\ x)\ (f\ x)\ x%  | 
|
816  | 
\end{isabelle}
 | 
|
817  | 
At last, we have the right combination! This goal follows by assumption.%  | 
|
818  | 
\index{unification|)}
 | 
|
819  | 
||
| 11406 | 820  | 
\medskip  | 
821  | 
This example shows that unification can do strange things with  | 
|
| 11077 | 822  | 
function variables. We were forced to select the right unifier using the  | 
| 11406 | 823  | 
\isacommand{back} command.  That is all right during exploration, but \isacommand{back}
 | 
| 11077 | 824  | 
should never appear in the final version of a proof. You can eliminate the  | 
| 11406 | 825  | 
need for \isacommand{back} by giving Isabelle less freedom when you apply a rule.
 | 
| 11077 | 826  | 
|
827  | 
One way to constrain the inference is by joining two methods in a  | 
|
828  | 
\isacommand{apply} command. Isabelle  applies the first method and then the
 | 
|
829  | 
second. If the second method fails then Isabelle automatically backtracks.  | 
|
830  | 
This process continues until the first method produces an output that the  | 
|
831  | 
second method can use. We get a one-line proof of our example:  | 
|
832  | 
\begin{isabelle}
 | 
|
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
833  | 
\isacommand{lemma}\ "\isasymlbrakk x\ =\ f\ x;\ triple\ (f\ x)\ (f\ x)\ x\isasymrbrakk\
 | 
| 11077 | 834  | 
\isasymLongrightarrow\ triple\ x\ x\ x"\isanewline  | 
835  | 
\isacommand{apply}\ (erule\ ssubst,\ assumption)\isanewline
 | 
|
836  | 
\isacommand{done}
 | 
|
837  | 
\end{isabelle}
 | 
|
838  | 
||
839  | 
\noindent  | 
|
840  | 
The \isacommand{by} command works too, since it backtracks when
 | 
|
841  | 
proving subgoals by assumption:  | 
|
842  | 
\begin{isabelle}
 | 
|
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
843  | 
\isacommand{lemma}\ "\isasymlbrakk x\ =\ f\ x;\ triple\ (f\ x)\ (f\ x)\ x\isasymrbrakk\
 | 
| 11077 | 844  | 
\isasymLongrightarrow\ triple\ x\ x\ x"\isanewline  | 
845  | 
\isacommand{by}\ (erule\ ssubst)
 | 
|
846  | 
\end{isabelle}
 | 
|
847  | 
||
848  | 
||
849  | 
The most general way to constrain unification is  | 
|
850  | 
by instantiating variables in the rule.  The method \isa{rule_tac} is
 | 
|
851  | 
similar to \isa{rule}, but it
 | 
|
852  | 
makes some of the rule's variables denote specified terms.  | 
|
853  | 
Also available are {\isa{drule_tac}}  and \isa{erule_tac}.  Here we need
 | 
|
854  | 
\isa{erule_tac} since above we used \isa{erule}.
 | 
|
855  | 
\begin{isabelle}
 | 
|
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
856  | 
\isacommand{lemma}\ "\isasymlbrakk x\ =\ f\ x;\ triple\ (f\ x)\ (f\ x)\ x\isasymrbrakk\ \isasymLongrightarrow\ triple\ x\ x\ x"\isanewline
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
857  | 
\isacommand{by}\ (erule_tac\ P = "\isasymlambda u.\ triple\ u\ u\ x"\ 
 | 
| 11077 | 858  | 
\isakeyword{in}\ ssubst)
 | 
859  | 
\end{isabelle}
 | 
|
860  | 
%  | 
|
861  | 
To specify a desired substitution  | 
|
862  | 
requires instantiating the variable \isa{?P} with a $\lambda$-expression. 
 | 
|
863  | 
The bound variable occurrences in \isa{{\isasymlambda}u.\ P\ u\
 | 
|
864  | 
u\ x} indicate that the first two arguments have to be substituted, leaving  | 
|
865  | 
the third unchanged. With this instantiation, backtracking is neither necessary  | 
|
866  | 
nor possible.  | 
|
867  | 
||
| 11406 | 868  | 
An alternative to \isa{rule_tac} is to use \isa{rule} with a theorem
 | 
869  | 
modified using~\isa{of}, described in
 | 
|
| 12540 | 870  | 
{\S}\ref{sec:forward} below.   But \isa{rule_tac}, unlike \isa{of}, can 
 | 
871  | 
express instantiations that refer to  | 
|
| 11077 | 872  | 
\isasymAnd-bound variables in the current subgoal.%  | 
873  | 
\index{substitution|)}
 | 
|
| 10295 | 874  | 
|
875  | 
||
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
876  | 
\section{Quantifiers}
 | 
| 10295 | 877  | 
|
| 11411 | 878  | 
\index{quantifiers!universal|(}%
 | 
| 11077 | 879  | 
Quantifiers require formalizing syntactic substitution and the notion of  | 
| 11406 | 880  | 
arbitrary value. Consider the universal quantifier. In a logic  | 
| 11077 | 881  | 
book, its introduction rule looks like this:  | 
| 10295 | 882  | 
\[ \infer{\forall x.\,P}{P} \]
 | 
883  | 
Typically, a proviso written in English says that $x$ must not  | 
|
884  | 
occur in the assumptions. This proviso guarantees that $x$ can be regarded as  | 
|
885  | 
arbitrary, since it has not been assumed to satisfy any special conditions.  | 
|
886  | 
Isabelle's underlying formalism, called the  | 
|
| 11406 | 887  | 
\bfindex{meta-logic}, eliminates the  need for English.  It provides its own
 | 
888  | 
universal quantifier (\isasymAnd) to express the notion of an arbitrary value. We  | 
|
889  | 
have already seen another symbol of the meta-logic, namely  | 
|
| 10295 | 890  | 
\isa\isasymLongrightarrow, which expresses inference rules and the treatment of  | 
891  | 
assumptions. The only other symbol in the meta-logic is \isa\isasymequiv, which  | 
|
892  | 
can be used to define constants.  | 
|
893  | 
||
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
894  | 
\subsection{The Universal Introduction Rule}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
895  | 
|
| 10295 | 896  | 
Returning to the universal quantifier, we find that having a similar quantifier  | 
897  | 
as part of the meta-logic makes the introduction rule trivial to express:  | 
|
898  | 
\begin{isabelle}
 | 
|
| 11417 | 899  | 
(\isasymAnd x.\ ?P\ x)\ \isasymLongrightarrow\ {\isasymforall}x.\ ?P\ x\rulenamedx{allI}
 | 
| 10295 | 900  | 
\end{isabelle}
 | 
901  | 
||
902  | 
||
903  | 
The following trivial proof demonstrates how the universal introduction  | 
|
904  | 
rule works.  | 
|
905  | 
\begin{isabelle}
 | 
|
906  | 
\isacommand{lemma}\ "{\isasymforall}x.\ P\ x\ \isasymlongrightarrow\ P\ x"\isanewline
 | 
|
907  | 
\isacommand{apply}\ (rule\ allI)\isanewline
 | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
908  | 
\isacommand{by}\ (rule\ impI)
 | 
| 10295 | 909  | 
\end{isabelle}
 | 
910  | 
The first step invokes the rule by applying the method \isa{rule allI}. 
 | 
|
911  | 
\begin{isabelle}
 | 
|
| 10596 | 912  | 
\ 1.\ \isasymAnd x.\ P\ x\ \isasymlongrightarrow\ P\ x  | 
| 10295 | 913  | 
\end{isabelle}
 | 
914  | 
Note that the resulting proof state has a bound variable,  | 
|
| 11077 | 915  | 
namely~\isa{x}.  The rule has replaced the universal quantifier of
 | 
| 10295 | 916  | 
higher-order logic by Isabelle's meta-level quantifier. Our goal is to  | 
917  | 
prove  | 
|
918  | 
\isa{P\ x\ \isasymlongrightarrow\ P\ x} for arbitrary~\isa{x}; it is 
 | 
|
919  | 
an implication, so we apply the corresponding introduction rule (\isa{impI}). 
 | 
|
920  | 
\begin{isabelle}
 | 
|
| 10596 | 921  | 
\ 1.\ \isasymAnd x.\ P\ x\ \isasymLongrightarrow\ P\ x  | 
| 10295 | 922  | 
\end{isabelle}
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
923  | 
This last subgoal is implicitly proved by assumption.  | 
| 10295 | 924  | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
925  | 
\subsection{The Universal Elimination Rule}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
926  | 
|
| 10295 | 927  | 
Now consider universal elimination. In a logic text,  | 
928  | 
the rule looks like this:  | 
|
929  | 
\[ \infer{P[t/x]}{\forall x.\,P} \]
 | 
|
930  | 
The conclusion is $P$ with $t$ substituted for the variable~$x$.  | 
|
931  | 
Isabelle expresses substitution using a function variable:  | 
|
932  | 
\begin{isabelle}
 | 
|
| 11417 | 933  | 
{\isasymforall}x.\ ?P\ x\ \isasymLongrightarrow\ ?P\ ?x\rulenamedx{spec}
 | 
| 10295 | 934  | 
\end{isabelle}
 | 
935  | 
This destruction rule takes a  | 
|
936  | 
universally quantified formula and removes the quantifier, replacing  | 
|
| 11077 | 937  | 
the bound variable \isa{x} by the schematic variable \isa{?x}.  Recall that a
 | 
| 10295 | 938  | 
schematic variable starts with a question mark and acts as a  | 
| 11077 | 939  | 
placeholder: it can be replaced by any term.  | 
| 10295 | 940  | 
|
| 11077 | 941  | 
The universal elimination rule is also  | 
942  | 
available in the standard elimination format.  Like \isa{conjE}, it never
 | 
|
943  | 
appears in logic books:  | 
|
944  | 
\begin{isabelle}
 | 
|
945  | 
\isasymlbrakk \isasymforall x.\ ?P\ x;\ ?P\ ?x\ \isasymLongrightarrow \ ?R\isasymrbrakk \ \isasymLongrightarrow \ ?R%  | 
|
| 11417 | 946  | 
\rulenamedx{allE}
 | 
| 11077 | 947  | 
\end{isabelle}
 | 
948  | 
The methods \isa{drule~spec} and \isa{erule~allE} do precisely the
 | 
|
949  | 
same inference.  | 
|
950  | 
||
951  | 
To see how $\forall$-elimination works, let us derive a rule about reducing  | 
|
| 10295 | 952  | 
the scope of a universal quantifier. In mathematical notation we write  | 
953  | 
\[ \infer{P\imp\forall x.\,Q}{\forall x.\,P\imp Q} \]
 | 
|
| 10978 | 954  | 
with the proviso ``$x$ not free in~$P$.'' Isabelle's treatment of  | 
| 10295 | 955  | 
substitution makes the proviso unnecessary. The conclusion is expressed as  | 
956  | 
\isa{P\
 | 
|
957  | 
\isasymlongrightarrow\ ({\isasymforall}x.\ Q\ x)}. No substitution for the
 | 
|
958  | 
variable \isa{P} can introduce a dependence upon~\isa{x}: that would be a
 | 
|
| 11077 | 959  | 
bound variable capture. Let us walk through the proof.  | 
| 10295 | 960  | 
\begin{isabelle}
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
961  | 
\isacommand{lemma}\ "(\isasymforall x.\ P\ \isasymlongrightarrow \ Q\ x)\
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
962  | 
\isasymLongrightarrow \ P\ \isasymlongrightarrow \ (\isasymforall x.\ Q\  | 
| 11077 | 963  | 
x)"  | 
| 10295 | 964  | 
\end{isabelle}
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
965  | 
First we apply implies introduction (\isa{impI}), 
 | 
| 10295 | 966  | 
which moves the \isa{P} from the conclusion to the assumptions. Then 
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
967  | 
we apply universal introduction (\isa{allI}).  
 | 
| 10295 | 968  | 
\begin{isabelle}
 | 
| 11077 | 969  | 
\isacommand{apply}\ (rule\ impI,\ rule\ allI)\isanewline
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
970  | 
\ 1.\ \isasymAnd x.\ \isasymlbrakk{\isasymforall}x.\ P\ \isasymlongrightarrow\ Q\
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
971  | 
x;\ P\isasymrbrakk\ \isasymLongrightarrow\ Q\ x  | 
| 10295 | 972  | 
\end{isabelle}
 | 
973  | 
As before, it replaces the HOL  | 
|
974  | 
quantifier by a meta-level quantifier, producing a subgoal that  | 
|
| 11077 | 975  | 
binds the variable~\isa{x}.  The leading bound variables
 | 
| 10295 | 976  | 
(here \isa{x}) and the assumptions (here \isa{{\isasymforall}x.\ P\
 | 
| 11406 | 977  | 
\isasymlongrightarrow\ Q\ x} and \isa{P}) form the \textbf{context} for the
 | 
| 11077 | 978  | 
conclusion, here \isa{Q\ x}.  Subgoals inherit the context,
 | 
979  | 
although assumptions can be added or deleted (as we saw  | 
|
980  | 
earlier), while rules such as \isa{allI} add bound variables.
 | 
|
| 10295 | 981  | 
|
982  | 
Now, to reason from the universally quantified  | 
|
| 10967 | 983  | 
assumption, we apply the elimination rule using the \isa{drule} 
 | 
| 10295 | 984  | 
method.  This rule is called \isa{spec} because it specializes a universal formula
 | 
985  | 
to a particular term.  | 
|
986  | 
\begin{isabelle}
 | 
|
| 11077 | 987  | 
\isacommand{apply}\ (drule\ spec)\isanewline
 | 
| 10596 | 988  | 
\ 1.\ \isasymAnd x.\ \isasymlbrakk P;\ P\ \isasymlongrightarrow\ Q\ (?x2\  | 
989  | 
x)\isasymrbrakk\ \isasymLongrightarrow\ Q\ x  | 
|
| 10295 | 990  | 
\end{isabelle}
 | 
991  | 
Observe how the context has changed. The quantified formula is gone,  | 
|
| 11406 | 992  | 
replaced by a new assumption derived from its body. We have  | 
993  | 
removed the quantifier and replaced the bound variable  | 
|
994  | 
by the curious term  | 
|
995  | 
\isa{?x2~x}.  This term is a placeholder: it may become any term that can be
 | 
|
996  | 
built from~\isa{x}.  (Formally, \isa{?x2} is an unknown of function type, applied
 | 
|
997  | 
to the argument~\isa{x}.)  This new assumption is an implication, so we can  use
 | 
|
998  | 
\emph{modus ponens} on it, which concludes the proof. 
 | 
|
| 11077 | 999  | 
\begin{isabelle}
 | 
1000  | 
\isacommand{by}\ (drule\ mp)
 | 
|
1001  | 
\end{isabelle}
 | 
|
1002  | 
Let us take a closer look at this last step.  \emph{Modus ponens} yields
 | 
|
1003  | 
two subgoals: one where we prove the antecedent (in this case \isa{P}) and
 | 
|
1004  | 
one where we may assume the consequent. Both of these subgoals are proved  | 
|
1005  | 
by the  | 
|
1006  | 
\isa{assumption} method, which is implicit in the
 | 
|
1007  | 
\isacommand{by} command.  Replacing the \isacommand{by} command by 
 | 
|
1008  | 
\isa{\isacommand{apply} (drule\ mp, assumption)} would have left one last
 | 
|
1009  | 
subgoal:  | 
|
| 10295 | 1010  | 
\begin{isabelle}
 | 
| 10596 | 1011  | 
\ 1.\ \isasymAnd x.\ \isasymlbrakk P;\ Q\ (?x2\ x)\isasymrbrakk\  | 
| 10295 | 1012  | 
\isasymLongrightarrow\ Q\ x  | 
1013  | 
\end{isabelle}
 | 
|
1014  | 
The consequent is \isa{Q} applied to that placeholder.  It may be replaced by any
 | 
|
| 11077 | 1015  | 
term built from~\isa{x}, and here 
 | 
1016  | 
it should simply be~\isa{x}.  The assumption need not
 | 
|
1017  | 
be identical to the conclusion, provided the two formulas are unifiable.%  | 
|
1018  | 
\index{quantifiers!universal|)}  
 | 
|
| 10295 | 1019  | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1020  | 
|
| 11234 | 1021  | 
\subsection{The Existential Quantifier}
 | 
1022  | 
||
1023  | 
\index{quantifiers!existential|(}%
 | 
|
1024  | 
The concepts just presented also apply  | 
|
1025  | 
to the existential quantifier, whose introduction rule looks like this in  | 
|
1026  | 
Isabelle:  | 
|
1027  | 
\begin{isabelle}
 | 
|
| 11417 | 1028  | 
?P\ ?x\ \isasymLongrightarrow\ {\isasymexists}x.\ ?P\ x\rulenamedx{exI}
 | 
| 11234 | 1029  | 
\end{isabelle}
 | 
1030  | 
If we can exhibit some $x$ such that $P(x)$ is true, then $\exists x.  | 
|
1031  | 
P(x)$ is also true. It is a dual of the universal elimination rule, and  | 
|
1032  | 
logic texts present it using the same notation for substitution.  | 
|
1033  | 
||
1034  | 
The existential  | 
|
1035  | 
elimination rule looks like this  | 
|
1036  | 
in a logic text:  | 
|
1037  | 
\[ \infer{Q}{\exists x.\,P & \infer*{Q}{[P]}} \]
 | 
|
1038  | 
%  | 
|
1039  | 
It looks like this in Isabelle:  | 
|
1040  | 
\begin{isabelle}
 | 
|
| 11417 | 1041  | 
\isasymlbrakk{\isasymexists}x.\ ?P\ x;\ \isasymAnd x.\ ?P\ x\ \isasymLongrightarrow\ ?Q\isasymrbrakk\ \isasymLongrightarrow\ ?Q\rulenamedx{exE}
 | 
| 11234 | 1042  | 
\end{isabelle}
 | 
1043  | 
%  | 
|
1044  | 
Given an existentially quantified theorem and some  | 
|
1045  | 
formula $Q$ to prove, it creates a new assumption by removing the quantifier. As with  | 
|
1046  | 
the universal introduction rule, the textbook version imposes a proviso on the  | 
|
| 11406 | 1047  | 
quantified variable, which Isabelle expresses using its meta-logic. It is  | 
| 11234 | 1048  | 
enough to have a universal quantifier in the meta-logic; we do not need an existential  | 
1049  | 
quantifier to be built in as well.  | 
|
1050  | 
||
1051  | 
||
1052  | 
\begin{exercise}
 | 
|
1053  | 
Prove the lemma  | 
|
1054  | 
\[ \exists x.\, P\conj Q(x)\Imp P\conj(\exists x.\, Q(x)). \]  | 
|
1055  | 
\emph{Hint}: the proof is similar 
 | 
|
1056  | 
to the one just above for the universal quantifier.  | 
|
1057  | 
\end{exercise}
 | 
|
| 11411 | 1058  | 
\index{quantifiers!existential|)}
 | 
| 11234 | 1059  | 
|
1060  | 
||
| 10967 | 1061  | 
\subsection{Renaming an Assumption: {\tt\slshape rename_tac}}
 | 
1062  | 
||
| 11406 | 1063  | 
\index{assumptions!renaming|(}\index{*rename_tac (method)|(}%
 | 
| 11077 | 1064  | 
When you apply a rule such as \isa{allI}, the quantified variable
 | 
1065  | 
becomes a new bound variable of the new subgoal. Isabelle tries to avoid  | 
|
1066  | 
changing its name, but sometimes it has to choose a new name in order to  | 
|
| 11234 | 1067  | 
avoid a clash. The result may not be ideal:  | 
| 10967 | 1068  | 
\begin{isabelle}
 | 
1069  | 
\isacommand{lemma}\ "x\ <\ y\ \isasymLongrightarrow \ \isasymforall x\ y.\ P\ x\
 | 
|
1070  | 
(f\ y)"\isanewline  | 
|
| 12408 | 1071  | 
\isacommand{apply}\ (intro allI)\isanewline
 | 
| 10967 | 1072  | 
\ 1.\ \isasymAnd xa\ ya.\ x\ <\ y\ \isasymLongrightarrow \ P\ xa\ (f\ ya)  | 
1073  | 
\end{isabelle}
 | 
|
1074  | 
%  | 
|
1075  | 
The names \isa{x} and \isa{y} were already in use, so the new bound variables are
 | 
|
1076  | 
called \isa{xa} and~\isa{ya}.  You can rename them by invoking \isa{rename_tac}:
 | 
|
1077  | 
||
1078  | 
\begin{isabelle}
 | 
|
1079  | 
\isacommand{apply}\ (rename_tac\ v\ w)\isanewline
 | 
|
1080  | 
\ 1.\ \isasymAnd v\ w.\ x\ <\ y\ \isasymLongrightarrow \ P\ v\ (f\ w)  | 
|
1081  | 
\end{isabelle}
 | 
|
| 11406 | 1082  | 
Recall that \isa{rule_tac}\index{*rule_tac (method)!and renaming} 
 | 
1083  | 
instantiates a  | 
|
| 10967 | 1084  | 
theorem with specified terms. These terms may involve the goal's bound  | 
1085  | 
variables, but beware of referring to variables  | 
|
1086  | 
like~\isa{xa}.  A future change to your theories could change the set of names
 | 
|
1087  | 
produced at top level, so that \isa{xa} changes to~\isa{xb} or reverts to~\isa{x}.
 | 
|
1088  | 
It is safer to rename automatically-generated variables before mentioning them.  | 
|
1089  | 
||
1090  | 
If the subgoal has more bound variables than there are names given to  | 
|
| 11077 | 1091  | 
\isa{rename_tac}, the rightmost ones are renamed.%
 | 
| 11406 | 1092  | 
\index{assumptions!renaming|)}\index{*rename_tac (method)|)}
 | 
| 10967 | 1093  | 
|
1094  | 
||
1095  | 
\subsection{Reusing an Assumption: {\tt\slshape frule}}
 | 
|
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
1096  | 
\label{sec:frule}
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1097  | 
|
| 11406 | 1098  | 
\index{assumptions!reusing|(}\index{*frule (method)|(}%
 | 
| 10295 | 1099  | 
Note that \isa{drule spec} removes the universal quantifier and --- as
 | 
1100  | 
usual with elimination rules --- discards the original formula. Sometimes, a  | 
|
1101  | 
universal formula has to be kept so that it can be used again. Then we use a new  | 
|
1102  | 
method: \isa{frule}.  It acts like \isa{drule} but copies rather than replaces
 | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1103  | 
the selected assumption.  The \isa{f} is for \emph{forward}.
 | 
| 10295 | 1104  | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1105  | 
In this example, going from \isa{P\ a} to \isa{P(h(h~a))}
 | 
| 11406 | 1106  | 
requires two uses of the quantified assumption, one for each~\isa{h}
 | 
1107  | 
in~\isa{h(h~a)}.
 | 
|
| 10295 | 1108  | 
\begin{isabelle}
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1109  | 
\isacommand{lemma}\ "\isasymlbrakk{\isasymforall}x.\ P\ x\ \isasymlongrightarrow\ P\ (h\ x);
 | 
| 11077 | 1110  | 
\ P\ a\isasymrbrakk\ \isasymLongrightarrow\ P(h\ (h\ a))"  | 
| 10295 | 1111  | 
\end{isabelle}
 | 
1112  | 
%  | 
|
| 11077 | 1113  | 
Examine the subgoal left by \isa{frule}:
 | 
| 10295 | 1114  | 
\begin{isabelle}
 | 
| 11077 | 1115  | 
\isacommand{apply}\ (frule\ spec)\isanewline
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1116  | 
\ 1.\ \isasymlbrakk{\isasymforall}x.\ P\ x\ \isasymlongrightarrow\ P\ (h\ x);\ P\ a;\ P\ ?x\ \isasymlongrightarrow\ P\ (h\ ?x)\isasymrbrakk\ \isasymLongrightarrow\ P\ (h\ (h\ a))
 | 
| 10295 | 1117  | 
\end{isabelle}
 | 
| 11077 | 1118  | 
It is what \isa{drule} would have left except that the quantified
 | 
1119  | 
assumption is still present.  Next we apply \isa{mp} to the
 | 
|
1120  | 
implication and the assumption~\isa{P\ a}:
 | 
|
| 10295 | 1121  | 
\begin{isabelle}
 | 
| 11077 | 1122  | 
\isacommand{apply}\ (drule\ mp,\ assumption)\isanewline
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1123  | 
\ 1.\ \isasymlbrakk{\isasymforall}x.\ P\ x\ \isasymlongrightarrow\ P\ (h\ x);\ P\ a;\ P\ (h\ a)\isasymrbrakk\ \isasymLongrightarrow\ P\ (h\ (h\ a))
 | 
| 10295 | 1124  | 
\end{isabelle}
 | 
1125  | 
%  | 
|
| 11077 | 1126  | 
We have created the assumption \isa{P(h\ a)}, which is progress.  To
 | 
1127  | 
continue the proof, we apply \isa{spec} again.  We shall not need it
 | 
|
1128  | 
again, so we can use  | 
|
1129  | 
\isa{drule}.
 | 
|
1130  | 
\begin{isabelle}
 | 
|
1131  | 
\isacommand{apply}\ (drule\ spec)\isanewline
 | 
|
1132  | 
\ 1.\ \isasymlbrakk P\ a;\ P\ (h\ a);\ P\ ?x2\  | 
|
1133  | 
\isasymlongrightarrow \ P\ (h\ ?x2)\isasymrbrakk \ \isasymLongrightarrow \  | 
|
1134  | 
P\ (h\ (h\ a))  | 
|
1135  | 
\end{isabelle}
 | 
|
1136  | 
%  | 
|
1137  | 
The new assumption bridges the gap between \isa{P(h\ a)} and \isa{P(h(h\ a))}.
 | 
|
1138  | 
\begin{isabelle}
 | 
|
1139  | 
\isacommand{by}\ (drule\ mp)
 | 
|
1140  | 
\end{isabelle}
 | 
|
| 10854 | 1141  | 
|
1142  | 
\medskip  | 
|
| 11077 | 1143  | 
\emph{A final remark}.  Replacing this \isacommand{by} command with
 | 
| 10295 | 1144  | 
\begin{isabelle}
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1145  | 
\isacommand{apply}\ (drule\ mp,\ assumption)
 | 
| 10295 | 1146  | 
\end{isabelle}
 | 
| 11077 | 1147  | 
would not work: it would add a second copy of \isa{P(h~a)} instead
 | 
| 10854 | 1148  | 
of the desired assumption, \isa{P(h(h~a))}.  The \isacommand{by}
 | 
1149  | 
command forces Isabelle to backtrack until it finds the correct one.  | 
|
1150  | 
Alternatively, we could have used the \isacommand{apply} command and bundled the
 | 
|
| 11234 | 1151  | 
\isa{drule mp} with \emph{two} calls of \isa{assumption}.  Or, of course,
 | 
1152  | 
we could have given the entire proof to \isa{auto}.%
 | 
|
| 11406 | 1153  | 
\index{assumptions!reusing|)}\index{*frule (method)|)}
 | 
| 10295 | 1154  | 
|
1155  | 
||
| 11234 | 1156  | 
|
1157  | 
\subsection{Instantiating a Quantifier Explicitly}
 | 
|
1158  | 
\index{quantifiers!instantiating}
 | 
|
| 10295 | 1159  | 
|
| 11234 | 1160  | 
We can prove a theorem of the form $\exists x.\,P\, x$ by exhibiting a  | 
1161  | 
suitable term~$t$ such that $P\,t$ is true. Dually, we can use an  | 
|
| 11406 | 1162  | 
assumption of the form $\forall x.\,P\, x$ to generate a new assumption $P\,t$ for  | 
1163  | 
a suitable term~$t$. In many cases,  | 
|
| 11234 | 1164  | 
Isabelle makes the correct choice automatically, constructing the term by  | 
1165  | 
unification. In other cases, the required term is not obvious and we must  | 
|
1166  | 
specify it ourselves.  Suitable methods are \isa{rule_tac}, \isa{drule_tac}
 | 
|
1167  | 
and \isa{erule_tac}.
 | 
|
1168  | 
||
| 11428 | 1169  | 
We have seen (just above, {\S}\ref{sec:frule}) a proof of this lemma:
 | 
| 10295 | 1170  | 
\begin{isabelle}
 | 
| 11234 | 1171  | 
\isacommand{lemma}\ "\isasymlbrakk \isasymforall x.\ P\ x\
 | 
1172  | 
\isasymlongrightarrow \ P\ (h\ x);\ P\ a\isasymrbrakk \  | 
|
1173  | 
\isasymLongrightarrow \ P(h\ (h\ a))"  | 
|
| 10295 | 1174  | 
\end{isabelle}
 | 
| 11234 | 1175  | 
We had reached this subgoal:  | 
| 10295 | 1176  | 
\begin{isabelle}
 | 
| 11234 | 1177  | 
\ 1.\ \isasymlbrakk{\isasymforall}x.\ P\ x\ \isasymlongrightarrow\ P\ (h\
 | 
1178  | 
x);\ P\ a;\ P\ (h\ a)\isasymrbrakk\ \isasymLongrightarrow\ P\ (h\ (h\ a))  | 
|
| 10295 | 1179  | 
\end{isabelle}
 | 
1180  | 
%  | 
|
| 11234 | 1181  | 
The proof requires instantiating the quantified assumption with the  | 
1182  | 
term~\isa{h~a}.
 | 
|
1183  | 
\begin{isabelle}
 | 
|
1184  | 
\isacommand{apply}\ (drule_tac\ x\ =\ "h\ a"\ \isakeyword{in}\
 | 
|
1185  | 
spec)\isanewline  | 
|
1186  | 
\ 1.\ \isasymlbrakk P\ a;\ P\ (h\ a);\ P\ (h\ a)\ \isasymlongrightarrow \  | 
|
1187  | 
P\ (h\ (h\ a))\isasymrbrakk \ \isasymLongrightarrow \ P\ (h\ (h\ a))  | 
|
1188  | 
\end{isabelle}
 | 
|
1189  | 
We have forced the desired instantiation.  | 
|
1190  | 
||
1191  | 
\medskip  | 
|
1192  | 
Existential formulas can be instantiated too. The next example uses the  | 
|
| 11417 | 1193  | 
\textbf{divides} relation\index{divides relation}
 | 
| 11406 | 1194  | 
of number theory:  | 
| 11234 | 1195  | 
\begin{isabelle}
 | 
1196  | 
?m\ dvd\ ?n\ \isasymequiv\ {\isasymexists}k.\ ?n\ =\ ?m\ *\ k
 | 
|
1197  | 
\rulename{dvd_def}
 | 
|
1198  | 
\end{isabelle}
 | 
|
| 10295 | 1199  | 
|
| 11234 | 1200  | 
Let us prove that multiplication of natural numbers is monotone with  | 
1201  | 
respect to the divides relation:  | 
|
1202  | 
\begin{isabelle}
 | 
|
1203  | 
\isacommand{lemma}\ mult_dvd_mono:\ "{\isasymlbrakk}i\ dvd\ m;\ j\ dvd\
 | 
|
1204  | 
n\isasymrbrakk\ \isasymLongrightarrow\ i*j\ dvd\ (m*n\ ::\ nat)"\isanewline  | 
|
1205  | 
\isacommand{apply}\ (simp\ add:\ dvd_def)
 | 
|
1206  | 
\end{isabelle}
 | 
|
1207  | 
%  | 
|
| 11406 | 1208  | 
Unfolding the definition of divides has left this subgoal:  | 
| 11234 | 1209  | 
\begin{isabelle}
 | 
1210  | 
\ 1.\ \isasymlbrakk \isasymexists k.\ m\ =\ i\ *\ k;\ \isasymexists k.\ n\  | 
|
1211  | 
=\ j\ *\ k\isasymrbrakk \ \isasymLongrightarrow \ \isasymexists k.\ m\ *\  | 
|
| 11406 | 1212  | 
n\ =\ i\ *\ j\ *\ k  | 
1213  | 
\end{isabelle}
 | 
|
1214  | 
%  | 
|
1215  | 
Next, we eliminate the two existential quantifiers in the assumptions:  | 
|
1216  | 
\begin{isabelle}
 | 
|
| 11234 | 1217  | 
\isacommand{apply}\ (erule\ exE)\isanewline
 | 
1218  | 
\ 1.\ \isasymAnd k.\ \isasymlbrakk \isasymexists k.\ n\ =\ j\ *\ k;\ m\ =\  | 
|
1219  | 
i\ *\ k\isasymrbrakk \ \isasymLongrightarrow \ \isasymexists k.\ m\ *\ n\  | 
|
1220  | 
=\ i\ *\ j\ *\ k%  | 
|
1221  | 
\isanewline  | 
|
1222  | 
\isacommand{apply}\ (erule\ exE)
 | 
|
| 11406 | 1223  | 
\isanewline  | 
| 11234 | 1224  | 
\ 1.\ \isasymAnd k\ ka.\ \isasymlbrakk m\ =\ i\ *\ k;\ n\ =\ j\ *\  | 
1225  | 
ka\isasymrbrakk \ \isasymLongrightarrow \ \isasymexists k.\ m\ *\ n\ =\ i\  | 
|
1226  | 
*\ j\ *\ k  | 
|
1227  | 
\end{isabelle}
 | 
|
1228  | 
%  | 
|
| 11406 | 1229  | 
The term needed to instantiate the remaining quantifier is~\isa{k*ka}.  But
 | 
1230  | 
\isa{ka} is an automatically-generated name.  As noted above, references to
 | 
|
1231  | 
such variable names makes a proof less resilient to future changes. So,  | 
|
1232  | 
first we rename the most recent variable to~\isa{l}:
 | 
|
| 11234 | 1233  | 
\begin{isabelle}
 | 
| 11406 | 1234  | 
\isacommand{apply}\ (rename_tac\ l)\isanewline
 | 
1235  | 
\ 1.\ \isasymAnd k\ l.\ \isasymlbrakk m\ =\ i\ *\ k;\ n\ =\ j\ *\ l\isasymrbrakk \  | 
|
1236  | 
\isasymLongrightarrow \ \isasymexists k.\ m\ *\ n\ =\ i\ *\ j\ *\ k%  | 
|
1237  | 
\end{isabelle}
 | 
|
1238  | 
||
1239  | 
We instantiate the quantifier with~\isa{k*l}:
 | 
|
1240  | 
\begin{isabelle}
 | 
|
1241  | 
\isacommand{apply}\ (rule_tac\ x="k*l"\ \isakeyword{in}\ exI)\ \isanewline
 | 
|
| 11234 | 1242  | 
\ 1.\ \isasymAnd k\ ka.\ \isasymlbrakk m\ =\ i\ *\ k;\ n\ =\ j\ *\  | 
1243  | 
ka\isasymrbrakk \ \isasymLongrightarrow \ m\ *\ n\ =\ i\  | 
|
1244  | 
*\ j\ *\ (k\ *\ ka)  | 
|
1245  | 
\end{isabelle}
 | 
|
1246  | 
%  | 
|
1247  | 
The rest is automatic, by arithmetic.  | 
|
1248  | 
\begin{isabelle}
 | 
|
1249  | 
\isacommand{apply}\ simp\isanewline
 | 
|
1250  | 
\isacommand{done}\isanewline
 | 
|
1251  | 
\end{isabelle}
 | 
|
1252  | 
||
1253  | 
||
| 10295 | 1254  | 
|
| 11458 | 1255  | 
\section{Description Operators}
 | 
| 10971 | 1256  | 
\label{sec:SOME}
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1257  | 
|
| 11458 | 1258  | 
\index{description operators|(}%
 | 
1259  | 
HOL provides two description operators.  | 
|
1260  | 
A \textbf{definite description} formalizes the word ``the,'' as in
 | 
|
1261  | 
``the greatest divisior of~$n$.''  | 
|
1262  | 
It returns an arbitrary value unless the formula has a unique solution.  | 
|
1263  | 
An \textbf{indefinite description} formalizes the word ``some,'' as in
 | 
|
| 12815 | 1264  | 
``some member of~$S$.'' It differs from a definite description in not  | 
| 11458 | 1265  | 
requiring the solution to be unique: it uses the axiom of choice to pick any  | 
1266  | 
solution.  | 
|
| 11077 | 1267  | 
|
1268  | 
\begin{warn}
 | 
|
| 11458 | 1269  | 
Description operators can be hard to reason about. Novices  | 
1270  | 
should try to avoid them. Fortunately, descriptions are seldom required.  | 
|
| 11077 | 1271  | 
\end{warn}
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1272  | 
|
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1273  | 
\subsection{Definite Descriptions}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1274  | 
|
| 11077 | 1275  | 
\index{descriptions!definite}%
 | 
| 11458 | 1276  | 
A definite description is traditionally written $\iota x. P(x)$. It denotes  | 
1277  | 
the $x$ such that $P(x)$ is true, provided there exists a unique such~$x$;  | 
|
1278  | 
otherwise, it returns an arbitrary value of the expected type.  | 
|
| 12540 | 1279  | 
Isabelle uses \sdx{THE} for the Greek letter~$\iota$.  
 | 
1280  | 
||
1281  | 
%(The traditional notation could be provided, but it is not legible on screen.)  | 
|
| 11458 | 1282  | 
|
1283  | 
We reason using this rule, where \isa{a} is the unique solution:
 | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1284  | 
\begin{isabelle}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1285  | 
\isasymlbrakk P\ a;\ \isasymAnd x.\ P\ x\ \isasymLongrightarrow \ x\ =\ a\isasymrbrakk \  | 
| 11458 | 1286  | 
\isasymLongrightarrow \ (THE\ x.\ P\ x)\ =\ a%  | 
1287  | 
\rulenamedx{the_equality}
 | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1288  | 
\end{isabelle}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1289  | 
For instance, we can define the  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1290  | 
cardinality of a finite set~$A$ to be that  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1291  | 
$n$ such that $A$ is in one-to-one correspondence with $\{1,\ldots,n\}$.  We can then
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1292  | 
prove that the cardinality of the empty set is zero (since $n=0$ satisfies the  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1293  | 
description) and proceed to prove other facts.  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1294  | 
|
| 11406 | 1295  | 
A more challenging example illustrates how Isabelle/HOL defines the least number  | 
1296  | 
operator, which denotes the least \isa{x} satisfying~\isa{P}:%
 | 
|
| 11428 | 1297  | 
\index{least number operator|see{\protect\isa{LEAST}}}
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1298  | 
\begin{isabelle}
 | 
| 11458 | 1299  | 
(LEAST\ x.\ P\ x)\ = (THE\ x.\ P\ x\ \isasymand \ (\isasymforall y.\  | 
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
1300  | 
P\ y\ \isasymlongrightarrow \ x\ \isasymle \ y))  | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1301  | 
\end{isabelle}
 | 
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
1302  | 
%  | 
| 11458 | 1303  | 
Let us prove the analogue of \isa{the_equality} for \sdx{LEAST}\@.
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1304  | 
\begin{isabelle}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1305  | 
\isacommand{theorem}\ Least_equality:\isanewline
 | 
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
1306  | 
\ \ \ \ \ "\isasymlbrakk P\ (k::nat);\ \ \isasymforall x.\ P\ x\ \isasymlongrightarrow \ k\ \isasymle \ x\isasymrbrakk \ \isasymLongrightarrow \ (LEAST\ x.\ P\ x)\ =\ k"\isanewline  | 
| 11458 | 1307  | 
\isacommand{apply}\ (simp\ add:\ Least_def)\isanewline
 | 
1308  | 
\isanewline  | 
|
1309  | 
\ 1.\ \isasymlbrakk P\ k;\ \isasymforall x.\ P\ x\ \isasymlongrightarrow \ k\ \isasymle \ x\isasymrbrakk \isanewline  | 
|
1310  | 
\isaindent{\ 1.\ }\isasymLongrightarrow \ (THE\ x.\ P\ x\ \isasymand \ (\isasymforall y.\ P\ y\ \isasymlongrightarrow \ x\ \isasymle \ y))\ =\ k%
 | 
|
1311  | 
\end{isabelle}
 | 
|
1312  | 
The first step has merely unfolded the definition.  | 
|
1313  | 
\begin{isabelle}
 | 
|
1314  | 
\isacommand{apply}\ (rule\ the_equality)\isanewline
 | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1315  | 
\isanewline  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1316  | 
\ 1.\ \isasymlbrakk P\ k;\ \isasymforall x.\ P\ x\ \isasymlongrightarrow \ k\  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1317  | 
\isasymle \ x\isasymrbrakk \ \isasymLongrightarrow \ P\ k\ \isasymand \  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1318  | 
(\isasymforall y.\ P\ y\ \isasymlongrightarrow \ k\ \isasymle \ y)\isanewline  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1319  | 
\ 2.\ \isasymAnd x.\ \isasymlbrakk P\ k;\ \isasymforall x.\ P\ x\ \isasymlongrightarrow \ k\ \isasymle \ x;\ P\ x\ \isasymand \ (\isasymforall y.\ P\ y\ \isasymlongrightarrow \ x\ \isasymle \ y)\isasymrbrakk \isanewline  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1320  | 
\ \ \ \ \ \ \ \ \isasymLongrightarrow \ x\ =\ k%  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1321  | 
\end{isabelle}
 | 
| 11458 | 1322  | 
As always with \isa{the_equality}, we must show existence and
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1323  | 
uniqueness of the claimed solution,~\isa{k}.  Existence, the first
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1324  | 
subgoal, is trivial. Uniqueness, the second subgoal, follows by antisymmetry:  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1325  | 
\begin{isabelle}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1326  | 
\isasymlbrakk x\ \isasymle \ y;\ y\ \isasymle \ x\isasymrbrakk \ \isasymLongrightarrow \ x\ =\ y%  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1327  | 
\rulename{order_antisym}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1328  | 
\end{isabelle}
 | 
| 11458 | 1329  | 
The assumptions imply both \isa{k~\isasymle~x} and \isa{x~\isasymle~k}.  One
 | 
1330  | 
call to \isa{auto} does it all: 
 | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1331  | 
\begin{isabelle}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1332  | 
\isacommand{by}\ (auto\ intro:\ order_antisym)
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1333  | 
\end{isabelle}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1334  | 
|
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1335  | 
|
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1336  | 
\subsection{Indefinite Descriptions}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1337  | 
|
| 11458 | 1338  | 
\index{Hilbert's $\varepsilon$-operator}%
 | 
| 11077 | 1339  | 
\index{descriptions!indefinite}%
 | 
| 11458 | 1340  | 
An indefinite description is traditionally written $\varepsilon x. P(x)$ and is  | 
1341  | 
known as Hilbert's $\varepsilon$-operator. It denotes  | 
|
1342  | 
some $x$ such that $P(x)$ is true, provided one exists.  | 
|
1343  | 
Isabelle uses \sdx{SOME} for the Greek letter~$\varepsilon$.
 | 
|
1344  | 
||
1345  | 
Here is the definition of~\cdx{inv}, which expresses inverses of
 | 
|
| 11417 | 1346  | 
functions:  | 
| 11077 | 1347  | 
\begin{isabelle}
 | 
1348  | 
inv\ f\ \isasymequiv \ \isasymlambda y.\ SOME\ x.\ f\ x\ =\ y%  | 
|
1349  | 
\rulename{inv_def}
 | 
|
1350  | 
\end{isabelle}
 | 
|
| 11458 | 1351  | 
Using \isa{SOME} rather than \isa{THE} makes \isa{inv~f} behave well
 | 
1352  | 
even if \isa{f} is not injective.  As it happens, most useful theorems about
 | 
|
1353  | 
\isa{inv} do assume the function to be injective.
 | 
|
1354  | 
||
| 11406 | 1355  | 
The inverse of \isa{f}, when applied to \isa{y}, returns some~\isa{x} such that
 | 
| 11077 | 1356  | 
\isa{f~x~=~y}.  For example, we can prove \isa{inv~Suc} really is the inverse
 | 
1357  | 
of the \isa{Suc} function 
 | 
|
1358  | 
\begin{isabelle}
 | 
|
1359  | 
\isacommand{lemma}\ "inv\ Suc\ (Suc\ n)\ =\ n"\isanewline
 | 
|
1360  | 
\isacommand{by}\ (simp\ add:\ inv_def)
 | 
|
1361  | 
\end{isabelle}
 | 
|
1362  | 
||
1363  | 
\noindent  | 
|
1364  | 
The proof is a one-liner: the subgoal simplifies to a degenerate application of  | 
|
1365  | 
\isa{SOME}, which is then erased.  In detail, the left-hand side simplifies
 | 
|
1366  | 
to \isa{SOME\ x.\ Suc\ x\ =\ Suc\ n}, then to \isa{SOME\ x.\ x\ =\ n} and
 | 
|
1367  | 
finally to~\isa{n}.  
 | 
|
1368  | 
||
1369  | 
We know nothing about what  | 
|
1370  | 
\isa{inv~Suc} returns when applied to zero.  The proof above still treats
 | 
|
1371  | 
\isa{SOME} as a definite description, since it only reasons about
 | 
|
| 11458 | 1372  | 
situations in which the value is described uniquely.  Indeed, \isa{SOME}
 | 
1373  | 
satisfies this rule:  | 
|
1374  | 
\begin{isabelle}
 | 
|
1375  | 
\isasymlbrakk P\ a;\ \isasymAnd x.\ P\ x\ \isasymLongrightarrow \ x\ =\ a\isasymrbrakk \  | 
|
1376  | 
\isasymLongrightarrow \ (SOME\ x.\ P\ x)\ =\ a%  | 
|
1377  | 
\rulenamedx{some_equality}
 | 
|
1378  | 
\end{isabelle}
 | 
|
1379  | 
To go further is  | 
|
| 11077 | 1380  | 
tricky and requires rules such as these:  | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1381  | 
\begin{isabelle}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1382  | 
P\ x\ \isasymLongrightarrow \ P\ (SOME\ x.\ P\ x)  | 
| 11417 | 1383  | 
\rulenamedx{someI}\isanewline
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1384  | 
\isasymlbrakk P\ a;\ \isasymAnd x.\ P\ x\ \isasymLongrightarrow \ Q\  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1385  | 
x\isasymrbrakk \ \isasymLongrightarrow \ Q\ (SOME\ x.\ P\ x)  | 
| 11417 | 1386  | 
\rulenamedx{someI2}
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1387  | 
\end{isabelle}
 | 
| 11406 | 1388  | 
Rule \isa{someI} is basic: if anything satisfies \isa{P} then so does
 | 
1389  | 
\hbox{\isa{SOME\ x.\ P\ x}}.  The repetition of~\isa{P} in the conclusion makes it
 | 
|
1390  | 
difficult to apply in a backward proof, so the derived rule \isa{someI2} is
 | 
|
1391  | 
also provided.  | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1392  | 
|
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1393  | 
\medskip  | 
| 11406 | 1394  | 
For example, let us prove the \rmindex{axiom of choice}:
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1395  | 
\begin{isabelle}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1396  | 
\isacommand{theorem}\ axiom_of_choice:
 | 
| 11077 | 1397  | 
\ "(\isasymforall x.\ \isasymexists y.\ P\ x\ y)\ \isasymLongrightarrow \  | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1398  | 
\isasymexists f.\ \isasymforall x.\ P\ x\ (f\ x)"\isanewline  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1399  | 
\isacommand{apply}\ (rule\ exI,\ rule\ allI)\isanewline
 | 
| 10971 | 1400  | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1401  | 
\ 1.\ \isasymAnd x.\ \isasymforall x.\ \isasymexists y.\ P\ x\ y\  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1402  | 
\isasymLongrightarrow \ P\ x\ (?f\ x)  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1403  | 
\end{isabelle}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1404  | 
%  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1405  | 
We have applied the introduction rules; now it is time to apply the elimination  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1406  | 
rules.  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1407  | 
|
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1408  | 
\begin{isabelle}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1409  | 
\isacommand{apply}\ (drule\ spec,\ erule\ exE)\isanewline
 | 
| 10971 | 1410  | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1411  | 
\ 1.\ \isasymAnd x\ y.\ P\ (?x2\ x)\ y\ \isasymLongrightarrow \ P\ x\ (?f\ x)  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1412  | 
\end{isabelle}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1413  | 
|
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1414  | 
\noindent  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1415  | 
The rule \isa{someI} automatically instantiates
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1416  | 
\isa{f} to \hbox{\isa{\isasymlambda x.\ SOME y.\ P\ x\ y}}, which is the choice
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1417  | 
function.  It also instantiates \isa{?x2\ x} to \isa{x}.
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1418  | 
\begin{isabelle}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1419  | 
\isacommand{by}\ (rule\ someI)\isanewline
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1420  | 
\end{isabelle}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1421  | 
|
| 11077 | 1422  | 
\subsubsection{Historical Note}
 | 
1423  | 
The original purpose of Hilbert's $\varepsilon$-operator was to express an  | 
|
1424  | 
existential destruction rule:  | 
|
1425  | 
\[ \infer{P[(\varepsilon x. P) / \, x]}{\exists x.\,P} \]
 | 
|
1426  | 
This rule is seldom used for that purpose --- it can cause exponential  | 
|
1427  | 
blow-up --- but it is occasionally used as an introduction rule  | 
|
| 13791 | 1428  | 
for the~$\varepsilon$-operator.  Its name in HOL is \tdxbold{someI_ex}.%%
 | 
| 11458 | 1429  | 
\index{description operators|)}
 | 
| 11077 | 1430  | 
|
1431  | 
||
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1432  | 
\section{Some Proofs That Fail}
 | 
| 10295 | 1433  | 
|
| 11077 | 1434  | 
\index{proofs!examples of failing|(}%
 | 
| 10295 | 1435  | 
Most of the examples in this tutorial involve proving theorems. But not every  | 
1436  | 
conjecture is true, and it can be instructive to see how  | 
|
1437  | 
proofs fail. Here we attempt to prove a distributive law involving  | 
|
1438  | 
the existential quantifier and conjunction.  | 
|
1439  | 
\begin{isabelle}
 | 
|
| 11077 | 1440  | 
\isacommand{lemma}\ "({\isasymexists}x.\ P\ x)\ \isasymand\ 
 | 
1441  | 
({\isasymexists}x.\ Q\ x)\ \isasymLongrightarrow\ {\isasymexists}x.\ P\ x\
 | 
|
1442  | 
\isasymand\ Q\ x"  | 
|
1443  | 
\end{isabelle}
 | 
|
1444  | 
The first steps are routine. We apply conjunction elimination to break  | 
|
1445  | 
the assumption into two existentially quantified assumptions.  | 
|
1446  | 
Applying existential elimination removes one of the quantifiers.  | 
|
1447  | 
\begin{isabelle}
 | 
|
| 10295 | 1448  | 
\isacommand{apply}\ (erule\ conjE)\isanewline
 | 
1449  | 
\isacommand{apply}\ (erule\ exE)\isanewline
 | 
|
| 10596 | 1450  | 
\ 1.\ \isasymAnd x.\ \isasymlbrakk{\isasymexists}x.\ Q\ x;\ P\ x\isasymrbrakk\ \isasymLongrightarrow\ {\isasymexists}x.\ P\ x\ \isasymand\ Q\ x
 | 
| 10295 | 1451  | 
\end{isabelle}
 | 
1452  | 
%  | 
|
1453  | 
When we remove the other quantifier, we get a different bound  | 
|
1454  | 
variable in the subgoal.  (The name \isa{xa} is generated automatically.)
 | 
|
1455  | 
\begin{isabelle}
 | 
|
| 11077 | 1456  | 
\isacommand{apply}\ (erule\ exE)\isanewline
 | 
| 10596 | 1457  | 
\ 1.\ \isasymAnd x\ xa.\ \isasymlbrakk P\ x;\ Q\ xa\isasymrbrakk\  | 
| 10295 | 1458  | 
\isasymLongrightarrow\ {\isasymexists}x.\ P\ x\ \isasymand\ Q\ x
 | 
1459  | 
\end{isabelle}
 | 
|
1460  | 
The proviso of the existential elimination rule has forced the variables to  | 
|
1461  | 
differ: we can hardly expect two arbitrary values to be equal! There is  | 
|
1462  | 
no way to prove this subgoal. Removing the  | 
|
1463  | 
conclusion's existential quantifier yields two  | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1464  | 
identical placeholders, which can become  any term involving the variables \isa{x}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1465  | 
and~\isa{xa}.  We need one to become \isa{x}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1466  | 
and the other to become~\isa{xa}, but Isabelle requires all instances of a
 | 
| 10295 | 1467  | 
placeholder to be identical.  | 
1468  | 
\begin{isabelle}
 | 
|
| 11077 | 1469  | 
\isacommand{apply}\ (rule\ exI)\isanewline
 | 
1470  | 
\isacommand{apply}\ (rule\ conjI)\isanewline
 | 
|
| 10596 | 1471  | 
\ 1.\ \isasymAnd x\ xa.\ \isasymlbrakk P\ x;\ Q\ xa\isasymrbrakk\  | 
| 10295 | 1472  | 
\isasymLongrightarrow\ P\ (?x3\ x\ xa)\isanewline  | 
| 10596 | 1473  | 
\ 2.\ \isasymAnd x\ xa.\ \isasymlbrakk P\ x;\ Q\ xa\isasymrbrakk\ \isasymLongrightarrow\ Q\ (?x3\ x\ xa)  | 
| 10295 | 1474  | 
\end{isabelle}
 | 
1475  | 
We can prove either subgoal  | 
|
1476  | 
using the \isa{assumption} method.  If we prove the first one, the placeholder
 | 
|
| 11077 | 1477  | 
changes into~\isa{x}. 
 | 
| 10295 | 1478  | 
\begin{isabelle}
 | 
| 11077 | 1479  | 
\ \isacommand{apply}\ assumption\isanewline
 | 
| 10596 | 1480  | 
\ 1.\ \isasymAnd x\ xa.\ \isasymlbrakk P\ x;\ Q\ xa\isasymrbrakk\  | 
| 10295 | 1481  | 
\isasymLongrightarrow\ Q\ x  | 
1482  | 
\end{isabelle}
 | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1483  | 
We are left with a subgoal that cannot be proved.  Applying the \isa{assumption}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1484  | 
method results in an error message:  | 
| 10295 | 1485  | 
\begin{isabelle}
 | 
1486  | 
*** empty result sequence -- proof command failed  | 
|
1487  | 
\end{isabelle}
 | 
|
| 11077 | 1488  | 
When interacting with Isabelle via the shell interface,  | 
1489  | 
you can abandon a proof using the \isacommand{oops} command.
 | 
|
| 10295 | 1490  | 
|
1491  | 
\medskip  | 
|
1492  | 
||
1493  | 
Here is another abortive proof, illustrating the interaction between  | 
|
1494  | 
bound variables and unknowns.  | 
|
1495  | 
If $R$ is a reflexive relation,  | 
|
1496  | 
is there an $x$ such that $R\,x\,y$ holds for all $y$? Let us see what happens when  | 
|
1497  | 
we attempt to prove it.  | 
|
1498  | 
\begin{isabelle}
 | 
|
| 11406 | 1499  | 
\isacommand{lemma}\ "\isasymforall y.\ R\ y\ y\ \isasymLongrightarrow 
 | 
1500  | 
\ \isasymexists x.\ \isasymforall y.\ R\ x\ y"  | 
|
| 11077 | 1501  | 
\end{isabelle}
 | 
1502  | 
First, we remove the existential quantifier. The new proof state has an  | 
|
1503  | 
unknown, namely~\isa{?x}. 
 | 
|
1504  | 
\begin{isabelle}
 | 
|
| 10295 | 1505  | 
\isacommand{apply}\ (rule\ exI)\isanewline
 | 
| 11077 | 1506  | 
\ 1.\ \isasymforall y.\ R\ y\ y\ \isasymLongrightarrow \ \isasymforall y.\ R\ ?x\ y%  | 
| 10295 | 1507  | 
\end{isabelle}
 | 
| 11077 | 1508  | 
It looks like we can just apply \isa{assumption}, but it fails.  Isabelle
 | 
1509  | 
refuses to substitute \isa{y}, a bound variable, for~\isa{?x}; that would be
 | 
|
1510  | 
a bound variable capture. We can still try to finish the proof in some  | 
|
1511  | 
other way. We remove the universal quantifier from the conclusion, moving  | 
|
1512  | 
the bound variable~\isa{y} into the subgoal.  But note that it is still
 | 
|
1513  | 
bound!  | 
|
| 10295 | 1514  | 
\begin{isabelle}
 | 
| 11077 | 1515  | 
\isacommand{apply}\ (rule\ allI)\isanewline
 | 
1516  | 
\ 1.\ \isasymAnd y.\ \isasymforall y.\ R\ y\ y\ \isasymLongrightarrow \ R\ ?x\ y%  | 
|
| 10295 | 1517  | 
\end{isabelle}
 | 
1518  | 
Finally, we try to apply our reflexivity assumption. We obtain a  | 
|
1519  | 
new assumption whose identical placeholders may be replaced by  | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1520  | 
any term involving~\isa{y}. 
 | 
| 10295 | 1521  | 
\begin{isabelle}
 | 
| 11077 | 1522  | 
\isacommand{apply}\ (drule\ spec)\isanewline
 | 
| 10596 | 1523  | 
\ 1.\ \isasymAnd y.\ R\ (?z2\ y)\ (?z2\ y)\ \isasymLongrightarrow\ R\ ?x\ y  | 
| 10295 | 1524  | 
\end{isabelle}
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1525  | 
This subgoal can only be proved by putting \isa{y} for all the placeholders,
 | 
| 11077 | 1526  | 
making the assumption and conclusion become \isa{R\ y\ y}.  Isabelle can
 | 
1527  | 
replace \isa{?z2~y} by \isa{y}; this involves instantiating
 | 
|
1528  | 
\isa{?z2} to the identity function.  But, just as two steps earlier,
 | 
|
1529  | 
Isabelle refuses to substitute~\isa{y} for~\isa{?x}.
 | 
|
| 10295 | 1530  | 
This example is typical of how Isabelle enforces sound quantifier reasoning.  | 
| 11077 | 1531  | 
\index{proofs!examples of failing|)}
 | 
| 10295 | 1532  | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1533  | 
\section{Proving Theorems Using the {\tt\slshape blast} Method}
 | 
| 10295 | 1534  | 
|
| 11077 | 1535  | 
\index{*blast (method)|(}%
 | 
| 11406 | 1536  | 
It is hard to prove many theorems using the methods  | 
1537  | 
described above. A proof may be hundreds of steps long. You  | 
|
| 10295 | 1538  | 
may need to search among different ways of proving certain  | 
1539  | 
subgoals. Often a choice that proves one subgoal renders another  | 
|
1540  | 
impossible to prove. There are further complications that we have not  | 
|
1541  | 
discussed, concerning negation and disjunction. Isabelle's  | 
|
| 11406 | 1542  | 
\textbf{classical reasoner} is a family of tools that perform such
 | 
| 10295 | 1543  | 
proofs automatically. The most important of these is the  | 
| 10596 | 1544  | 
\isa{blast} method. 
 | 
| 10295 | 1545  | 
|
1546  | 
In this section, we shall first see how to use the classical  | 
|
1547  | 
reasoner in its default mode and then how to insert additional  | 
|
1548  | 
rules, enabling it to work in new problem domains.  | 
|
1549  | 
||
1550  | 
We begin with examples from pure predicate logic. The following  | 
|
1551  | 
example is known as Andrew's challenge. Peter Andrews designed  | 
|
| 11406 | 1552  | 
it to be hard to prove by automatic means.  | 
1553  | 
It is particularly hard for a resolution prover, where  | 
|
1554  | 
converting the nested biconditionals to  | 
|
1555  | 
clause form produces a combinatorial  | 
|
1556  | 
explosion~\cite{pelletier86}. However, the
 | 
|
| 11077 | 1557  | 
\isa{blast} method proves it in a fraction  of a second. 
 | 
| 10295 | 1558  | 
\begin{isabelle}
 | 
1559  | 
\isacommand{lemma}\
 | 
|
1560  | 
"(({\isasymexists}x.\
 | 
|
1561  | 
{\isasymforall}y.\
 | 
|
| 10301 | 1562  | 
p(x){=}p(y))\
 | 
| 10295 | 1563  | 
=\  | 
1564  | 
(({\isasymexists}x.\
 | 
|
| 10301 | 1565  | 
q(x))=({\isasymforall}y.\
 | 
1566  | 
p(y))))\  | 
|
| 10295 | 1567  | 
\ \ =\ \ \ \ \isanewline  | 
1568  | 
\ \ \ \ \ \ \ \  | 
|
1569  | 
(({\isasymexists}x.\
 | 
|
1570  | 
{\isasymforall}y.\
 | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1571  | 
q(x){=}q(y))\ =\ (({\isasymexists}x.\ p(x))=({\isasymforall}y.\ q(y))))"\isanewline
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1572  | 
\isacommand{by}\ blast
 | 
| 10295 | 1573  | 
\end{isabelle}
 | 
1574  | 
The next example is a logic problem composed by Lewis Carroll.  | 
|
| 10596 | 1575  | 
The \isa{blast} method finds it trivial. Moreover, it turns out 
 | 
| 11406 | 1576  | 
that not all of the assumptions are necessary. We can  | 
| 10295 | 1577  | 
experiment with variations of this formula and see which ones  | 
1578  | 
can be proved.  | 
|
1579  | 
\begin{isabelle}
 | 
|
1580  | 
\isacommand{lemma}\
 | 
|
1581  | 
"({\isasymforall}x.\
 | 
|
1582  | 
honest(x)\ \isasymand\  | 
|
1583  | 
industrious(x)\ \isasymlongrightarrow\  | 
|
| 10301 | 1584  | 
healthy(x))\  | 
| 10295 | 1585  | 
\isasymand\ \ \isanewline  | 
1586  | 
\ \ \ \ \ \ \ \ \isasymnot\ ({\isasymexists}x.\
 | 
|
1587  | 
grocer(x)\ \isasymand\  | 
|
| 10301 | 1588  | 
healthy(x))\  | 
| 10295 | 1589  | 
\isasymand\ \isanewline  | 
1590  | 
\ \ \ \ \ \ \ \ ({\isasymforall}x.\
 | 
|
1591  | 
industrious(x)\ \isasymand\  | 
|
1592  | 
grocer(x)\ \isasymlongrightarrow\  | 
|
| 10301 | 1593  | 
honest(x))\  | 
| 10295 | 1594  | 
\isasymand\ \isanewline  | 
1595  | 
\ \ \ \ \ \ \ \ ({\isasymforall}x.\
 | 
|
1596  | 
cyclist(x)\ \isasymlongrightarrow\  | 
|
| 10301 | 1597  | 
industrious(x))\  | 
| 10295 | 1598  | 
\isasymand\ \isanewline  | 
1599  | 
\ \ \ \ \ \ \ \ ({\isasymforall}x.\
 | 
|
1600  | 
{\isasymnot}healthy(x)\ \isasymand\
 | 
|
1601  | 
cyclist(x)\ \isasymlongrightarrow\  | 
|
| 10301 | 1602  | 
{\isasymnot}honest(x))\
 | 
| 10295 | 1603  | 
\ \isanewline  | 
1604  | 
\ \ \ \ \ \ \ \ \isasymlongrightarrow\  | 
|
1605  | 
({\isasymforall}x.\
 | 
|
1606  | 
grocer(x)\ \isasymlongrightarrow\  | 
|
| 10301 | 1607  | 
{\isasymnot}cyclist(x))"\isanewline
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1608  | 
\isacommand{by}\ blast
 | 
| 10295 | 1609  | 
\end{isabelle}
 | 
| 10596 | 1610  | 
The \isa{blast} method is also effective for set theory, which is
 | 
| 11406 | 1611  | 
described in the next chapter. The formula below may look horrible, but  | 
1612  | 
the \isa{blast} method proves it in milliseconds. 
 | 
|
| 10295 | 1613  | 
\begin{isabelle}
 | 
| 10301 | 1614  | 
\isacommand{lemma}\ "({\isasymUnion}i{\isasymin}I.\ A(i))\ \isasyminter\ ({\isasymUnion}j{\isasymin}J.\ B(j))\ =\isanewline
 | 
1615  | 
\ \ \ \ \ \ \ \ ({\isasymUnion}i{\isasymin}I.\ {\isasymUnion}j{\isasymin}J.\ A(i)\ \isasyminter\ B(j))"\isanewline
 | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1616  | 
\isacommand{by}\ blast
 | 
| 10295 | 1617  | 
\end{isabelle}
 | 
1618  | 
||
1619  | 
Few subgoals are couched purely in predicate logic and set theory.  | 
|
1620  | 
We can extend the scope of the classical reasoner by giving it new rules.  | 
|
1621  | 
Extending it effectively requires understanding the notions of  | 
|
1622  | 
introduction, elimination and destruction rules. Moreover, there is a  | 
|
| 11077 | 1623  | 
distinction between safe and unsafe rules. A  | 
1624  | 
\textbf{safe}\indexbold{safe rules} rule is one that can be applied 
 | 
|
1625  | 
backwards without losing information; an  | 
|
1626  | 
\textbf{unsafe}\indexbold{unsafe rules} rule loses  information, perhaps
 | 
|
1627  | 
transforming the subgoal into one that cannot be proved. The safe/unsafe  | 
|
| 10295 | 1628  | 
distinction affects the proof search: if a proof attempt fails, the  | 
1629  | 
classical reasoner backtracks to the most recent unsafe rule application  | 
|
1630  | 
and makes another choice.  | 
|
1631  | 
||
1632  | 
An important special case avoids all these complications. A logical  | 
|
1633  | 
equivalence, which in higher-order logic is an equality between  | 
|
1634  | 
formulas, can be given to the classical  | 
|
| 11406 | 1635  | 
reasoner and simplifier by using the attribute \attrdx{iff}.  You 
 | 
| 10295 | 1636  | 
should do so if the right hand side of the equivalence is  | 
1637  | 
simpler than the left-hand side.  | 
|
1638  | 
||
1639  | 
For example, here is a simple fact about list concatenation.  | 
|
1640  | 
The result of appending two lists is empty if and only if both  | 
|
1641  | 
of the lists are themselves empty. Obviously, applying this equivalence  | 
|
1642  | 
will result in a simpler goal. When stating this lemma, we include  | 
|
| 11406 | 1643  | 
the \attrdx{iff} attribute. Once we have proved the lemma, Isabelle 
 | 
| 10295 | 1644  | 
will make it known to the classical reasoner (and to the simplifier).  | 
1645  | 
\begin{isabelle}
 | 
|
1646  | 
\isacommand{lemma}\
 | 
|
| 10854 | 1647  | 
[iff]:\ "(xs{\isacharat}ys\ =\ [])\ =\
 | 
| 10971 | 1648  | 
(xs=[]\ \isasymand\ ys=[])"\isanewline  | 
| 10854 | 1649  | 
\isacommand{apply}\ (induct_tac\ xs)\isanewline
 | 
1650  | 
\isacommand{apply}\ (simp_all)\isanewline
 | 
|
| 10295 | 1651  | 
\isacommand{done}
 | 
1652  | 
\end{isabelle}
 | 
|
1653  | 
%  | 
|
1654  | 
This fact about multiplication is also appropriate for  | 
|
| 11406 | 1655  | 
the \attrdx{iff} attribute:
 | 
| 10295 | 1656  | 
\begin{isabelle}
 | 
| 10596 | 1657  | 
(\mbox{?m}\ *\ \mbox{?n}\ =\ 0)\ =\ (\mbox{?m}\ =\ 0\ \isasymor\ \mbox{?n}\ =\ 0)
 | 
| 10295 | 1658  | 
\end{isabelle}
 | 
1659  | 
A product is zero if and only if one of the factors is zero. The  | 
|
| 10971 | 1660  | 
reasoning involves a disjunction. Proving new rules for  | 
| 10295 | 1661  | 
disjunctive reasoning is hard, but translating to an actual disjunction  | 
1662  | 
works: the classical reasoner handles disjunction properly.  | 
|
1663  | 
||
| 11406 | 1664  | 
In more detail, this is how the \attrdx{iff} attribute works.  It converts
 | 
| 10295 | 1665  | 
the equivalence $P=Q$ to a pair of rules: the introduction  | 
1666  | 
rule $Q\Imp P$ and the destruction rule $P\Imp Q$. It gives both to the  | 
|
1667  | 
classical reasoner as safe rules, ensuring that all occurrences of $P$ in  | 
|
1668  | 
a subgoal are replaced by~$Q$. The simplifier performs the same  | 
|
1669  | 
replacement, since \isa{iff} gives $P=Q$ to the
 | 
|
| 11406 | 1670  | 
simplifier.  | 
1671  | 
||
1672  | 
Classical reasoning is different from  | 
|
1673  | 
simplification. Simplification is deterministic. It applies rewrite rules  | 
|
1674  | 
repeatedly, as long as possible, transforming a goal into another goal. Classical  | 
|
1675  | 
reasoning uses search and backtracking in order to prove a goal outright.%  | 
|
| 11077 | 1676  | 
\index{*blast (method)|)}%
 | 
1677  | 
||
| 10295 | 1678  | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1679  | 
\section{Other Classical Reasoning Methods}
 | 
| 10295 | 1680  | 
|
| 10596 | 1681  | 
The \isa{blast} method is our main workhorse for proving theorems 
 | 
| 10295 | 1682  | 
automatically. Other components of the classical reasoner interact  | 
1683  | 
with the simplifier. Still others perform classical reasoning  | 
|
1684  | 
to a limited extent, giving the user fine control over the proof.  | 
|
1685  | 
||
| 11077 | 1686  | 
Of the latter methods, the most useful is  | 
| 11406 | 1687  | 
\methdx{clarify}.
 | 
| 11077 | 1688  | 
It performs  | 
| 10295 | 1689  | 
all obvious reasoning steps without splitting the goal into multiple  | 
| 10971 | 1690  | 
parts. It does not apply unsafe rules that could render the  | 
1691  | 
goal unprovable. By performing the obvious  | 
|
| 11077 | 1692  | 
steps, \isa{clarify} lays bare the difficult parts of the problem, 
 | 
| 10295 | 1693  | 
where human intervention is necessary.  | 
1694  | 
||
1695  | 
For example, the following conjecture is false:  | 
|
1696  | 
\begin{isabelle}
 | 
|
1697  | 
\isacommand{lemma}\ "({\isasymforall}x.\ P\ x)\ \isasymand\
 | 
|
1698  | 
({\isasymexists}x.\ Q\ x)\ \isasymlongrightarrow\ ({\isasymforall}x.\ P\ x\
 | 
|
1699  | 
\isasymand\ Q\ x)"\isanewline  | 
|
1700  | 
\isacommand{apply}\ clarify
 | 
|
1701  | 
\end{isabelle}
 | 
|
| 11077 | 1702  | 
The \isa{blast} method would simply fail, but \isa{clarify} presents 
 | 
| 10295 | 1703  | 
a subgoal that helps us see why we cannot continue the proof.  | 
1704  | 
\begin{isabelle}
 | 
|
| 10596 | 1705  | 
\ 1.\ \isasymAnd x\ xa.\ \isasymlbrakk{\isasymforall}x.\ P\ x;\ Q\
 | 
| 10295 | 1706  | 
xa\isasymrbrakk\ \isasymLongrightarrow\ P\ x\ \isasymand\ Q\ x  | 
1707  | 
\end{isabelle}
 | 
|
1708  | 
The proof must fail because the assumption \isa{Q\ xa} and conclusion \isa{Q\ x}
 | 
|
1709  | 
refer to distinct bound variables.  To reach this state, \isa{clarify} applied
 | 
|
1710  | 
the introduction rules for \isa{\isasymlongrightarrow} and \isa{\isasymforall}
 | 
|
| 12535 | 1711  | 
and the elimination rule for \isa{\isasymand}.  It did not apply the introduction
 | 
| 10295 | 1712  | 
rule for  \isa{\isasymand} because of its policy never to split goals.
 | 
1713  | 
||
| 11406 | 1714  | 
Also available is \methdx{clarsimp}, a method
 | 
1715  | 
that interleaves \isa{clarify} and \isa{simp}.  Also there is  \methdx{safe},
 | 
|
1716  | 
which like \isa{clarify} performs obvious steps but even applies those that
 | 
|
| 11077 | 1717  | 
split goals.  | 
| 10295 | 1718  | 
|
| 11406 | 1719  | 
The \methdx{force} method applies the classical
 | 
| 11077 | 1720  | 
reasoner and simplifier to one goal.  | 
| 10295 | 1721  | 
Unless it can prove the goal, it fails. Contrast  | 
| 10546 | 1722  | 
that with the \isa{auto} method, which also combines classical reasoning 
 | 
| 10295 | 1723  | 
with simplification. The latter's purpose is to prove all the  | 
1724  | 
easy subgoals and parts of subgoals. Unfortunately, it can produce  | 
|
1725  | 
large numbers of new subgoals; also, since it proves some subgoals  | 
|
1726  | 
and splits others, it obscures the structure of the proof tree.  | 
|
| 10546 | 1727  | 
The \isa{force} method does not have these drawbacks. Another 
 | 
1728  | 
difference: \isa{force} tries harder than {\isa{auto}} to prove 
 | 
|
| 10295 | 1729  | 
its goal, so it can take much longer to terminate.  | 
1730  | 
||
1731  | 
Older components of the classical reasoner have largely been  | 
|
| 10596 | 1732  | 
superseded by \isa{blast}, but they still have niche applications. 
 | 
1733  | 
Most important among these are \isa{fast} and \isa{best}. While \isa{blast} 
 | 
|
| 10295 | 1734  | 
searches for proofs using a built-in first-order reasoner, these  | 
1735  | 
earlier methods search for proofs using standard Isabelle inference.  | 
|
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
1736  | 
That makes them slower but enables them to work in the  | 
| 10295 | 1737  | 
presence of the more unusual features of Isabelle rules, such  | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1738  | 
as type classes and function unknowns. For example, recall the introduction rule  | 
| 10971 | 1739  | 
for Hilbert's $\varepsilon$-operator:  | 
| 10295 | 1740  | 
\begin{isabelle}
 | 
| 10546 | 1741  | 
?P\ ?x\ \isasymLongrightarrow\ ?P\ (SOME\ x.\ ?P x)  | 
| 10295 | 1742  | 
\rulename{someI}
 | 
1743  | 
\end{isabelle}
 | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1744  | 
%  | 
| 10295 | 1745  | 
The repeated occurrence of the variable \isa{?P} makes this rule tricky 
 | 
1746  | 
to apply. Consider this contrived example:  | 
|
1747  | 
\begin{isabelle}
 | 
|
| 10596 | 1748  | 
\isacommand{lemma}\ "\isasymlbrakk Q\ a;\ P\ a\isasymrbrakk\isanewline
 | 
| 10295 | 1749  | 
\ \ \ \ \ \ \ \ \,\isasymLongrightarrow\ P\ (SOME\ x.\ P\ x\ \isasymand\ Q\ x)\  | 
1750  | 
\isasymand\ Q\ (SOME\ x.\ P\ x\ \isasymand\ Q\ x)"\isanewline  | 
|
1751  | 
\isacommand{apply}\ (rule\ someI)
 | 
|
1752  | 
\end{isabelle}
 | 
|
1753  | 
%  | 
|
1754  | 
We can apply rule \isa{someI} explicitly.  It yields the 
 | 
|
1755  | 
following subgoal:  | 
|
1756  | 
\begin{isabelle}
 | 
|
| 10596 | 1757  | 
\ 1.\ \isasymlbrakk Q\ a;\ P\ a\isasymrbrakk\ \isasymLongrightarrow\ P\ ?x\  | 
| 10295 | 1758  | 
\isasymand\ Q\ ?x%  | 
1759  | 
\end{isabelle}
 | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1760  | 
The proof from this point is trivial. Could we have  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1761  | 
proved the theorem with a single command? Not using \isa{blast}: it
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1762  | 
cannot perform the higher-order unification needed here. The  | 
| 11406 | 1763  | 
\methdx{fast} method succeeds: 
 | 
| 10295 | 1764  | 
\begin{isabelle}
 | 
1765  | 
\isacommand{apply}\ (fast\ intro!:\ someI)
 | 
|
1766  | 
\end{isabelle}
 | 
|
1767  | 
||
| 11406 | 1768  | 
The \methdx{best} method is similar to
 | 
| 11077 | 1769  | 
\isa{fast} but it uses a  best-first search instead of depth-first search.
 | 
1770  | 
Accordingly, it is slower but is less susceptible to divergence.  | 
|
| 11406 | 1771  | 
Transitivity  rules usually cause \isa{fast} to loop where \isa{best} 
 | 
1772  | 
can often manage.  | 
|
| 10295 | 1773  | 
|
1774  | 
Here is a summary of the classical reasoning methods:  | 
|
1775  | 
\begin{itemize}
 | 
|
| 11406 | 1776  | 
\item \methdx{blast} works automatically and is the fastest
 | 
1777  | 
||
1778  | 
\item \methdx{clarify} and \methdx{clarsimp} perform obvious steps without
 | 
|
1779  | 
splitting the goal;  \methdx{safe} even splits goals
 | 
|
1780  | 
||
1781  | 
\item \methdx{force} uses classical reasoning and simplification to prove a goal;
 | 
|
1782  | 
 \methdx{auto} is similar but leaves what it cannot prove
 | 
|
1783  | 
||
1784  | 
\item \methdx{fast} and \methdx{best} are legacy methods that work well with rules
 | 
|
1785  | 
involving unusual features  | 
|
| 10295 | 1786  | 
\end{itemize}
 | 
1787  | 
A table illustrates the relationships among four of these methods.  | 
|
1788  | 
\begin{center}
 | 
|
1789  | 
\begin{tabular}{r|l|l|}
 | 
|
1790  | 
& no split & split \\ \hline  | 
|
| 11406 | 1791  | 
  no simp  & \methdx{clarify}    & \methdx{safe} \\ \hline
 | 
1792  | 
     simp  & \methdx{clarsimp}   & \methdx{auto} \\ \hline
 | 
|
| 10295 | 1793  | 
\end{tabular}
 | 
1794  | 
\end{center}
 | 
|
1795  | 
||
1796  | 
||
| 11406 | 1797  | 
\section{Forward Proof: Transforming Theorems}\label{sec:forward}
 | 
| 10295 | 1798  | 
|
| 11077 | 1799  | 
\index{forward proof|(}%
 | 
| 10295 | 1800  | 
Forward proof means deriving new facts from old ones. It is the  | 
1801  | 
most fundamental type of proof. Backward proof, by working from goals to  | 
|
1802  | 
subgoals, can help us find a difficult proof. But it is  | 
|
| 14403 | 1803  | 
not always the best way of presenting the proof thus found. Forward  | 
| 10301 | 1804  | 
proof is particularly good for reasoning from the general  | 
| 11406 | 1805  | 
to the specific. For example, consider this distributive law for  | 
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1806  | 
the greatest common divisor:  | 
| 10295 | 1807  | 
\[ k\times\gcd(m,n) = \gcd(k\times m,k\times n)\]  | 
1808  | 
||
1809  | 
Putting $m=1$ we get (since $\gcd(1,n)=1$ and $k\times1=k$)  | 
|
1810  | 
\[ k = \gcd(k,k\times n)\]  | 
|
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1811  | 
We have derived a new fact; if re-oriented, it might be  | 
| 10295 | 1812  | 
useful for simplification. After re-orienting it and putting $n=1$, we  | 
1813  | 
derive another useful law:  | 
|
1814  | 
\[ \gcd(k,k)=k \]  | 
|
1815  | 
Substituting values for variables --- instantiation --- is a forward step.  | 
|
1816  | 
Re-orientation works by applying the symmetry of equality to  | 
|
1817  | 
an equation, so it too is a forward step.  | 
|
1818  | 
||
| 14403 | 1819  | 
\subsection{Modifying a Theorem using {\tt\slshape of},  {\tt\slshape where}
 | 
1820  | 
 and {\tt\slshape THEN}}
 | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1821  | 
|
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1822  | 
Let us reproduce our examples in Isabelle. Recall that in  | 
| 11428 | 1823  | 
{\S}\ref{sec:recdef-simplification} we declared the recursive function
 | 
| 11406 | 1824  | 
\isa{gcd}:\index{*gcd (constant)|(}
 | 
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1825  | 
\begin{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1826  | 
\isacommand{consts}\ gcd\ ::\ "nat*nat\ \isasymRightarrow\ nat"\isanewline
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1827  | 
\isacommand{recdef}\ gcd\ "measure\ ((\isasymlambda(m,n).n))"\isanewline
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1828  | 
\ \ \ \ "gcd\ (m,n)\ =\ (if\ n=0\ then\ m\ else\ gcd(n,\ m\ mod\ n))"  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1829  | 
\end{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1830  | 
%  | 
| 12333 | 1831  | 
From this definition, it is possible to prove the distributive law.  | 
1832  | 
That takes us to the starting point for our example.  | 
|
| 11077 | 1833  | 
\begin{isabelle}
 | 
| 10596 | 1834  | 
?k\ *\ gcd\ (?m,\ ?n)\ =\ gcd\ (?k\ *\ ?m,\ ?k\ *\ ?n)  | 
| 10295 | 1835  | 
\rulename{gcd_mult_distrib2}
 | 
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1836  | 
\end{isabelle}
 | 
| 11406 | 1837  | 
%  | 
1838  | 
The first step in our derivation is to replace \isa{?m} by~1.  We instantiate the
 | 
|
1839  | 
theorem using~\attrdx{of}, which identifies variables in order of their
 | 
|
1840  | 
appearance from left to right.  In this case, the variables  are \isa{?k}, \isa{?m}
 | 
|
1841  | 
and~\isa{?n}. So, the expression
 | 
|
| 10295 | 1842  | 
\hbox{\texttt{[of k 1]}} replaces \isa{?k} by~\isa{k} and \isa{?m}
 | 
| 
12156
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
1843  | 
by~\isa{1}.
 | 
| 10295 | 1844  | 
\begin{isabelle}
 | 
1845  | 
\isacommand{lemmas}\ gcd_mult_0\ =\ gcd_mult_distrib2\ [of\ k\ 1]
 | 
|
1846  | 
\end{isabelle}
 | 
|
1847  | 
%  | 
|
| 11406 | 1848  | 
The keyword \commdx{lemmas} declares a new theorem, which can be derived
 | 
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1849  | 
from an existing one using attributes such as \isa{[of~k~1]}.
 | 
| 10295 | 1850  | 
The command  | 
1851  | 
\isa{thm gcd_mult_0}
 | 
|
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1852  | 
displays the result:  | 
| 10295 | 1853  | 
\begin{isabelle}
 | 
| 10596 | 1854  | 
\ \ \ \ \ k\ *\ gcd\ (1,\ ?n)\ =\ gcd\ (k\ *\ 1,\ k\ *\ ?n)  | 
| 10295 | 1855  | 
\end{isabelle}
 | 
| 14403 | 1856  | 
Something is odd: \isa{k} is an ordinary variable, while \isa{?n} 
 | 
| 10295 | 1857  | 
is schematic. We did not specify an instantiation  | 
| 14403 | 1858  | 
for \isa{?n}.  In its present form, the theorem does not allow 
 | 
1859  | 
substitution for \isa{k}.  One solution is to avoid giving an instantiation for
 | 
|
| 10295 | 1860  | 
\isa{?k}: instead of a term we can put an underscore~(\isa{_}).  For example,
 | 
1861  | 
\begin{isabelle}
 | 
|
1862  | 
\ \ \ \ \ gcd_mult_distrib2\ [of\ _\ 1]  | 
|
1863  | 
\end{isabelle}
 | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1864  | 
replaces \isa{?m} by~\isa{1} but leaves \isa{?k} unchanged.  
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1865  | 
|
| 14403 | 1866  | 
An equivalent solution is to use the attribute \isa{where}. 
 | 
1867  | 
\begin{isabelle}
 | 
|
1868  | 
\ \ \ \ \ gcd\_mult\_distrib2\ [where\ m=1]  | 
|
1869  | 
\end{isabelle}
 | 
|
1870  | 
While \isa{of} refers to
 | 
|
1871  | 
variables by their position, \isa{where} refers to variables by name. Multiple
 | 
|
1872  | 
instantiations are separated by~\isa{and}, as in this example:
 | 
|
1873  | 
\begin{isabelle}
 | 
|
1874  | 
\ \ \ \ \ gcd\_mult\_distrib2\ [where\ m=1\ and\ k=1]  | 
|
1875  | 
\end{isabelle}
 | 
|
1876  | 
||
1877  | 
We now continue the present example with the version of \isa{gcd_mult_0}
 | 
|
1878  | 
shown above, which has \isa{k} instead of \isa{?k}.
 | 
|
1879  | 
Once we have replaced \isa{?m} by~1, we must next simplify
 | 
|
1880  | 
the theorem \isa{gcd_mult_0}, performing the steps 
 | 
|
| 11406 | 1881  | 
$\gcd(1,n)=1$ and $k\times1=k$.  The \attrdx{simplified}
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1882  | 
attribute takes a theorem  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1883  | 
and returns the result of simplifying it, with respect to the default  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1884  | 
simplification rules:  | 
| 10295 | 1885  | 
\begin{isabelle}
 | 
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1886  | 
\isacommand{lemmas}\ gcd_mult_1\ =\ gcd_mult_0\
 | 
| 10295 | 1887  | 
[simplified]%  | 
1888  | 
\end{isabelle}
 | 
|
1889  | 
%  | 
|
1890  | 
Again, we display the resulting theorem:  | 
|
1891  | 
\begin{isabelle}
 | 
|
| 10596 | 1892  | 
\ \ \ \ \ k\ =\ gcd\ (k,\ k\ *\ ?n)  | 
| 10295 | 1893  | 
\end{isabelle}
 | 
1894  | 
%  | 
|
1895  | 
To re-orient the equation requires the symmetry rule:  | 
|
1896  | 
\begin{isabelle}
 | 
|
1897  | 
?s\ =\ ?t\  | 
|
1898  | 
\isasymLongrightarrow\ ?t\ =\  | 
|
1899  | 
?s%  | 
|
| 11417 | 1900  | 
\rulenamedx{sym}
 | 
| 10295 | 1901  | 
\end{isabelle}
 | 
1902  | 
The following declaration gives our equation to \isa{sym}:
 | 
|
1903  | 
\begin{isabelle}
 | 
|
| 11077 | 1904  | 
\ \ \ \isacommand{lemmas}\ gcd_mult\ =\ gcd_mult_1\ [THEN\ sym]
 | 
| 10295 | 1905  | 
\end{isabelle}
 | 
1906  | 
%  | 
|
1907  | 
Here is the result:  | 
|
1908  | 
\begin{isabelle}
 | 
|
| 10596 | 1909  | 
\ \ \ \ \ gcd\ (k,\ k\ *\ ?n)\ =\ k%  | 
| 10295 | 1910  | 
\end{isabelle}
 | 
| 11406 | 1911  | 
\isa{THEN~sym}\indexbold{*THEN (attribute)} gives the current theorem to the
 | 
| 11077 | 1912  | 
rule \isa{sym} and returns the resulting conclusion.  The effect is to
 | 
1913  | 
exchange the two operands of the equality. Typically \isa{THEN} is used
 | 
|
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1914  | 
with destruction rules.  Also useful is \isa{THEN~spec}, which removes the
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1915  | 
quantifier from a theorem of the form $\forall x.\,P$, and \isa{THEN~mp},
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1916  | 
which converts the implication $P\imp Q$ into the rule  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1917  | 
$\vcenter{\infer{Q}{P}}$. Similar to \isa{mp} are the following two rules,
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1918  | 
which extract the two directions of reasoning about a boolean equivalence:  | 
| 10295 | 1919  | 
\begin{isabelle}
 | 
| 10596 | 1920  | 
\isasymlbrakk?Q\ =\ ?P;\ ?Q\isasymrbrakk\ \isasymLongrightarrow\ ?P%  | 
| 11417 | 1921  | 
\rulenamedx{iffD1}%
 | 
| 10295 | 1922  | 
\isanewline  | 
| 10596 | 1923  | 
\isasymlbrakk?P\ =\ ?Q;\ ?Q\isasymrbrakk\ \isasymLongrightarrow\ ?P%  | 
| 11417 | 1924  | 
\rulenamedx{iffD2}
 | 
| 10295 | 1925  | 
\end{isabelle}
 | 
1926  | 
%  | 
|
1927  | 
Normally we would never name the intermediate theorems  | 
|
| 
12156
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
1928  | 
such as \isa{gcd_mult_0} and \isa{gcd_mult_1} but would combine
 | 
| 10295 | 1929  | 
the three forward steps:  | 
1930  | 
\begin{isabelle}
 | 
|
1931  | 
\isacommand{lemmas}\ gcd_mult\ =\ gcd_mult_distrib2\ [of\ k\ 1,\ simplified,\ THEN\ sym]%
 | 
|
1932  | 
\end{isabelle}
 | 
|
1933  | 
The directives, or attributes, are processed from left to right. This  | 
|
1934  | 
declaration of \isa{gcd_mult} is equivalent to the
 | 
|
1935  | 
previous one.  | 
|
1936  | 
||
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1937  | 
Such declarations can make the proof script hard to read. Better  | 
| 10295 | 1938  | 
is to state the new lemma explicitly and to prove it using a single  | 
1939  | 
\isa{rule} method whose operand is expressed using forward reasoning:
 | 
|
1940  | 
\begin{isabelle}
 | 
|
1941  | 
\isacommand{lemma}\ gcd_mult\
 | 
|
| 10301 | 1942  | 
[simp]:\  | 
| 10596 | 1943  | 
"gcd(k,\ k*n)\ =\ k"\isanewline  | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1944  | 
\isacommand{by}\ (rule\ gcd_mult_distrib2\ [of\ k\ 1,\ simplified,\ THEN\ sym])
 | 
| 10295 | 1945  | 
\end{isabelle}
 | 
1946  | 
Compared with the previous proof of \isa{gcd_mult}, this
 | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1947  | 
version shows the reader what has been proved. Also, the result will be processed  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1948  | 
in the normal way. In particular, Isabelle generalizes over all variables: the  | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1949  | 
resulting theorem will have {\isa{?k}} instead of {\isa{k}}.
 | 
| 10295 | 1950  | 
|
1951  | 
At the start of this section, we also saw a proof of $\gcd(k,k)=k$. Here  | 
|
| 11406 | 1952  | 
is the Isabelle version:\index{*gcd (constant)|)}
 | 
| 10295 | 1953  | 
\begin{isabelle}
 | 
| 10301 | 1954  | 
\isacommand{lemma}\ gcd_self\ [simp]:\ "gcd(k,k)\ =\ k"\isanewline
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1955  | 
\isacommand{by}\ (rule\ gcd_mult\ [of\ k\ 1,\ simplified])
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1956  | 
\end{isabelle}
 | 
| 
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1957  | 
|
| 11406 | 1958  | 
\begin{warn}
 | 
| 12535 | 1959  | 
To give~\isa{of} a nonatomic term, enclose it in quotation marks, as in
 | 
| 11406 | 1960  | 
\isa{[of "k*m"]}.  The term must not contain unknowns: an
 | 
1961  | 
attribute such as  | 
|
1962  | 
\isa{[of "?k*m"]} will be rejected.
 | 
|
1963  | 
\end{warn}
 | 
|
1964  | 
||
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
1965  | 
\begin{exercise}
 | 
| 11428 | 1966  | 
In {\S}\ref{sec:subst} the method \isa{subst\ mult_commute} was applied.  How
 | 
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
1967  | 
can we achieve the same effect using \isa{THEN} with the rule \isa{ssubst}?
 | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
1968  | 
% answer rule (mult_commute [THEN ssubst])  | 
| 
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
1969  | 
\end{exercise}
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1970  | 
|
| 11406 | 1971  | 
\subsection{Modifying a Theorem using {\tt\slshape OF}}
 | 
| 10295 | 1972  | 
|
| 11406 | 1973  | 
\index{*OF (attribute)|(}%
 | 
| 11077 | 1974  | 
Recall that \isa{of} generates an instance of a
 | 
1975  | 
rule by specifying values for its variables.  Analogous is \isa{OF}, which
 | 
|
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1976  | 
generates an instance of a rule by specifying facts for its premises.  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1977  | 
|
| 11406 | 1978  | 
We again need the divides relation\index{divides relation} of number theory, which
 | 
1979  | 
as we recall is defined by  | 
|
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1980  | 
\begin{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1981  | 
?m\ dvd\ ?n\ \isasymequiv\ {\isasymexists}k.\ ?n\ =\ ?m\ *\ k
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1982  | 
\rulename{dvd_def}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1983  | 
\end{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1984  | 
%  | 
| 12333 | 1985  | 
Suppose, for example, that we have proved the following rule.  | 
1986  | 
It states that if $k$ and $n$ are relatively prime  | 
|
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1987  | 
and if $k$ divides $m\times n$ then $k$ divides $m$.  | 
| 10295 | 1988  | 
\begin{isabelle}
 | 
| 10971 | 1989  | 
\isasymlbrakk gcd(?k,?n){=}1;\ ?k\ dvd\ ?m * ?n\isasymrbrakk\
 | 
| 10295 | 1990  | 
\isasymLongrightarrow\ ?k\ dvd\ ?m  | 
1991  | 
\rulename{relprime_dvd_mult}
 | 
|
1992  | 
\end{isabelle}
 | 
|
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
1993  | 
We can use \isa{OF} to create an instance of this rule.
 | 
| 10295 | 1994  | 
First, we  | 
1995  | 
prove an instance of its first premise:  | 
|
1996  | 
\begin{isabelle}
 | 
|
| 
12156
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
1997  | 
\isacommand{lemma}\ relprime_20_81:\ "gcd(20,81)\ =\ 1"\isanewline
 | 
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
1998  | 
\isacommand{by}\ (simp\ add:\ gcd.simps)
 | 
| 10295 | 1999  | 
\end{isabelle}
 | 
2000  | 
We have evaluated an application of the \isa{gcd} function by
 | 
|
| 11077 | 2001  | 
simplification. Expression evaluation involving recursive functions is not  | 
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2002  | 
guaranteed to terminate, and it can be slow; Isabelle  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2003  | 
performs arithmetic by rewriting symbolic bit strings. Here,  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2004  | 
however, the simplification takes less than one second. We can  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2005  | 
give this new lemma to \isa{OF}.  The expression
 | 
| 10295 | 2006  | 
\begin{isabelle}
 | 
2007  | 
\ \ \ \ \ relprime_dvd_mult [OF relprime_20_81]  | 
|
2008  | 
\end{isabelle}
 | 
|
2009  | 
yields the theorem  | 
|
2010  | 
\begin{isabelle}
 | 
|
| 
12156
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
2011  | 
\ \ \ \ \ 20\ dvd\ (?m\ *\ 81)\ \isasymLongrightarrow\ 20\ dvd\ ?m%  | 
| 10295 | 2012  | 
\end{isabelle}
 | 
2013  | 
%  | 
|
| 10596 | 2014  | 
\isa{OF} takes any number of operands.  Consider 
 | 
| 10295 | 2015  | 
the following facts about the divides relation:  | 
2016  | 
\begin{isabelle}
 | 
|
2017  | 
\isasymlbrakk?k\ dvd\ ?m;\  | 
|
2018  | 
?k\ dvd\ ?n\isasymrbrakk\  | 
|
2019  | 
\isasymLongrightarrow\ ?k\ dvd\  | 
|
| 10971 | 2020  | 
?m\ +\ ?n  | 
| 10295 | 2021  | 
\rulename{dvd_add}\isanewline
 | 
2022  | 
?m\ dvd\ ?m%  | 
|
2023  | 
\rulename{dvd_refl}
 | 
|
2024  | 
\end{isabelle}
 | 
|
2025  | 
Let us supply \isa{dvd_refl} for each of the premises of \isa{dvd_add}:
 | 
|
2026  | 
\begin{isabelle}
 | 
|
2027  | 
\ \ \ \ \ dvd_add [OF dvd_refl dvd_refl]  | 
|
2028  | 
\end{isabelle}
 | 
|
2029  | 
Here is the theorem that we have expressed:  | 
|
2030  | 
\begin{isabelle}
 | 
|
| 10596 | 2031  | 
\ \ \ \ \ ?k\ dvd\ (?k\ +\ ?k)  | 
| 10295 | 2032  | 
\end{isabelle}
 | 
2033  | 
As with \isa{of}, we can use the \isa{_} symbol to leave some positions
 | 
|
2034  | 
unspecified:  | 
|
2035  | 
\begin{isabelle}
 | 
|
2036  | 
\ \ \ \ \ dvd_add [OF _ dvd_refl]  | 
|
2037  | 
\end{isabelle}
 | 
|
2038  | 
The result is  | 
|
2039  | 
\begin{isabelle}
 | 
|
| 10971 | 2040  | 
\ \ \ \ \ ?k\ dvd\ ?m\ \isasymLongrightarrow\ ?k\ dvd\ ?m\ +\ ?k  | 
| 10295 | 2041  | 
\end{isabelle}
 | 
2042  | 
||
| 10596 | 2043  | 
You may have noticed that \isa{THEN} and \isa{OF} are based on 
 | 
| 10295 | 2044  | 
the same idea, namely to combine two rules. They differ in the  | 
2045  | 
order of the combination and thus in their effect.  We use \isa{THEN}
 | 
|
2046  | 
typically with a destruction rule to extract a subformula of the current  | 
|
2047  | 
theorem.  We use \isa{OF} with a list of facts to generate an instance of
 | 
|
| 11077 | 2048  | 
the current theorem.%  | 
| 11406 | 2049  | 
\index{*OF (attribute)|)}
 | 
| 10295 | 2050  | 
|
| 
10848
 
7b3ee4695fe6
various changes including the SOME examples, rule_format and "by"
 
paulson 
parents: 
10792 
diff
changeset
 | 
2051  | 
Here is a summary of some primitives for forward reasoning:  | 
| 10295 | 2052  | 
\begin{itemize}
 | 
| 11406 | 2053  | 
\item \attrdx{of} instantiates the variables of a rule to a list of terms
 | 
2054  | 
\item \attrdx{OF} applies a rule to a list of theorems
 | 
|
2055  | 
\item \attrdx{THEN} gives a theorem to a named rule and returns the
 | 
|
| 10295 | 2056  | 
conclusion  | 
| 11406 | 2057  | 
%\item \attrdx{rule_format} puts a theorem into standard form
 | 
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2058  | 
%  by removing \isa{\isasymlongrightarrow} and~\isa{\isasymforall}
 | 
| 11406 | 2059  | 
\item \attrdx{simplified} applies the simplifier to a theorem
 | 
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2060  | 
\item \isacommand{lemmas} assigns a name to the theorem produced by the
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2061  | 
attributes above  | 
| 10295 | 2062  | 
\end{itemize}
 | 
2063  | 
||
2064  | 
||
| 11406 | 2065  | 
\section{Forward Reasoning in a Backward Proof}
 | 
| 10295 | 2066  | 
|
| 10967 | 2067  | 
We have seen that the forward proof directives work well within a backward  | 
| 11077 | 2068  | 
proof. There are many ways to achieve a forward style using our existing  | 
2069  | 
proof methods. We shall also meet some new methods that perform forward  | 
|
2070  | 
reasoning.  | 
|
| 10967 | 2071  | 
|
2072  | 
The methods \isa{drule}, \isa{frule}, \isa{drule_tac}, etc.,
 | 
|
2073  | 
reason forward from a subgoal. We have seen them already, using rules such as  | 
|
2074  | 
\isa{mp} and
 | 
|
2075  | 
\isa{spec} to operate on formulae.  They can also operate on terms, using rules
 | 
|
2076  | 
such as these:  | 
|
2077  | 
\begin{isabelle}
 | 
|
2078  | 
x\ =\ y\ \isasymLongrightarrow \ f\ x\ =\ f\ y%  | 
|
| 11417 | 2079  | 
\rulenamedx{arg_cong}\isanewline
 | 
| 10967 | 2080  | 
i\ \isasymle \ j\ \isasymLongrightarrow \ i\ *\ k\ \isasymle \ j\ *\ k%  | 
2081  | 
\rulename{mult_le_mono1}
 | 
|
2082  | 
\end{isabelle}
 | 
|
2083  | 
||
2084  | 
For example, let us prove a fact about divisibility in the natural numbers:  | 
|
2085  | 
\begin{isabelle}
 | 
|
| 
12156
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
2086  | 
\isacommand{lemma}\ "2\ \isasymle \ u\ \isasymLongrightarrow \ u*m\ \isasymnoteq
 | 
| 10967 | 2087  | 
\ Suc(u*n)"\isanewline  | 
| 12408 | 2088  | 
\isacommand{apply}\ (intro\ notI)\isanewline
 | 
| 
12156
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
2089  | 
\ 1.\ \isasymlbrakk 2\ \isasymle \ u;\ u\ *\ m\ =\ Suc\ (u\ *\ n)\isasymrbrakk \ \isasymLongrightarrow \ False%  | 
| 10967 | 2090  | 
\end{isabelle}
 | 
2091  | 
%  | 
|
2092  | 
The key step is to apply the function \ldots\isa{mod\ u} to both sides of the
 | 
|
2093  | 
equation  | 
|
| 11077 | 2094  | 
\isa{u*m\ =\ Suc(u*n)}:\index{*drule_tac (method)}
 | 
| 10967 | 2095  | 
\begin{isabelle}
 | 
2096  | 
\isacommand{apply}\ (drule_tac\ f="\isasymlambda x.\ x\ mod\ u"\ \isakeyword{in}\
 | 
|
2097  | 
arg_cong)\isanewline  | 
|
| 
12156
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
2098  | 
\ 1.\ \isasymlbrakk 2\ \isasymle \ u;\ u\ *\ m\ mod\ u\ =\ Suc\ (u\ *\ n)\ mod\  | 
| 10967 | 2099  | 
u\isasymrbrakk \ \isasymLongrightarrow \ False  | 
2100  | 
\end{isabelle}
 | 
|
2101  | 
%  | 
|
2102  | 
Simplification reduces the left side to 0 and the right side to~1, yielding the  | 
|
2103  | 
required contradiction.  | 
|
2104  | 
\begin{isabelle}
 | 
|
2105  | 
\isacommand{apply}\ (simp\ add:\ mod_Suc)\isanewline
 | 
|
2106  | 
\isacommand{done}
 | 
|
2107  | 
\end{isabelle}
 | 
|
2108  | 
||
2109  | 
Our proof has used a fact about remainder:  | 
|
2110  | 
\begin{isabelle}
 | 
|
2111  | 
Suc\ m\ mod\ n\ =\isanewline  | 
|
2112  | 
(if\ Suc\ (m\ mod\ n)\ =\ n\ then\ 0\ else\ Suc\ (m\ mod\ n))  | 
|
2113  | 
\rulename{mod_Suc}
 | 
|
2114  | 
\end{isabelle}
 | 
|
2115  | 
||
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2116  | 
\subsection{The Method {\tt\slshape insert}}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2117  | 
|
| 11406 | 2118  | 
\index{*insert (method)|(}%
 | 
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2119  | 
The \isa{insert} method
 | 
| 11077 | 2120  | 
inserts a given theorem as a new assumption of the current subgoal. This  | 
2121  | 
already is a forward step; moreover, we may (as always when using a  | 
|
2122  | 
theorem) apply  | 
|
| 10596 | 2123  | 
\isa{of}, \isa{THEN} and other directives.  The new assumption can then
 | 
| 10295 | 2124  | 
be used to help prove the subgoal.  | 
2125  | 
||
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2126  | 
For example, consider this theorem about the divides relation. The first  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2127  | 
proof step inserts the distributive law for  | 
| 10295 | 2128  | 
\isa{gcd}.  We specify its variables as shown. 
 | 
2129  | 
\begin{isabelle}
 | 
|
2130  | 
\isacommand{lemma}\
 | 
|
2131  | 
relprime_dvd_mult:\isanewline  | 
|
| 
11179
 
bee6673b020a
subst method and a new section on rule, rule_tac, etc
 
paulson 
parents: 
11159 
diff
changeset
 | 
2132  | 
\ \ \ \ \ \ \ "\isasymlbrakk gcd(k,n){=}1;\ k\ dvd\ m*n\isasymrbrakk\
 | 
| 10295 | 2133  | 
\isasymLongrightarrow\ k\ dvd\  | 
2134  | 
m"\isanewline  | 
|
2135  | 
\isacommand{apply}\ (insert\ gcd_mult_distrib2\ [of\ m\ k\
 | 
|
2136  | 
n])  | 
|
2137  | 
\end{isabelle}
 | 
|
2138  | 
In the resulting subgoal, note how the equation has been  | 
|
2139  | 
inserted:  | 
|
2140  | 
\begin{isabelle}
 | 
|
| 10971 | 2141  | 
\ 1.\ \isasymlbrakk gcd\ (k,\ n)\ =\ 1;\ k\ dvd\ m\ *\ n{;}\ m\ *\ gcd\
 | 
| 10295 | 2142  | 
(k,\ n)\  | 
| 10596 | 2143  | 
=\ gcd\ (m\ *\ k,\ m\ *\ n)\isasymrbrakk\isanewline  | 
| 10295 | 2144  | 
\ \ \ \ \isasymLongrightarrow\ k\ dvd\ m  | 
2145  | 
\end{isabelle}
 | 
|
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2146  | 
The next proof step utilizes the assumption \isa{gcd(k,n)\ =\ 1}: 
 | 
| 10295 | 2147  | 
\begin{isabelle}
 | 
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2148  | 
\isacommand{apply}(simp)\isanewline
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2149  | 
\ 1.\ \isasymlbrakk gcd\ (k,\ n)\ =\ 1;\ k\ dvd\  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2150  | 
(m\ *\ n){;}
 | 
| 10971 | 2151  | 
\ m\ =\ gcd\ (m\ *\ k,\ m\ *\ n)\isasymrbrakk\isanewline  | 
| 10295 | 2152  | 
\ \ \ \ \isasymLongrightarrow\ k\ dvd\ m  | 
2153  | 
\end{isabelle}
 | 
|
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2154  | 
Simplification has yielded an equation for~\isa{m}.  The rest of the proof
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2155  | 
is omitted.  | 
| 10295 | 2156  | 
|
2157  | 
\medskip  | 
|
| 11417 | 2158  | 
Here is another demonstration of \isa{insert}.  Division and
 | 
2159  | 
remainder obey a well-known law:  | 
|
| 10295 | 2160  | 
\begin{isabelle}
 | 
| 10596 | 2161  | 
(?m\ div\ ?n)\ *\ ?n\ +\ ?m\ mod\ ?n\ =\ ?m  | 
| 10295 | 2162  | 
\rulename{mod_div_equality}
 | 
2163  | 
\end{isabelle}
 | 
|
2164  | 
||
2165  | 
We refer to this law explicitly in the following proof:  | 
|
2166  | 
\begin{isabelle}
 | 
|
2167  | 
\isacommand{lemma}\ div_mult_self_is_m:\ \isanewline
 | 
|
| 10596 | 2168  | 
\ \ \ \ \ \ "0{\isacharless}n\ \isasymLongrightarrow\ (m*n)\ div\ n\ =\
 | 
2169  | 
(m::nat)"\isanewline  | 
|
2170  | 
\isacommand{apply}\ (insert\ mod_div_equality\ [of\ "m*n"\ n])\isanewline
 | 
|
| 10295 | 2171  | 
\isacommand{apply}\ (simp)\isanewline
 | 
2172  | 
\isacommand{done}
 | 
|
2173  | 
\end{isabelle}
 | 
|
2174  | 
The first step inserts the law, specifying \isa{m*n} and
 | 
|
| 10301 | 2175  | 
\isa{n} for its variables.  Notice that non-trivial expressions must be
 | 
| 10295 | 2176  | 
enclosed in quotation marks. Here is the resulting  | 
2177  | 
subgoal, with its new assumption:  | 
|
2178  | 
\begin{isabelle}
 | 
|
2179  | 
%0\ \isacharless\ n\ \isasymLongrightarrow\ (m\  | 
|
| 10596 | 2180  | 
%*\ n)\ div\ n\ =\ m\isanewline  | 
| 10295 | 2181  | 
\ 1.\ \isasymlbrakk0\ \isacharless\  | 
| 10596 | 2182  | 
n;\ \ (m\ *\ n)\ div\ n\ *\ n\ +\ (m\ *\ n)\ mod\ n\  | 
2183  | 
=\ m\ *\ n\isasymrbrakk\isanewline  | 
|
2184  | 
\ \ \ \ \isasymLongrightarrow\ (m\ *\ n)\ div\ n\  | 
|
| 10295 | 2185  | 
=\ m  | 
2186  | 
\end{isabelle}
 | 
|
| 10596 | 2187  | 
Simplification reduces \isa{(m\ *\ n)\ mod\ n} to zero.
 | 
| 10295 | 2188  | 
Then it cancels the factor~\isa{n} on both
 | 
| 11406 | 2189  | 
sides of the equation \isa{(m\ *\ n)\ div\ n\ *\ n\ =\ m\ *\ n}, proving the
 | 
2190  | 
theorem.  | 
|
2191  | 
||
2192  | 
\begin{warn}
 | 
|
2193  | 
Any unknowns in the theorem given to \methdx{insert} will be universally
 | 
|
2194  | 
quantified in the new assumption.  | 
|
2195  | 
\end{warn}%
 | 
|
2196  | 
\index{*insert (method)|)}
 | 
|
| 10295 | 2197  | 
|
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2198  | 
\subsection{The Method {\tt\slshape subgoal_tac}}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2199  | 
|
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2200  | 
\index{*subgoal_tac (method)}%
 | 
| 11406 | 2201  | 
A related method is \isa{subgoal_tac}, but instead
 | 
| 11077 | 2202  | 
of inserting a theorem as an assumption, it inserts an arbitrary formula.  | 
| 10295 | 2203  | 
This formula must be proved later as a separate subgoal. The  | 
2204  | 
idea is to claim that the formula holds on the basis of the current  | 
|
2205  | 
assumptions, to use this claim to complete the proof, and finally  | 
|
| 11406 | 2206  | 
to justify the claim. It gives the proof  | 
2207  | 
some structure. If you find yourself generating a complex assumption by a  | 
|
2208  | 
long series of forward steps, consider using \isa{subgoal_tac} instead: you can
 | 
|
2209  | 
state the formula you are aiming for, and perhaps prove it automatically.  | 
|
| 10295 | 2210  | 
|
2211  | 
Look at the following example.  | 
|
2212  | 
\begin{isabelle}
 | 
|
| 
12156
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
2213  | 
\isacommand{lemma}\ "\isasymlbrakk(z::int)\ <\ 37;\ 66\ <\ 2*z;\ z*z\
 | 
| 
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
2214  | 
\isasymnoteq\ 1225;\ Q(34);\ Q(36)\isasymrbrakk\isanewline  | 
| 10295 | 2215  | 
\ \ \ \ \ \ \ \ \,\isasymLongrightarrow\ Q(z)"\isanewline  | 
| 
12156
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
2216  | 
\isacommand{apply}\ (subgoal_tac\ "z\ =\ 34\ \isasymor\ z\ =\
 | 
| 
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
2217  | 
36")\isanewline  | 
| 10295 | 2218  | 
\isacommand{apply}\ blast\isanewline
 | 
| 
12156
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
2219  | 
\isacommand{apply}\ (subgoal_tac\ "z\ \isasymnoteq\ 35")\isanewline
 | 
| 10295 | 2220  | 
\isacommand{apply}\ arith\isanewline
 | 
2221  | 
\isacommand{apply}\ force\isanewline
 | 
|
2222  | 
\isacommand{done}
 | 
|
2223  | 
\end{isabelle}
 | 
|
| 11406 | 2224  | 
The first assumption tells us  | 
2225  | 
that \isa{z} is no greater than~36. The second tells us that \isa{z} 
 | 
|
2226  | 
is at least~34. The third assumption tells us that \isa{z} cannot be 35, since
 | 
|
2227  | 
$35\times35=1225$.  So \isa{z} is either 34 or~36, and since \isa{Q} holds for
 | 
|
| 10295 | 2228  | 
both of those values, we have the conclusion.  | 
2229  | 
||
2230  | 
The Isabelle proof closely follows this reasoning. The first  | 
|
2231  | 
step is to claim that \isa{z} is either 34 or 36. The resulting proof 
 | 
|
2232  | 
state gives us two subgoals:  | 
|
2233  | 
\begin{isabelle}
 | 
|
| 
12156
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
2234  | 
%\isasymlbrakk z\ <\ 37;\ 66\ <\ 2\ *\ z;\ z\ *\ z\ \isasymnoteq\ 1225;\  | 
| 
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
2235  | 
%Q\ 34;\ Q\ 36\isasymrbrakk\ \isasymLongrightarrow\ Q\ z\isanewline  | 
| 
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
2236  | 
\ 1.\ \isasymlbrakk z\ <\ 37;\ 66\ <\ 2\ *\ z;\ z\ *\ z\ \isasymnoteq\ 1225;\ Q\ 34;\ Q\ 36;\isanewline  | 
| 
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
2237  | 
\ \ \ \ \ z\ =\ 34\ \isasymor\ z\ =\ 36\isasymrbrakk\isanewline  | 
| 10295 | 2238  | 
\ \ \ \ \isasymLongrightarrow\ Q\ z\isanewline  | 
| 
12156
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
2239  | 
\ 2.\ \isasymlbrakk z\ <\ 37;\ 66\ <\ 2\ *\ z;\ z\ *\ z\ \isasymnoteq\ 1225;\ Q\ 34;\ Q\ 36\isasymrbrakk\isanewline  | 
| 
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
2240  | 
\ \ \ \ \isasymLongrightarrow\ z\ =\ 34\ \isasymor\ z\ =\ 36  | 
| 10295 | 2241  | 
\end{isabelle}
 | 
| 10971 | 2242  | 
The first subgoal is trivial (\isa{blast}), but for the second Isabelle needs help to eliminate
 | 
| 10295 | 2243  | 
the case  | 
| 10596 | 2244  | 
\isa{z}=35.  The second invocation  of {\isa{subgoal_tac}} leaves two
 | 
| 10295 | 2245  | 
subgoals:  | 
2246  | 
\begin{isabelle}
 | 
|
| 
12156
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
2247  | 
\ 1.\ \isasymlbrakk z\ <\ 37;\ 66\ <\ 2\ *\ z;\ z\ *\ z\ \isasymnoteq\  | 
| 
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
2248  | 
1225;\ Q\ 34;\ Q\ 36;\isanewline  | 
| 
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
2249  | 
\ \ \ \ \ z\ \isasymnoteq\ 35\isasymrbrakk\isanewline  | 
| 
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
2250  | 
\ \ \ \ \isasymLongrightarrow\ z\ =\ 34\ \isasymor\ z\ =\ 36\isanewline  | 
| 
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
2251  | 
\ 2.\ \isasymlbrakk z\ <\ 37;\ 66\ <\ 2\ *\ z;\ z\ *\ z\ \isasymnoteq\ 1225;\ Q\ 34;\ Q\ 36\isasymrbrakk\isanewline  | 
| 
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
2252  | 
\ \ \ \ \isasymLongrightarrow\ z\ \isasymnoteq\ 35  | 
| 10295 | 2253  | 
\end{isabelle}
 | 
2254  | 
||
| 10971 | 2255  | 
Assuming that \isa{z} is not 35, the first subgoal follows by linear arithmetic
 | 
2256  | 
(\isa{arith}). For the second subgoal we apply the method \isa{force}, 
 | 
|
| 10295 | 2257  | 
which proceeds by assuming that \isa{z}=35 and arriving at a contradiction.
 | 
2258  | 
||
2259  | 
||
2260  | 
\medskip  | 
|
2261  | 
Summary of these methods:  | 
|
2262  | 
\begin{itemize}
 | 
|
| 11406 | 2263  | 
\item \methdx{insert} adds a theorem as a new assumption
 | 
2264  | 
\item \methdx{subgoal_tac} adds a formula as a new assumption and leaves the
 | 
|
| 10295 | 2265  | 
subgoal of proving that formula  | 
2266  | 
\end{itemize}
 | 
|
| 11077 | 2267  | 
\index{forward proof|)}
 | 
| 10967 | 2268  | 
|
2269  | 
||
2270  | 
\section{Managing Large Proofs}
 | 
|
2271  | 
||
2272  | 
Naturally you should try to divide proofs into manageable parts. Look for lemmas  | 
|
2273  | 
that can be proved separately. Sometimes you will observe that they are  | 
|
2274  | 
instances of much simpler facts. On other occasions, no lemmas suggest themselves  | 
|
2275  | 
and you are forced to cope with a long proof involving many subgoals.  | 
|
2276  | 
||
2277  | 
\subsection{Tacticals, or Control Structures}
 | 
|
2278  | 
||
| 11406 | 2279  | 
\index{tacticals|(}%
 | 
| 10967 | 2280  | 
If the proof is long, perhaps it at least has some regularity. Then you can  | 
| 11406 | 2281  | 
express it more concisely using \textbf{tacticals}, which provide control
 | 
| 10967 | 2282  | 
structures. Here is a proof (it would be a one-liner using  | 
2283  | 
\isa{blast}, but forget that) that contains a series of repeated
 | 
|
2284  | 
commands:  | 
|
2285  | 
%  | 
|
2286  | 
\begin{isabelle}
 | 
|
2287  | 
\isacommand{lemma}\ "\isasymlbrakk P\isasymlongrightarrow Q;\
 | 
|
2288  | 
Q\isasymlongrightarrow R;\ R\isasymlongrightarrow S;\ P\isasymrbrakk \  | 
|
2289  | 
\isasymLongrightarrow \ S"\isanewline  | 
|
2290  | 
\isacommand{apply}\ (drule\ mp,\ assumption)\isanewline
 | 
|
2291  | 
\isacommand{apply}\ (drule\ mp,\ assumption)\isanewline
 | 
|
2292  | 
\isacommand{apply}\ (drule\ mp,\ assumption)\isanewline
 | 
|
2293  | 
\isacommand{apply}\ (assumption)\isanewline
 | 
|
2294  | 
\isacommand{done}
 | 
|
2295  | 
\end{isabelle}
 | 
|
2296  | 
%  | 
|
2297  | 
Each of the three identical commands finds an implication and proves its  | 
|
2298  | 
antecedent by assumption.  The first one finds \isa{P\isasymlongrightarrow Q} and
 | 
|
2299  | 
\isa{P}, concluding~\isa{Q}; the second one concludes~\isa{R} and the third one
 | 
|
2300  | 
concludes~\isa{S}.  The final step matches the assumption \isa{S} with the goal to
 | 
|
2301  | 
be proved.  | 
|
2302  | 
||
| 11406 | 2303  | 
Suffixing a method with a plus sign~(\isa+)\index{*"+ (tactical)}
 | 
| 10967 | 2304  | 
expresses one or more repetitions:  | 
2305  | 
\begin{isabelle}
 | 
|
2306  | 
\isacommand{lemma}\ "\isasymlbrakk P\isasymlongrightarrow Q;\ Q\isasymlongrightarrow R;\ R\isasymlongrightarrow S;\ P\isasymrbrakk \ \isasymLongrightarrow \ S"\isanewline
 | 
|
2307  | 
\isacommand{by}\ (drule\ mp,\ assumption)+
 | 
|
2308  | 
\end{isabelle}
 | 
|
2309  | 
%  | 
|
2310  | 
Using \isacommand{by} takes care of the final use of \isa{assumption}.  The new
 | 
|
2311  | 
proof is more concise. It is also more general: the repetitive method works  | 
|
2312  | 
for a chain of implications having any length, not just three.  | 
|
2313  | 
||
2314  | 
Choice is another control structure. Separating two methods by a vertical  | 
|
| 11406 | 2315  | 
% we must use ?? rather than "| as the sorting item because somehow the presence  | 
2316  | 
% of | (even quoted) stops hyperref from putting |hyperpage at the end of the index  | 
|
2317  | 
% entry.  | 
|
2318  | 
bar~(\isa|)\index{??@\texttt{"|} (tactical)}  gives the effect of applying the
 | 
|
2319  | 
first method, and if that fails, trying the second. It can be combined with  | 
|
2320  | 
repetition, when the choice must be made over and over again. Here is a chain of  | 
|
2321  | 
implications in which most of the antecedents are proved by assumption, but one is  | 
|
2322  | 
proved by arithmetic:  | 
|
| 10967 | 2323  | 
\begin{isabelle}
 | 
| 
12156
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
2324  | 
\isacommand{lemma}\ "\isasymlbrakk Q\isasymlongrightarrow R;\ P\isasymlongrightarrow Q;\ x<5\isasymlongrightarrow P;\
 | 
| 
 
d2758965362e
new-style numerals without leading #, along with generic 0 and 1
 
paulson 
parents: 
11494 
diff
changeset
 | 
2325  | 
Suc\ x\ <\ 5\isasymrbrakk \ \isasymLongrightarrow \ R"\ \isanewline  | 
| 10967 | 2326  | 
\isacommand{by}\ (drule\ mp,\ (assumption|arith))+
 | 
2327  | 
\end{isabelle}
 | 
|
2328  | 
The \isa{arith}
 | 
|
2329  | 
method can prove $x<5$ from $x+1<5$, but it cannot duplicate the effect of  | 
|
2330  | 
\isa{assumption}.  Therefore, we combine these methods using the choice
 | 
|
2331  | 
operator.  | 
|
2332  | 
||
| 11406 | 2333  | 
A postfixed question mark~(\isa?)\index{*"? (tactical)} expresses zero or one
 | 
2334  | 
repetitions of a method. It can also be viewed as the choice between executing a  | 
|
| 12540 | 2335  | 
method and doing nothing. It is useless at top level but can be valuable  | 
2336  | 
within other control structures; for example,  | 
|
2337  | 
\isa{($m$+)?} performs zero or more repetitions of method~$m$.%
 | 
|
| 11406 | 2338  | 
\index{tacticals|)}
 | 
| 10967 | 2339  | 
|
2340  | 
||
2341  | 
\subsection{Subgoal Numbering}
 | 
|
2342  | 
||
2343  | 
Another problem in large proofs is contending with huge  | 
|
2344  | 
subgoals or many subgoals. Induction can produce a proof state that looks  | 
|
2345  | 
like this:  | 
|
2346  | 
\begin{isabelle}
 | 
|
2347  | 
\ 1.\ bigsubgoal1\isanewline  | 
|
2348  | 
\ 2.\ bigsubgoal2\isanewline  | 
|
2349  | 
\ 3.\ bigsubgoal3\isanewline  | 
|
2350  | 
\ 4.\ bigsubgoal4\isanewline  | 
|
2351  | 
\ 5.\ bigsubgoal5\isanewline  | 
|
2352  | 
\ 6.\ bigsubgoal6  | 
|
2353  | 
\end{isabelle}
 | 
|
2354  | 
If each \isa{bigsubgoal} is 15 lines or so, the proof state will be too big to
 | 
|
2355  | 
scroll through. By default, Isabelle displays at most 10 subgoals. The  | 
|
| 11406 | 2356  | 
\commdx{pr} command lets you change this limit:
 | 
| 10967 | 2357  | 
\begin{isabelle}
 | 
2358  | 
\isacommand{pr}\ 2\isanewline
 | 
|
2359  | 
\ 1.\ bigsubgoal1\isanewline  | 
|
2360  | 
\ 2.\ bigsubgoal2\isanewline  | 
|
2361  | 
A total of 6 subgoals...  | 
|
2362  | 
\end{isabelle}
 | 
|
2363  | 
||
2364  | 
\medskip  | 
|
2365  | 
All methods apply to the first subgoal.  | 
|
2366  | 
Sometimes, not only in a large proof, you may want to focus on some other  | 
|
2367  | 
subgoal.  Then you should try the commands \isacommand{defer} or \isacommand{prefer}.
 | 
|
2368  | 
||
2369  | 
In the following example, the first subgoal looks hard, while the others  | 
|
2370  | 
look as if \isa{blast} alone could prove them:
 | 
|
2371  | 
\begin{isabelle}
 | 
|
2372  | 
\ 1.\ hard\isanewline  | 
|
2373  | 
\ 2.\ \isasymnot \ \isasymnot \ P\ \isasymLongrightarrow \ P\isanewline  | 
|
2374  | 
\ 3.\ Q\ \isasymLongrightarrow \ Q%  | 
|
2375  | 
\end{isabelle}
 | 
|
2376  | 
%  | 
|
| 11406 | 2377  | 
The \commdx{defer} command moves the first subgoal into the last position.
 | 
| 10967 | 2378  | 
\begin{isabelle}
 | 
2379  | 
\isacommand{defer}\ 1\isanewline
 | 
|
2380  | 
\ 1.\ \isasymnot \ \isasymnot \ P\ \isasymLongrightarrow \ P\isanewline  | 
|
2381  | 
\ 2.\ Q\ \isasymLongrightarrow \ Q\isanewline  | 
|
2382  | 
\ 3.\ hard%  | 
|
2383  | 
\end{isabelle}
 | 
|
2384  | 
%  | 
|
2385  | 
Now we apply \isa{blast} repeatedly to the easy subgoals:
 | 
|
2386  | 
\begin{isabelle}
 | 
|
2387  | 
\isacommand{apply}\ blast+\isanewline
 | 
|
2388  | 
\ 1.\ hard%  | 
|
2389  | 
\end{isabelle}
 | 
|
2390  | 
Using \isacommand{defer}, we have cleared away the trivial parts of the proof so
 | 
|
2391  | 
that we can devote attention to the difficult part.  | 
|
2392  | 
||
2393  | 
\medskip  | 
|
| 11406 | 2394  | 
The \commdx{prefer} command moves the specified subgoal into the
 | 
| 10967 | 2395  | 
first position. For example, if you suspect that one of your subgoals is  | 
2396  | 
invalid (not a theorem), then you should investigate that subgoal first. If it  | 
|
2397  | 
cannot be proved, then there is no point in proving the other subgoals.  | 
|
2398  | 
\begin{isabelle}
 | 
|
2399  | 
\ 1.\ ok1\isanewline  | 
|
2400  | 
\ 2.\ ok2\isanewline  | 
|
2401  | 
\ 3.\ doubtful%  | 
|
2402  | 
\end{isabelle}
 | 
|
2403  | 
%  | 
|
2404  | 
We decide to work on the third subgoal.  | 
|
2405  | 
\begin{isabelle}
 | 
|
2406  | 
\isacommand{prefer}\ 3\isanewline
 | 
|
2407  | 
\ 1.\ doubtful\isanewline  | 
|
2408  | 
\ 2.\ ok1\isanewline  | 
|
2409  | 
\ 3.\ ok2  | 
|
2410  | 
\end{isabelle}
 | 
|
2411  | 
If we manage to prove \isa{doubtful}, then we can work on the other
 | 
|
2412  | 
subgoals, confident that we are not wasting our time. Finally we revise the  | 
|
2413  | 
proof script to remove the \isacommand{prefer} command, since we needed it only to
 | 
|
2414  | 
focus our exploration. The previous example is different: its use of  | 
|
2415  | 
\isacommand{defer} stops trivial subgoals from cluttering the rest of the
 | 
|
2416  | 
proof.  Even there, we should consider proving \isa{hard} as a preliminary
 | 
|
2417  | 
lemma. Always seek ways to streamline your proofs.  | 
|
2418  | 
||
2419  | 
||
2420  | 
\medskip  | 
|
2421  | 
Summary:  | 
|
2422  | 
\begin{itemize}
 | 
|
2423  | 
\item the control structures \isa+, \isa? and \isa| help express complicated proofs  | 
|
2424  | 
\item the \isacommand{pr} command can limit the number of subgoals to display
 | 
|
2425  | 
\item the \isacommand{defer} and \isacommand{prefer} commands move a 
 | 
|
2426  | 
subgoal to the last or first position  | 
|
2427  | 
\end{itemize}
 | 
|
2428  | 
||
2429  | 
\begin{exercise}
 | 
|
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2430  | 
Explain the use of \isa? and \isa+ in this proof.  | 
| 10967 | 2431  | 
\begin{isabelle}
 | 
2432  | 
\isacommand{lemma}\ "\isasymlbrakk P\isasymand Q\isasymlongrightarrow R;\ P\isasymlongrightarrow Q;\ P\isasymrbrakk \ \isasymLongrightarrow \ R"\isanewline
 | 
|
2433  | 
\isacommand{by}\ (drule\ mp,\ intro?,\ assumption+)+
 | 
|
2434  | 
\end{isabelle}
 | 
|
2435  | 
\end{exercise}
 | 
|
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2436  | 
|
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2437  | 
|
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2438  | 
|
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2439  | 
\section{Proving the Correctness of Euclid's Algorithm}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2440  | 
\label{sec:proving-euclid}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2441  | 
|
| 11406 | 2442  | 
\index{Euclid's algorithm|(}\index{*gcd (constant)|(}\index{divides relation|(}%
 | 
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2443  | 
A brief development will demonstrate the techniques of this chapter,  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2444  | 
including \isa{blast} applied with additional rules.  We shall also see
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2445  | 
\isa{case_tac} used to perform a Boolean case split.
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2446  | 
|
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2447  | 
Let us prove that \isa{gcd} computes the greatest common
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2448  | 
divisor of its two arguments.  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2449  | 
%  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2450  | 
We use induction: \isa{gcd.induct} is the
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2451  | 
induction rule returned by \isa{recdef}.  We simplify using
 | 
| 11428 | 2452  | 
rules proved in {\S}\ref{sec:recdef-simplification}, since rewriting by the
 | 
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2453  | 
definition of \isa{gcd} can loop.
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2454  | 
\begin{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2455  | 
\isacommand{lemma}\ gcd_dvd_both:\ "(gcd(m,n)\ dvd\ m)\ \isasymand\ (gcd(m,n)\ dvd\
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2456  | 
n)"  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2457  | 
\end{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2458  | 
The induction formula must be a conjunction. In the  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2459  | 
inductive step, each conjunct establishes the other.  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2460  | 
\begin{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2461  | 
\isacommand{apply}\ (induct_tac\ m\ n\ rule:\ gcd.induct)\isanewline
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2462  | 
\ 1.\ \isasymAnd m\ n.\ n\ \isasymnoteq \ 0\ \isasymlongrightarrow \isanewline  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2463  | 
\isaindent{\ 1.\ \isasymAnd m\ n.\ }gcd\ (n,\ m\ mod\ n)\ dvd\ n\ \isasymand
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2464  | 
\ gcd\ (n,\ m\ mod\ n)\ dvd\ m\ mod\ n\isanewline  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2465  | 
\isaindent{\ 1.\ \isasymAnd m\ n.\ }\isasymLongrightarrow\ gcd\ (m,\ n)\
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2466  | 
dvd\ m\ \isasymand \ gcd\ (m,\ n)\ dvd\ n%  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2467  | 
\end{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2468  | 
|
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2469  | 
The conditional induction hypothesis suggests doing a case  | 
| 11406 | 2470  | 
analysis on \isa{n=0}.  We apply \methdx{case_tac} with type
 | 
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2471  | 
\isa{bool} --- and not with a datatype, as we have done until now.  Since
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2472  | 
\isa{nat} is a datatype, we could have written
 | 
| 12535 | 2473  | 
\isa{case_tac~n} instead of \isa{case_tac~"n=0"}.  However, the definition
 | 
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2474  | 
of \isa{gcd} makes a Boolean decision:
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2475  | 
\begin{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2476  | 
\ \ \ \ "gcd\ (m,n)\ =\ (if\ n=0\ then\ m\ else\ gcd(n,\ m\ mod\ n))"  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2477  | 
\end{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2478  | 
Proofs about a function frequently follow the function's definition, so we perform  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2479  | 
case analysis over the same formula.  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2480  | 
\begin{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2481  | 
\isacommand{apply}\ (case_tac\ "n=0")\isanewline
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2482  | 
\ 1.\ \isasymAnd m\ n.\ \isasymlbrakk n\ \isasymnoteq \ 0\ \isasymlongrightarrow \isanewline  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2483  | 
\isaindent{\ 1.\ \isasymAnd m\ n.\ \isasymlbrakk }gcd\ (n,\ m\ mod\ n)\ dvd\ n\ \isasymand \ gcd\ (n,\ m\ mod\ n)\ dvd\ m\ mod\ n;\isanewline
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2484  | 
\isaindent{\ 1.\ \isasymAnd m\ n.\ \ }n\ =\ 0\isasymrbrakk \isanewline
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2485  | 
\isaindent{\ 1.\ \isasymAnd m\ n.\ }\isasymLongrightarrow \ gcd\ (m,\ n)\ dvd\ m\ \isasymand \ gcd\ (m,\ n)\ dvd\ n\isanewline
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2486  | 
\ 2.\ \isasymAnd m\ n.\ \isasymlbrakk n\ \isasymnoteq \ 0\ \isasymlongrightarrow \isanewline  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2487  | 
\isaindent{\ 2.\ \isasymAnd m\ n.\ \isasymlbrakk }gcd\ (n,\ m\ mod\ n)\ dvd\ n\ \isasymand \ gcd\ (n,\ m\ mod\ n)\ dvd\ m\ mod\ n;\isanewline
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2488  | 
\isaindent{\ 2.\ \isasymAnd m\ n.\ \ }n\ \isasymnoteq \ 0\isasymrbrakk
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2489  | 
\isanewline  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2490  | 
\isaindent{\ 2.\ \isasymAnd m\ n.\ }\isasymLongrightarrow \ gcd\ (m,\ n)\ dvd\ m\ \isasymand \ gcd\ (m,\ n)\ dvd\ n%
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2491  | 
\end{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2492  | 
%  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2493  | 
Simplification leaves one subgoal:  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2494  | 
\begin{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2495  | 
\isacommand{apply}\ (simp_all)\isanewline
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2496  | 
\ 1.\ \isasymAnd m\ n.\ \isasymlbrakk 0\ <\ n;\isanewline  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2497  | 
\isaindent{\ 1.\ \isasymAnd m\ n.\ \ }gcd\ (n,\ m\ mod\ n)\ dvd\ n\
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2498  | 
\isasymand \ gcd\ (n,\ m\ mod\ n)\ dvd\ m\ mod\  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2499  | 
n\isasymrbrakk \isanewline  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2500  | 
\isaindent{\ 1.\ \isasymAnd m\ n.\ }\isasymLongrightarrow \ gcd\ (n,\ m\ mod\ n)\ dvd\ m%
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2501  | 
\end{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2502  | 
%  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2503  | 
Here, we can use \isa{blast}.  
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2504  | 
One of the assumptions, the induction hypothesis, is a conjunction.  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2505  | 
The two divides relationships it asserts are enough to prove  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2506  | 
the conclusion, for we have the following theorem at our disposal:  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2507  | 
\begin{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2508  | 
\isasymlbrakk?k\ dvd\ (?m\ mod\ ?n){;}\ ?k\ dvd\ ?n\isasymrbrakk\ \isasymLongrightarrow\ ?k\ dvd\ ?m%
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2509  | 
\rulename{dvd_mod_imp_dvd}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2510  | 
\end{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2511  | 
%  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2512  | 
This theorem can be applied in various ways. As an introduction rule, it  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2513  | 
would cause backward chaining from the conclusion (namely  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2514  | 
\isa{?k~dvd~?m}) to the two premises, which 
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2515  | 
also involve the divides relation. This process does not look promising  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2516  | 
and could easily loop. More sensible is to apply the rule in the forward  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2517  | 
direction; each step would eliminate an occurrence of the \isa{mod} symbol, so the
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2518  | 
process must terminate.  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2519  | 
\begin{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2520  | 
\isacommand{apply}\ (blast\ dest:\ dvd_mod_imp_dvd)\isanewline
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2521  | 
\isacommand{done}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2522  | 
\end{isabelle}
 | 
| 11406 | 2523  | 
Attaching the \attrdx{dest} attribute to \isa{dvd_mod_imp_dvd} tells
 | 
2524  | 
\isa{blast} to use it as destruction rule; that is, in the forward direction.
 | 
|
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2525  | 
|
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2526  | 
\medskip  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2527  | 
We have proved a conjunction. Now, let us give names to each of the  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2528  | 
two halves:  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2529  | 
\begin{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2530  | 
\isacommand{lemmas}\ gcd_dvd1\ [iff]\ =\ gcd_dvd_both\ [THEN\ conjunct1]\isanewline
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2531  | 
\isacommand{lemmas}\ gcd_dvd2\ [iff]\ =\ gcd_dvd_both\ [THEN\ conjunct2]%
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2532  | 
\end{isabelle}
 | 
| 11406 | 2533  | 
Here we see \commdx{lemmas}
 | 
2534  | 
used with the \attrdx{iff} attribute, which supplies the new theorems to the
 | 
|
2535  | 
classical reasoner and the simplifier.  Recall that \attrdx{THEN} is
 | 
|
| 
11080
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2536  | 
frequently used with destruction rules; \isa{THEN conjunct1} extracts the
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2537  | 
first half of a conjunctive theorem.  Given \isa{gcd_dvd_both} it yields
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2538  | 
\begin{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2539  | 
\ \ \ \ \ gcd\ (?m1,\ ?n1)\ dvd\ ?m1  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2540  | 
\end{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2541  | 
The variable names \isa{?m1} and \isa{?n1} arise because
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2542  | 
Isabelle renames schematic variables to prevent  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2543  | 
clashes.  The second \isacommand{lemmas} declaration yields
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2544  | 
\begin{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2545  | 
\ \ \ \ \ gcd\ (?m1,\ ?n1)\ dvd\ ?n1  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2546  | 
\end{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2547  | 
|
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2548  | 
\medskip  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2549  | 
To complete the verification of the \isa{gcd} function, we must 
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2550  | 
prove that it returns the greatest of all the common divisors  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2551  | 
of its arguments. The proof is by induction, case analysis and simplification.  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2552  | 
\begin{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2553  | 
\isacommand{lemma}\ gcd_greatest\
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2554  | 
[rule_format]:\isanewline  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2555  | 
\ \ \ \ \ \ \ "k\ dvd\ m\ \isasymlongrightarrow\ k\ dvd\ n\ \isasymlongrightarrow\  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2556  | 
k\ dvd\ gcd(m,n)"  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2557  | 
\end{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2558  | 
%  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2559  | 
The goal is expressed using HOL implication,  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2560  | 
\isa{\isasymlongrightarrow}, because the induction affects the two
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2561  | 
preconditions.  The directive \isa{rule_format} tells Isabelle to replace
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2562  | 
each \isa{\isasymlongrightarrow} by \isa{\isasymLongrightarrow} before
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2563  | 
storing the eventual theorem. This directive can also remove outer  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2564  | 
universal quantifiers, converting the theorem into the usual format for  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2565  | 
inference rules. It can replace any series of applications of  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2566  | 
\isa{THEN} to the rules \isa{mp} and \isa{spec}.  We did not have to
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2567  | 
write this:  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2568  | 
\begin{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2569  | 
\ \ \ \ \ \isacommand{lemma}\ gcd_greatest\
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2570  | 
[THEN mp, THEN mp]:\isanewline  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2571  | 
\ \ \ \ \ \ \ \ \ \ \ \ "k\ dvd\ m\ \isasymlongrightarrow\ k\ dvd\ n\  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2572  | 
\isasymlongrightarrow\ k\ dvd\ gcd(m,n)"  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2573  | 
\end{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2574  | 
|
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2575  | 
Because we are again reasoning about \isa{gcd}, we perform the same
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2576  | 
induction and case analysis as in the previous proof:  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2577  | 
\begingroup\samepage  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2578  | 
\begin{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2579  | 
\isacommand{apply}\ (induct_tac\ m\ n\ rule:\ gcd.induct)\isanewline
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2580  | 
\isacommand{apply}\ (case_tac\ "n=0")\isanewline
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2581  | 
\ 1.\ \isasymAnd m\ n.\ \isasymlbrakk n\ \isasymnoteq \ 0\  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2582  | 
\isasymlongrightarrow \isanewline  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2583  | 
\isaindent{\ 1.\ \isasymAnd m\ n.\ \isasymlbrakk }k\ dvd\ n\ \isasymlongrightarrow \ k\ dvd\ m\ mod\ n\ \isasymlongrightarrow \ k\ dvd\ gcd\ (n,\ m\ mod\ n);\isanewline
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2584  | 
\isaindent{\ 1.\ \isasymAnd m\ n.\ \ }n\ =\ 0\isasymrbrakk \isanewline
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2585  | 
\isaindent{\ 1.\ \isasymAnd m\ n.\ }\isasymLongrightarrow \ k\ dvd\ m\ \isasymlongrightarrow \ k\ dvd\ n\ \isasymlongrightarrow \ k\ dvd\ gcd\ (m,\ n)\isanewline
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2586  | 
\ 2.\ \isasymAnd m\ n.\ \isasymlbrakk n\ \isasymnoteq \ 0\ \isasymlongrightarrow \isanewline  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2587  | 
\isaindent{\ 2.\ \isasymAnd m\ n.\ \isasymlbrakk }k\ dvd\ n\ \isasymlongrightarrow \ k\ dvd\ m\ mod\ n\ \isasymlongrightarrow \ k\ dvd\ gcd\ (n,\ m\ mod\ n);\isanewline
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2588  | 
\isaindent{\ 2.\ \isasymAnd m\ n.\ \ }n\ \isasymnoteq \ 0\isasymrbrakk
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2589  | 
\isanewline  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2590  | 
\isaindent{\ 2.\ \isasymAnd m\ n.\ }\isasymLongrightarrow \ k\ dvd\ m\ \isasymlongrightarrow \ k\ dvd\ n\ \isasymlongrightarrow \ k\ dvd\ gcd\ (m,\ n)
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2591  | 
\end{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2592  | 
\endgroup  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2593  | 
|
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2594  | 
\noindent Simplification proves both subgoals.  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2595  | 
\begin{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2596  | 
\isacommand{apply}\ (simp_all\ add:\ dvd_mod)\isanewline
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2597  | 
\isacommand{done}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2598  | 
\end{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2599  | 
In the first, where \isa{n=0}, the implication becomes trivial: \isa{k\ dvd\
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2600  | 
gcd\ (m,\ n)} goes to~\isa{k\ dvd\ m}.  The second subgoal is proved by
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2601  | 
an unfolding of \isa{gcd}, using this rule about divides:
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2602  | 
\begin{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2603  | 
\isasymlbrakk ?f\ dvd\ ?m;\ ?f\ dvd\ ?n\isasymrbrakk \  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2604  | 
\isasymLongrightarrow \ ?f\ dvd\ ?m\ mod\ ?n%  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2605  | 
\rulename{dvd_mod}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2606  | 
\end{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2607  | 
|
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2608  | 
|
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2609  | 
\medskip  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2610  | 
The facts proved above can be summarized as a single logical  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2611  | 
equivalence. This step gives us a chance to see another application  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2612  | 
of \isa{blast}.
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2613  | 
\begin{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2614  | 
\isacommand{theorem}\ gcd_greatest_iff\ [iff]:\isanewline
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2615  | 
\ \ \ \ \ \ \ \ \ "(k\ dvd\ gcd(m,n))\ =\ (k\ dvd\ m\ \isasymand\ k\ dvd\  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2616  | 
n)"\isanewline  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2617  | 
\isacommand{by}\ (blast\ intro!:\ gcd_greatest\ intro:\ dvd_trans)
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2618  | 
\end{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2619  | 
This theorem concisely expresses the correctness of the \isa{gcd} 
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2620  | 
function.  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2621  | 
We state it with the \isa{iff} attribute so that 
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2622  | 
Isabelle can use it to remove some occurrences of \isa{gcd}. 
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2623  | 
The theorem has a one-line  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2624  | 
proof using \isa{blast} supplied with two additional introduction 
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2625  | 
rules. The exclamation mark  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2626  | 
({\isa{intro}}{\isa{!}})\ signifies safe rules, which are 
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2627  | 
applied aggressively. Rules given without the exclamation mark  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2628  | 
are applied reluctantly and their uses can be undone if  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2629  | 
the search backtracks. Here the unsafe rule expresses transitivity  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2630  | 
of the divides relation:  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2631  | 
\begin{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2632  | 
\isasymlbrakk?m\ dvd\ ?n;\ ?n\ dvd\ ?p\isasymrbrakk\ \isasymLongrightarrow\ ?m\ dvd\ ?p%  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2633  | 
\rulename{dvd_trans}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2634  | 
\end{isabelle}
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2635  | 
Applying \isa{dvd_trans} as 
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2636  | 
an introduction rule entails a risk of looping, for it multiplies  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2637  | 
occurrences of the divides symbol. However, this proof relies  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2638  | 
on transitivity reasoning.  The rule {\isa{gcd\_greatest}} is safe to apply 
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2639  | 
aggressively because it yields simpler subgoals. The proof implicitly  | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2640  | 
uses \isa{gcd_dvd1} and \isa{gcd_dvd2} as safe rules, because they were
 | 
| 
 
22855d091249
various revisions in response to comments from Tobias
 
paulson 
parents: 
11077 
diff
changeset
 | 
2641  | 
declared using \isa{iff}.%
 | 
| 11406 | 2642  | 
\index{Euclid's algorithm|)}\index{*gcd (constant)|)}\index{divides relation|)}
 |