| author | wenzelm | 
| Thu, 16 Mar 2017 23:33:39 +0100 | |
| changeset 65281 | c70e7d24a16d | 
| parent 56059 | 2390391584c2 | 
| child 67406 | 23307fd33906 | 
| permissions | -rw-r--r-- | 
| 48895 | 1 | (*<*)theory Even imports Main begin | 
| 2 | ML_file "../../antiquote_setup.ML" | |
| 43564 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
42637diff
changeset | 3 | (*>*) | 
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 4 | |
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 5 | section{* The Set of Even Numbers *}
 | 
| 10314 | 6 | |
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 7 | text {*
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 8 | \index{even numbers!defining inductively|(}%
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 9 | The set of even numbers can be inductively defined as the least set | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 10 | containing 0 and closed under the operation $+2$. Obviously, | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 11 | \emph{even} can also be expressed using the divides relation (@{text dvd}). 
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 12 | We shall prove below that the two formulations coincide. On the way we | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 13 | shall examine the primary means of reasoning about inductively defined | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 14 | sets: rule induction. | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 15 | *} | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 16 | |
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 17 | subsection{* Making an Inductive Definition *}
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 18 | |
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 19 | text {*
 | 
| 23928 | 20 | Using \commdx{inductive\protect\_set}, we declare the constant @{text even} to be
 | 
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 21 | a set of natural numbers with the desired properties. | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 22 | *} | 
| 10314 | 23 | |
| 25330 | 24 | inductive_set even :: "nat set" where | 
| 25 | zero[intro!]: "0 \<in> even" | | |
| 26 | step[intro!]: "n \<in> even \<Longrightarrow> (Suc (Suc n)) \<in> even" | |
| 10314 | 27 | |
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 28 | text {*
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 29 | An inductive definition consists of introduction rules. The first one | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 30 | above states that 0 is even; the second states that if $n$ is even, then so | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 31 | is~$n+2$. Given this declaration, Isabelle generates a fixed point | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 32 | definition for @{term even} and proves theorems about it,
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 33 | thus following the definitional approach (see {\S}\ref{sec:definitional}).
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 34 | These theorems | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 35 | include the introduction rules specified in the declaration, an elimination | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 36 | rule for case analysis and an induction rule. We can refer to these | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 37 | theorems by automatically-generated names. Here are two examples: | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 38 | @{named_thms[display,indent=0] even.zero[no_vars] (even.zero) even.step[no_vars] (even.step)}
 | 
| 10314 | 39 | |
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 40 | The introduction rules can be given attributes. Here | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 41 | both rules are specified as \isa{intro!},%
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 42 | \index{intro"!@\isa {intro"!} (attribute)}
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 43 | directing the classical reasoner to | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 44 | apply them aggressively. Obviously, regarding 0 as even is safe. The | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 45 | @{text step} rule is also safe because $n+2$ is even if and only if $n$ is
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 46 | even. We prove this equivalence later. | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 47 | *} | 
| 10314 | 48 | |
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 49 | subsection{*Using Introduction Rules*}
 | 
| 10314 | 50 | |
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 51 | text {*
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 52 | Our first lemma states that numbers of the form $2\times k$ are even. | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 53 | Introduction rules are used to show that specific values belong to the | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 54 | inductive set. Such proofs typically involve | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 55 | induction, perhaps over some other inductive set. | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 56 | *} | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 57 | |
| 11705 | 58 | lemma two_times_even[intro!]: "2*k \<in> even" | 
| 12328 | 59 | apply (induct_tac k) | 
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 60 | apply auto | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 61 | done | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 62 | (*<*) | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 63 | lemma "2*k \<in> even" | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 64 | apply (induct_tac k) | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 65 | (*>*) | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 66 | txt {*
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 67 | \noindent | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 68 | The first step is induction on the natural number @{text k}, which leaves
 | 
| 10883 | 69 | two subgoals: | 
| 70 | @{subgoals[display,indent=0,margin=65]}
 | |
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 71 | Here @{text auto} simplifies both subgoals so that they match the introduction
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 72 | rules, which are then applied automatically. | 
| 10314 | 73 | |
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 74 | Our ultimate goal is to prove the equivalence between the traditional | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 75 | definition of @{text even} (using the divides relation) and our inductive
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 76 | definition. One direction of this equivalence is immediate by the lemma | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 77 | just proved, whose @{text "intro!"} attribute ensures it is applied automatically.
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 78 | *} | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 79 | (*<*)oops(*>*) | 
| 11705 | 80 | lemma dvd_imp_even: "2 dvd n \<Longrightarrow> n \<in> even" | 
| 10883 | 81 | by (auto simp add: dvd_def) | 
| 10314 | 82 | |
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 83 | subsection{* Rule Induction \label{sec:rule-induction} *}
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 84 | |
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 85 | text {*
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 86 | \index{rule induction|(}%
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 87 | From the definition of the set | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 88 | @{term even}, Isabelle has
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 89 | generated an induction rule: | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 90 | @{named_thms [display,indent=0,margin=40] even.induct [no_vars] (even.induct)}
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 91 | A property @{term P} holds for every even number provided it
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 92 | holds for~@{text 0} and is closed under the operation
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 93 | \isa{Suc(Suc \(\cdot\))}.  Then @{term P} is closed under the introduction
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 94 | rules for @{term even}, which is the least set closed under those rules. 
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 95 | This type of inductive argument is called \textbf{rule induction}. 
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 96 | |
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 97 | Apart from the double application of @{term Suc}, the induction rule above
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 98 | resembles the familiar mathematical induction, which indeed is an instance | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 99 | of rule induction; the natural numbers can be defined inductively to be | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 100 | the least set containing @{text 0} and closed under~@{term Suc}.
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 101 | |
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 102 | Induction is the usual way of proving a property of the elements of an | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 103 | inductively defined set. Let us prove that all members of the set | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 104 | @{term even} are multiples of two.
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 105 | *} | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 106 | |
| 11705 | 107 | lemma even_imp_dvd: "n \<in> even \<Longrightarrow> 2 dvd n" | 
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 108 | txt {*
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 109 | We begin by applying induction.  Note that @{text even.induct} has the form
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 110 | of an elimination rule, so we use the method @{text erule}.  We get two
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 111 | subgoals: | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 112 | *} | 
| 10314 | 113 | apply (erule even.induct) | 
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 114 | txt {*
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 115 | @{subgoals[display,indent=0]}
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 116 | We unfold the definition of @{text dvd} in both subgoals, proving the first
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 117 | one and simplifying the second: | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 118 | *} | 
| 10883 | 119 | apply (simp_all add: dvd_def) | 
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 120 | txt {*
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 121 | @{subgoals[display,indent=0]}
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 122 | The next command eliminates the existential quantifier from the assumption | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 123 | and replaces @{text n} by @{text "2 * k"}.
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 124 | *} | 
| 10314 | 125 | apply clarify | 
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 126 | txt {*
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 127 | @{subgoals[display,indent=0]}
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 128 | To conclude, we tell Isabelle that the desired value is | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 129 | @{term "Suc k"}.  With this hint, the subgoal falls to @{text simp}.
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 130 | *} | 
| 10883 | 131 | apply (rule_tac x = "Suc k" in exI, simp) | 
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 132 | (*<*)done(*>*) | 
| 10314 | 133 | |
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 134 | text {*
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 135 | Combining the previous two results yields our objective, the | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 136 | equivalence relating @{term even} and @{text dvd}. 
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 137 | % | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 138 | %we don't want [iff]: discuss? | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 139 | *} | 
| 10314 | 140 | |
| 11705 | 141 | theorem even_iff_dvd: "(n \<in> even) = (2 dvd n)" | 
| 10883 | 142 | by (blast intro: dvd_imp_even even_imp_dvd) | 
| 10314 | 143 | |
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 144 | |
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 145 | subsection{* Generalization and Rule Induction \label{sec:gen-rule-induction} *}
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 146 | |
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 147 | text {*
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 148 | \index{generalizing for induction}%
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 149 | Before applying induction, we typically must generalize | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 150 | the induction formula. With rule induction, the required generalization | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 151 | can be hard to find and sometimes requires a complete reformulation of the | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 152 | problem. In this example, our first attempt uses the obvious statement of | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 153 | the result. It fails: | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 154 | *} | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 155 | |
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 156 | lemma "Suc (Suc n) \<in> even \<Longrightarrow> n \<in> even" | 
| 10314 | 157 | apply (erule even.induct) | 
| 158 | oops | |
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 159 | (*<*) | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 160 | lemma "Suc (Suc n) \<in> even \<Longrightarrow> n \<in> even" | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 161 | apply (erule even.induct) | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 162 | (*>*) | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 163 | txt {*
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 164 | Rule induction finds no occurrences of @{term "Suc(Suc n)"} in the
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 165 | conclusion, which it therefore leaves unchanged. (Look at | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 166 | @{text even.induct} to see why this happens.)  We have these subgoals:
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 167 | @{subgoals[display,indent=0]}
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 168 | The first one is hopeless. Rule induction on | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 169 | a non-variable term discards information, and usually fails. | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 170 | How to deal with such situations | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 171 | in general is described in {\S}\ref{sec:ind-var-in-prems} below.
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 172 | In the current case the solution is easy because | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 173 | we have the necessary inverse, subtraction: | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 174 | *} | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 175 | (*<*)oops(*>*) | 
| 11705 | 176 | lemma even_imp_even_minus_2: "n \<in> even \<Longrightarrow> n - 2 \<in> even" | 
| 10314 | 177 | apply (erule even.induct) | 
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 178 | apply auto | 
| 10314 | 179 | done | 
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 180 | (*<*) | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 181 | lemma "n \<in> even \<Longrightarrow> n - 2 \<in> even" | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 182 | apply (erule even.induct) | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 183 | (*>*) | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 184 | txt {*
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 185 | This lemma is trivially inductive. Here are the subgoals: | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 186 | @{subgoals[display,indent=0]}
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 187 | The first is trivial because @{text "0 - 2"} simplifies to @{text 0}, which is
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 188 | even.  The second is trivial too: @{term "Suc (Suc n) - 2"} simplifies to
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 189 | @{term n}, matching the assumption.%
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 190 | \index{rule induction|)}  %the sequel isn't really about induction
 | 
| 10314 | 191 | |
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 192 | \medskip | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 193 | Using our lemma, we can easily prove the result we originally wanted: | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 194 | *} | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 195 | (*<*)oops(*>*) | 
| 10883 | 196 | lemma Suc_Suc_even_imp_even: "Suc (Suc n) \<in> even \<Longrightarrow> n \<in> even" | 
| 197 | by (drule even_imp_even_minus_2, simp) | |
| 10326 | 198 | |
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 199 | text {*
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 200 | We have just proved the converse of the introduction rule @{text even.step}.
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 201 | This suggests proving the following equivalence. We give it the | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 202 | \attrdx{iff} attribute because of its obvious value for simplification.
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 203 | *} | 
| 10326 | 204 | |
| 205 | lemma [iff]: "((Suc (Suc n)) \<in> even) = (n \<in> even)" | |
| 10883 | 206 | by (blast dest: Suc_Suc_even_imp_even) | 
| 10314 | 207 | |
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 208 | |
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 209 | subsection{* Rule Inversion \label{sec:rule-inversion} *}
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 210 | |
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 211 | text {*
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 212 | \index{rule inversion|(}%
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 213 | Case analysis on an inductive definition is called \textbf{rule
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 214 | inversion}. It is frequently used in proofs about operational | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 215 | semantics. It can be highly effective when it is applied | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 216 | automatically. Let us look at how rule inversion is done in | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 217 | Isabelle/HOL\@. | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 218 | |
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 219 | Recall that @{term even} is the minimal set closed under these two rules:
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 220 | @{thm [display,indent=0] even.intros [no_vars]}
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 221 | Minimality means that @{term even} contains only the elements that these
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 222 | rules force it to contain.  If we are told that @{term a}
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 223 | belongs to | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 224 | @{term even} then there are only two possibilities.  Either @{term a} is @{text 0}
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 225 | or else @{term a} has the form @{term "Suc(Suc n)"}, for some suitable @{term n}
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 226 | that belongs to | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 227 | @{term even}.  That is the gist of the @{term cases} rule, which Isabelle proves
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 228 | for us when it accepts an inductive definition: | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 229 | @{named_thms [display,indent=0,margin=40] even.cases [no_vars] (even.cases)}
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 230 | This general rule is less useful than instances of it for | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 231 | specific patterns.  For example, if @{term a} has the form
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 232 | @{term "Suc(Suc n)"} then the first case becomes irrelevant, while the second
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 233 | case tells us that @{term n} belongs to @{term even}.  Isabelle will generate
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 234 | this instance for us: | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 235 | *} | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 236 | |
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 237 | inductive_cases Suc_Suc_cases [elim!]: "Suc(Suc n) \<in> even" | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 238 | |
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 239 | text {*
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 240 | The \commdx{inductive\protect\_cases} command generates an instance of
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 241 | the @{text cases} rule for the supplied pattern and gives it the supplied name:
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 242 | @{named_thms [display,indent=0] Suc_Suc_cases [no_vars] (Suc_Suc_cases)}
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 243 | Applying this as an elimination rule yields one case where @{text even.cases}
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 244 | would yield two. Rule inversion works well when the conclusions of the | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 245 | introduction rules involve datatype constructors like @{term Suc} and @{text "#"}
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 246 | (list ``cons''); freeness reasoning discards all but one or two cases. | 
| 10314 | 247 | |
| 23842 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 248 | In the \isacommand{inductive\_cases} command we supplied an
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 249 | attribute, @{text "elim!"},
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 250 | \index{elim"!@\isa {elim"!} (attribute)}%
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 251 | indicating that this elimination rule can be | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 252 | applied aggressively. The original | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 253 | @{term cases} rule would loop if used in that manner because the
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 254 | pattern~@{term a} matches everything.
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 255 | |
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 256 | The rule @{text Suc_Suc_cases} is equivalent to the following implication:
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 257 | @{term [display,indent=0] "Suc (Suc n) \<in> even \<Longrightarrow> n \<in> even"}
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 258 | Just above we devoted some effort to reaching precisely | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 259 | this result. Yet we could have obtained it by a one-line declaration, | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 260 | dispensing with the lemma @{text even_imp_even_minus_2}. 
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 261 | This example also justifies the terminology | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 262 | \textbf{rule inversion}: the new rule inverts the introduction rule
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 263 | @{text even.step}.  In general, a rule can be inverted when the set of elements
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 264 | it introduces is disjoint from those of the other introduction rules. | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 265 | |
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 266 | For one-off applications of rule inversion, use the \methdx{ind_cases} method. 
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 267 | Here is an example: | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 268 | *} | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 269 | |
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 270 | (*<*)lemma "Suc(Suc n) \<in> even \<Longrightarrow> P"(*>*) | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 271 | apply (ind_cases "Suc(Suc n) \<in> even") | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 272 | (*<*)oops(*>*) | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 273 | |
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 274 | text {*
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 275 | The specified instance of the @{text cases} rule is generated, then applied
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 276 | as an elimination rule. | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 277 | |
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 278 | To summarize, every inductive definition produces a @{text cases} rule.  The
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 279 | \commdx{inductive\protect\_cases} command stores an instance of the
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 280 | @{text cases} rule for a given pattern.  Within a proof, the
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 281 | @{text ind_cases} method applies an instance of the @{text cases}
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 282 | rule. | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 283 | |
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 284 | The even numbers example has shown how inductive definitions can be | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 285 | used. Later examples will show that they are actually worth using.% | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 286 | \index{rule inversion|)}%
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 287 | \index{even numbers!defining inductively|)}
 | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 288 | *} | 
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 289 | |
| 
9d87177f1f89
LaTeX code is now generated directly from theory file.
 berghofe parents: 
23733diff
changeset | 290 | (*<*)end(*>*) |