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