diff -r b04cc5e4e84c -r 7743d2ad71d1 Theories/Closure.thy --- a/Theories/Closure.thy Tue May 31 20:32:49 2011 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,140 +0,0 @@ -theory Closure -imports Myhill_2 -begin - -section {* Closure properties of regular languages *} - -abbreviation - regular :: "lang \ bool" -where - "regular A \ \r::rexp. A = L r" - - -lemma closure_union[intro]: - assumes "regular A" "regular B" - shows "regular (A \ B)" -proof - - from assms obtain r1 r2::rexp where "L r1 = A" "L r2 = B" by auto - then have "A \ B = L (ALT r1 r2)" by simp - then show "regular (A \ B)" by blast -qed - -lemma closure_seq[intro]: - assumes "regular A" "regular B" - shows "regular (A ;; B)" -proof - - from assms obtain r1 r2::rexp where "L r1 = A" "L r2 = B" by auto - then have "A ;; B = L (SEQ r1 r2)" by simp - then show "regular (A ;; B)" by blast -qed - -lemma closure_star[intro]: - assumes "regular A" - shows "regular (A\)" -proof - - from assms obtain r::rexp where "L r = A" by auto - then have "A\ = L (STAR r)" by simp - then show "regular (A\)" by blast -qed - -lemma closure_complement[intro]: - assumes "regular A" - shows "regular (- A)" -proof - - from assms have "finite (UNIV // \A)" by (simp add: Myhill_Nerode) - then have "finite (UNIV // \(-A))" by (simp add: str_eq_rel_def) - then show "regular (- A)" by (simp add: Myhill_Nerode) -qed - -lemma closure_difference[intro]: - assumes "regular A" "regular B" - shows "regular (A - B)" -proof - - have "A - B = - (- A \ B)" by blast - moreover - have "regular (- (- A \ B))" - using assms by blast - ultimately show "regular (A - B)" by simp -qed - -lemma closure_intersection[intro]: - assumes "regular A" "regular B" - shows "regular (A \ B)" -proof - - have "A \ B = - (- A \ - B)" by blast - moreover - have "regular (- (- A \ - B))" - using assms by blast - ultimately show "regular (A \ B)" by simp -qed - - -text {* closure under string reversal *} - -fun - Rev :: "rexp \ rexp" -where - "Rev NULL = NULL" -| "Rev EMPTY = EMPTY" -| "Rev (CHAR c) = CHAR c" -| "Rev (ALT r1 r2) = ALT (Rev r1) (Rev r2)" -| "Rev (SEQ r1 r2) = SEQ (Rev r2) (Rev r1)" -| "Rev (STAR r) = STAR (Rev r)" - -lemma rev_Seq: - "(rev ` A) ;; (rev ` B) = rev ` (B ;; A)" -unfolding Seq_def image_def -apply(auto) -apply(rule_tac x="xb @ xa" in exI) -apply(auto) -done - -lemma rev_Star1: - assumes a: "s \ (rev ` A)\" - shows "s \ rev ` (A\)" -using a -proof(induct rule: star_induct) - case (step s1 s2) - have inj: "inj (rev::string \ string)" unfolding inj_on_def by auto - have "s1 \ rev ` A" "s2 \ rev ` (A\)" by fact+ - then obtain x1 x2 where "x1 \ A" "x2 \ A\" and eqs: "s1 = rev x1" "s2 = rev x2" by auto - then have "x1 \ A\" "x2 \ A\" by (auto intro: star_intro2) - then have "x2 @ x1 \ A\" by (auto intro: star_intro1) - then have "rev (x2 @ x1) \ rev ` A\" using inj by (simp only: inj_image_mem_iff) - then show "s1 @ s2 \ rev ` A\" using eqs by simp -qed (auto) - -lemma rev_Star2: - assumes a: "s \ A\" - shows "rev s \ (rev ` A)\" -using a -proof(induct rule: star_induct) - case (step s1 s2) - have inj: "inj (rev::string \ string)" unfolding inj_on_def by auto - have "s1 \ A"by fact - then have "rev s1 \ rev ` A" using inj by (simp only: inj_image_mem_iff) - then have "rev s1 \ (rev ` A)\" by (auto intro: star_intro2) - moreover - have "rev s2 \ (rev ` A)\" by fact - ultimately show "rev (s1 @ s2) \ (rev ` A)\" by (auto intro: star_intro1) -qed (auto) - -lemma rev_Star: - "(rev ` A)\ = rev ` (A\)" -using rev_Star1 rev_Star2 by auto - -lemma rev_lang: - "L (Rev r) = rev ` (L r)" -by (induct r) (simp_all add: rev_Star rev_Seq image_Un) - -lemma closure_reversal[intro]: - assumes "regular A" - shows "regular (rev ` A)" -proof - - from assms obtain r::rexp where "L r = A" by auto - then have "L (Rev r) = rev ` A" by (simp add: rev_lang) - then show "regular (rev` A)" by blast -qed - - -end \ No newline at end of file