diff -r 85fa86398d39 -r fbd62804f153 MyhillNerode.thy --- a/MyhillNerode.thy Wed Nov 03 22:08:50 2010 +0000 +++ b/MyhillNerode.thy Sat Nov 06 23:31:53 2010 +0000 @@ -740,12 +740,8 @@ shows "X = L xrhs" proof (cases "X = {[]}") case True - thus ?thesis using X_in_equas - unfolding equations_def - unfolding equation_rhs_def - apply(simp del: L_rhs.simps) - apply(simp add: lang_seq_def) - done + thus ?thesis using X_in_equas + by (simp add:equations_def equation_rhs_def lang_seq_def) next case False show ?thesis @@ -758,32 +754,33 @@ proof (cases "x = []") assume empty: "x = []" hence "x \ L (empty_rhs X)" using "(1)" - unfolding empty_rhs_def - by (simp add: lang_seq_def) + by (auto simp:empty_rhs_def lang_seq_def) thus ?thesis using X_in_equas False empty "(1)" unfolding equations_def equation_rhs_def by auto next assume not_empty: "x \ []" - then obtain clist c where decom: "x = clist @ [c]" - using rev_cases by blast - moreover have "\ Y. Y-c\X \ [c] \ L (folds ALT NULL {CHAR c |c. Y-c\X})" + hence "\ clist c. x = clist @ [c]" by (case_tac x rule:rev_cases, auto) + then obtain clist c where decom: "x = clist @ [c]" by blast + moreover have "\ Y. \Y \ UNIV Quo Lang; Y-c\X; clist \ Y\ + \ [c] \ L (folds ALT NULL {CHAR c |c. Y-c\X})" proof - fix Y - assume Y_CT_X: "Y-c\X" + assume Y_is_eq_cl: "Y \ UNIV Quo Lang" + and Y_CT_X: "Y-c\X" + and clist_in_Y: "clist \ Y" with finite_charset_rS show "[c] \ L (folds ALT NULL {CHAR c |c. Y-c\X})" - by (auto simp: fold_alt_null_eqs) + by (auto simp :fold_alt_null_eqs) qed hence "\Xa. Xa \ UNIV Quo Lang \ clist @ [c] \ Xa ; L (folds ALT NULL {CHAR c |c. Xa-c\X})" using X_in_equas False not_empty "(1)" decom - by (auto dest!: every_eqclass_has_ascendent simp: equations_def equation_rhs_def lang_seq_def) + by (auto dest!:every_eqclass_has_ascendent simp:equations_def equation_rhs_def lang_seq_def) then obtain Xa where - "Xa \ UNIV Quo Lang" "clist @ [c] \ Xa ; L (folds ALT NULL {CHAR c |c. Xa-c\X})" by blast + "Xa \ UNIV Quo Lang \ clist @ [c] \ Xa ; L (folds ALT NULL {CHAR c |c. Xa-c\X})" by blast hence "x \ L {(S, folds ALT NULL {CHAR c |c. S-c\X}) |S. S \ UNIV Quo Lang}" using X_in_equas "(1)" decom by (auto simp add:equations_def equation_rhs_def intro!:exI[where x = Xa]) - thus "x \ L xrhs" using X_in_equas False not_empty - unfolding equations_def equation_rhs_def + thus "x \ L xrhs" using X_in_equas False not_empty unfolding equations_def equation_rhs_def by auto qed qed @@ -794,14 +791,11 @@ assume "(2)": "x \ L xrhs" have "(2_1)": "\ s1 s2 r Xa. \s1 \ Xa; s2 \ L (folds ALT NULL {CHAR c |c. Xa-c\X})\ \ s1 @ s2 \ X" using finite_charset_rS - unfolding CT_def - by (simp add: lang_seq_def fold_alt_null_eqs) (auto) + by (auto simp:CT_def lang_seq_def fold_alt_null_eqs) have "(2_2)": "\ s1 s2 Xa r.\s1 \ Xa; s2 \ L r; (Xa, r) \ empty_rhs X\ \ s1 @ s2 \ X" - by (simp add: empty_rhs_def split: if_splits) - show "x \ X" using X_in_equas False "(2)" - unfolding equations_def - unfolding equation_rhs_def - by (auto intro:"(2_1)" "(2_2)" simp: lang_seq_def) + by (simp add:empty_rhs_def split:if_splits) + show "x \ X" using X_in_equas False "(2)" + by (auto intro:"(2_1)" "(2_2)" simp:equations_def equation_rhs_def lang_seq_def) qed qed qed @@ -1318,252 +1312,42 @@ text {* tests by Christian *} -(* compatibility with stable Isabelle *) lemma temp_set_ext[no_atp]: "(\x. (x:A) = (x:B)) \ (A = B)" - by(auto intro:set_eqI) - -lemma folds_simp_null [simp]: - "finite rs \ x \ L (folds ALT NULL rs) = (\r \ rs. x \ L r)" -apply (simp add: folds_def) -apply (rule someI2_ex) -apply (erule finite_imp_fold_graph) -apply (erule fold_graph.induct) -apply (auto) -done +by(auto intro:set_eqI) -lemma folds_simp_empty [simp]: - "finite rs \ x \ L (folds ALT EMPTY rs) = ((\r \ rs. x \ L r) \ x = [])" -apply (simp add: folds_def) -apply (rule someI2_ex) -apply (erule finite_imp_fold_graph) -apply (erule fold_graph.induct) -apply (auto) -done - -abbreviation - str_eq ("_ \_ _") -where - "x \Lang y \ (\z. x @ z \ Lang \ y @ z \ Lang)" - -abbreviation - lang_eq ("\_") +fun + MNRel where - "\Lang \ (\(x, y). x \Lang y)" - -lemma lang_eq_is_equiv: - "equiv UNIV (\Lang)" -unfolding equiv_def -unfolding refl_on_def sym_def trans_def -by (simp add: mem_def equiv_str_def) - -text {* - equivalence classes of x can be written - - UNIV // (\Lang)``{x} - - the language quotient can be written - - UNIV // (\Lang) -*} - -lemma - "(\Lang)``{x} = \x\Lang" -unfolding equiv_class_def equiv_str_def Image_def mem_def -by (simp) - -lemma - "UNIV // (\Lang) = UNIV Quo Lang" -unfolding quotient_def quot_def -unfolding equiv_class_def equiv_str_def -unfolding Image_def mem_def -by auto + "MNRel Lang (x, y) = (x \Lang\ y)" lemma - "{} \ UNIV // (\Lang)" -unfolding quotient_def -unfolding Image_def -apply(auto) -apply(rule_tac x="x" in exI) -unfolding mem_def -apply(simp) -done - -definition - transitions :: "string set \ string set \ rexp set" ("_\\_") -where - "Y \\ X \ {CHAR c | c. Y ; {[c]} \ X}" - -definition - transitions_rexp ("_ \\ _") -where - "Y \\ X \ if [] \ X then folds ALT EMPTY (Y \\X) else folds ALT NULL (Y \\X)" - -definition - "rhs CS X \ { (Y, Y \\X) | Y. Y \ CS }" - -definition - "rhs_sem CS X \ { (Y; L (Y \\ X)) | Y. Y \ CS }" - -definition - "eqs CS \ (\X \ CS. {(X, rhs CS X)})" - -definition - "eqs_sem CS \ (\X \ CS. {(X, rhs_sem CS X)})" - -(* -lemma - assumes X_in_equas: "(X, rhss) \ (eqs_sem (UNIV // (\Lang)))" - shows "X = \rhss" -using assms -proof (cases "X = {[]}") - case True - thus ?thesis using X_in_equas - by (simp add:equations_def equation_rhs_def lang_seq_def) -next - case False - show ?thesis - proof - show "X \ L xrhs" - proof - fix x - assume "(1)": "x \ X" - show "x \ L xrhs" - proof (cases "x = []") - assume empty: "x = []" - hence "x \ L (empty_rhs X)" using "(1)" - by (auto simp:empty_rhs_def lang_seq_def) - thus ?thesis using X_in_equas False empty "(1)" - unfolding equations_def equation_rhs_def by auto - next - assume not_empty: "x \ []" - hence "\ clist c. x = clist @ [c]" by (case_tac x rule:rev_cases, auto) - then obtain clist c where decom: "x = clist @ [c]" by blast - moreover have "\ Y. \Y \ UNIV Quo Lang; Y-c\X; clist \ Y\ - \ [c] \ L (folds ALT NULL {CHAR c |c. Y-c\X})" - proof - - fix Y - assume Y_is_eq_cl: "Y \ UNIV Quo Lang" - and Y_CT_X: "Y-c\X" - and clist_in_Y: "clist \ Y" - with finite_charset_rS - show "[c] \ L (folds ALT NULL {CHAR c |c. Y-c\X})" - by (auto simp :fold_alt_null_eqs) - qed - hence "\Xa. Xa \ UNIV Quo Lang \ clist @ [c] \ Xa ; L (folds ALT NULL {CHAR c |c. Xa-c\X})" - using X_in_equas False not_empty "(1)" decom - by (auto dest!:every_eqclass_has_ascendent simp:equations_def equation_rhs_def lang_seq_def) - then obtain Xa where - "Xa \ UNIV Quo Lang \ clist @ [c] \ Xa ; L (folds ALT NULL {CHAR c |c. Xa-c\X})" by blast - hence "x \ L {(S, folds ALT NULL {CHAR c |c. S-c\X}) |S. S \ UNIV Quo Lang}" - using X_in_equas "(1)" decom - by (auto simp add:equations_def equation_rhs_def intro!:exI[where x = Xa]) - thus "x \ L xrhs" using X_in_equas False not_empty unfolding equations_def equation_rhs_def - by auto - qed - qed - next -*) - -lemma finite_rhs: - assumes fin: "finite CS" - shows "finite (rhs CS X)" - using fin unfolding rhs_def by (auto) - -lemma finite_eqs: - assumes fin: "finite CS" - shows "finite (eqs CS)" -unfolding eqs_def -apply(rule finite_UN_I) -apply(rule fin) -apply(simp add: eq_def) + "equiv UNIV (MNRel Lang)" +unfolding equiv_def +unfolding refl_on_def sym_def trans_def +apply(auto simp add: mem_def equiv_str_def) done lemma - shows "X ; L (folds ALT NULL (X \\ Y)) \ Y" -by (auto simp add: transitions_def lang_seq_def) - -lemma - shows "X ; L (X \\ Y) \ Y" -apply (auto simp add: transitions_rexp_def transitions_def lang_seq_def) -oops + "(MNRel Lang)``{x} = \x\Lang" +unfolding equiv_class_def Image_def mem_def +by (simp) -lemma - "equation_rhs CS X = rhs CS X" -apply(simp only: rhs_def empty_rhs_def CT_def transitions_rexp_def transitions_def equation_rhs_def) -oops - - - -lemma - shows "X ; L (X \\ Y) \ Y" -apply (auto simp add: transitions_rexp_def transitions_def lang_seq_def) -oops +lemma tt: "\A = B; C \ B\ \ C \ A" by simp lemma - assumes a: "X \ (UNIV // (\Lang))" - shows "X \ \ (rhs_sem (UNIV // (\Lang)) X)" -unfolding rhs_sem_def -apply (auto simp add: transitions_def lang_seq_def fold_alt_null_eqs) -apply(rule_tac x="X" in exI) + "UNIV//(MNRel (L1 \ L2)) \ (UNIV//(MNRel L1)) \ (UNIV//(MNRel L2))" +unfolding quotient_def +unfolding UNION_eq_Union_image +apply(rule tt) +apply(rule Un_Union_image[symmetric]) apply(simp) -apply(simp add: quotient_def Image_def) -apply(subst (4) mem_def) -oops - - -lemma UNIV_eq_complement: - "UNIV // (\Lang) = UNIV // (\(- Lang))" -by auto - -lemma eq_inter: - fixes x y::"string" - shows "\x \L1 y; x \L2 y\ \ (x \(L1 \ L2) y)" -by auto - -lemma equ_union: - fixes x y::"string" - shows "\x \L1 y; x \L2 y\ \ (x \(L1 \ L2) y)" -by auto - -(* HERE *) - -lemma tt: - "R1 \ R2 \ R1 `` {x} \ R2 `` {x}" +apply(rule UN_mono) +apply(simp) +apply(simp) unfolding Image_def -by auto - -lemma tt_aux: - "(\Lang) `` {x} = \x\Lang" -unfolding Image_def -unfolding equiv_class_def -unfolding equiv_str_def unfolding mem_def +unfolding MNRel.simps apply(simp) -done - -lemma tt_old: - "(\L1) \ (\L2) \ \x\L1 \ \x\L2" -unfolding tt_aux[symmetric] -apply(simp add: tt) -done - - - - -lemma - assumes a: "finite (A // R1)" "R1 \ R2" - shows "card (A // R2) <= card (A // R1)" -using assms -apply(induct ) -unfolding quotient_def -apply(drule_tac tt) -sorry - -lemma other_direction_cu: - fixes r::"rexp" - shows "finite (UNIV // (\(L r)))" -apply(induct r) -apply(simp_all) oops @@ -1574,13 +1358,13 @@ where "QUOT Lang \ (\x. {\x\Lang})" - lemma test_01: "Lang \ (\ QUOT Lang)" unfolding QUOT_def equiv_class_def equiv_str_def by (blast) -text{* by chunhan *} + +(* by chunhan *) lemma quot_lambda: "QUOT {[]} = {{[]}, UNIV - {[]}}" proof show "QUOT {[]} \ {{[]}, UNIV - {[]}}" @@ -1759,4 +1543,244 @@ + +(* by chunhan *) + + +lemma finite_tag_image: + "finite (range tag) \ finite (((op `) tag) ` S)" +apply (rule_tac B = "Pow (tag ` UNIV)" in finite_subset) +by (auto simp add:image_def Pow_def) + +lemma str_inj_imps: + assumes str_inj: "\ m n. tag m = tag (n::string) \ m \lang\ n" + shows "inj_on ((op `) tag) (QUOT lang)" +proof (clarsimp simp add:inj_on_def QUOT_def) + fix x y + assume eq_tag: "tag ` \x\lang = tag ` \y\lang" + show "\x\lang = \y\lang" + proof - + have aux1:"\a b. a \ (\b\lang) \ (a \lang\ b)" + by (simp add:equiv_class_def equiv_str_def) + have aux2: "\ A B f. \f ` A = f ` B; A \ {}\ \ \ a b. a \ A \ b \ B \ f a = f b" + by auto + have aux3: "\ a l. \a\l \ {}" + by (auto simp:equiv_class_def equiv_str_def) + show ?thesis using eq_tag + apply (drule_tac aux2, simp add:aux3, clarsimp) + apply (drule_tac str_inj, (drule_tac aux1)+) + by (simp add:equiv_str_def equiv_class_def) + qed +qed + +definition tag_str_ALT :: "string set \ string set \ string \ (string set \ string set)" +where + "tag_str_ALT L\<^isub>1 L\<^isub>2 x \ (\x\L\<^isub>1, \x\L\<^isub>2)" + +lemma tag_str_alt_range_finite: + assumes finite1: "finite (QUOT L\<^isub>1)" + and finite2: "finite (QUOT L\<^isub>2)" + shows "finite (range (tag_str_ALT L\<^isub>1 L\<^isub>2))" +proof - + have "{y. \x. y = (\x\L\<^isub>1, \x\L\<^isub>2)} \ (QUOT L\<^isub>1) \ (QUOT L\<^isub>2)" + by (auto simp:QUOT_def) + thus ?thesis using finite1 finite2 + by (auto simp: image_def tag_str_ALT_def UNION_def + intro: finite_subset[where B = "(QUOT L\<^isub>1) \ (QUOT L\<^isub>2)"]) +qed + +lemma tag_str_alt_inj: + "tag_str_ALT L\<^isub>1 L\<^isub>2 x = tag_str_ALT L\<^isub>1 L\<^isub>2 y \ x \(L\<^isub>1 \ L\<^isub>2)\ y" +apply (simp add:tag_str_ALT_def equiv_class_def equiv_str_def) +by blast + +lemma quot_alt: + assumes finite1: "finite (QUOT L\<^isub>1)" + and finite2: "finite (QUOT L\<^isub>2)" + shows "finite (QUOT (L\<^isub>1 \ L\<^isub>2))" +proof (rule_tac f = "(op `) (tag_str_ALT L\<^isub>1 L\<^isub>2)" in finite_imageD) + show "finite (op ` (tag_str_ALT L\<^isub>1 L\<^isub>2) ` QUOT (L\<^isub>1 \ L\<^isub>2))" + using finite_tag_image tag_str_alt_range_finite finite1 finite2 + by auto +next + show "inj_on (op ` (tag_str_ALT L\<^isub>1 L\<^isub>2)) (QUOT (L\<^isub>1 \ L\<^isub>2))" + apply (rule_tac str_inj_imps) + by (erule_tac tag_str_alt_inj) +qed + +(* list_diff:: list substract, once different return tailer *) +fun list_diff :: "'a list \ 'a list \ 'a list" (infix "-" 51) +where + "list_diff [] xs = []" | + "list_diff (x#xs) [] = x#xs" | + "list_diff (x#xs) (y#ys) = (if x = y then list_diff xs ys else (x#xs))" + +definition tag_str_SEQ:: "string set \ string set \ string \ (string set) set" +where + "tag_str_SEQ L\<^isub>1 L\<^isub>2 x \ if (\ y. y \ x \ y \ L\<^isub>1) + then {(\(x - y)\L\<^isub>2) | y. y \ x \ y \ L\<^isub>1} + else { \x\L\<^isub>1 }" + +lemma tag_str_seq_range_finite: + assumes finite1: "finite (QUOT L\<^isub>1)" + and finite2: "finite (QUOT L\<^isub>2)" + shows "finite (range (tag_str_SEQ L\<^isub>1 L\<^isub>2))" +proof - + have "(range (tag_str_SEQ L\<^isub>1 L\<^isub>2)) \ Pow ((QUOT L\<^isub>1) \ (QUOT L\<^isub>2))" + by (auto simp:image_def tag_str_SEQ_def QUOT_def) + thus ?thesis using finite1 finite2 + by (rule_tac B = "Pow ((QUOT L\<^isub>1) \ (QUOT L\<^isub>2))" in finite_subset, auto) +qed + +lemma tag_str_seq_inj: + assumes tag_eq: "tag_str_SEQ L\<^isub>1 L\<^isub>2 x = tag_str_SEQ L\<^isub>1 L\<^isub>2 y" + shows "(x::string) \(L\<^isub>1 ; L\<^isub>2)\ y" +proof (cases "\ xa. xa \ x \ xa \ L\<^isub>1") + have equiv_str_sym: "\ x y lang. (x::string) \lang\ y \ y \lang\ x" + by (auto simp:equiv_str_def) + have set_equ_D: "\ A a B b. \A = B; A \ {}\ \ \ a b. a \ A \ b \ B \ a = b " by auto + have eqset_equ_D: "\ x y lang. {y. x \lang\ y} = {ya. y \lang\ ya} \ x \lang\ y" + by (drule set_equ_D, auto simp:equiv_str_def) + assume x_left_l1: "\xa\x. xa \ L\<^isub>1" + show "x \L\<^isub>1 ; L\<^isub>2\ y" + proof (cases "\ ya. ya \ y \ ya \ L\<^isub>1") + assume y_left_l1: "\ya\y. ya \ L\<^isub>1" + with tag_eq x_left_l1 + show "x \L\<^isub>1 ; L\<^isub>2\ y" + apply (simp add:tag_str_SEQ_def) + apply (drule set_equ_D) + apply (auto simp:equiv_class_def equiv_str_def)[1] + apply (clarsimp simp:equiv_str_def) + apply (rule iffI) + apply + apply ( + next + assume y_in_l1: "\ (\ya\y. ya \ L\<^isub>1)" + show "x \L\<^isub>1 ; L\<^isub>2\ y" + sorry + qed +next + assume x_in_l1: "\ (\xa\x. xa \ L\<^isub>1)" + show "x \L\<^isub>1 ; L\<^isub>2\ y" + proof (cases "\ ya. ya \ y \ ya \ L\<^isub>1") + assume y_left_l1: "\ya\y. ya \ L\<^isub>1" + show "x \L\<^isub>1 ; L\<^isub>2\ y" + sorry + next + assume y_in_l1: "\ (\ya\y. ya \ L\<^isub>1)" + with tag_eq x_in_l1 + have "\x\(L\<^isub>1;L\<^isub>2) = \y\(L\<^isub>1;L\<^isub>2)" + sorry + thus "x \L\<^isub>1 ; L\<^isub>2\ y" + by (auto simp:equiv_class_def equiv_str_def) + qed +qed + +apply (simp add:tag_str_SEQ_def split:if_splits) +prefer 4 +apply (clarsimp simp add:equiv_str_def) +apply (rule iffI) +apply (simp add:lang_seq_def equiv_class_def equiv_str_def) +apply blast +apply ( +sorry + + +lemma quot_seq: + assumes finite1: "finite (QUOT L\<^isub>1)" + and finite2: "finite (QUOT L\<^isub>2)" + shows "finite (QUOT (L\<^isub>1;L\<^isub>2))" +proof (rule_tac f = "(op `) (tag_str_SEQ L\<^isub>1 L\<^isub>2)" in finite_imageD) + show "finite (op ` (tag_str_SEQ L\<^isub>1 L\<^isub>2) ` QUOT (L\<^isub>1 ; L\<^isub>2))" + using finite_tag_image tag_str_seq_range_finite finite1 finite2 + by auto +next + show "inj_on (op ` (tag_str_SEQ L\<^isub>1 L\<^isub>2)) (QUOT (L\<^isub>1 ; L\<^isub>2))" + apply (rule_tac str_inj_imps) + by (erule_tac tag_str_seq_inj) +qed + +definition tag_str_STAR:: "string set \ string \ (string set) set" +where + "tag_str_STAR L\<^isub>1 x = {\y\L\<^isub>1 | y. y \ x}" + +lemma tag_str_star_range_finite: + assumes finite1: "finite (QUOT L\<^isub>1)" + shows "finite (range (tag_str_STAR L\<^isub>1))" +proof - + have "range (tag_str_STAR L\<^isub>1) \ Pow (QUOT L\<^isub>1)" + by (auto simp:image_def tag_str_STAR_def QUOT_def) + thus ?thesis using finite1 + by (rule_tac B = "Pow (QUOT L\<^isub>1)" in finite_subset, auto) +qed + +lemma tag_str_star_inj: + "tag_str_STAR L\<^isub>1 x = tag_str_STAR L\<^isub>1 (y::string) \ x \L\<^isub>1\\ y" +proof - + have "\ x lang. (x = []) = (tag_str_STAR lang x = {\[]\lang})" + proof (rule_tac allI, rule_tac allI, rule_tac iffI) + fix x lang + show "x = [] \ tag_str_STAR lang x = {\[]\lang}" + by (simp add:tag_str_STAR_def) + next + fix x lang + show "tag_str_STAR lang x = {\[]\lang} \ x = []" + apply (simp add:tag_str_STAR_def) + apply (drule equalityD1) + apply (case_tac x) + apply simp + thm in_mono + apply (drule_tac x = "\[a]\lang" in in_mono) + apply simp + apply auto + + apply (erule subsetCE) + + apply (case_tac y) + + sorry + next + qed + apply (simp add:tag_str_STAR_def equiv_class_def equiv_str_def) + apply (rule iffI) + + apply (auto simp:tag_str_STAR_def equiv_class_def equiv_str_def) + have "\ x y z xstr. xstr \ L\<^isub>1\ \ + xstr = x @ z \ tag_str_STAR L\<^isub>1 x = tag_str_STAR L\<^isub>1 y \ y @ z \ L\<^isub>1\ " + proof (erule Star.induct) + fix x y z xstr + show "[] = x @ z \ tag_str_STAR L\<^isub>1 x = tag_str_STAR L\<^isub>1 y \ y @ z \ L\<^isub>1\" + apply (clarsimp simp add:tag_str_STAR_def equiv_str_def equiv_class_def) + apply (blast) +apply (simp add:tag_str_STAR_def equiv_class_def QUOT_def) +apply (simp add:equiv_str_def) +apply (rule allI, rule_tac iffI) +apply (erule_tac star.induct) +apply blast + +sorry + + +lemma quot_star: + assumes finite1: "finite (QUOT L\<^isub>1)" + shows "finite (QUOT (L\<^isub>1\))" +proof (rule_tac f = "(op `) (tag_str_STAR L\<^isub>1)" in finite_imageD) + show "finite (op ` (tag_str_STAR L\<^isub>1) ` QUOT (L\<^isub>1\))" + using finite_tag_image tag_str_star_range_finite finite1 + by auto +next + show "inj_on (op ` (tag_str_STAR L\<^isub>1)) (QUOT (L\<^isub>1\))" + apply (rule_tac str_inj_imps) + by (erule_tac tag_str_star_inj) +qed + +lemma other_direction: + "Lang = L (r::rexp) \ finite (QUOT Lang)" +apply (induct arbitrary:Lang rule:rexp.induct) +apply (simp add:QUOT_def equiv_class_def equiv_str_def) +by (simp_all add:quot_lambda quot_single quot_seq quot_alt quot_star) + + + + end \ No newline at end of file