diff -r ce24ed955cca -r 2a5ac68db24b Derivatives.thy --- a/Derivatives.thy Thu Aug 11 16:55:41 2011 +0000 +++ b/Derivatives.thy Thu Aug 11 23:11:39 2011 +0000 @@ -115,12 +115,12 @@ fun pder :: "'a \ 'a rexp \ ('a rexp) set" where - "pder c Zero = {Zero}" -| "pder c One = {Zero}" -| "pder c (Atom c') = (if c = c' then {One} else {Zero})" + "pder c Zero = {}" +| "pder c One = {}" +| "pder c (Atom c') = (if c = c' then {One} else {})" | "pder c (Plus r1 r2) = (pder c r1) \ (pder c r2)" | "pder c (Times r1 r2) = - (if nullable r1 then Timess (pder c r1) r2 \ pder c r2 else Timess (pder c r1) r2)" + (if nullable r1 then Timess (pder c r1) r2 \ pder c r2 else Timess (pder c r1) r2)" | "pder c (Star r) = Timess (pder c r) (Star r)" abbreviation @@ -144,11 +144,14 @@ by (simp add: pders_append) lemma pders_simps [simp]: - shows "pders s Zero = {Zero}" - and "pders s One = (if s = [] then {One} else {Zero})" - and "pders s (Atom c) = (if s = [] then {Atom c} else (if s = [c] then {One} else {Zero}))" + shows "pders s Zero = (if s= [] then {Zero} else {})" + and "pders s One = (if s = [] then {One} else {})" and "pders s (Plus r1 r2) = (if s = [] then {Plus r1 r2} else (pders s r1) \ (pders s r2))" -by (induct s) (auto) +by (induct s) (simp_all) + +lemma pders_Atom [intro]: + shows "pders s (Atom c) \ {Atom c, One}" +by (induct s) (simp_all) subsection {* Relating left-quotients and partial derivatives *} @@ -185,7 +188,7 @@ subsection {* There are only finitely many partial derivatives for a language *} definition - "pders_lang A r \ \s \ A. pders s r" + "pders_lang A r \ \x \ A. pders x r" lemma pders_lang_subsetI [intro]: assumes "\s. s \ A \ pders s r \ C" @@ -196,20 +199,31 @@ shows "pders_lang (A \ B) r = (pders_lang A r \ pders_lang B r)" by (simp add: pders_lang_def) +lemma pders_lang_subset: + shows "A \ B \ pders_lang A r \ pders_lang B r" +by (auto simp add: pders_lang_def) + definition "UNIV1 \ UNIV - {[]}" lemma pders_lang_Zero [simp]: - shows "pders_lang UNIV1 Zero = {Zero}" + shows "pders_lang UNIV1 Zero = {}" unfolding UNIV1_def pders_lang_def by auto lemma pders_lang_One [simp]: - shows "pders_lang UNIV1 One = {Zero}" + shows "pders_lang UNIV1 One = {}" unfolding UNIV1_def pders_lang_def by (auto split: if_splits) -lemma pders_lang_Atom: - shows "pders_lang UNIV1 (Atom c) \ {One, Zero}" -unfolding UNIV1_def pders_lang_def by (auto split: if_splits) +lemma pders_lang_Atom [simp]: + shows "pders_lang UNIV1 (Atom c) = {One}" +unfolding UNIV1_def pders_lang_def +apply(auto) +apply(frule rev_subsetD) +apply(rule pders_Atom) +apply(simp) +apply(case_tac xa) +apply(auto split: if_splits) +done lemma pders_lang_Plus [simp]: shows "pders_lang UNIV1 (Plus r1 r2) = pders_lang UNIV1 r1 \ pders_lang UNIV1 r2" @@ -328,15 +342,9 @@ lemma finite_pders_lang_UNIV1: shows "finite (pders_lang UNIV1 r)" apply(induct r) -apply(simp) -apply(simp) -apply(rule finite_subset[OF pders_lang_Atom]) -apply(simp) -apply(simp) -apply(rule finite_subset[OF pders_lang_Times]) -apply(simp) -apply(rule finite_subset[OF pders_lang_Star]) -apply(simp) +apply(simp_all add: + finite_subset[OF pders_lang_Times] + finite_subset[OF pders_lang_Star]) done lemma pders_lang_UNIV: @@ -351,9 +359,9 @@ lemma finite_pders_lang: shows "finite (pders_lang A r)" -apply(rule rev_finite_subset) -apply(rule_tac r="r" in finite_pders_lang_UNIV) -apply(auto simp add: pders_lang_def) +apply(rule rev_finite_subset[OF finite_pders_lang_UNIV]) +apply(rule pders_lang_subset) +apply(simp) done text {* Relating the Myhill-Nerode relation with left-quotients. *}