doc-src/TutorialI/Inductive/Even.thy
author haftmann
Fri, 17 Jun 2005 16:12:49 +0200
changeset 16417 9bc16273c2d4
parent 12328 7c4ec77a8715
child 23733 3f8ad7418e55
permissions -rw-r--r--
migrated theory headers to new format
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10341
6eb91805a012 added the $Id:$ line
paulson
parents: 10326
diff changeset
     1
(* ID:         $Id$ *)
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 12328
diff changeset
     2
theory Even imports Main begin
10314
5b36035e4dff even numbers example
paulson
parents:
diff changeset
     3
5b36035e4dff even numbers example
paulson
parents:
diff changeset
     4
5b36035e4dff even numbers example
paulson
parents:
diff changeset
     5
consts even :: "nat set"
5b36035e4dff even numbers example
paulson
parents:
diff changeset
     6
inductive even
5b36035e4dff even numbers example
paulson
parents:
diff changeset
     7
intros
5b36035e4dff even numbers example
paulson
parents:
diff changeset
     8
zero[intro!]: "0 \<in> even"
5b36035e4dff even numbers example
paulson
parents:
diff changeset
     9
step[intro!]: "n \<in> even \<Longrightarrow> (Suc (Suc n)) \<in> even"
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    10
10883
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    11
text{*An inductive definition consists of introduction rules. 
10314
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    12
10326
d4fe5ce8a5d5 minor tinkering
paulson
parents: 10314
diff changeset
    13
@{thm[display] even.step[no_vars]}
10314
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    14
\rulename{even.step}
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    15
10326
d4fe5ce8a5d5 minor tinkering
paulson
parents: 10314
diff changeset
    16
@{thm[display] even.induct[no_vars]}
10314
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    17
\rulename{even.induct}
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    18
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    19
Attributes can be given to the introduction rules.  Here both rules are
10883
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    20
specified as \isa{intro!}
10314
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    21
10883
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    22
Our first lemma states that numbers of the form $2\times k$ are even. *}
11705
ac8ca15c556c fixed numerals;
wenzelm
parents: 10883
diff changeset
    23
lemma two_times_even[intro!]: "2*k \<in> even"
12328
7c4ec77a8715 *** empty log message ***
nipkow
parents: 11705
diff changeset
    24
apply (induct_tac k)
10883
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    25
txt{*
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    26
The first step is induction on the natural number \isa{k}, which leaves
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    27
two subgoals:
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    28
@{subgoals[display,indent=0,margin=65]}
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    29
Here \isa{auto} simplifies both subgoals so that they match the introduction
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    30
rules, which then are applied automatically.*};
10314
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    31
 apply auto
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    32
done
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    33
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    34
text{*Our goal is to prove the equivalence between the traditional definition
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    35
of even (using the divides relation) and our inductive definition.  Half of
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    36
this equivalence is trivial using the lemma just proved, whose \isa{intro!}
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    37
attribute ensures it will be applied automatically.  *}
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    38
11705
ac8ca15c556c fixed numerals;
wenzelm
parents: 10883
diff changeset
    39
lemma dvd_imp_even: "2 dvd n \<Longrightarrow> n \<in> even"
10883
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    40
by (auto simp add: dvd_def)
10314
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    41
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    42
text{*our first rule induction!*}
11705
ac8ca15c556c fixed numerals;
wenzelm
parents: 10883
diff changeset
    43
lemma even_imp_dvd: "n \<in> even \<Longrightarrow> 2 dvd n"
10314
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    44
apply (erule even.induct)
10883
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    45
txt{*
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    46
@{subgoals[display,indent=0,margin=65]}
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    47
*};
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    48
apply (simp_all add: dvd_def)
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    49
txt{*
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    50
@{subgoals[display,indent=0,margin=65]}
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    51
*};
10314
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    52
apply clarify
10883
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    53
txt{*
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    54
@{subgoals[display,indent=0,margin=65]}
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    55
*};
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    56
apply (rule_tac x = "Suc k" in exI, simp)
10314
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    57
done
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    58
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    59
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    60
text{*no iff-attribute because we don't always want to use it*}
11705
ac8ca15c556c fixed numerals;
wenzelm
parents: 10883
diff changeset
    61
theorem even_iff_dvd: "(n \<in> even) = (2 dvd n)"
10883
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    62
by (blast intro: dvd_imp_even even_imp_dvd)
10314
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    63
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    64
text{*this result ISN'T inductive...*}
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    65
lemma Suc_Suc_even_imp_even: "Suc (Suc n) \<in> even \<Longrightarrow> n \<in> even"
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    66
apply (erule even.induct)
10883
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    67
txt{*
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    68
@{subgoals[display,indent=0,margin=65]}
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    69
*};
10314
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    70
oops
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    71
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    72
text{*...so we need an inductive lemma...*}
11705
ac8ca15c556c fixed numerals;
wenzelm
parents: 10883
diff changeset
    73
lemma even_imp_even_minus_2: "n \<in> even \<Longrightarrow> n - 2 \<in> even"
10314
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    74
apply (erule even.induct)
10883
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    75
txt{*
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    76
@{subgoals[display,indent=0,margin=65]}
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    77
*};
10314
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    78
apply auto
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    79
done
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    80
10883
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    81
text{*...and prove it in a separate step*}
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    82
lemma Suc_Suc_even_imp_even: "Suc (Suc n) \<in> even \<Longrightarrow> n \<in> even"
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    83
by (drule even_imp_even_minus_2, simp)
10326
d4fe5ce8a5d5 minor tinkering
paulson
parents: 10314
diff changeset
    84
d4fe5ce8a5d5 minor tinkering
paulson
parents: 10314
diff changeset
    85
d4fe5ce8a5d5 minor tinkering
paulson
parents: 10314
diff changeset
    86
lemma [iff]: "((Suc (Suc n)) \<in> even) = (n \<in> even)"
10883
2b9f87bf9113 updated for new version of even-examples.tex
paulson
parents: 10341
diff changeset
    87
by (blast dest: Suc_Suc_even_imp_even)
10314
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    88
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    89
end
5b36035e4dff even numbers example
paulson
parents:
diff changeset
    90