src/HOL/Finite_Set.thy
changeset 29609 a010aab5bed0
parent 29580 117b88da143c
child 29668 33ba3faeaa0e
child 29674 3857d7eba390
equal deleted inserted replaced
29608:564ea783ace8 29609:a010aab5bed0
     4 *)
     4 *)
     5 
     5 
     6 header {* Finite sets *}
     6 header {* Finite sets *}
     7 
     7 
     8 theory Finite_Set
     8 theory Finite_Set
     9 imports Datatype Divides Transitive_Closure
     9 imports Nat Product_Type Power
    10 begin
    10 begin
    11 
    11 
    12 subsection {* Definition and basic properties *}
    12 subsection {* Definition and basic properties *}
    13 
    13 
    14 inductive finite :: "'a set => bool"
    14 inductive finite :: "'a set => bool"
   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