diff -r c090baa7059d -r 8b8db9558ecf thys/Spec.thy --- a/thys/Spec.thy Mon Feb 11 23:18:05 2019 +0000 +++ b/thys/Spec.thy Sun Feb 17 22:15:06 2019 +0000 @@ -1,187 +1,10 @@ theory Spec - imports Main "~~/src/HOL/Library/Sublist" + imports RegLangs begin -section {* Sequential Composition of Languages *} - -definition - Sequ :: "string set \ string set \ string set" ("_ ;; _" [100,100] 100) -where - "A ;; B = {s1 @ s2 | s1 s2. s1 \ A \ s2 \ B}" - -text {* Two Simple Properties about Sequential Composition *} - -lemma Sequ_empty_string [simp]: - shows "A ;; {[]} = A" - and "{[]} ;; A = A" -by (simp_all add: Sequ_def) - -lemma Sequ_empty [simp]: - shows "A ;; {} = {}" - and "{} ;; A = {}" -by (simp_all add: Sequ_def) - - -section {* Semantic Derivative (Left Quotient) of Languages *} - -definition - Der :: "char \ string set \ string set" -where - "Der c A \ {s. c # s \ A}" - -definition - Ders :: "string \ string set \ string set" -where - "Ders s A \ {s'. s @ s' \ A}" - -lemma Der_null [simp]: - shows "Der c {} = {}" -unfolding Der_def -by auto - -lemma Der_empty [simp]: - shows "Der c {[]} = {}" -unfolding Der_def -by auto - -lemma Der_char [simp]: - shows "Der c {[d]} = (if c = d then {[]} else {})" -unfolding Der_def -by auto - -lemma Der_union [simp]: - shows "Der c (A \ B) = Der c A \ Der c B" -unfolding Der_def -by auto - -lemma Der_Sequ [simp]: - shows "Der c (A ;; B) = (Der c A) ;; B \ (if [] \ A then Der c B else {})" -unfolding Der_def Sequ_def -by (auto simp add: Cons_eq_append_conv) - - -section {* Kleene Star for Languages *} - -inductive_set - Star :: "string set \ string set" ("_\" [101] 102) - for A :: "string set" -where - start[intro]: "[] \ A\" -| step[intro]: "\s1 \ A; s2 \ A\\ \ s1 @ s2 \ A\" - -(* Arden's lemma *) - -lemma Star_cases: - shows "A\ = {[]} \ A ;; A\" -unfolding Sequ_def -by (auto) (metis Star.simps) - -lemma Star_decomp: - assumes "c # x \ A\" - shows "\s1 s2. x = s1 @ s2 \ c # s1 \ A \ s2 \ A\" -using assms -by (induct x\"c # x" rule: Star.induct) - (auto simp add: append_eq_Cons_conv) - -lemma Star_Der_Sequ: - shows "Der c (A\) \ (Der c A) ;; A\" -unfolding Der_def Sequ_def -by(auto simp add: Star_decomp) - -lemma Der_star [simp]: - shows "Der c (A\) = (Der c A) ;; A\" -proof - - have "Der c (A\) = Der c ({[]} \ A ;; A\)" - by (simp only: Star_cases[symmetric]) - also have "... = Der c (A ;; A\)" - by (simp only: Der_union Der_empty) (simp) - also have "... = (Der c A) ;; A\ \ (if [] \ A then Der c (A\) else {})" - by simp - also have "... = (Der c A) ;; A\" - using Star_Der_Sequ by auto - finally show "Der c (A\) = (Der c A) ;; A\" . -qed - - -section {* Regular Expressions *} - -datatype rexp = - ZERO -| ONE -| CHAR char -| SEQ rexp rexp -| ALT rexp rexp -| STAR rexp - -section {* Semantics of Regular Expressions *} - -fun - L :: "rexp \ string set" -where - "L (ZERO) = {}" -| "L (ONE) = {[]}" -| "L (CHAR c) = {[c]}" -| "L (SEQ r1 r2) = (L r1) ;; (L r2)" -| "L (ALT r1 r2) = (L r1) \ (L r2)" -| "L (STAR r) = (L r)\" - - -section {* Nullable, Derivatives *} - -fun - nullable :: "rexp \ bool" -where - "nullable (ZERO) = False" -| "nullable (ONE) = True" -| "nullable (CHAR c) = False" -| "nullable (ALT r1 r2) = (nullable r1 \ nullable r2)" -| "nullable (SEQ r1 r2) = (nullable r1 \ nullable r2)" -| "nullable (STAR r) = True" - - -fun - der :: "char \ rexp \ rexp" -where - "der c (ZERO) = ZERO" -| "der c (ONE) = ZERO" -| "der c (CHAR d) = (if c = d then ONE else ZERO)" -| "der c (ALT r1 r2) = ALT (der c r1) (der c r2)" -| "der c (SEQ r1 r2) = - (if nullable r1 - then ALT (SEQ (der c r1) r2) (der c r2) - else SEQ (der c r1) r2)" -| "der c (STAR r) = SEQ (der c r) (STAR r)" - -fun - ders :: "string \ rexp \ rexp" -where - "ders [] r = r" -| "ders (c # s) r = ders s (der c r)" - - -lemma nullable_correctness: - shows "nullable r \ [] \ (L r)" -by (induct r) (auto simp add: Sequ_def) - -lemma der_correctness: - shows "L (der c r) = Der c (L r)" -by (induct r) (simp_all add: nullable_correctness) - -lemma ders_correctness: - shows "L (ders s r) = Ders s (L r)" -by (induct s arbitrary: r) - (simp_all add: Ders_def der_correctness Der_def) - -lemma ders_append: - shows "ders (s1 @ s2) r = ders s2 (ders s1 r)" - apply(induct s1 arbitrary: s2 r) - apply(auto) - done - - -section {* Values *} +section {* "Plain" Values *} datatype val = Void @@ -212,28 +35,6 @@ "flat (Stars vs) = flats vs" by (induct vs) (auto) -lemma Star_concat: - assumes "\s \ set ss. s \ A" - shows "concat ss \ A\" -using assms by (induct ss) (auto) - -lemma Star_cstring: - assumes "s \ A\" - shows "\ss. concat ss = s \ (\s \ set ss. s \ A \ s \ [])" -using assms -apply(induct rule: Star.induct) -apply(auto)[1] -apply(rule_tac x="[]" in exI) -apply(simp) -apply(erule exE) -apply(clarify) -apply(case_tac "s1 = []") -apply(rule_tac x="ss" in exI) -apply(simp) -apply(rule_tac x="s1#ss" in exI) -apply(simp) -done - section {* Lexical Values *} @@ -262,7 +63,7 @@ by (auto intro: Prf.intros elim!: Prf_elims) -lemma Star_cval: +lemma flats_Prf_value: assumes "\s\set ss. \v. s = flat v \ \ v : r" shows "\vs. flats vs = concat ss \ (\v\set vs. \ v : r \ flat v \ [])" using assms @@ -293,9 +94,9 @@ have IH: "\s. s \ L r \ \v. \ v : r \ flat v = s" by fact have "s \ L (STAR r)" by fact then obtain ss where "concat ss = s" "\s \ set ss. s \ L r \ s \ []" - using Star_cstring by auto + using Star_split by auto then obtain vs where "flats vs = s" "\v\set vs. \ v : r \ flat v \ []" - using IH Star_cval by metis + using IH flats_Prf_value by metis then show "\v. \ v : STAR r \ flat v = s" using Prf.intros(6) flat_Stars by blast next @@ -455,7 +256,7 @@ -section {* Our POSIX Definition *} +section {* Our inductive POSIX Definition *} inductive Posix :: "string \ rexp \ val \ bool" ("_ \ _ \ _" [100, 100, 100] 100) @@ -488,7 +289,8 @@ (auto simp add: Sequ_def) text {* - Our Posix definition determines a unique value. + For a give value and string, our Posix definition + determines a unique value. *} lemma Posix_determ: