theory Inductive_Examples+ −
imports Simple_Inductive_Package+ −
begin+ −
+ −
section {* Transitive closure *}+ −
+ −
simple_inductive+ −
trcl for r :: "'a \<Rightarrow> 'a \<Rightarrow> bool"+ −
where+ −
base: "trcl r x x"+ −
| step: "trcl r x y \<Longrightarrow> r y z \<Longrightarrow> trcl r x z"+ −
+ −
thm trcl_def+ −
thm trcl.induct+ −
thm base+ −
thm step+ −
thm trcl.intros+ −
+ −
lemma trcl_strong_induct:+ −
assumes trcl: "trcl r x y"+ −
and I1: "\<And>x. P x x"+ −
and I2: "\<And>x y z. P x y \<Longrightarrow> trcl r x y \<Longrightarrow> r y z \<Longrightarrow> P x z"+ −
shows "P x y" + −
proof -+ −
from trcl+ −
have "P x y \<and> trcl r x y"+ −
proof induct+ −
case (base x)+ −
from I1 and trcl.base show ?case ..+ −
next+ −
case (step x y z)+ −
then have "P x y" and "trcl r x y" by simp_all+ −
from `P x y` `trcl r x y` `r y z` have "P x z"+ −
by (rule I2)+ −
moreover from `trcl r x y` `r y z` have "trcl r x z"+ −
by (rule trcl.step)+ −
ultimately show ?case ..+ −
qed+ −
then show ?thesis ..+ −
qed+ −
+ −
+ −
section {* Even and odd numbers *}+ −
+ −
simple_inductive+ −
even and odd+ −
where+ −
even0: "even 0"+ −
| evenS: "odd n \<Longrightarrow> even (Suc n)"+ −
| oddS: "even n \<Longrightarrow> odd (Suc n)"+ −
+ −
thm even_def odd_def+ −
thm even.induct odd.induct+ −
thm even0+ −
thm evenS+ −
thm oddS+ −
thm even_odd.intros+ −
+ −
+ −
section {* Accessible part *}+ −
+ −
simple_inductive+ −
accpart for r :: "'a \<Rightarrow> 'a \<Rightarrow> bool"+ −
where+ −
accpartI: "(\<And>y. r y x \<Longrightarrow> accpart r y) \<Longrightarrow> accpart r x"+ −
+ −
thm accpart_def+ −
thm accpart.induct+ −
thm accpartI+ −
+ −
+ −
section {* Accessible part in locale *}+ −
+ −
locale rel =+ −
fixes r :: "'a \<Rightarrow> 'a \<Rightarrow> bool"+ −
+ −
simple_inductive (in rel) accpart'+ −
where+ −
accpartI': "\<And>x. (\<And>y. r y x \<Longrightarrow> accpart' y) \<Longrightarrow> accpart' x"+ −
+ −
context rel+ −
begin+ −
+ −
thm accpartI'+ −
thm accpart'.induct+ −
+ −
end+ −
+ −
thm rel.accpartI'+ −
thm rel.accpart'.induct+ −
+ −
end+ −