src/HOL/Finite_Set.thy
changeset 22398 dfe146d65b14
parent 22388 14098da702e0
child 22425 c252770ae2d0
equal deleted inserted replaced
22397:ec7ecf706955 22398:dfe146d65b14
     5 *)
     5 *)
     6 
     6 
     7 header {* Finite sets *}
     7 header {* Finite sets *}
     8 
     8 
     9 theory Finite_Set
     9 theory Finite_Set
    10 imports Power Divides Inductive Lattices
    10 imports Divides
    11 begin
    11 begin
    12 
    12 
    13 subsection {* Definition and basic properties *}
    13 subsection {* Definition and basic properties *}
    14 
    14 
    15 inductive2 finite :: "'a set => bool"
    15 inductive2 finite :: "'a set => bool"
  1637 apply (cases "finite A")
  1637 apply (cases "finite A")
  1638 apply (erule finite_induct)
  1638 apply (erule finite_induct)
  1639 apply (auto simp add: ring_distrib add_ac)
  1639 apply (auto simp add: ring_distrib add_ac)
  1640 done
  1640 done
  1641 
  1641 
  1642 
       
  1643 lemma setprod_constant: "finite A ==> (\<Prod>x\<in> A. (y::'a::{recpower, comm_monoid_mult})) = y^(card A)"
  1642 lemma setprod_constant: "finite A ==> (\<Prod>x\<in> A. (y::'a::{recpower, comm_monoid_mult})) = y^(card A)"
  1644   apply (erule finite_induct)
  1643   apply (erule finite_induct)
  1645   apply (auto simp add: power_Suc)
  1644   apply (auto simp add: power_Suc)
  1646   done
  1645   done
  1647 
  1646 
  2586 
  2585 
  2587 lemma univ_sum [code func]:
  2586 lemma univ_sum [code func]:
  2588   "UNIV = (UNIV \<Colon> 'a\<Colon>finite set) <+> (UNIV \<Colon> 'b\<Colon>finite set)"
  2587   "UNIV = (UNIV \<Colon> 'a\<Colon>finite set) <+> (UNIV \<Colon> 'b\<Colon>finite set)"
  2589   unfolding UNIV_Plus_UNIV ..
  2588   unfolding UNIV_Plus_UNIV ..
  2590 
  2589 
       
  2590 lemma insert_None_conv_UNIV: "insert None (range Some) = UNIV"
       
  2591   by (rule set_ext, case_tac x, auto)
       
  2592 
       
  2593 instance option :: (finite) finite
       
  2594 proof
       
  2595   have "finite (UNIV :: 'a set)" by (rule finite)
       
  2596   hence "finite (insert None (Some ` (UNIV :: 'a set)))" by simp
       
  2597   also have "insert None (Some ` (UNIV :: 'a set)) = UNIV"
       
  2598     by (rule insert_None_conv_UNIV)
       
  2599   finally show "finite (UNIV :: 'a option set)" .
       
  2600 qed
       
  2601 
       
  2602 lemma univ_option [code func]:
       
  2603   "UNIV = insert (None \<Colon> 'a\<Colon>finite option) (image Some UNIV)"
       
  2604   unfolding insert_None_conv_UNIV ..
       
  2605 
  2591 instance set :: (finite) finite
  2606 instance set :: (finite) finite
  2592 proof
  2607 proof
  2593   have "finite (UNIV :: 'a set)" by (rule finite)
  2608   have "finite (UNIV :: 'a set)" by (rule finite)
  2594   hence "finite (Pow (UNIV :: 'a set))"
  2609   hence "finite (Pow (UNIV :: 'a set))"
  2595     by (rule finite_Pow_iff [THEN iffD2])
  2610     by (rule finite_Pow_iff [THEN iffD2])