diff -r 42268a284ea6 -r 424bdcd01016 thys/LexerExt.thy --- a/thys/LexerExt.thy Sun Oct 08 14:21:24 2017 +0100 +++ b/thys/LexerExt.thy Tue Oct 10 10:40:44 2017 +0100 @@ -447,8 +447,7 @@ | (null) v1 vs s1 s2 where "v = Seq v1 (Stars vs)" "s = s1 @ s2" "s2 \ (STAR r) \ (Stars vs)" "s1 \ der c r \ v1" "n = 0" - "\ (\s\<^sub>3 s\<^sub>4. s\<^sub>3 \ [] \ s\<^sub>3 @ s\<^sub>4 = s2 \ s1 @ s\<^sub>3 \ L (der c r) \ s\<^sub>4 \ L (STAR r))" - (* here *) + "\ (\s\<^sub>3 s\<^sub>4. s\<^sub>3 \ [] \ s\<^sub>3 @ s\<^sub>4 = s2 \ s1 @ s\<^sub>3 \ L (der c r) \ s\<^sub>4 \ L (STAR r))" apply(auto elim: Posix_elims simp add: der_correctness Der_def intro: Posix.intros split: if_splits) prefer 2 apply(erule Posix_elims) @@ -527,11 +526,100 @@ done qed next - case (NMTIMES x1 x2 m s v) - then show ?case sorry + case (NMTIMES r n m s v) + have IH: "\s v. s \ der c r \ v \ (c # s) \ r \ injval r c v" by fact + have "s \ der c (NMTIMES r n m) \ v" by fact + then consider + (cons) v1 vs s1 s2 where + "v = Seq v1 (Stars vs)" "s = s1 @ s2" + "s1 \ der c r \ v1" "s2 \ (NMTIMES r (n - 1) (m - 1)) \ (Stars vs)" "0 < n" "n \ m" + "\ (\s\<^sub>3 s\<^sub>4. s\<^sub>3 \ [] \ s\<^sub>3 @ s\<^sub>4 = s2 \ s1 @ s\<^sub>3 \ L (der c r) \ s\<^sub>4 \ L (NMTIMES r (n - 1) (m - 1)))" + | (null) v1 vs s1 s2 where + "v = Seq v1 (Stars vs)" "s = s1 @ s2" "s2 \ (UPNTIMES r (m - 1)) \ (Stars vs)" + "s1 \ der c r \ v1" "n = 0" "0 < m" + "\ (\s\<^sub>3 s\<^sub>4. s\<^sub>3 \ [] \ s\<^sub>3 @ s\<^sub>4 = s2 \ s1 @ s\<^sub>3 \ L (der c r) \ s\<^sub>4 \ L (UPNTIMES r (m - 1)))" + apply(auto elim: Posix_elims simp add: der_correctness Der_def intro: Posix.intros split: if_splits) + prefer 2 + apply(erule Posix_elims) + apply(simp) + apply(subgoal_tac "\vss. v2 = Stars vss") + apply(clarify) + apply(drule_tac x="v1" in meta_spec) + apply(drule_tac x="vss" in meta_spec) + apply(drule_tac x="s1" in meta_spec) + apply(drule_tac x="s2" in meta_spec) + apply(simp add: der_correctness Der_def) + apply(rotate_tac 5) + apply(erule Posix_elims) + apply(auto)[2] + apply(erule Posix_elims) + apply(simp) + apply blast + + apply(erule Posix_elims) + apply(auto) + apply(auto elim: Posix_elims simp add: der_correctness Der_def intro: Posix.intros split: if_splits) + apply(subgoal_tac "\vss. v2 = Stars vss") + apply(clarify) + apply simp + apply(rotate_tac 6) + apply(erule Posix_elims) + apply(auto)[2] + done + then show "(c # s) \ (NMTIMES r n m) \ injval (NMTIMES r n m) c v" + proof (cases) + case cons + have "s1 \ der c r \ v1" by fact + then have "(c # s1) \ r \ injval r c v1" using IH by simp + moreover + have "s2 \ (NMTIMES r (n - 1) (m - 1)) \ Stars vs" by fact + moreover + have "(c # s1) \ r \ injval r c v1" by fact + then have "flat (injval r c v1) = (c # s1)" by (rule Posix1) + then have "flat (injval r c v1) \ []" by simp + moreover + have "\ (\s\<^sub>3 s\<^sub>4. s\<^sub>3 \ [] \ s\<^sub>3 @ s\<^sub>4 = s2 \ s1 @ s\<^sub>3 \ L (der c r) \ s\<^sub>4 \ L (NMTIMES r (n - 1) (m - 1)))" by fact + then have "\ (\s\<^sub>3 s\<^sub>4. s\<^sub>3 \ [] \ s\<^sub>3 @ s\<^sub>4 = s2 \ (c # s1) @ s\<^sub>3 \ L r \ s\<^sub>4 \ L (NMTIMES r (n - 1) (m - 1)))" + by (simp add: der_correctness Der_def) + ultimately + have "((c # s1) @ s2) \ NMTIMES r n m \ Stars (injval r c v1 # vs)" + apply (rule_tac Posix.intros) + apply(simp_all) + apply(case_tac n) + apply(simp) + using Posix_elims(1) NMTIMES.prems apply auto[1] + using cons(5) apply blast + apply(simp) + apply(rule cons) + done + then show "(c # s) \ NMTIMES r n m \ injval (NMTIMES r n m) c v" using cons by(simp) + next + case null + have "s1 \ der c r \ v1" by fact + then have "(c # s1) \ r \ injval r c v1" using IH by simp + moreover + have "s2 \ UPNTIMES r (m - 1) \ Stars vs" by fact + moreover + have "(c # s1) \ r \ injval r c v1" by fact + then have "flat (injval r c v1) = (c # s1)" by (rule Posix1) + then have "flat (injval r c v1) \ []" by simp + moreover + moreover + have "\ (\s\<^sub>3 s\<^sub>4. s\<^sub>3 \ [] \ s\<^sub>3 @ s\<^sub>4 = s2 \ s1 @ s\<^sub>3 \ L (der c r) \ s\<^sub>4 \ L (UPNTIMES r (m - 1)))" by fact + then have "\ (\s\<^sub>3 s\<^sub>4. s\<^sub>3 \ [] \ s\<^sub>3 @ s\<^sub>4 = s2 \ (c # s1) @ s\<^sub>3 \ L r \ s\<^sub>4 \ L (UPNTIMES r (m - 1)))" + by (simp add: der_correctness Der_def) + ultimately + have "((c # s1) @ s2) \ NMTIMES r 0 m \ Stars (injval r c v1 # vs)" + apply (rule_tac Posix.intros) back + apply(simp_all) + apply(rule null) + done + then show "(c # s) \ NMTIMES r n m \ injval (NMTIMES r n m) c v" using null + apply(simp) + done + qed qed - section {* Lexer Correctness *} lemma lexer_correct_None: