doc-src/TutorialI/Inductive/Even.thy
author chaieb
Wed, 19 May 2004 11:23:59 +0200
changeset 14758 af3b71a46a1c
parent 12328 7c4ec77a8715
child 16417 9bc16273c2d4
permissions -rw-r--r--
A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller. the tactic has also changed and allows the abstaction over fuction occurences whose type is nat or int.
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
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