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