diff -r acc027964d10 -r 804fbb227568 thys/Lexer.thy --- a/thys/Lexer.thy Wed May 16 20:58:39 2018 +0100 +++ b/thys/Lexer.thy Wed Aug 15 13:48:57 2018 +0100 @@ -53,7 +53,7 @@ assumes "\ v : der c r" shows "flat (injval r c v) = c # (flat v)" using assms -apply(induct arbitrary: v rule: der.induct) +apply(induct c r arbitrary: v rule: der.induct) apply(auto elim!: Prf_elims intro: mkeps_flat split: if_splits) done @@ -238,20 +238,33 @@ lemma lexer_correct_None: shows "s \ L r \ lexer r s = None" -apply(induct s arbitrary: r) -apply(simp add: nullable_correctness) -apply(drule_tac x="der a r" in meta_spec) -apply(auto simp add: der_correctness Der_def) + apply(induct s arbitrary: r) + apply(simp) + apply(simp add: nullable_correctness) + apply(simp) + apply(drule_tac x="der a r" in meta_spec) + apply(auto) + apply(auto simp add: der_correctness Der_def) done lemma lexer_correct_Some: shows "s \ L r \ (\v. lexer r s = Some(v) \ s \ r \ v)" -apply(induct s arbitrary: r) -apply(auto simp add: Posix_mkeps nullable_correctness)[1] -apply(drule_tac x="der a r" in meta_spec) -apply(simp add: der_correctness Der_def) -apply(rule iffI) -apply(auto intro: Posix_injval simp add: Posix1(1)) + apply(induct s arbitrary : r) + apply(simp only: lexer.simps) + apply(simp) + apply(simp add: nullable_correctness Posix_mkeps) + apply(drule_tac x="der a r" in meta_spec) + apply(simp (no_asm_use) add: der_correctness Der_def del: lexer.simps) + apply(simp del: lexer.simps) + apply(simp only: lexer.simps) + apply(case_tac "lexer (der a r) s = None") + apply(auto)[1] + apply(simp) + apply(erule exE) + apply(simp) + apply(rule iffI) + apply(simp add: Posix_injval) + apply(simp add: Posix1(1)) done lemma lexer_correctness: @@ -260,4 +273,37 @@ using Posix1(1) Posix_determ lexer_correct_None lexer_correct_Some apply fastforce using Posix1(1) lexer_correct_None lexer_correct_Some by blast + + + +fun flex :: "rexp \ (val \ val) => string \ (val \ val)" + where + "flex r f [] = f" +| "flex r f (c#s) = flex (der c r) (\v. f (injval r c v)) s" + +lemma flex_fun_apply: + shows "g (flex r f s v) = flex r (g o f) s v" + apply(induct s arbitrary: g f r v) + apply(simp_all add: comp_def) + by meson + +lemma flex_append: + shows "flex r f (s1 @ s2) = flex (ders s1 r) (flex r f s1) s2" + apply(induct s1 arbitrary: s2 r f) + apply(simp) + apply(drule_tac x="s2" in meta_spec) + apply(drule_tac x="der a r" in meta_spec) + apply(simp) + done + +lemma lexer_flex: + shows "lexer r s = (if nullable (ders s r) + then Some(flex r id s (mkeps (ders s r))) else None)" + apply(induct s arbitrary: r) + apply(simp) + apply(simp add: flex_fun_apply) + done + +unused_thms + end \ No newline at end of file