15 | "mkeps(STAR r) = Stars []" |
15 | "mkeps(STAR r) = Stars []" |
16 | "mkeps(UPNTIMES r n) = Stars []" |
16 | "mkeps(UPNTIMES r n) = Stars []" |
17 | "mkeps(NTIMES r n) = Stars (replicate n (mkeps r))" |
17 | "mkeps(NTIMES r n) = Stars (replicate n (mkeps r))" |
18 | "mkeps(FROMNTIMES r n) = Stars (replicate n (mkeps r))" |
18 | "mkeps(FROMNTIMES r n) = Stars (replicate n (mkeps r))" |
19 | "mkeps(NMTIMES r n m) = Stars (replicate n (mkeps r))" |
19 | "mkeps(NMTIMES r n m) = Stars (replicate n (mkeps r))" |
20 |
20 | "mkeps(NOT ZERO) = Nt Void" |
|
21 | "mkeps(NOT (CH _ )) = Nt Void" |
|
22 | "mkeps(NOT (SEQ r1 r2)) = Seq (mkeps (NOT r1)) (mkeps (NOT r1))" |
|
23 | "mkeps(NOT (ALT r1 r2)) = (if nullable(r1) then Right (mkeps (NOT r2)) else (mkeps (NOT r1)))" |
|
24 |
|
25 |
21 fun injval :: "rexp \<Rightarrow> char \<Rightarrow> val \<Rightarrow> val" |
26 fun injval :: "rexp \<Rightarrow> char \<Rightarrow> val \<Rightarrow> val" |
22 where |
27 where |
23 "injval (CHAR d) c Void = Char d" |
28 "injval (CH d) c Void = Char d" |
24 | "injval (ALT r1 r2) c (Left v1) = Left(injval r1 c v1)" |
29 | "injval (ALT r1 r2) c (Left v1) = Left(injval r1 c v1)" |
25 | "injval (ALT r1 r2) c (Right v2) = Right(injval r2 c v2)" |
30 | "injval (ALT r1 r2) c (Right v2) = Right(injval r2 c v2)" |
26 | "injval (SEQ r1 r2) c (Seq v1 v2) = Seq (injval r1 c v1) v2" |
31 | "injval (SEQ r1 r2) c (Seq v1 v2) = Seq (injval r1 c v1) v2" |
27 | "injval (SEQ r1 r2) c (Left (Seq v1 v2)) = Seq (injval r1 c v1) v2" |
32 | "injval (SEQ r1 r2) c (Left (Seq v1 v2)) = Seq (injval r1 c v1) v2" |
28 | "injval (SEQ r1 r2) c (Right v2) = Seq (mkeps r1) (injval r2 c v2)" |
33 | "injval (SEQ r1 r2) c (Right v2) = Seq (mkeps r1) (injval r2 c v2)" |
79 apply(simp) |
86 apply(simp) |
80 apply(simp) |
87 apply(simp) |
81 apply (simp add: mkeps_flat) |
88 apply (simp add: mkeps_flat) |
82 apply(simp) |
89 apply(simp) |
83 apply(simp) |
90 apply(simp) |
84 done |
91 sorry |
85 |
92 |
86 |
93 |
87 lemma Prf_injval_flat: |
94 lemma Prf_injval_flat: |
88 assumes "\<Turnstile> v : der c r" |
95 assumes "\<Turnstile> v : der c r" |
89 shows "flat (injval r c v) = c # (flat v)" |
96 shows "flat (injval r c v) = c # (flat v)" |
90 using assms |
97 using assms |
91 apply(induct arbitrary: v rule: der.induct) |
98 apply(induct arbitrary: v rule: der.induct) |
92 apply(auto elim!: Prf_elims intro: mkeps_flat split: if_splits) |
99 apply(auto elim!: Prf_elims intro: mkeps_flat split: if_splits) |
93 done |
100 sorry |
94 |
101 |
95 lemma Prf_injval: |
102 lemma Prf_injval: |
96 assumes "\<Turnstile> v : der c r" |
103 assumes "\<Turnstile> v : der c r" |
97 shows "\<Turnstile> (injval r c v) : r" |
104 shows "\<Turnstile> (injval r c v) : r" |
98 using assms |
105 using assms |
184 using assms |
192 using assms |
185 apply(induct r rule: nullable.induct) |
193 apply(induct r rule: nullable.induct) |
186 apply(auto intro: Posix.intros simp add: nullable_correctness Sequ_def) |
194 apply(auto intro: Posix.intros simp add: nullable_correctness Sequ_def) |
187 apply(subst append.simps(1)[symmetric]) |
195 apply(subst append.simps(1)[symmetric]) |
188 apply(rule Posix.intros) |
196 apply(rule Posix.intros) |
189 apply(auto) |
197 apply(auto) |
190 done |
198 apply(case_tac r) |
|
199 apply(auto) |
|
200 sorry |
191 |
201 |
192 |
202 |
193 lemma Posix_injval: |
203 lemma Posix_injval: |
194 assumes "s \<in> (der c r) \<rightarrow> v" |
204 assumes "s \<in> (der c r) \<rightarrow> v" |
195 shows "(c # s) \<in> r \<rightarrow> (injval r c v)" |
205 shows "(c # s) \<in> r \<rightarrow> (injval r c v)" |
205 have "s \<in> der c ONE \<rightarrow> v" by fact |
215 have "s \<in> der c ONE \<rightarrow> v" by fact |
206 then have "s \<in> ZERO \<rightarrow> v" by simp |
216 then have "s \<in> ZERO \<rightarrow> v" by simp |
207 then have "False" by cases |
217 then have "False" by cases |
208 then show "(c # s) \<in> ONE \<rightarrow> (injval ONE c v)" by simp |
218 then show "(c # s) \<in> ONE \<rightarrow> (injval ONE c v)" by simp |
209 next |
219 next |
210 case (CHAR d) |
220 case (CH d) |
211 consider (eq) "c = d" | (ineq) "c \<noteq> d" by blast |
221 consider (eq) "c = d" | (ineq) "c \<noteq> d" by blast |
212 then show "(c # s) \<in> (CHAR d) \<rightarrow> (injval (CHAR d) c v)" |
222 then show "(c # s) \<in> (CH d) \<rightarrow> (injval (CH d) c v)" |
213 proof (cases) |
223 proof (cases) |
214 case eq |
224 case eq |
215 have "s \<in> der c (CHAR d) \<rightarrow> v" by fact |
225 have "s \<in> der c (CH d) \<rightarrow> v" by fact |
216 then have "s \<in> ONE \<rightarrow> v" using eq by simp |
226 then have "s \<in> ONE \<rightarrow> v" using eq by simp |
217 then have eqs: "s = [] \<and> v = Void" by cases simp |
227 then have eqs: "s = [] \<and> v = Void" by cases simp |
218 show "(c # s) \<in> CHAR d \<rightarrow> injval (CHAR d) c v" using eq eqs |
228 show "(c # s) \<in> CH d \<rightarrow> injval (CH d) c v" using eq eqs |
219 by (auto intro: Posix.intros) |
229 by (auto intro: Posix.intros) |
220 next |
230 next |
221 case ineq |
231 case ineq |
222 have "s \<in> der c (CHAR d) \<rightarrow> v" by fact |
232 have "s \<in> der c (CH d) \<rightarrow> v" by fact |
223 then have "s \<in> ZERO \<rightarrow> v" using ineq by simp |
233 then have "s \<in> ZERO \<rightarrow> v" using ineq by simp |
224 then have "False" by cases |
234 then have "False" by cases |
225 then show "(c # s) \<in> CHAR d \<rightarrow> injval (CHAR d) c v" by simp |
235 then show "(c # s) \<in> CH d \<rightarrow> injval (CH d) c v" by simp |
226 qed |
236 qed |
227 next |
237 next |
228 case (ALT r1 r2) |
238 case (ALT r1 r2) |
229 have IH1: "\<And>s v. s \<in> der c r1 \<rightarrow> v \<Longrightarrow> (c # s) \<in> r1 \<rightarrow> injval r1 c v" by fact |
239 have IH1: "\<And>s v. s \<in> der c r1 \<rightarrow> v \<Longrightarrow> (c # s) \<in> r1 \<rightarrow> injval r1 c v" by fact |
230 have IH2: "\<And>s v. s \<in> der c r2 \<rightarrow> v \<Longrightarrow> (c # s) \<in> r2 \<rightarrow> injval r2 c v" by fact |
240 have IH2: "\<And>s v. s \<in> der c r2 \<rightarrow> v \<Longrightarrow> (c # s) \<in> r2 \<rightarrow> injval r2 c v" by fact |
317 apply(auto elim: Posix_elims simp add: der_correctness Der_def intro: Posix.intros split: if_splits) |
327 apply(auto elim: Posix_elims simp add: der_correctness Der_def intro: Posix.intros split: if_splits) |
318 apply(erule Posix_elims) |
328 apply(erule Posix_elims) |
319 apply(simp) |
329 apply(simp) |
320 apply(subgoal_tac "\<exists>vss. v2 = Stars vss") |
330 apply(subgoal_tac "\<exists>vss. v2 = Stars vss") |
321 apply(clarify) |
331 apply(clarify) |
322 apply(drule_tac x="v1" in meta_spec) |
|
323 apply(drule_tac x="vss" in meta_spec) |
332 apply(drule_tac x="vss" in meta_spec) |
324 apply(drule_tac x="s1" in meta_spec) |
333 apply(drule_tac x="s1" in meta_spec) |
325 apply(drule_tac x="s2" in meta_spec) |
334 apply(drule_tac x="s2" in meta_spec) |
326 apply(simp add: der_correctness Der_def) |
335 apply(simp add: der_correctness Der_def) |
327 apply(erule Posix_elims) |
336 apply(erule Posix_elims) |
399 apply(auto elim: Posix_elims simp add: der_correctness Der_def intro: Posix.intros split: if_splits) |
408 apply(auto elim: Posix_elims simp add: der_correctness Der_def intro: Posix.intros split: if_splits) |
400 apply(erule Posix_elims) |
409 apply(erule Posix_elims) |
401 apply(simp) |
410 apply(simp) |
402 apply(subgoal_tac "\<exists>vss. v2 = Stars vss") |
411 apply(subgoal_tac "\<exists>vss. v2 = Stars vss") |
403 apply(clarify) |
412 apply(clarify) |
404 apply(drule_tac x="v1" in meta_spec) |
|
405 apply(drule_tac x="vss" in meta_spec) |
413 apply(drule_tac x="vss" in meta_spec) |
406 apply(drule_tac x="s1" in meta_spec) |
414 apply(drule_tac x="s1" in meta_spec) |
407 apply(drule_tac x="s2" in meta_spec) |
415 apply(drule_tac x="s2" in meta_spec) |
408 apply(simp add: der_correctness Der_def) |
416 apply(simp add: der_correctness Der_def) |
409 apply(erule Posix_elims) |
417 apply(erule Posix_elims) |
452 prefer 2 |
460 prefer 2 |
453 apply(erule Posix_elims) |
461 apply(erule Posix_elims) |
454 apply(simp) |
462 apply(simp) |
455 apply(subgoal_tac "\<exists>vss. v2 = Stars vss") |
463 apply(subgoal_tac "\<exists>vss. v2 = Stars vss") |
456 apply(clarify) |
464 apply(clarify) |
457 apply(drule_tac x="v1" in meta_spec) |
|
458 apply(drule_tac x="vss" in meta_spec) |
465 apply(drule_tac x="vss" in meta_spec) |
459 apply(drule_tac x="s1" in meta_spec) |
466 apply(drule_tac x="s1" in meta_spec) |
460 apply(drule_tac x="s2" in meta_spec) |
467 apply(drule_tac x="s2" in meta_spec) |
461 apply(simp add: der_correctness Der_def) |
468 apply(simp add: der_correctness Der_def) |
462 apply(rotate_tac 5) |
469 apply(rotate_tac 5) |
542 prefer 2 |
549 prefer 2 |
543 apply(erule Posix_elims) |
550 apply(erule Posix_elims) |
544 apply(simp) |
551 apply(simp) |
545 apply(subgoal_tac "\<exists>vss. v2 = Stars vss") |
552 apply(subgoal_tac "\<exists>vss. v2 = Stars vss") |
546 apply(clarify) |
553 apply(clarify) |
547 apply(drule_tac x="v1" in meta_spec) |
|
548 apply(drule_tac x="vss" in meta_spec) |
554 apply(drule_tac x="vss" in meta_spec) |
549 apply(drule_tac x="s1" in meta_spec) |
555 apply(drule_tac x="s1" in meta_spec) |
550 apply(drule_tac x="s2" in meta_spec) |
556 apply(drule_tac x="s2" in meta_spec) |
551 apply(simp add: der_correctness Der_def) |
557 apply(simp add: der_correctness Der_def) |
552 apply(rotate_tac 5) |
558 apply(rotate_tac 5) |