lemma closure_difference [intro]: fixes A::"('a::finite) lang" 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 ultimatelyshow"regular (A - B)"by simp qed
lemma closure_intersection [intro]: fixes A::"('a::finite) lang" 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 ultimatelyshow"regular (A ∩ B)"by simp qed
subsection‹Closure under string reversal›
fun
Rev :: "'a rexp ==> 'a rexp" where "Rev Zero = Zero"
| "Rev One = One"
| "Rev (Atom c) = Atom c"
| "Rev (Plus r1 r2) = Plus (Rev r1) (Rev r2)"
| "Rev (Times r1 r2) = Times (Rev r2) (Rev r1)"
| "Rev (Star r) = Star (Rev r)"
lemma rev_seq[simp]: shows"rev ` (B ⋅ A) = (rev ` A) ⋅ (rev ` B)" unfolding conc_def image_def by (auto) (metis rev_append)+
lemma rev_star1: assumes a: "s ∈ (rev ` A)⋆" shows"s ∈ rev ` (A⋆)" using a proof(induct rule: star_induct) case (append s1 s2) have inj: "inj (rev::'a list ==> 'a list)"unfolding inj_on_def by auto have"s1 ∈ rev ` A""s2 ∈ rev ` (A⋆)"by fact+ thenobtain x1 x2 where"x1 ∈ A""x2 ∈ A⋆"and eqs: "s1 = rev x1""s2 = rev x2"by auto thenhave"x1 ∈ A⋆""x2 ∈ A⋆"by (auto) thenhave"x2 @ x1 ∈ A⋆"by (auto) thenhave"rev (x2 @ x1) ∈ rev ` A⋆"using inj by (simp only: inj_image_mem_iff) thenshow"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 (append s1 s2) have inj: "inj (rev::'a list ==> 'a list)"unfolding inj_on_def by auto have"s1 ∈ A"by fact thenhave"rev s1 ∈ rev ` A"using inj by (simp only: inj_image_mem_iff) thenhave"rev s1 ∈ (rev ` A)⋆"by (auto) moreover have"rev s2 ∈ (rev ` A)⋆"by fact ultimatelyshow"rev (s1 @ s2) ∈ (rev ` A)⋆"by (auto) qed (auto)
lemma rev_star [simp]: shows" rev ` (A⋆) = (rev ` A)⋆" using rev_star1 rev_star2 by auto
lemma rev_lang: shows"rev ` (lang r) = lang (Rev r)" by (induct r) (simp_all add: image_Un)
lemma closure_reversal [intro]: assumes"regular A" shows"regular (rev ` A)" proof - from assms obtain r::"'a rexp"where"A = lang r"by auto thenhave"lang (Rev r) = rev ` A"by (simp add: rev_lang) thenshow"regular (rev` A)"by blast qed
subsection‹Closure under left-quotients›
abbreviation "Deriv_lang A B ≡∪x ∈ A. Derivs x B"
lemma closure_left_quotient: assumes"regular A" shows"regular (Deriv_lang B A)" proof - from assms obtain r::"'a rexp"where eq: "lang r = A"by auto have fin: "finite (pderivs_lang B r)"by (rule finite_pderivs_lang)
have"Deriv_lang B (lang r) = (∪ (lang ` pderivs_lang B r))" by (simp add: Derivs_pderivs pderivs_lang_def) alsohave"… = lang (⊎(pderivs_lang B r))"using fin by simp finallyhave"Deriv_lang B A = lang (⊎(pderivs_lang B r))"using eq by simp thenshow"regular (Deriv_lang B A)"by auto qed
subsection‹Finite and co-finite sets are regular›
lemma singleton_regular: shows"regular {s}" proof (induct s) case Nil have"{[]} = lang (One)"by simp thenshow"regular {[]}"by blast next case (Cons c s) have"regular {s}"by fact thenobtain r where"{s} = lang r"by blast thenhave"{c # s} = lang (Times (Atom c) r)" by (auto simp add: conc_def) thenshow"regular {c # s}"by blast qed
lemma finite_regular: assumes"finite A" shows"regular A" using assms proof (induct) case empty have"{} = lang (Zero)"by simp thenshow"regular {}"by blast next case (insert s A) have"regular {s}"by (simp add: singleton_regular) moreover have"regular A"by fact ultimatelyhave"regular ({s} ∪ A)"by (rule closure_union) thenshow"regular (insert s A)"by simp qed
subsection‹Continuation lemma for showing non-regularity of languages›
lemma continuation_lemma: fixes A B::"'a::finite lang" assumes reg: "regular A" and inf: "infinite B" shows"∃x ∈ B. ∃y ∈ B. x ≠ y ∧ x ≈A y" proof -
define eqfun where"eqfun = (λA x::('a::finite list). (≈A) `` {x})" have"finite (UNIV // ≈A)"using reg by (simp add: Myhill_Nerode) moreover have"(eqfun A) ` B ⊆ UNIV // (≈A)" unfolding eqfun_def quotient_def by auto ultimatelyhave"finite ((eqfun A) ` B)"by (rule rev_finite_subset) with inf have"∃a ∈ B. infinite {b ∈ B. eqfun A b = eqfun A a}" by (rule pigeonhole_infinite) thenobtain a where in_a: "a ∈ B"and"infinite {b ∈ B. eqfun A b = eqfun A a}" by blast moreover have"{b ∈ B. eqfun A b = eqfun A a} = {b ∈ B. b ≈A a}" unfolding eqfun_def Image_def str_eq_def by auto ultimatelyhave"infinite {b ∈ B. b ≈A a}"by simp thenhave"infinite ({b ∈ B. b ≈A a} - {a})"by simp moreover have"{b ∈ B. b ≈A a} - {a} = {b ∈ B. b ≈A a ∧ b ≠ a}"by auto ultimatelyhave"infinite {b ∈ B. b ≈A a ∧ b ≠ a}"by simp thenhave"{b ∈ B. b ≈A a ∧ b ≠ a} ≠ {}" by (metis finite.emptyI) thenobtain b where"b ∈ B""b ≠ a""b ≈A a"by blast with in_a show"∃x ∈ B. ∃y ∈ B. x ≠ y ∧ x ≈A y" by blast qed
subsection‹The language ‹an bn› is not regular›
abbreviation
replicate_rev (‹_ ^^^ _› [100, 100] 100) where "a ^^^ n ≡ replicate n a"
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.