144 "nullable (NULL) = False" |
144 "nullable (NULL) = False" |
145 | "nullable (EMPTY) = True" |
145 | "nullable (EMPTY) = True" |
146 | "nullable (CHAR c) = False" |
146 | "nullable (CHAR c) = False" |
147 | "nullable (ALT r1 r2) = (nullable r1 \<or> nullable r2)" |
147 | "nullable (ALT r1 r2) = (nullable r1 \<or> nullable r2)" |
148 | "nullable (SEQ r1 r2) = (nullable r1 \<and> nullable r2)" |
148 | "nullable (SEQ r1 r2) = (nullable r1 \<and> nullable r2)" |
149 | "nullable (STAR r1) = True" |
149 | "nullable (STAR r) = True" |
150 |
150 |
151 lemma nullable_correctness: |
151 lemma nullable_correctness: |
152 shows "nullable r \<longleftrightarrow> [] \<in> (L r)" |
152 shows "nullable r \<longleftrightarrow> [] \<in> (L r)" |
153 apply (induct r) |
153 apply (induct r) |
154 apply(auto simp add: Sequ_def) |
154 apply(auto simp add: Sequ_def) |
172 "flat (Void) = []" |
172 "flat (Void) = []" |
173 | "flat (Char c) = [c]" |
173 | "flat (Char c) = [c]" |
174 | "flat (Left v) = flat v" |
174 | "flat (Left v) = flat v" |
175 | "flat (Right v) = flat v" |
175 | "flat (Right v) = flat v" |
176 | "flat (Seq v1 v2) = (flat v1) @ (flat v2)" |
176 | "flat (Seq v1 v2) = (flat v1) @ (flat v2)" |
177 | "flat (Star []) = []" |
177 | "flat (Stars []) = []" |
178 | "flat (Star (v#vs)) = (flat v) @ (flat (Star vs))" |
178 | "flat (Stars (v#vs)) = (flat v) @ (flat (Stars vs))" |
179 |
179 |
180 lemma [simp]: |
180 lemma [simp]: |
181 "flat (Star vs) = concat (map flat vs)" |
181 "flat (Stars vs) = concat (map flat vs)" |
182 apply(induct vs) |
182 apply(induct vs) |
183 apply(auto) |
183 apply(auto) |
184 done |
184 done |
185 |
185 |
186 section {* Relation between values and regular expressions *} |
186 section {* Relation between values and regular expressions *} |
191 "\<lbrakk>\<Turnstile> v1 : r1; \<Turnstile> v2 : r2\<rbrakk> \<Longrightarrow> \<Turnstile> Seq v1 v2 : SEQ r1 r2" |
191 "\<lbrakk>\<Turnstile> v1 : r1; \<Turnstile> v2 : r2\<rbrakk> \<Longrightarrow> \<Turnstile> Seq v1 v2 : SEQ r1 r2" |
192 | "\<Turnstile> v1 : r1 \<Longrightarrow> \<Turnstile> Left v1 : ALT r1 r2" |
192 | "\<Turnstile> v1 : r1 \<Longrightarrow> \<Turnstile> Left v1 : ALT r1 r2" |
193 | "\<Turnstile> v2 : r2 \<Longrightarrow> \<Turnstile> Right v2 : ALT r1 r2" |
193 | "\<Turnstile> v2 : r2 \<Longrightarrow> \<Turnstile> Right v2 : ALT r1 r2" |
194 | "\<Turnstile> Void : EMPTY" |
194 | "\<Turnstile> Void : EMPTY" |
195 | "\<Turnstile> Char c : CHAR c" |
195 | "\<Turnstile> Char c : CHAR c" |
196 | "\<Turnstile> Star [] : STAR r" |
196 | "\<Turnstile> Stars [] : STAR r" |
197 | "\<lbrakk>\<Turnstile> v : r; \<Turnstile> Star vs : STAR r; flat v \<noteq> []\<rbrakk> \<Longrightarrow> \<Turnstile> Star (v # vs) : STAR r" |
197 | "\<lbrakk>\<Turnstile> v : r; \<Turnstile> Stars vs : STAR r; flat v \<noteq> []\<rbrakk> \<Longrightarrow> \<Turnstile> Stars (v # vs) : STAR r" |
198 |
198 |
199 inductive |
199 inductive |
200 Prf :: "val \<Rightarrow> rexp \<Rightarrow> bool" ("\<turnstile> _ : _" [100, 100] 100) |
200 Prf :: "val \<Rightarrow> rexp \<Rightarrow> bool" ("\<turnstile> _ : _" [100, 100] 100) |
201 where |
201 where |
202 "\<lbrakk>\<turnstile> v1 : r1; \<turnstile> v2 : r2\<rbrakk> \<Longrightarrow> \<turnstile> Seq v1 v2 : SEQ r1 r2" |
202 "\<lbrakk>\<turnstile> v1 : r1; \<turnstile> v2 : r2\<rbrakk> \<Longrightarrow> \<turnstile> Seq v1 v2 : SEQ r1 r2" |
203 | "\<turnstile> v1 : r1 \<Longrightarrow> \<turnstile> Left v1 : ALT r1 r2" |
203 | "\<turnstile> v1 : r1 \<Longrightarrow> \<turnstile> Left v1 : ALT r1 r2" |
204 | "\<turnstile> v2 : r2 \<Longrightarrow> \<turnstile> Right v2 : ALT r1 r2" |
204 | "\<turnstile> v2 : r2 \<Longrightarrow> \<turnstile> Right v2 : ALT r1 r2" |
205 | "\<turnstile> Void : EMPTY" |
205 | "\<turnstile> Void : EMPTY" |
206 | "\<turnstile> Char c : CHAR c" |
206 | "\<turnstile> Char c : CHAR c" |
207 | "\<turnstile> Star [] : STAR r" |
207 | "\<turnstile> Stars [] : STAR r" |
208 | "\<lbrakk>\<turnstile> v : r; \<turnstile> Star vs : STAR r\<rbrakk> \<Longrightarrow> \<turnstile> Star (v # vs) : STAR r" |
208 | "\<lbrakk>\<turnstile> v : r; \<turnstile> Stars vs : STAR r\<rbrakk> \<Longrightarrow> \<turnstile> Stars (v # vs) : STAR r" |
209 |
209 |
210 lemma NPrf_imp_Prf: |
210 lemma NPrf_imp_Prf: |
211 assumes "\<Turnstile> v : r" |
211 assumes "\<Turnstile> v : r" |
212 shows "\<turnstile> v : r" |
212 shows "\<turnstile> v : r" |
213 using assms |
213 using assms |
215 apply(auto intro: Prf.intros) |
215 apply(auto intro: Prf.intros) |
216 done |
216 done |
217 |
217 |
218 lemma NPrf_Prf_val: |
218 lemma NPrf_Prf_val: |
219 shows "\<turnstile> v : r \<Longrightarrow> \<exists>v'. flat v' = flat v \<and> \<Turnstile> v' : r" |
219 shows "\<turnstile> v : r \<Longrightarrow> \<exists>v'. flat v' = flat v \<and> \<Turnstile> v' : r" |
220 and "\<turnstile> Star vs : r \<Longrightarrow> \<exists>vs'. flat (Star vs') = flat (Star vs) \<and> \<Turnstile> Star vs' : r" |
220 and "\<turnstile> Stars vs : r \<Longrightarrow> \<exists>vs'. flat (Stars vs') = flat (Stars vs) \<and> \<Turnstile> Stars vs' : r" |
221 using assms |
221 using assms |
222 apply(induct v and vs arbitrary: r and r rule: val.inducts) |
222 apply(induct v and vs arbitrary: r and r rule: val.inducts) |
223 apply(auto)[1] |
223 apply(auto)[1] |
224 apply(erule Prf.cases) |
224 apply(erule Prf.cases) |
225 apply(simp_all)[7] |
225 apply(simp_all)[7] |
260 apply(simp) |
260 apply(simp) |
261 apply (metis NPrf.intros) |
261 apply (metis NPrf.intros) |
262 apply(drule_tac x="r" in meta_spec) |
262 apply(drule_tac x="r" in meta_spec) |
263 apply(simp) |
263 apply(simp) |
264 apply(auto)[1] |
264 apply(auto)[1] |
265 apply(rule_tac x="Star vs'" in exI) |
265 apply(rule_tac x="Stars vs'" in exI) |
266 apply(simp) |
266 apply(simp) |
267 apply(rule_tac x="[]" in exI) |
267 apply(rule_tac x="[]" in exI) |
268 apply(simp) |
268 apply(simp) |
269 apply(erule Prf.cases) |
269 apply(erule Prf.cases) |
270 apply(simp_all)[7] |
270 apply(simp_all)[7] |
311 lemma NPrf_flat_L: |
311 lemma NPrf_flat_L: |
312 assumes "\<Turnstile> v : r" shows "flat v \<in> L r" |
312 assumes "\<Turnstile> v : r" shows "flat v \<in> L r" |
313 using assms |
313 using assms |
314 by (metis NPrf_imp_Prf Prf_flat_L) |
314 by (metis NPrf_imp_Prf Prf_flat_L) |
315 |
315 |
316 lemma Prf_Star: |
316 lemma Prf_Stars: |
317 assumes "\<forall>v \<in> set vs. \<turnstile> v : r" |
317 assumes "\<forall>v \<in> set vs. \<turnstile> v : r" |
318 shows "\<turnstile> Star vs : STAR r" |
318 shows "\<turnstile> Stars vs : STAR r" |
319 using assms |
319 using assms |
320 apply(induct vs) |
320 apply(induct vs) |
321 apply (metis Prf.intros(6)) |
321 apply (metis Prf.intros(6)) |
322 by (metis Prf.intros(7) insert_iff set_simps(2)) |
322 by (metis Prf.intros(7) insert_iff set_simps(2)) |
323 |
323 |
362 apply (metis Prf.intros(3) flat.simps(4)) |
362 apply (metis Prf.intros(3) flat.simps(4)) |
363 apply(erule Prf.cases) |
363 apply(erule Prf.cases) |
364 apply(auto) |
364 apply(auto) |
365 apply(subgoal_tac "\<exists>vs::val list. concat (map flat vs) = x \<and> (\<forall>v \<in> set vs. \<turnstile> v : r)") |
365 apply(subgoal_tac "\<exists>vs::val list. concat (map flat vs) = x \<and> (\<forall>v \<in> set vs. \<turnstile> v : r)") |
366 apply(auto)[1] |
366 apply(auto)[1] |
367 apply(rule_tac x="Star vs" in exI) |
367 apply(rule_tac x="Stars vs" in exI) |
368 apply(simp) |
368 apply(simp) |
369 apply(rule Prf_Star) |
369 apply(rule Prf_Stars) |
370 apply(simp) |
370 apply(simp) |
371 apply(drule Star_string) |
371 apply(drule Star_string) |
372 apply(auto) |
372 apply(auto) |
373 apply(rule Star_val) |
373 apply(rule Star_val) |
374 apply(simp) |
374 apply(simp) |
388 apply(simp add: star3) |
388 apply(simp add: star3) |
389 apply(auto) |
389 apply(auto) |
390 apply(rule_tac x="Suc x" in exI) |
390 apply(rule_tac x="Suc x" in exI) |
391 apply(auto simp add: Sequ_def) |
391 apply(auto simp add: Sequ_def) |
392 apply(rule_tac x="flat v" in exI) |
392 apply(rule_tac x="flat v" in exI) |
393 apply(rule_tac x="flat (Star vs)" in exI) |
393 apply(rule_tac x="flat (Stars vs)" in exI) |
394 apply(auto) |
394 apply(auto) |
395 by (metis Prf_flat_L) |
395 by (metis Prf_flat_L) |
396 |
396 |
397 lemma L_flat_Prf2: |
397 lemma L_flat_Prf2: |
398 "L(r) = {flat v | v. \<turnstile> v : r}" |
398 "L(r) = {flat v | v. \<turnstile> v : r}" |
500 |
500 |
501 definition NValues :: "rexp \<Rightarrow> string \<Rightarrow> val set" where |
501 definition NValues :: "rexp \<Rightarrow> string \<Rightarrow> val set" where |
502 "NValues r s \<equiv> {v. \<Turnstile> v : r \<and> flat v \<sqsubseteq> s}" |
502 "NValues r s \<equiv> {v. \<Turnstile> v : r \<and> flat v \<sqsubseteq> s}" |
503 |
503 |
504 lemma NValues_STAR_Nil: |
504 lemma NValues_STAR_Nil: |
505 "NValues (STAR r) [] = {Star []}" |
505 "NValues (STAR r) [] = {Stars []}" |
506 apply(auto simp add: NValues_def prefix_def) |
506 apply(auto simp add: NValues_def prefix_def) |
507 apply(erule NPrf.cases) |
507 apply(erule NPrf.cases) |
508 apply(auto) |
508 apply(auto) |
509 by (metis NPrf.intros(6)) |
509 by (metis NPrf.intros(6)) |
510 |
510 |
539 "Values (EMPTY) s = {Void}" |
539 "Values (EMPTY) s = {Void}" |
540 "Values (CHAR c) s = (if [c] \<sqsubseteq> s then {Char c} else {})" |
540 "Values (CHAR c) s = (if [c] \<sqsubseteq> s then {Char c} else {})" |
541 "Values (ALT r1 r2) s = {Left v | v. v \<in> Values r1 s} \<union> {Right v | v. v \<in> Values r2 s}" |
541 "Values (ALT r1 r2) s = {Left v | v. v \<in> Values r1 s} \<union> {Right v | v. v \<in> Values r2 s}" |
542 "Values (SEQ r1 r2) s = {Seq v1 v2 | v1 v2. v1 \<in> Values r1 s \<and> v2 \<in> Values r2 (rest v1 s)}" |
542 "Values (SEQ r1 r2) s = {Seq v1 v2 | v1 v2. v1 \<in> Values r1 s \<and> v2 \<in> Values r2 (rest v1 s)}" |
543 "Values (STAR r) s = |
543 "Values (STAR r) s = |
544 {Star []} \<union> {Star (v # vs) | v vs. v \<in> Values r s \<and> Star vs \<in> Values (STAR r) (rest v s)}" |
544 {Stars []} \<union> {Stars (v # vs) | v vs. v \<in> Values r s \<and> Stars vs \<in> Values (STAR r) (rest v s)}" |
545 unfolding Values_def |
545 unfolding Values_def |
546 apply(auto) |
546 apply(auto) |
547 (*NULL*) |
547 (*NULL*) |
548 apply(erule Prf.cases) |
548 apply(erule Prf.cases) |
549 apply(simp_all)[7] |
549 apply(simp_all)[7] |
588 "NValues (EMPTY) s = {Void}" |
588 "NValues (EMPTY) s = {Void}" |
589 "NValues (CHAR c) s = (if [c] \<sqsubseteq> s then {Char c} else {})" |
589 "NValues (CHAR c) s = (if [c] \<sqsubseteq> s then {Char c} else {})" |
590 "NValues (ALT r1 r2) s = {Left v | v. v \<in> NValues r1 s} \<union> {Right v | v. v \<in> NValues r2 s}" |
590 "NValues (ALT r1 r2) s = {Left v | v. v \<in> NValues r1 s} \<union> {Right v | v. v \<in> NValues r2 s}" |
591 "NValues (SEQ r1 r2) s = {Seq v1 v2 | v1 v2. v1 \<in> NValues r1 s \<and> v2 \<in> NValues r2 (rest v1 s)}" |
591 "NValues (SEQ r1 r2) s = {Seq v1 v2 | v1 v2. v1 \<in> NValues r1 s \<and> v2 \<in> NValues r2 (rest v1 s)}" |
592 "NValues (STAR r) s = |
592 "NValues (STAR r) s = |
593 {Star []} \<union> {Star (v # vs) | v vs. v \<in> NValues r s \<and> flat v \<noteq> [] \<and> Star vs \<in> NValues (STAR r) (rest v s)}" |
593 {Stars []} \<union> {Stars (v # vs) | v vs. v \<in> NValues r s \<and> flat v \<noteq> [] \<and> Stars vs \<in> NValues (STAR r) (rest v s)}" |
594 unfolding NValues_def |
594 unfolding NValues_def |
595 apply(auto) |
595 apply(auto) |
596 (*NULL*) |
596 (*NULL*) |
597 apply(erule NPrf.cases) |
597 apply(erule NPrf.cases) |
598 apply(simp_all)[7] |
598 apply(simp_all)[7] |
661 apply(simp) |
661 apply(simp) |
662 apply(simp add: NValues_recs) |
662 apply(simp add: NValues_recs) |
663 apply(clarify) |
663 apply(clarify) |
664 apply(subst NValues_recs) |
664 apply(subst NValues_recs) |
665 apply(simp) |
665 apply(simp) |
666 apply(rule_tac f="\<lambda>(v, vs). Star (v # vs)" and |
666 apply(rule_tac f="\<lambda>(v, vs). Stars (v # vs)" and |
667 A="{(v, vs) | v vs. v \<in> NValues rexp b \<and> (flat v \<noteq> [] \<and> Star vs \<in> NValues (STAR rexp) (rest v b))}" in finite_surj) |
667 A="{(v, vs) | v vs. v \<in> NValues rexp b \<and> (flat v \<noteq> [] \<and> Stars vs \<in> NValues (STAR rexp) (rest v b))}" in finite_surj) |
668 prefer 2 |
668 prefer 2 |
669 apply(auto)[1] |
669 apply(auto)[1] |
670 apply(auto) |
670 apply(auto) |
671 apply(case_tac b) |
671 apply(case_tac b) |
672 apply(simp) |
672 apply(simp) |
673 defer |
673 defer |
674 apply(rule_tac B="\<Union>sp \<in> SSuffixes b. {(v, vs) | v vs. v \<in> NValues rexp b \<and> Star vs \<in> NValues (STAR rexp) sp}" in finite_subset) |
674 apply(rule_tac B="\<Union>sp \<in> SSuffixes b. {(v, vs) | v vs. v \<in> NValues rexp b \<and> Stars vs \<in> NValues (STAR rexp) sp}" in finite_subset) |
675 apply(auto)[1] |
675 apply(auto)[1] |
676 apply(rule_tac x="rest aa (a # list)" in bexI) |
676 apply(rule_tac x="rest aa (a # list)" in bexI) |
677 apply(simp) |
677 apply(simp) |
678 apply (rule rest_SSuffixes) |
678 apply (rule rest_SSuffixes) |
679 apply(simp) |
679 apply(simp) |
694 apply(auto)[1] |
694 apply(auto)[1] |
695 apply (metis length_Cons length_rev length_sprefix rev.simps(2)) |
695 apply (metis length_Cons length_rev length_sprefix rev.simps(2)) |
696 apply(simp) |
696 apply(simp) |
697 apply(rule finite_cartesian_product) |
697 apply(rule finite_cartesian_product) |
698 apply(simp) |
698 apply(simp) |
699 apply(rule_tac f="Star" in finite_imageD) |
699 apply(rule_tac f="Stars" in finite_imageD) |
700 prefer 2 |
700 prefer 2 |
701 apply(auto simp add: inj_on_def)[1] |
701 apply(auto simp add: inj_on_def)[1] |
702 apply (metis finite_subset image_Collect_subsetI) |
702 apply (metis finite_subset image_Collect_subsetI) |
703 apply(simp add: rest_Nil) |
703 apply(simp add: rest_Nil) |
704 apply(simp add: NValues_STAR_Nil) |
704 apply(simp add: NValues_STAR_Nil) |
721 mkeps :: "rexp \<Rightarrow> val" |
721 mkeps :: "rexp \<Rightarrow> val" |
722 where |
722 where |
723 "mkeps(EMPTY) = Void" |
723 "mkeps(EMPTY) = Void" |
724 | "mkeps(SEQ r1 r2) = Seq (mkeps r1) (mkeps r2)" |
724 | "mkeps(SEQ r1 r2) = Seq (mkeps r1) (mkeps r2)" |
725 | "mkeps(ALT r1 r2) = (if nullable(r1) then Left (mkeps r1) else Right (mkeps r2))" |
725 | "mkeps(ALT r1 r2) = (if nullable(r1) then Left (mkeps r1) else Right (mkeps r2))" |
726 | "mkeps(STAR r) = Star []" |
726 | "mkeps(STAR r) = Stars []" |
727 |
727 |
728 section {* Derivatives *} |
728 section {* Derivatives *} |
729 |
729 |
730 fun |
730 fun |
731 der :: "char \<Rightarrow> rexp \<Rightarrow> rexp" |
731 der :: "char \<Rightarrow> rexp \<Rightarrow> rexp" |
754 "injval (EMPTY) c Void = Char c" |
754 "injval (EMPTY) c Void = Char c" |
755 | "injval (CHAR d) c Void = Char d" |
755 | "injval (CHAR d) c Void = Char d" |
756 | "injval (CHAR d) c (Char c') = Seq (Char d) (Char c')" |
756 | "injval (CHAR d) c (Char c') = Seq (Char d) (Char c')" |
757 | "injval (ALT r1 r2) c (Left v1) = Left(injval r1 c v1)" |
757 | "injval (ALT r1 r2) c (Left v1) = Left(injval r1 c v1)" |
758 | "injval (ALT r1 r2) c (Right v2) = Right(injval r2 c v2)" |
758 | "injval (ALT r1 r2) c (Right v2) = Right(injval r2 c v2)" |
759 | "injval (SEQ r1 r2) c (Char c') = Seq (Char c) (Char c')" |
|
760 | "injval (SEQ r1 r2) c (Seq v1 v2) = Seq (injval r1 c v1) v2" |
759 | "injval (SEQ r1 r2) c (Seq v1 v2) = Seq (injval r1 c v1) v2" |
761 | "injval (SEQ r1 r2) c (Left (Seq v1 v2)) = Seq (injval r1 c v1) v2" |
760 | "injval (SEQ r1 r2) c (Left (Seq v1 v2)) = Seq (injval r1 c v1) v2" |
762 | "injval (SEQ r1 r2) c (Right v2) = Seq (mkeps r1) (injval r2 c v2)" |
761 | "injval (SEQ r1 r2) c (Right v2) = Seq (mkeps r1) (injval r2 c v2)" |
763 | "injval (STAR r) c (Seq v (Star vs)) = Star ((injval r c v) # vs)" |
762 | "injval (STAR r) c (Seq v (Stars vs)) = Stars ((injval r c v) # vs)" |
764 |
763 |
765 fun |
764 fun |
766 lex :: "rexp \<Rightarrow> string \<Rightarrow> val option" |
765 lex :: "rexp \<Rightarrow> string \<Rightarrow> val option" |
767 where |
766 where |
768 "lex r [] = (if nullable r then Some(mkeps r) else None)" |
767 "lex r [] = (if nullable r then Some(mkeps r) else None)" |
786 | "projval (ALT r1 r2) c (Right v2) = Right (projval r2 c v2)" |
785 | "projval (ALT r1 r2) c (Right v2) = Right (projval r2 c v2)" |
787 | "projval (SEQ r1 r2) c (Seq v1 v2) = |
786 | "projval (SEQ r1 r2) c (Seq v1 v2) = |
788 (if flat v1 = [] then Right(projval r2 c v2) |
787 (if flat v1 = [] then Right(projval r2 c v2) |
789 else if nullable r1 then Left (Seq (projval r1 c v1) v2) |
788 else if nullable r1 then Left (Seq (projval r1 c v1) v2) |
790 else Seq (projval r1 c v1) v2)" |
789 else Seq (projval r1 c v1) v2)" |
791 | "projval (STAR r) c (Star (v # vs)) = Seq (projval r c v) (Star vs)" |
790 | "projval (STAR r) c (Stars (v # vs)) = Seq (projval r c v) (Stars vs)" |
792 |
791 |
793 |
792 |
794 |
793 |
795 lemma mkeps_nullable: |
794 lemma mkeps_nullable: |
796 assumes "nullable(r)" |
795 assumes "nullable(r)" |
886 apply (metis Cons_eq_append_conv) |
885 apply (metis Cons_eq_append_conv) |
887 apply(simp) |
886 apply(simp) |
888 apply(rule NPrf.intros) |
887 apply(rule NPrf.intros) |
889 apply (metis Cons_eq_append_conv) |
888 apply (metis Cons_eq_append_conv) |
890 apply(simp) |
889 apply(simp) |
891 (* Star case *) |
890 (* Stars case *) |
892 apply(rule NPrf.intros) |
891 apply(rule NPrf.intros) |
893 apply (metis Cons_eq_append_conv) |
892 apply (metis Cons_eq_append_conv) |
894 apply(auto) |
893 apply(auto) |
895 done |
894 done |
896 |
895 |
975 "[] \<in> EMPTY \<rightarrow> Void" |
974 "[] \<in> EMPTY \<rightarrow> Void" |
976 | "[c] \<in> (CHAR c) \<rightarrow> (Char c)" |
975 | "[c] \<in> (CHAR c) \<rightarrow> (Char c)" |
977 | "s \<in> r1 \<rightarrow> v \<Longrightarrow> s \<in> (ALT r1 r2) \<rightarrow> (Left v)" |
976 | "s \<in> r1 \<rightarrow> v \<Longrightarrow> s \<in> (ALT r1 r2) \<rightarrow> (Left v)" |
978 | "\<lbrakk>s \<in> r2 \<rightarrow> v; s \<notin> L(r1)\<rbrakk> \<Longrightarrow> s \<in> (ALT r1 r2) \<rightarrow> (Right v)" |
977 | "\<lbrakk>s \<in> r2 \<rightarrow> v; s \<notin> L(r1)\<rbrakk> \<Longrightarrow> s \<in> (ALT r1 r2) \<rightarrow> (Right v)" |
979 | "\<lbrakk>s1 \<in> r1 \<rightarrow> v1; s2 \<in> r2 \<rightarrow> v2; |
978 | "\<lbrakk>s1 \<in> r1 \<rightarrow> v1; s2 \<in> r2 \<rightarrow> v2; |
980 \<not>(\<exists>s3 s4. s3 \<noteq> [] \<and> s3 @ s4 = s2 \<and> (s1 @ s3) \<in> L r1 \<and> s4 \<in> L r2)\<rbrakk> \<Longrightarrow> |
979 \<not>(\<exists>s\<^sub>3 s\<^sub>4. s\<^sub>3 \<noteq> [] \<and> s\<^sub>3 @ s\<^sub>4 = s2 \<and> (s1 @ s\<^sub>3) \<in> L r1 \<and> s\<^sub>4 \<in> L r2)\<rbrakk> \<Longrightarrow> |
981 (s1 @ s2) \<in> (SEQ r1 r2) \<rightarrow> (Seq v1 v2)" |
980 (s1 @ s2) \<in> (SEQ r1 r2) \<rightarrow> (Seq v1 v2)" |
982 | "\<lbrakk>s1 \<in> r \<rightarrow> v; s2 \<in> STAR r \<rightarrow> Star vs; flat v \<noteq> []\<rbrakk> |
981 | "\<lbrakk>s1 \<in> r \<rightarrow> v; s2 \<in> STAR r \<rightarrow> Stars vs; flat v \<noteq> []\<rbrakk> |
983 \<Longrightarrow> (s1 @ s2) \<in> STAR r \<rightarrow> Star (v # vs)" |
982 \<Longrightarrow> (s1 @ s2) \<in> STAR r \<rightarrow> Stars (v # vs)" |
984 | "[] \<in> STAR r \<rightarrow> Star []" |
983 | "[] \<in> STAR r \<rightarrow> Stars []" |
985 |
984 |
986 lemma PMatch_mkeps: |
985 lemma PMatch_mkeps: |
987 assumes "nullable r" |
986 assumes "nullable r" |
988 shows "[] \<in> r \<rightarrow> mkeps r" |
987 shows "[] \<in> r \<rightarrow> mkeps r" |
989 using assms |
988 using assms |
1091 apply(auto)[1] |
1090 apply(auto)[1] |
1092 apply(simp add: L_flat_NPrf) |
1091 apply(simp add: L_flat_NPrf) |
1093 apply(auto)[1] |
1092 apply(auto)[1] |
1094 apply(frule_tac c="c" in v3_proj) |
1093 apply(frule_tac c="c" in v3_proj) |
1095 apply metis |
1094 apply metis |
1096 apply(drule_tac x="s3" in spec) |
1095 apply(drule_tac x="s\<^sub>3" in spec) |
1097 apply(drule mp) |
1096 apply(drule mp) |
1098 apply(rule_tac x="projval r1 c v" in exI) |
1097 apply(rule_tac x="projval r1 c v" in exI) |
1099 apply(rule conjI) |
1098 apply(rule conjI) |
1100 apply (metis v4_proj2) |
1099 apply (metis v4_proj2) |
1101 apply (metis NPrf_imp_Prf) |
1100 apply (metis NPrf_imp_Prf) |
1114 apply(auto)[1] |
1113 apply(auto)[1] |
1115 apply(simp add: L_flat_NPrf) |
1114 apply(simp add: L_flat_NPrf) |
1116 apply(auto)[1] |
1115 apply(auto)[1] |
1117 apply(frule_tac c="c" in v3_proj) |
1116 apply(frule_tac c="c" in v3_proj) |
1118 apply metis |
1117 apply metis |
1119 apply(drule_tac x="s3" in spec) |
1118 apply(drule_tac x="s\<^sub>3" in spec) |
1120 apply(drule mp) |
1119 apply(drule mp) |
1121 apply (metis NPrf_imp_Prf v4_proj2) |
1120 apply (metis NPrf_imp_Prf v4_proj2) |
1122 apply(simp) |
1121 apply(simp) |
1123 (* interesting case *) |
1122 (* interesting case *) |
1124 apply(clarify) |
1123 apply(clarify) |
1142 apply (metis NPrf_imp_Prf Prf.intros(1)) |
1141 apply (metis NPrf_imp_Prf Prf.intros(1)) |
1143 apply(rule NPrf_imp_Prf) |
1142 apply(rule NPrf_imp_Prf) |
1144 apply(rule v3_proj) |
1143 apply(rule v3_proj) |
1145 apply(simp) |
1144 apply(simp) |
1146 apply (metis Cons_eq_append_conv) |
1145 apply (metis Cons_eq_append_conv) |
1147 (* Star case *) |
1146 (* Stars case *) |
1148 apply(erule PMatch.cases) |
1147 apply(erule PMatch.cases) |
1149 apply(simp_all)[7] |
1148 apply(simp_all)[7] |
1150 apply(clarify) |
1149 apply(clarify) |
1151 apply(rotate_tac 2) |
1150 apply(rotate_tac 2) |
1152 apply(frule_tac PMatch1) |
1151 apply(frule_tac PMatch1) |
1273 | "length (flat v2) > length (flat v1) \<Longrightarrow> (Right v2) \<succ>(ALT r1 r2) (Left v1)" |
1272 | "length (flat v2) > length (flat v1) \<Longrightarrow> (Right v2) \<succ>(ALT r1 r2) (Left v1)" |
1274 | "v2 \<succ>r2 v2' \<Longrightarrow> (Right v2) \<succ>(ALT r1 r2) (Right v2')" |
1273 | "v2 \<succ>r2 v2' \<Longrightarrow> (Right v2) \<succ>(ALT r1 r2) (Right v2')" |
1275 | "v1 \<succ>r1 v1' \<Longrightarrow> (Left v1) \<succ>(ALT r1 r2) (Left v1')" |
1274 | "v1 \<succ>r1 v1' \<Longrightarrow> (Left v1) \<succ>(ALT r1 r2) (Left v1')" |
1276 | "Void \<succ>EMPTY Void" |
1275 | "Void \<succ>EMPTY Void" |
1277 | "(Char c) \<succ>(CHAR c) (Char c)" |
1276 | "(Char c) \<succ>(CHAR c) (Char c)" |
1278 | "flat (Star (v # vs)) = [] \<Longrightarrow> (Star []) \<succ>(STAR r) (Star (v # vs))" |
1277 | "flat (Stars (v # vs)) = [] \<Longrightarrow> (Stars []) \<succ>(STAR r) (Stars (v # vs))" |
1279 | "flat (Star (v # vs)) \<noteq> [] \<Longrightarrow> (Star (v # vs)) \<succ>(STAR r) (Star [])" |
1278 | "flat (Stars (v # vs)) \<noteq> [] \<Longrightarrow> (Stars (v # vs)) \<succ>(STAR r) (Stars [])" |
1280 | "v1 \<succ>r v2 \<Longrightarrow> (Star (v1 # vs1)) \<succ>(STAR r) (Star (v2 # vs2))" |
1279 | "v1 \<succ>r v2 \<Longrightarrow> (Stars (v1 # vs1)) \<succ>(STAR r) (Stars (v2 # vs2))" |
1281 | "(Star vs1) \<succ>(STAR r) (Star vs2) \<Longrightarrow> (Star (v # vs1)) \<succ>(STAR r) (Star (v # vs2))" |
1280 | "(Stars vs1) \<succ>(STAR r) (Stars vs2) \<Longrightarrow> (Stars (v # vs1)) \<succ>(STAR r) (Stars (v # vs2))" |
1282 | "(Star []) \<succ>(STAR r) (Star [])" |
1281 | "(Stars []) \<succ>(STAR r) (Stars [])" |
1283 |
1282 |
1284 (* |
1283 (* |
1285 |
1284 |
1286 lemma ValOrd_PMatch: |
1285 lemma ValOrd_PMatch: |
1287 assumes "s \<in> r \<rightarrow> v1" "\<turnstile> v2 : r" "flat v2 \<sqsubseteq> s" |
1286 assumes "s \<in> r \<rightarrow> v1" "\<turnstile> v2 : r" "flat v2 \<sqsubseteq> s" |
1311 apply(erule PMatch.cases) |
1310 apply(erule PMatch.cases) |
1312 apply(simp_all)[7] |
1311 apply(simp_all)[7] |
1313 apply (metis PMatch1(2) ValOrd.intros(3) length_sprefix less_imp_le_nat order_refl sprefix_def) |
1312 apply (metis PMatch1(2) ValOrd.intros(3) length_sprefix less_imp_le_nat order_refl sprefix_def) |
1314 apply(clarify) |
1313 apply(clarify) |
1315 apply (metis ValOrd.intros(5)) |
1314 apply (metis ValOrd.intros(5)) |
1316 (* Star case *) |
1315 (* Stars case *) |
1317 apply(erule Prf.cases) |
1316 apply(erule Prf.cases) |
1318 apply(simp_all)[7] |
1317 apply(simp_all)[7] |
1319 apply(erule PMatch.cases) |
1318 apply(erule PMatch.cases) |
1320 apply(simp_all) |
1319 apply(simp_all) |
1321 apply (metis Nil_is_append_conv ValOrd.intros(10) flat.simps(7)) |
1320 apply (metis Nil_is_append_conv ValOrd.intros(10) flat.simps(7)) |