doc-src/TutorialI/Inductive/Even.thy
author paulson
Tue, 24 Oct 2000 10:48:51 +0200
changeset 10315 ec30a7d15f76
parent 10314 5b36035e4dff
child 10326 d4fe5ce8a5d5
permissions -rw-r--r--
Acc example
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10314
5b36035e4dff even numbers example
paulson
parents:
diff changeset
     1
theory Even = Main:
5b36035e4dff even numbers example
paulson
parents:
diff changeset
     2
5b36035e4dff even numbers example
paulson
parents:
diff changeset
     3
text{*We begin with a simple example: the set of even numbers.  Obviously this
5b36035e4dff even numbers example
paulson
parents:
diff changeset
     4
concept can be expressed already using the divides relation (dvd).  We shall
5b36035e4dff even numbers example
paulson
parents:
diff changeset
     5
prove below that the two formulations coincide.
5b36035e4dff even numbers example
paulson
parents:
diff changeset
     6
5b36035e4dff even numbers example
paulson
parents:
diff changeset
     7
First, we declare the constant \isa{even} to be a set of natural numbers.
5b36035e4dff even numbers example
paulson
parents:
diff changeset
     8
Then, an inductive declaration gives it the desired properties.
5b36035e4dff even numbers example
paulson
parents:
diff changeset
     9
*}
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    10
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    11
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    12
consts even :: "nat set"
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    13
inductive even
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    14
intros
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    15
zero[intro!]: "0 \<in> even"
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    16
step[intro!]: "n \<in> even \<Longrightarrow> (Suc (Suc n)) \<in> even"
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    17
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    18
text{*An inductive definition consists of introduction rules.  The first one
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    19
above states that 0 is even; the second states that if $n$ is even, so is
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    20
$n+2$.  Given this declaration, Isabelle generates a fixed point definition
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    21
for \isa{even} and proves many theorems about it.  These theorems include the
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    22
introduction rules specified in the declaration, an elimination rule for case
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    23
analysis and an induction rule.  We can refer to these theorems by
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    24
automatically-generated names:
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    25
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    26
@{thm[display] even.step}
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    27
\rulename{even.step}
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    28
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    29
@{thm[display] even.induct}
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    30
\rulename{even.induct}
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    31
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    32
Attributes can be given to the introduction rules.  Here both rules are
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    33
specified as \isa{intro!}, which will cause them to be applied aggressively.
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    34
Obviously, regarding 0 as even is always safe.  The second rule is also safe
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    35
because $n+2$ is even if and only if $n$ is even.  We prove this equivalence
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    36
later.*}
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    37
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    38
text{*Our first lemma states that numbers of the form $2\times k$ are even.
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    39
Introduction rules are used to show that given values belong to the inductive
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    40
set.  Often, as here, the proof involves some other sort of induction.*}
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    41
lemma two_times_even[intro!]: "#2*k \<in> even"
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    42
apply (induct "k")
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    43
 apply auto
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    44
done
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    45
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    46
text{* The first step is induction on the natural number \isa{k}, which leaves
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    47
two subgoals:
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    48
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    49
pr(latex xsymbols symbols);
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    50
proof\ {\isacharparenleft}prove{\isacharparenright}{\isacharcolon}\ step\ {\isadigit{1}}\isanewline
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    51
\isanewline
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    52
goal\ {\isacharparenleft}lemma\ two{\isacharunderscore}times{\isacharunderscore}even{\isacharparenright}{\isacharcolon}\isanewline
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    53
{\isacharhash}{\isadigit{2}}\ {\isacharasterisk}\ k\ {\isasymin}\ even\isanewline
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    54
\ {\isadigit{1}}{\isachardot}\ {\isacharhash}{\isadigit{2}}\ {\isacharasterisk}\ {\isadigit{0}}\ {\isasymin}\ even\isanewline
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    55
\ {\isadigit{2}}{\isachardot}\ {\isasymAnd}n{\isachardot}\ {\isacharhash}{\isadigit{2}}\ {\isacharasterisk}\ n\ {\isasymin}\ even\ {\isasymLongrightarrow}\ {\isacharhash}{\isadigit{2}}\ {\isacharasterisk}\ Suc\ n\ {\isasymin}\ even
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    56
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    57
Here \isa{auto} simplifies both subgoals so that they match the introduction
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    58
rules, which then are applied automatically.  *}
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    59
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    60
text{*Our goal is to prove the equivalence between the traditional definition
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    61
of even (using the divides relation) and our inductive definition.  Half of
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    62
this equivalence is trivial using the lemma just proved, whose \isa{intro!}
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    63
attribute ensures it will be applied automatically.  *}
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    64
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    65
lemma dvd_imp_even: "#2 dvd n \<Longrightarrow> n \<in> even"
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    66
apply (auto simp add: dvd_def)
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    67
done
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    68
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    69
text{*our first rule induction!*}
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    70
lemma even_imp_dvd: "n \<in> even \<Longrightarrow> #2 dvd n"
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    71
apply (erule even.induct)
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    72
 apply simp
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    73
apply (simp add: dvd_def)
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    74
apply clarify
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    75
apply (rule_tac x = "Suc k" in exI)
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    76
apply simp
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    77
done
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    78
text{*
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    79
proof\ {\isacharparenleft}prove{\isacharparenright}{\isacharcolon}\ step\ {\isadigit{1}}\isanewline
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    80
\isanewline
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    81
goal\ {\isacharparenleft}lemma\ even{\isacharunderscore}imp{\isacharunderscore}dvd{\isacharparenright}{\isacharcolon}\isanewline
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    82
n\ {\isasymin}\ even\ {\isasymLongrightarrow}\ {\isacharhash}{\isadigit{2}}\ dvd\ n\isanewline
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    83
\ {\isadigit{1}}{\isachardot}\ {\isacharhash}{\isadigit{2}}\ dvd\ {\isadigit{0}}\isanewline
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    84
\ {\isadigit{2}}{\isachardot}\ {\isasymAnd}n{\isachardot}\ {\isasymlbrakk}n\ {\isasymin}\ even{\isacharsemicolon}\ {\isacharhash}{\isadigit{2}}\ dvd\ n{\isasymrbrakk}\ {\isasymLongrightarrow}\ {\isacharhash}{\isadigit{2}}\ dvd\ Suc\ {\isacharparenleft}Suc\ n{\isacharparenright}
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    85
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    86
proof\ {\isacharparenleft}prove{\isacharparenright}{\isacharcolon}\ step\ {\isadigit{4}}\isanewline
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    87
\isanewline
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    88
goal\ {\isacharparenleft}lemma\ even{\isacharunderscore}imp{\isacharunderscore}dvd{\isacharparenright}{\isacharcolon}\isanewline
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    89
n\ {\isasymin}\ even\ {\isasymLongrightarrow}\ {\isacharhash}{\isadigit{2}}\ dvd\ n\isanewline
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    90
\ {\isadigit{1}}{\isachardot}\ {\isasymAnd}n\ k{\isachardot}\ {\isacharhash}{\isadigit{2}}\ {\isacharasterisk}\ k\ {\isasymin}\ even\ {\isasymLongrightarrow}\ {\isasymexists}ka{\isachardot}\ Suc\ {\isacharparenleft}Suc\ {\isacharparenleft}{\isacharhash}{\isadigit{2}}\ {\isacharasterisk}\ k{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ {\isacharhash}{\isadigit{2}}\ {\isacharasterisk}\ ka
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    91
*}
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    92
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    93
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    94
text{*no iff-attribute because we don't always want to use it*}
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    95
theorem even_iff_dvd: "(n \<in> even) = (#2 dvd n)"
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    96
apply (blast intro: dvd_imp_even even_imp_dvd)
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    97
done
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    98
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    99
text{*this result ISN'T inductive...*}
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   100
lemma Suc_Suc_even_imp_even: "Suc (Suc n) \<in> even \<Longrightarrow> n \<in> even"
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   101
apply (erule even.induct)
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   102
oops
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   103
text{*
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   104
proof\ {\isacharparenleft}prove{\isacharparenright}{\isacharcolon}\ step\ {\isadigit{1}}\isanewline
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   105
\isanewline
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   106
goal\ {\isacharparenleft}lemma\ Suc{\isacharunderscore}Suc{\isacharunderscore}even{\isacharunderscore}imp{\isacharunderscore}even{\isacharparenright}{\isacharcolon}\isanewline
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   107
Suc\ {\isacharparenleft}Suc\ n{\isacharparenright}\ {\isasymin}\ even\ {\isasymLongrightarrow}\ n\ {\isasymin}\ even\isanewline
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   108
\ {\isadigit{1}}{\isachardot}\ n\ {\isasymin}\ even\isanewline
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   109
\ {\isadigit{2}}{\isachardot}\ {\isasymAnd}na{\isachardot}\ {\isasymlbrakk}na\ {\isasymin}\ even{\isacharsemicolon}\ n\ {\isasymin}\ even{\isasymrbrakk}\ {\isasymLongrightarrow}\ n\ {\isasymin}\ even
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   110
*}
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   111
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   112
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   113
text{*...so we need an inductive lemma...*}
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   114
lemma even_imp_even_minus_2: "n \<in> even \<Longrightarrow> n-#2 \<in> even"
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   115
apply (erule even.induct)
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   116
apply auto
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   117
done
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   118
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   119
text{*...and prove it in a separate step*}
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   120
lemma Suc_Suc_even_imp_even: "Suc (Suc n) \<in> even \<Longrightarrow> n \<in> even"
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   121
apply (drule even_imp_even_minus_2)
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   122
apply simp
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   123
done
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   124
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   125
lemma Suc_Suc_even_iff [iff]: "((Suc (Suc n)) \<in> even) = (n \<in> even)"
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   126
apply (blast dest: Suc_Suc_even_imp_even)
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   127
done
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   128
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   129
end
5b36035e4dff even numbers example
paulson
parents:
diff changeset
   130