src/HOL/Finite_Set.thy
changeset 13825 ef4c41e7956a
parent 13737 e564c3d2d174
child 14208 144f45277d5a
equal deleted inserted replaced
13824:e4d8dea6dfc2 13825:ef4c41e7956a
   115 
   115 
   116 lemma finite_insert [simp]: "finite (insert a A) = finite A"
   116 lemma finite_insert [simp]: "finite (insert a A) = finite A"
   117   apply (subst insert_is_Un)
   117   apply (subst insert_is_Un)
   118   apply (simp only: finite_Un)
   118   apply (simp only: finite_Un)
   119   apply blast
   119   apply blast
   120   done
       
   121 
       
   122 lemma finite_imageI[simp]: "finite F ==> finite (h ` F)"
       
   123   -- {* The image of a finite set is finite. *}
       
   124   by (induct set: Finites) simp_all
       
   125 
       
   126 lemma finite_range_imageI:
       
   127     "finite (range g) ==> finite (range (%x. f (g x)))"
       
   128   apply (drule finite_imageI)
       
   129   apply simp
       
   130   done
   120   done
   131 
   121 
   132 lemma finite_empty_induct:
   122 lemma finite_empty_induct:
   133   "finite A ==>
   123   "finite A ==>
   134   P A ==> (!!a A. finite A ==> a:A ==> P A ==> P (A - {a})) ==> P {}"
   124   P A ==> (!!a A. finite A ==> a:A ==> P A ==> P (A - {a})) ==> P {}"
   171    apply (subst insert_Diff)
   161    apply (subst insert_Diff)
   172     apply simp_all
   162     apply simp_all
   173   done
   163   done
   174 
   164 
   175 
   165 
       
   166 subsubsection {* Image and Inverse Image over Finite Sets *}
       
   167 
       
   168 lemma finite_imageI[simp]: "finite F ==> finite (h ` F)"
       
   169   -- {* The image of a finite set is finite. *}
       
   170   by (induct set: Finites) simp_all
       
   171 
       
   172 lemma finite_range_imageI:
       
   173     "finite (range g) ==> finite (range (%x. f (g x)))"
       
   174   apply (drule finite_imageI)
       
   175   apply simp
       
   176   done
       
   177 
   176 lemma finite_imageD: "finite (f`A) ==> inj_on f A ==> finite A"
   178 lemma finite_imageD: "finite (f`A) ==> inj_on f A ==> finite A"
   177 proof -
   179 proof -
   178   have aux: "!!A. finite (A - {}) = finite A" by simp
   180   have aux: "!!A. finite (A - {}) = finite A" by simp
   179   fix B :: "'a set"
   181   fix B :: "'a set"
   180   assume "finite B"
   182   assume "finite B"
   191     apply clarify
   193     apply clarify
   192     apply (rule_tac x = xa in bexI)
   194     apply (rule_tac x = xa in bexI)
   193      apply (simp_all add: inj_on_image_set_diff)
   195      apply (simp_all add: inj_on_image_set_diff)
   194     done
   196     done
   195 qed (rule refl)
   197 qed (rule refl)
       
   198 
       
   199 
       
   200 lemma inj_vimage_singleton: "inj f ==> f-`{a} \<subseteq> {THE x. f x = a}"
       
   201   -- {* The inverse image of a singleton under an injective function
       
   202          is included in a singleton. *}
       
   203   apply (auto simp add: inj_on_def) 
       
   204   apply (blast intro: the_equality [symmetric]) 
       
   205   done
       
   206 
       
   207 lemma finite_vimageI: "[|finite F; inj h|] ==> finite (h -` F)"
       
   208   -- {* The inverse image of a finite set under an injective function
       
   209          is finite. *}
       
   210   apply (induct set: Finites, simp_all) 
       
   211   apply (subst vimage_insert) 
       
   212   apply (simp add: finite_Un finite_subset [OF inj_vimage_singleton]) 
       
   213   done
   196 
   214 
   197 
   215 
   198 subsubsection {* The finite UNION of finite sets *}
   216 subsubsection {* The finite UNION of finite sets *}
   199 
   217 
   200 lemma finite_UN_I: "finite A ==> (!!a. a:A ==> finite (B a)) ==> finite (UN a:A. B a)"
   218 lemma finite_UN_I: "finite A ==> (!!a. a:A ==> finite (B a)) ==> finite (UN a:A. B a)"