doc-src/TutorialI/Overview/LNCS/Ind.thy
author chaieb
Wed, 19 May 2004 11:23:59 +0200
changeset 14758 af3b71a46a1c
parent 13439 2f98365f57a8
child 15905 0a4cc9b113c7
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:
13262
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
     1
(*<*)theory Ind = Main:(*>*)
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
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
    24
text{* Rule induction for set @{term even}, @{thm[source]even.induct}:
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(*>*)