199 |
199 |
200 lemma Suf_Union: |
200 lemma Suf_Union: |
201 shows "(\<Union>v \<in> Suf s \<cdot> {[c]}. f v) = (\<Union>v \<in> Suf s. f (v @ [c]))" |
201 shows "(\<Union>v \<in> Suf s \<cdot> {[c]}. f v) = (\<Union>v \<in> Suf s. f (v @ [c]))" |
202 by (auto simp add: conc_def) |
202 by (auto simp add: conc_def) |
203 |
203 |
204 lemma pders_set_snoc: |
204 lemma pders_lang_snoc: |
205 shows "pders_set (Suf s \<cdot> {[c]}) r = (pder_set c (pders_set (Suf s) r))" |
205 shows "pders_lang (Suf s \<cdot> {[c]}) r = (pder_set c (pders_lang (Suf s) r))" |
206 by (simp add: Suf_Union pders_snoc) |
206 by (simp add: Suf_Union pders_snoc) |
207 |
207 |
208 lemma pders_Times: |
208 lemma pders_Times: |
209 shows "pders s (Times r1 r2) \<subseteq> Timess (pders s r1) r2 \<union> (pders_set (Suf s) r2)" |
209 shows "pders s (Times r1 r2) \<subseteq> Timess (pders s r1) r2 \<union> (pders_lang (Suf s) r2)" |
210 proof (induct s rule: rev_induct) |
210 proof (induct s rule: rev_induct) |
211 case (snoc c s) |
211 case (snoc c s) |
212 have ih: "pders s (Times r1 r2) \<subseteq> Timess (pders s r1) r2 \<union> (pders_set (Suf s) r2)" |
212 have ih: "pders s (Times r1 r2) \<subseteq> Timess (pders s r1) r2 \<union> (pders_lang (Suf s) r2)" |
213 by fact |
213 by fact |
214 have "pders (s @ [c]) (Times r1 r2) = pder_set c (pders s (Times r1 r2))" |
214 have "pders (s @ [c]) (Times r1 r2) = pder_set c (pders s (Times r1 r2))" |
215 by (simp add: pders_snoc) |
215 by (simp add: pders_snoc) |
216 also have "\<dots> \<subseteq> pder_set c (Timess (pders s r1) r2 \<union> (pders_set (Suf s) r2))" |
216 also have "\<dots> \<subseteq> pder_set c (Timess (pders s r1) r2 \<union> (pders_lang (Suf s) r2))" |
217 using ih by (auto) (blast) |
217 using ih by (auto) (blast) |
218 also have "\<dots> = pder_set c (Timess (pders s r1) r2) \<union> pder_set c (pders_set (Suf s) r2)" |
218 also have "\<dots> = pder_set c (Timess (pders s r1) r2) \<union> pder_set c (pders_lang (Suf s) r2)" |
219 by (simp) |
219 by (simp) |
220 also have "\<dots> = pder_set c (Timess (pders s r1) r2) \<union> pders_set (Suf s \<cdot> {[c]}) r2" |
220 also have "\<dots> = pder_set c (Timess (pders s r1) r2) \<union> pders_lang (Suf s \<cdot> {[c]}) r2" |
221 by (simp add: pders_set_snoc) |
221 by (simp add: pders_lang_snoc) |
222 also have "\<dots> \<subseteq> pder_set c (Timess (pders s r1) r2) \<union> pder c r2 \<union> pders_set (Suf s \<cdot> {[c]}) r2" |
222 also have "\<dots> \<subseteq> pder_set c (Timess (pders s r1) r2) \<union> pder c r2 \<union> pders_lang (Suf s \<cdot> {[c]}) r2" |
223 by auto |
223 by auto |
224 also have "\<dots> \<subseteq> Timess (pders (s @ [c]) r1) r2 \<union> pder c r2 \<union> pders_set (Suf s \<cdot> {[c]}) r2" |
224 also have "\<dots> \<subseteq> Timess (pder_set c (pders s r1)) r2 \<union> pder c r2 \<union> pders_lang (Suf s \<cdot> {[c]}) r2" |
225 by (auto simp add: if_splits pders_snoc) (blast) |
225 by (auto simp add: if_splits) (blast) |
226 also have "\<dots> = Timess (pders (s @ [c]) r1) r2 \<union> pders_set (Suf (s @ [c])) r2" |
226 also have "\<dots> = Timess (pders (s @ [c]) r1) r2 \<union> pder c r2 \<union> pders_lang (Suf s \<cdot> {[c]}) r2" |
|
227 by (simp add: pders_snoc) |
|
228 also have "\<dots> \<subseteq> Timess (pders (s @ [c]) r1) r2 \<union> pders_lang (Suf (s @ [c])) r2" |
227 by (auto simp add: Suf_snoc) |
229 by (auto simp add: Suf_snoc) |
228 finally show ?case . |
230 finally show ?case . |
229 qed (simp) |
231 qed (simp) |
230 |
232 |
231 |
|
232 lemma pders_Star: |
233 lemma pders_Star: |
233 assumes a: "s \<noteq> []" |
234 assumes a: "s \<noteq> []" |
234 shows "pders s (Star r) \<subseteq> (\<Union>v \<in> Suf s. Timess (pders v r) (Star r))" |
235 shows "pders s (Star r) \<subseteq> Timess (pders_lang (Suf s) r) (Star r)" |
235 using a |
236 using a |
236 proof (induct s rule: rev_induct) |
237 proof (induct s rule: rev_induct) |
237 case (snoc c s) |
238 case (snoc c s) |
238 have ih: "s \<noteq> [] \<Longrightarrow> pders s (Star r) \<subseteq> (\<Union>v\<in>Suf s. Timess (pders v r) (Star r))" by fact |
239 have ih: "s \<noteq> [] \<Longrightarrow> pders s (Star r) \<subseteq> Timess (pders_lang (Suf s) r) (Star r)" by fact |
239 { assume asm: "s \<noteq> []" |
240 { assume asm: "s \<noteq> []" |
240 have "pders (s @ [c]) (Star r) = pder_set c (pders s (Star r))" by (simp add: pders_snoc) |
241 have "pders (s @ [c]) (Star r) = pder_set c (pders s (Star r))" by (simp add: pders_snoc) |
241 also have "\<dots> \<subseteq> (pder_set c (\<Union>v\<in>Suf s. Timess (pders v r) (Star r)))" |
242 also have "\<dots> \<subseteq> pder_set c (Timess (pders_lang (Suf s) r) (Star r))" |
242 using ih[OF asm] by (auto) (blast) |
243 using ih[OF asm] by (auto) (blast) |
243 also have "\<dots> = (\<Union>v\<in>Suf s. pder_set c (Timess (pders v r) (Star r)))" |
244 also have "\<dots> \<subseteq> Timess (pder_set c (pders_lang (Suf s) r)) (Star r) \<union> pder c (Star r)" |
244 by simp |
245 by (auto split: if_splits) (blast)+ |
245 also have "\<dots> \<subseteq> (\<Union>v\<in>Suf s. (Timess (pder_set c (pders v r)) (Star r) \<union> pder c (Star r)))" |
246 also have "\<dots> \<subseteq> Timess (pders_lang (Suf (s @ [c])) r) (Star r) \<union> (Timess (pder c r) (Star r))" |
246 by (auto split: if_splits) |
247 by (auto simp add: Suf_snoc pders_lang_snoc) |
247 also have "\<dots> = (\<Union>v\<in>Suf s. (Timess (pder_set c (pders v r)) (Star r))) \<union> pder c (Star r)" |
248 also have "\<dots> = Timess (pders_lang (Suf (s @ [c])) r) (Star r)" |
248 using asm by (auto simp add: Suf_def) |
|
249 also have "\<dots> = (\<Union>v\<in>Suf s. (Timess (pders (v @ [c]) r) (Star r))) \<union> (Timess (pder c r) (Star r))" |
|
250 by (simp add: pders_snoc) |
|
251 also have "\<dots> = (\<Union>v\<in>Suf (s @ [c]). (Timess (pders v r) (Star r)))" |
|
252 by (auto simp add: Suf_snoc Suf_Union pders_snoc) |
249 by (auto simp add: Suf_snoc Suf_Union pders_snoc) |
253 finally have ?case . |
250 finally have ?case . |
254 } |
251 } |
255 moreover |
252 moreover |
256 { assume asm: "s = []" |
253 { assume asm: "s = []" |
257 then have ?case |
254 then have ?case |
258 by (auto simp add: pders_snoc Suf_def) |
255 apply (auto simp add: pders_snoc Suf_def) |
|
256 apply(rule_tac x = "[c]" in exI) |
|
257 apply(auto) |
|
258 done |
259 } |
259 } |
260 ultimately show ?case by blast |
260 ultimately show ?case by blast |
261 qed (simp) |
261 qed (simp) |
262 |
262 |
263 definition |
263 definition |
264 "UNIV1 \<equiv> UNIV - {[]}" |
264 "UNIV1 \<equiv> UNIV - {[]}" |
265 |
265 |
266 lemma pders_set_Zero: |
266 lemma pders_lang_Zero [simp]: |
267 shows "pders_set UNIV1 Zero = {Zero}" |
267 shows "pders_lang UNIV1 Zero = {Zero}" |
268 unfolding UNIV1_def by auto |
268 unfolding UNIV1_def by auto |
269 |
269 |
270 lemma pders_set_One: |
270 lemma pders_lang_One [simp]: |
271 shows "pders_set UNIV1 One = {Zero}" |
271 shows "pders_lang UNIV1 One = {Zero}" |
272 unfolding UNIV1_def by (auto split: if_splits) |
272 unfolding UNIV1_def by (auto split: if_splits) |
273 |
273 |
274 lemma pders_set_Atom: |
274 lemma pders_lang_Atom: |
275 shows "pders_set UNIV1 (Atom c) \<subseteq> {One, Zero}" |
275 shows "pders_lang UNIV1 (Atom c) \<subseteq> {One, Zero}" |
276 unfolding UNIV1_def by (auto split: if_splits) |
276 unfolding UNIV1_def by (auto split: if_splits) |
277 |
277 |
278 lemma pders_set_Plus: |
278 lemma pders_lang_Plus: |
279 shows "pders_set UNIV1 (Plus r1 r2) = pders_set UNIV1 r1 \<union> pders_set UNIV1 r2" |
279 shows "pders_lang UNIV1 (Plus r1 r2) = pders_lang UNIV1 r1 \<union> pders_lang UNIV1 r2" |
280 unfolding UNIV1_def by auto |
280 unfolding UNIV1_def by auto |
281 |
281 |
282 lemma pders_set_Times_aux: |
282 lemma pders_lang_Times_aux: |
283 assumes a: "s \<in> UNIV1" |
283 assumes a: "s \<in> UNIV1" |
284 shows "pders_set (Suf s) r2 \<subseteq> pders_set UNIV1 r2" |
284 shows "pders_lang (Suf s) r \<subseteq> pders_lang UNIV1 r" |
285 using a unfolding UNIV1_def Suf_def by (auto) |
285 using a unfolding UNIV1_def Suf_def by auto |
286 |
286 |
287 lemma pders_set_Times: |
287 lemma pders_lang_Times [intro]: |
288 shows "pders_set UNIV1 (Times r1 r2) \<subseteq> Timess (pders_set UNIV1 r1) r2 \<union> pders_set UNIV1 r2" |
288 shows "pders_lang UNIV1 (Times r1 r2) \<subseteq> Timess (pders_lang UNIV1 r1) r2 \<union> pders_lang UNIV1 r2" |
289 unfolding UNIV1_def |
289 unfolding UNIV1_def |
290 apply(rule UN_least) |
290 apply(rule UN_least) |
291 apply(rule subset_trans) |
291 apply(rule subset_trans) |
292 apply(rule pders_Times) |
292 apply(rule pders_Times) |
293 apply(simp) |
293 apply(simp) |
294 apply(rule conjI) |
294 apply(rule conjI) |
295 apply(auto)[1] |
295 apply(auto)[1] |
296 apply(rule subset_trans) |
296 apply(rule subset_trans) |
297 apply(rule pders_set_Times_aux) |
297 apply(rule pders_lang_Times_aux) |
298 apply(auto simp add: UNIV1_def) |
298 apply(auto simp add: UNIV1_def) |
299 done |
299 done |
300 |
300 |
301 lemma pders_set_Star: |
301 lemma pders_lang_Star [intro]: |
302 shows "pders_set UNIV1 (Star r) \<subseteq> Timess (pders_set UNIV1 r) (Star r)" |
302 shows "pders_lang UNIV1 (Star r) \<subseteq> Timess (pders_lang UNIV1 r) (Star r)" |
303 unfolding UNIV1_def |
303 unfolding UNIV1_def |
304 apply(rule UN_least) |
304 apply(rule UN_least) |
305 apply(rule subset_trans) |
305 apply(rule subset_trans) |
306 apply(rule pders_Star) |
306 apply(rule pders_Star) |
307 apply(simp) |
307 apply(simp) |
310 done |
310 done |
311 |
311 |
312 lemma finite_Timess: |
312 lemma finite_Timess: |
313 assumes a: "finite A" |
313 assumes a: "finite A" |
314 shows "finite (Timess A r)" |
314 shows "finite (Timess A r)" |
315 using a by (auto) |
315 using a by auto |
316 |
316 |
317 lemma finite_pders_set_UNIV1: |
317 lemma finite_pders_lang_UNIV1: |
318 shows "finite (pders_set UNIV1 r)" |
318 shows "finite (pders_lang UNIV1 r)" |
319 apply(induct r) |
319 apply(induct r) |
320 apply(simp) |
320 apply(simp) |
321 apply(simp only: pders_set_One) |
321 apply(simp only: pders_lang_One) |
322 apply(simp) |
322 apply(simp) |
323 apply(rule finite_subset) |
323 apply(rule finite_subset) |
324 apply(rule pders_set_Atom) |
324 apply(rule pders_lang_Atom) |
325 apply(simp) |
325 apply(simp) |
326 apply(simp only: pders_set_Plus) |
326 apply(simp only: pders_lang_Plus) |
327 apply(simp) |
327 apply(simp) |
328 apply(rule finite_subset) |
328 apply(rule finite_subset) |
329 apply(rule pders_set_Times) |
329 apply(rule pders_lang_Times) |
330 apply(simp only: finite_Timess finite_Un) |
330 apply(simp only: finite_Timess finite_Un) |
331 apply(simp) |
331 apply(simp) |
332 apply(rule finite_subset) |
332 apply(rule finite_subset) |
333 apply(rule pders_set_Star) |
333 apply(rule pders_lang_Star) |
334 apply(simp only: finite_Timess) |
334 apply(simp only: finite_Timess) |
335 done |
335 done |
336 |
336 |
337 lemma pders_set_UNIV_UNIV1: |
337 lemma pders_lang_UNIV_UNIV1: |
338 shows "pders_set UNIV r = pders [] r \<union> pders_set UNIV1 r" |
338 shows "pders_lang UNIV r = pders [] r \<union> pders_lang UNIV1 r" |
339 unfolding UNIV1_def |
339 unfolding UNIV1_def |
340 apply(auto) |
340 apply(auto) |
341 apply(rule_tac x="[]" in exI) |
341 apply(rule_tac x="[]" in exI) |
342 apply(simp) |
342 apply(simp) |
343 done |
343 done |
344 |
344 |
345 lemma finite_pders_set_UNIV: |
345 lemma finite_pders_lang_UNIV: |
346 shows "finite (pders_set UNIV r)" |
346 shows "finite (pders_lang UNIV r)" |
347 unfolding pders_set_UNIV_UNIV1 |
347 unfolding pders_lang_UNIV_UNIV1 |
348 by (simp add: finite_pders_set_UNIV1) |
348 by (simp add: finite_pders_lang_UNIV1) |
349 |
349 |
350 lemma finite_pders_set: |
350 lemma finite_pders_lang: |
351 shows "finite (pders_set A r)" |
351 shows "finite (pders_lang A r)" |
352 apply(rule rev_finite_subset) |
352 apply(rule rev_finite_subset) |
353 apply(rule_tac r="r" in finite_pders_set_UNIV) |
353 apply(rule_tac r="r" in finite_pders_lang_UNIV) |
354 apply(auto) |
354 apply(auto) |
355 done |
355 done |
356 |
356 |
357 lemma finite_pders: |
357 lemma finite_pders: |
358 shows "finite (pders s r)" |
358 shows "finite (pders s r)" |
359 using finite_pders_set[where A="{s}" and r="r"] |
359 using finite_pders_lang[where A="{s}" and r="r"] |
360 by simp |
360 by simp |
361 |
361 |
362 lemma finite_pders2: |
362 lemma finite_pders2: |
363 shows "finite {pders s r | s. s \<in> A}" |
363 shows "finite {pders s r | s. s \<in> A}" |
364 proof - |
364 proof - |
365 have "{pders s r | s. s \<in> A} \<subseteq> Pow (pders_set A r)" by auto |
365 have "{pders s r | s. s \<in> A} \<subseteq> Pow (pders_lang A r)" by auto |
366 moreover |
366 moreover |
367 have "finite (Pow (pders_set A r))" |
367 have "finite (Pow (pders_lang A r))" |
368 using finite_pders_set by simp |
368 using finite_pders_lang by simp |
369 ultimately |
369 ultimately |
370 show "finite {pders s r | s. s \<in> A}" |
370 show "finite {pders s r | s. s \<in> A}" |
371 by(rule finite_subset) |
371 by(rule finite_subset) |
372 qed |
372 qed |
373 |
373 |