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