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