thys/ReStar.thy
changeset 97 38696f516c6b
parent 95 a33d3040bf7e
child 99 f76c250906d5
equal deleted inserted replaced
96:c3d7125f9950 97:38696f516c6b
   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) 
   160   Void
   160   Void
   161 | Char char
   161 | Char char
   162 | Seq val val
   162 | Seq val val
   163 | Right val
   163 | Right val
   164 | Left val
   164 | Left val
   165 | Star "val list"
   165 | Stars "val list"
   166 
   166 
   167 section {* The string behind a value *}
   167 section {* The string behind a value *}
   168 
   168 
   169 fun 
   169 fun 
   170   flat :: "val \<Rightarrow> string"
   170   flat :: "val \<Rightarrow> string"
   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))
  2913 apply(erule Prf.cases)
  2912 apply(erule Prf.cases)
  2914 apply(simp_all)[5]
  2913 apply(simp_all)[5]
  2915 oops
  2914 oops
  2916 *)
  2915 *)
  2917 
  2916 
       
  2917 
  2918 end
  2918 end