(* Author: Xingyuan Zhang, Chunhan Wu, Christian Urban *) theory Myhill_2 imports Myhill_1 "HOL-Library.Sublist" begin
section‹Second direction of MN: ‹regular language ==> finite partition››
subsection‹Tagging functions›
definition
tag_eq :: "('a list ==> 'b) ==> ('a list × 'a list) set" (‹=_=›) where "=tag= ≡ {(x, y). tag x = tag y}"
abbreviation
tag_eq_applied :: "'a list ==> ('a list ==> 'b) ==> 'a list ==> bool" (‹_ =_= _›) where "x =tag= y ≡ (x, y) ∈ =tag="
lemma [simp]: shows"(≈A) `` {x} = (≈A) `` {y} ⟷ x ≈A y" unfolding str_eq_def by auto
lemma refined_intro: assumes"∧x y z. [x =tag= y; x @ z ∈ A]==> y @ z ∈ A" shows"=tag= ⊆≈A" using assms unfolding str_eq_def tag_eq_def apply(clarify, simp (no_asm_use)) by metis
lemma finite_eq_tag_rel: assumes rng_fnt: "finite (range tag)" shows"finite (UNIV // =tag=)" proof - let"?f" = "λX. tag ` X"and ?A = "(UNIV // =tag=)" have"finite (?f ` ?A)" proof - have"range ?f ⊆ (Pow (range tag))"unfolding Pow_def by auto moreover have"finite (Pow (range tag))"using rng_fnt by simp ultimately have"finite (range ?f)"unfolding image_def by (blast intro: finite_subset) moreover have"?f ` ?A ⊆ range ?f"by auto ultimatelyshow"finite (?f ` ?A)"by (rule rev_finite_subset) qed moreover have"inj_on ?f ?A" proof -
{ fix X Y assume X_in: "X ∈ ?A" and Y_in: "Y ∈ ?A" and tag_eq: "?f X = ?f Y" thenobtain x y where"x ∈ X""y ∈ Y""tag x = tag y" unfolding quotient_def Image_def image_def tag_eq_def by (simp) (blast) with X_in Y_in have"X = Y" unfolding quotient_def tag_eq_def by auto
} thenshow"inj_on ?f ?A"unfolding inj_on_def by auto qed ultimatelyshow"finite (UNIV // =tag=)"by (rule finite_imageD) qed
lemma refined_partition_finite: assumes fnt: "finite (UNIV // R1)" and refined: "R1 ⊆ R2" and eq1: "equiv UNIV R1"and eq2: "equiv UNIV R2" shows"finite (UNIV // R2)" proof - let ?f = "λX. {R1 `` {x} | x. x ∈ X}" and ?A = "UNIV // R2"and ?B = "UNIV // R1" have"?f ` ?A ⊆ Pow ?B" unfolding image_def Pow_def quotient_def by auto moreover have"finite (Pow ?B)"using fnt by simp ultimately have"finite (?f ` ?A)"by (rule finite_subset) moreover have"inj_on ?f ?A" proof -
{ fix X Y assume X_in: "X ∈ ?A"and Y_in: "Y ∈ ?A"and eq_f: "?f X = ?f Y" from quotientE [OF X_in] obtain x where"X = R2 `` {x}"by blast with equiv_class_self[OF eq2] have x_in: "x ∈ X"by simp thenhave"R1 ``{x} ∈ ?f X"by auto with eq_f have"R1 `` {x} ∈ ?f Y"by simp thenobtain y where y_in: "y ∈ Y"and eq_r1_xy: "R1 `` {x} = R1 `` {y}"by auto with eq_equiv_class[OF _ eq1] have"(x, y) ∈ R1"by blast with refined have"(x, y) ∈ R2"by auto with quotient_eqI [OF eq2 X_in Y_in x_in y_in] have"X = Y" .
} thenshow"inj_on ?f ?A"unfolding inj_on_def by blast qed ultimatelyshow"finite (UNIV // R2)"by (rule finite_imageD) qed
lemma tag_finite_imageD: assumes rng_fnt: "finite (range tag)" and refined: "=tag= ⊆≈A" shows"finite (UNIV // ≈A)" proof (rule_tac refined_partition_finite [of "=tag="]) show"finite (UNIV // =tag=)"by (rule finite_eq_tag_rel[OF rng_fnt]) next show"=tag= ⊆≈A"using refined . next show"equiv UNIV =tag=" and"equiv UNIV (≈A)" unfolding equiv_def str_eq_def tag_eq_def refl_on_def sym_def trans_def by auto qed
subsection‹Base cases: @{const Zero}, @{const One} and @{const Atom}›
lemma quot_zero_eq: shows"UNIV // ≈{} = {UNIV}" unfolding quotient_def Image_def str_eq_def by auto
definition
tag_Times :: "'a lang ==> 'a lang ==> 'a list ==> 'a lang × 'a lang set" where "tag_Times A B ≡ λx. (≈A `` {x}, {(≈B `` {xs}) | xp xs. xp∈ A ∧ (xp, xs) ∈ Partitions x})"
lemma tag_Times_injI: assumes a: "tag_Times A B x = tag_Times A B y" and c: "x @ z ∈ A ⋅ B" shows"y @ z ∈ A ⋅ B" proof - from c obtain u v where
h1: "(u, v) ∈ Partitions (x @ z)"and
h2: "u ∈ A"and
h3: "v ∈ B"by (auto dest: conc_partitions_elim) from h1 have"x @ z = u @ v"unfolding Partitions_def by simp thenobtain us where"(x = u @ us ∧ us @ z = v) ∨ (x @ us = u ∧ z = us @ v)" by (auto simp add: append_eq_append_conv2) moreover
{ assume eq: "x = u @ us""us @ z = v" have"(≈B `` {us}) ∈ snd (tag_Times A B x)" unfolding Partitions_def tag_Times_def using h2 eq by (auto simp add: str_eq_def) thenhave"(≈B `` {us}) ∈ snd (tag_Times A B y)" using a by simp thenobtain u' us' where
q1: "u' ∈ A"and
q2: "≈B `` {us} = ≈B `` {us'}"and
q3: "(u', us') ∈ Partitions y" unfolding tag_Times_def by auto from q2 h3 eq have"us' @ z ∈ B" unfolding Image_def str_eq_def by auto thenhave"y @ z ∈ A ⋅ B"using q1 q3 unfolding Partitions_def by auto
} moreover
{ assume eq: "x @ us = u""z = us @ v" have"(≈A `` {x}) = fst (tag_Times A B x)" by (simp add: tag_Times_def) thenhave"(≈A `` {x}) = fst (tag_Times A B y)" using a by simp thenhave"≈A `` {x} = ≈A `` {y}" by (simp add: tag_Times_def) moreover have"x @ us ∈ A"using h2 eq by simp ultimately have"y @ us ∈ A"using equiv_class_member unfolding Image_def str_eq_def by blast thenhave"(y @ us) @ v ∈ A ⋅ B" using h3 unfolding conc_def by blast thenhave"y @ z ∈ A ⋅ B"using eq by simp
} ultimatelyshow"y @ z ∈ A ⋅ B"by blast qed
lemma quot_conc_finiteI [intro]: assumes fin1: "finite (UNIV // ≈A)" and fin2: "finite (UNIV // ≈B)" shows"finite (UNIV // ≈(A ⋅ B))" proof (rule_tac tag = "tag_Times A B"in tag_finite_imageD) have"∧x y z. [tag_Times A B x = tag_Times A B y; x @ z ∈ A ⋅ B]==> y @ z ∈ A ⋅B" by (rule tag_Times_injI)
(auto simp add: tag_Times_def tag_eq_def) thenshow"=tag_Times A B= ⊆≈(A ⋅ B)" by (rule refined_intro)
(auto simp add: tag_eq_def) next have *: "finite ((UNIV // ≈A) × (Pow (UNIV // ≈B)))" using fin1 fin2 by auto show"finite (range (tag_Times A B))" unfolding tag_Times_def apply(rule finite_subset[OF _ *]) unfolding quotient_def by auto qed
subsection‹Case for @{const "Star"}›
lemma star_partitions_elim: assumes"x @ z ∈ A⋆""x ≠ []" shows"∃(u, v) ∈ Partitions (x @ z). strict_prefix u x ∧ u ∈ A⋆∧ v ∈ A⋆" proof - have"([], x @ z) ∈ Partitions (x @ z)""strict_prefix [] x""[] ∈ A⋆""x @ z ∈ A⋆" using assms by (auto simp add: Partitions_def strict_prefix_def) thenshow"∃(u, v) ∈ Partitions (x @ z). strict_prefix u x ∧ u ∈ A⋆∧ v ∈ A⋆" by blast qed
lemma finite_set_has_max2: "[finite A; A ≠ {}]==>∃ max ∈ A. ∀ a ∈ A. length a ≤ length max" apply(induct rule:finite.induct) apply(simp) by (metis (no_types) all_not_in_conv insert_iff linorder_le_cases order_trans)
lemma finite_strict_prefix_set: shows"finite {xa. strict_prefix xa (x::'a list)}" apply (induct x rule:rev_induct, simp) apply (subgoal_tac "{xa. strict_prefix xa (xs @ [x])} = {xa. strict_prefix xa xs} ∪ {xs}") by (auto simp:strict_prefix_def)
lemma append_eq_cases: assumes a: "x @ y = m @ n""m ≠ []" shows"prefix x m ∨ strict_prefix m x" unfolding prefix_def strict_prefix_def using a by (auto simp add: append_eq_append_conv2)
lemma star_spartitions_elim2: assumes a: "x @ z ∈ A⋆" and b: "x ≠ []" shows"∃(u, v) ∈ Partitions x. ∃ (u', v') ∈ Partitions z. strict_prefix u x ∧ u ∈ A⋆∧ v @ u' ∈ A ∧ v' ∈ A⋆" proof -
define S where"S = {u | u v. (u, v) ∈ Partitions x ∧ strict_prefix u x ∧ u ∈ A⋆∧v @ z ∈ A⋆}" have"finite {u. strict_prefix u x}"by (rule finite_strict_prefix_set) thenhave"finite S"unfolding S_def by (rule rev_finite_subset) (auto) moreover have"S ≠ {}"using a b unfolding S_def Partitions_def by (auto simp: strict_prefix_def) ultimatelyhave"∃ u_max ∈ S. ∀ u ∈ S. length u ≤ length u_max" using finite_set_has_max2 by blast thenobtain u_max v where h0: "(u_max, v) ∈ Partitions x" and h1: "strict_prefix u_max x" and h2: "u_max ∈ A⋆" and h3: "v @ z ∈ A⋆" and h4: "∀ u v. (u, v) ∈ Partitions x ∧ strict_prefix u x ∧ u ∈ A⋆∧ v @ z ∈ A⋆⟶length u ≤ length u_max" unfolding S_def Partitions_def by blast have q: "v ≠ []"using h0 h1 b unfolding Partitions_def by auto from h3 obtain a b where i1: "(a, b) ∈ Partitions (v @ z)" and i2: "a ∈ A" and i3: "b ∈ A⋆" and i4: "a ≠ []" unfolding Partitions_def using q by (auto dest: star_decom) have"prefix v a" proof (rule ccontr) assume a: "¬(prefix v a)" from i1 have i1': "a @ b = v @ z"unfolding Partitions_def by simp thenhave"prefix a v ∨ strict_prefix v a"using append_eq_cases q by blast thenhave q: "strict_prefix a v"using a unfolding strict_prefix_def prefix_def by auto thenobtain as where eq: "a @ as = v"unfolding strict_prefix_def prefix_def by auto have"(u_max @ a, as) ∈ Partitions x"using eq h0 unfolding Partitions_def by auto moreover have"strict_prefix (u_max @ a) x"using h0 eq q unfolding Partitions_def prefix_def strict_prefix_def by auto moreover have"u_max @ a ∈ A⋆"using i2 h2 by simp moreover have"as @ z ∈ A⋆"using i1' i2 i3 eq by auto ultimatelyhave"length (u_max @ a) ≤ length u_max"using h4 by blast with i4 show"False"by auto qed with i1 obtain za zb where k1: "v @ za = a" and k2: "(za, zb) ∈ Partitions z" and k4: "zb = b" unfolding Partitions_def prefix_def by (auto simp add: append_eq_append_conv2) show"∃ (u, v) ∈ Partitions x. ∃ (u', v') ∈ Partitions z. strict_prefix u x ∧ u ∈ A⋆∧ v @ u' ∈ A ∧ v' ∈ A⋆" using h0 h1 h2 i2 i3 k1 k2 k4 unfolding Partitions_def by blast qed
definition
tag_Star :: "'a lang ==> 'a list ==> ('a lang) set" where "tag_Star A ≡ λx. {≈A `` {v} | u v. strict_prefix u x ∧ u ∈ A⋆∧ (u, v) ∈ Partitions x}"
lemma tag_Star_non_empty_injI: assumes a: "tag_Star A x = tag_Star A y" and c: "x @ z ∈ A⋆" and d: "x ≠ []" shows"y @ z ∈ A⋆" proof - obtain u v u' v' where a1: "(u, v) ∈ Partitions x""(u', v')∈ Partitions z" and a2: "strict_prefix u x" and a3: "u ∈ A⋆" and a4: "v @ u' ∈ A" and a5: "v' ∈ A⋆" using c d by (auto dest: star_spartitions_elim2) have"(≈A) `` {v} ∈ tag_Star A x" apply(simp add: tag_Star_def Partitions_def str_eq_def) using a1 a2 a3 by (auto simp add: Partitions_def) thenhave"(≈A) `` {v} ∈ tag_Star A y"using a by simp thenobtain u1 v1 where b1: "v ≈A v1" and b3: "u1 ∈ A⋆" and b4: "(u1, v1) ∈ Partitions y" unfolding tag_Star_def by auto have c: "v1 @ u' ∈ A⋆"using b1 a4 unfolding str_eq_def by simp have"u1 @ (v1 @ u') @ v' ∈ A⋆" using b3 c a5 by (simp only: append_in_starI) thenshow"y @ z ∈ A⋆"using b4 a1 unfolding Partitions_def by auto qed
lemma tag_Star_empty_injI: assumes a: "tag_Star A x = tag_Star A y" and c: "x @ z ∈ A⋆" and d: "x = []" shows"y @ z ∈ A⋆" proof - from a have"{} = tag_Star A y"unfolding tag_Star_def using d by auto thenhave"y = []" unfolding tag_Star_def Partitions_def strict_prefix_def prefix_def by (auto) (metis Nil_in_star append_self_conv2) thenshow"y @ z ∈ A⋆"using c d by simp qed
lemma quot_star_finiteI [intro]: assumes finite1: "finite (UNIV // ≈A)" shows"finite (UNIV // ≈(A⋆))" proof (rule_tac tag = "tag_Star A"in tag_finite_imageD) have"∧x y z. [tag_Star A x = tag_Star A y; x @ z ∈ A⋆]==> y @ z ∈ A⋆" by (case_tac "x = []") (blast intro: tag_Star_empty_injI tag_Star_non_empty_injI)+ thenshow"=(tag_Star A)= ⊆≈(A⋆)" by (rule refined_intro) (auto simp add: tag_eq_def) next have *: "finite (Pow (UNIV // ≈A))" using finite1 by auto show"finite (range (tag_Star A))" unfolding tag_Star_def by (rule finite_subset[OF _ *])
(auto simp add: quotient_def) qed
subsection‹The conclusion of the second direction›
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.