378 |
378 |
379 lemma finite_UnionD: "finite(\<Union>A) \<Longrightarrow> finite A" |
379 lemma finite_UnionD: "finite(\<Union>A) \<Longrightarrow> finite A" |
380 by(blast intro: finite_subset[OF subset_Pow_Union]) |
380 by(blast intro: finite_subset[OF subset_Pow_Union]) |
381 |
381 |
382 |
382 |
383 lemma finite_converse [iff]: "finite (r^-1) = finite r" |
|
384 apply (subgoal_tac "r^-1 = (%(x,y). (y,x))`r") |
|
385 apply simp |
|
386 apply (rule iffI) |
|
387 apply (erule finite_imageD [unfolded inj_on_def]) |
|
388 apply (simp split add: split_split) |
|
389 apply (erule finite_imageI) |
|
390 apply (simp add: converse_def image_def, auto) |
|
391 apply (rule bexI) |
|
392 prefer 2 apply assumption |
|
393 apply simp |
|
394 done |
|
395 |
|
396 |
|
397 text {* \paragraph{Finiteness of transitive closure} (Thanks to Sidi |
|
398 Ehmety) *} |
|
399 |
|
400 lemma finite_Field: "finite r ==> finite (Field r)" |
|
401 -- {* A finite relation has a finite field (@{text "= domain \<union> range"}. *} |
|
402 apply (induct set: finite) |
|
403 apply (auto simp add: Field_def Domain_insert Range_insert) |
|
404 done |
|
405 |
|
406 lemma trancl_subset_Field2: "r^+ <= Field r \<times> Field r" |
|
407 apply clarify |
|
408 apply (erule trancl_induct) |
|
409 apply (auto simp add: Field_def) |
|
410 done |
|
411 |
|
412 lemma finite_trancl: "finite (r^+) = finite r" |
|
413 apply auto |
|
414 prefer 2 |
|
415 apply (rule trancl_subset_Field2 [THEN finite_subset]) |
|
416 apply (rule finite_SigmaI) |
|
417 prefer 3 |
|
418 apply (blast intro: r_into_trancl' finite_subset) |
|
419 apply (auto simp add: finite_Field) |
|
420 done |
|
421 |
|
422 |
|
423 subsection {* Class @{text finite} *} |
383 subsection {* Class @{text finite} *} |
424 |
384 |
425 setup {* Sign.add_path "finite" *} -- {*FIXME: name tweaking*} |
385 setup {* Sign.add_path "finite" *} -- {*FIXME: name tweaking*} |
426 class finite = itself + |
386 class finite = itself + |
427 assumes finite_UNIV: "finite (UNIV \<Colon> 'a set)" |
387 assumes finite_UNIV: "finite (UNIV \<Colon> 'a set)" |
468 qed |
428 qed |
469 qed |
429 qed |
470 |
430 |
471 instance "+" :: (finite, finite) finite |
431 instance "+" :: (finite, finite) finite |
472 by default (simp only: UNIV_Plus_UNIV [symmetric] finite_Plus finite) |
432 by default (simp only: UNIV_Plus_UNIV [symmetric] finite_Plus finite) |
473 |
|
474 instance option :: (finite) finite |
|
475 by default (simp add: insert_None_conv_UNIV [symmetric]) |
|
476 |
433 |
477 |
434 |
478 subsection {* A fold functional for finite sets *} |
435 subsection {* A fold functional for finite sets *} |
479 |
436 |
480 text {* The intended behaviour is |
437 text {* The intended behaviour is |