doc-src/TutorialI/Overview/Ind.thy
author nipkow
Wed, 26 Jun 2002 12:17:21 +0200
changeset 13250 efd5db7dc7cc
parent 13249 4b3de6370184
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13249
4b3de6370184 *** empty log message ***
nipkow
parents: 12815
diff changeset
     1
(*<*)theory Ind = Main:(*>*)
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
     2
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
     3
section{*Inductive Definitions*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
     4
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
     5
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
     6
subsection{*Even Numbers*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
     7
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
     8
subsubsection{*The Definition*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
     9
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    10
consts even :: "nat set"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    11
inductive even
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    12
intros
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    13
zero[intro!]: "0 \<in> even"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    14
step[intro!]: "n \<in> even \<Longrightarrow> Suc(Suc n) \<in> even"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    15
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    16
lemma [simp,intro!]: "2 dvd n \<Longrightarrow> 2 dvd Suc(Suc n)"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    17
apply (unfold dvd_def)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    18
apply clarify
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    19
apply (rule_tac x = "Suc k" in exI, simp)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    20
done
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    21
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    22
subsubsection{*Rule Induction*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    23
13249
4b3de6370184 *** empty log message ***
nipkow
parents: 12815
diff changeset
    24
text{* Rule induction for set @{term even}, @{thm[source]even.induct}:
13250
efd5db7dc7cc *** empty log message ***
nipkow
parents: 13249
diff changeset
    25
@{thm[display] even.induct[no_vars]}*}
13249
4b3de6370184 *** empty log message ***
nipkow
parents: 12815
diff changeset
    26
(*<*)thm even.induct[no_vars](*>*)
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    27
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    28
lemma even_imp_dvd: "n \<in> even \<Longrightarrow> 2 dvd n"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    29
apply (erule even.induct)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    30
apply simp_all
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    31
done
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    32
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    33
subsubsection{*Rule Inversion*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    34
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    35
inductive_cases Suc_Suc_case [elim!]: "Suc(Suc n) \<in> even"
13249
4b3de6370184 *** empty log message ***
nipkow
parents: 12815
diff changeset
    36
text{* @{thm[display] Suc_Suc_case[no_vars]} *}
4b3de6370184 *** empty log message ***
nipkow
parents: 12815
diff changeset
    37
(*<*)thm Suc_Suc_case(*>*)
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    38
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    39
lemma "Suc(Suc n) \<in> even \<Longrightarrow> n \<in> even"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    40
by blast
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    41
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    42
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    43
subsection{*Mutually Inductive Definitions*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    44
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    45
consts evn :: "nat set"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    46
       odd :: "nat set"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    47
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    48
inductive evn odd
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    49
intros
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    50
zero: "0 \<in> evn"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    51
evnI: "n \<in> odd \<Longrightarrow> Suc n \<in> evn"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    52
oddI: "n \<in> evn \<Longrightarrow> Suc n \<in> odd"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    53
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    54
lemma "(m \<in> evn \<longrightarrow> 2 dvd m) \<and> (n \<in> odd \<longrightarrow> 2 dvd (Suc n))"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    55
apply(rule evn_odd.induct)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    56
by simp_all
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    57
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    58
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    59
subsection{*The Reflexive Transitive Closure*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    60
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    61
consts rtc :: "('a \<times> 'a)set \<Rightarrow> ('a \<times> 'a)set"   ("_*" [1000] 999)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    62
inductive "r*"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    63
intros
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    64
rtc_refl[iff]:  "(x,x) \<in> r*"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    65
rtc_step:       "\<lbrakk> (x,y) \<in> r; (y,z) \<in> r* \<rbrakk> \<Longrightarrow> (x,z) \<in> r*"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    66
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    67
lemma [intro]: "(x,y) : r \<Longrightarrow> (x,y) \<in> r*"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    68
by(blast intro: rtc_step);
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    69
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    70
lemma rtc_trans: "\<lbrakk> (x,y) \<in> r*; (y,z) \<in> r* \<rbrakk> \<Longrightarrow> (x,z) \<in> r*"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    71
apply(erule rtc.induct)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    72
oops
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    73
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    74
lemma rtc_trans[rule_format]:
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    75
  "(x,y) \<in> r* \<Longrightarrow> (y,z) \<in> r* \<longrightarrow> (x,z) \<in> r*"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    76
apply(erule rtc.induct)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    77
 apply(blast);
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    78
apply(blast intro: rtc_step);
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    79
done
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    80
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    81
text{*
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    82
\begin{exercise}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    83
Show that the converse of @{thm[source]rtc_step} also holds:
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    84
@{prop[display]"[| (x,y) : r*; (y,z) : r |] ==> (x,z) : r*"}
13250
efd5db7dc7cc *** empty log message ***
nipkow
parents: 13249
diff changeset
    85
\end{exercise}*}
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    86
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    87
subsection{*The accessible part of a relation*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    88
13249
4b3de6370184 *** empty log message ***
nipkow
parents: 12815
diff changeset
    89
consts  acc :: "('a \<times> 'a) set \<Rightarrow> 'a set"
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    90
inductive "acc r"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    91
intros
11293
6878bb02a7f9 *** empty log message ***
nipkow
parents: 11235
diff changeset
    92
  "(\<forall>y. (y,x) \<in> r \<longrightarrow> y \<in> acc r) \<Longrightarrow> x \<in> acc r"
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    93
11293
6878bb02a7f9 *** empty log message ***
nipkow
parents: 11235
diff changeset
    94
lemma "wf{(x,y). (x,y) \<in> r \<and> y \<in> acc r}"
6878bb02a7f9 *** empty log message ***
nipkow
parents: 11235
diff changeset
    95
thm wfI
6878bb02a7f9 *** empty log message ***
nipkow
parents: 11235
diff changeset
    96
apply(rule_tac A = "acc r" in wfI)
12815
wenzelm
parents: 11293
diff changeset
    97
 apply (blast elim: acc.elims)
11293
6878bb02a7f9 *** empty log message ***
nipkow
parents: 11235
diff changeset
    98
apply(simp(no_asm_use))
6878bb02a7f9 *** empty log message ***
nipkow
parents: 11235
diff changeset
    99
thm acc.induct
6878bb02a7f9 *** empty log message ***
nipkow
parents: 11235
diff changeset
   100
apply(erule acc.induct)
6878bb02a7f9 *** empty log message ***
nipkow
parents: 11235
diff changeset
   101
by blast
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   102
13249
4b3de6370184 *** empty log message ***
nipkow
parents: 12815
diff changeset
   103
consts  accs :: "('a \<times> 'a) set \<Rightarrow> 'a set"
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   104
inductive "accs r"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   105
intros
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   106
 "r``{x} \<in> Pow(accs r) \<Longrightarrow> x \<in> accs r"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   107
monos Pow_mono
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   108
13249
4b3de6370184 *** empty log message ***
nipkow
parents: 12815
diff changeset
   109
(*<*)end(*>*)