theory week06B_demo imports Main begin inductive Ev :: "nat \ bool" where ZeroI: "Ev 0" | Add2I: "Ev n \ Ev (Suc(Suc n))" print_theorems -- --------------------------------------------------- text {* Cases (rule inversion) in Isar *} lemma "Ev n \ n = 0 \ (\Ev n'. n = Suc (Suc n'))" proof - assume "Ev n" from this show "n = 0 \ (\Ev n'. n = Suc (Suc n'))" proof cases assume "n = 0" thus ?thesis .. next fix n' assume "n = Suc (Suc n')" and "Ev n'" thus ?thesis by blast qed qed lemma assumes n: "Ev n" shows "n = 0 \ (\Ev n'. n = Suc (Suc n'))" using n proof cases case ZeroI thus ?thesis .. next case (Add2I n') thus ?thesis by blast qed text {* Rule induction in Isar *} lemma "Ev n \ \k. n = 2*k" proof (induct rule: Ev.induct) case ZeroI thus ?case by simp next case Add2I thus ?case by arith qed lemma assumes n: "Ev n" shows "\k. n = 2*k" using n proof induct case ZeroI thus ?case by simp next case Add2I thus ?case by arith qed lemma assumes n: "Ev n" shows "\k. n = 2*k" using n proof induct case ZeroI thus ?case by simp next case (Add2I m) then obtain k where "m = 2*k" by blast hence "Suc (Suc m) = 2*(k+1)" by simp thus "\k. Suc (Suc m) = 2*k" .. qed -- ---------------------------------------------- section "Formalising Least Fixpoints" definition closed :: "('a set \ 'a set) \ 'a set \ bool" where "closed f B \ f B \ B" lemma closed_int: "\ mono f; closed f A; closed f B \ \ closed f (A \ B)" apply (unfold closed_def mono_def) apply blast done definition lfpt :: "('a set \ 'a set) \ 'a set" where "lfpt f \ \ {B. closed f B}" text {* lfpt is the greatest lower bound: *} lemma lfpt_lower: "closed f B \ lfpt f \ B" apply (unfold lfpt_def) apply blast done lemma lfpt_greatest: assumes A_smaller: "\B. closed f B \ A \ B" shows "A \ lfpt f" apply (unfold lfpt_def) apply (insert A_smaller) apply blast done section {* Fix Point *} lemma 1: "mono f \ f (lfpt f) \ lfpt f" apply (rule lfpt_greatest) apply (frule lfpt_lower) apply (drule monoD, assumption) apply (simp add: closed_def) done lemma 2: "mono f \ lfpt f \ (f (lfpt f) :: 'a set)" apply (rule lfpt_lower) apply (unfold closed_def) apply (rule monoD [where f=f], assumption) apply (erule 1) done lemma lfpt_fixpoint: "mono f \ f (lfpt f) = lfpt f" by (blast intro!: 1 2) text {* lfpt is the least fix point *} lemma lfpt_least: assumes A: "f A = A" shows "lfpt f \ A" apply (rule lfpt_lower) apply (unfold closed_def) apply (simp add: A) done section {* Rule Induction *} consts R :: "('a set \ 'a) set" definition R_hat :: "'a set \ 'a set" where "R_hat A \ {x. \H. (H,x) \ R \ H \ A}" lemma monoR': "mono R_hat" apply (unfold mono_def) apply (unfold R_hat_def) apply blast done lemma sound: assumes hyp: "\(H,x) \ R. ((\h \ H. P h) \ P x)" shows "\x \ lfpt R_hat. P x" proof - from hyp have "closed R_hat {x. P x}" unfolding closed_def R_hat_def by blast hence "lfpt R_hat \ {x. P x}" by (rule lfpt_lower) thus ?thesis by blast qed end