src/HOL/Finite_Set.thy
changeset 14944 efbaecbdc05c
parent 14889 d7711d6b9014
child 15004 44ac09ba7213
equal deleted inserted replaced
14943:ffdb22cf6f67 14944:efbaecbdc05c
     1 (*  Title:      HOL/Finite_Set.thy
     1 (*  Title:      HOL/Finite_Set.thy
     2     ID:         $Id$
     2     ID:         $Id$
     3     Author:     Tobias Nipkow, Lawrence C Paulson and Markus Wenzel
     3     Author:     Tobias Nipkow, Lawrence C Paulson and Markus Wenzel
     4                 Additions by Jeremy Avigad in Feb 2004
     4                 Additions by Jeremy Avigad in Feb 2004
     5     License:    GPL (GNU GENERAL PUBLIC LICENSE)
       
     6 *)
     5 *)
     7 
     6 
     8 header {* Finite sets *}
     7 header {* Finite sets *}
     9 
     8 
    10 theory Finite_Set = Divides + Power + Inductive:
     9 theory Finite_Set = Divides + Power + Inductive:
   778 lemma setsum_insert [simp]:
   777 lemma setsum_insert [simp]:
   779     "finite F ==> a \<notin> F ==> setsum f (insert a F) = f a + setsum f F"
   778     "finite F ==> a \<notin> F ==> setsum f (insert a F) = f a + setsum f F"
   780   by (simp add: setsum_def
   779   by (simp add: setsum_def
   781     LC.fold_insert [OF LC.intro] add_left_commute)
   780     LC.fold_insert [OF LC.intro] add_left_commute)
   782 
   781 
   783 lemma setsum_reindex [rule_format]: "finite B ==>
   782 lemma setsum_reindex [rule_format]:
   784                   inj_on f B --> setsum h (f ` B) = setsum (h \<circ> f) B"
   783      "finite B ==> inj_on f B --> setsum h (f ` B) = setsum (h \<circ> f) B"
   785 apply (rule finite_induct, assumption, force)
   784 apply (rule finite_induct, assumption, force)
   786 apply (rule impI, auto)
   785 apply (rule impI, auto)
   787 apply (simp add: inj_on_def)
   786 apply (simp add: inj_on_def)
   788 apply (subgoal_tac "f x \<notin> f ` F")
   787 apply (subgoal_tac "f x \<notin> f ` F")
   789 apply (subgoal_tac "finite (f ` F)")
   788 apply (subgoal_tac "finite (f ` F)")
   790 apply (auto simp add: setsum_insert)
   789 apply (auto simp add: setsum_insert)
   791 apply (simp add: inj_on_def)
   790 apply (simp add: inj_on_def)
   792   done
   791 done
   793 
   792 
   794 lemma setsum_reindex_id: "finite B ==> inj_on f B ==>
   793 lemma setsum_reindex_id:
   795     setsum f B = setsum id (f ` B)"
   794      "finite B ==> inj_on f B ==> setsum f B = setsum id (f ` B)"
   796 by (auto simp add: setsum_reindex id_o)
   795 by (auto simp add: setsum_reindex id_o)
   797 
       
   798 lemma setsum_reindex_cong: "finite A ==> inj_on f A ==>
       
   799     B = f ` A ==> g = h \<circ> f ==> setsum h B = setsum g A"
       
   800   by (frule setsum_reindex, assumption, simp)
       
   801 
   796 
   802 lemma setsum_cong:
   797 lemma setsum_cong:
   803   "A = B ==> (!!x. x:B ==> f x = g x) ==> setsum f A = setsum g B"
   798   "A = B ==> (!!x. x:B ==> f x = g x) ==> setsum f A = setsum g B"
   804   apply (case_tac "finite B")
   799   apply (case_tac "finite B")
   805    prefer 2 apply (simp add: setsum_def, simp)
   800    prefer 2 apply (simp add: setsum_def, simp)
   814   apply (erule ssubst)
   809   apply (erule ssubst)
   815   apply (drule spec)
   810   apply (drule spec)
   816   apply (erule (1) notE impE)
   811   apply (erule (1) notE impE)
   817   apply (simp add: Ball_def del:insert_Diff_single)
   812   apply (simp add: Ball_def del:insert_Diff_single)
   818   done
   813   done
       
   814 
       
   815 lemma setsum_reindex_cong:
       
   816      "[|finite A; inj_on f A; B = f ` A; !!a. g a = h (f a)|] 
       
   817       ==> setsum h B = setsum g A"
       
   818   by (simp add: setsum_reindex cong: setsum_cong) 
   819 
   819 
   820 lemma setsum_0: "setsum (%i. 0) A = 0"
   820 lemma setsum_0: "setsum (%i. 0) A = 0"
   821   apply (case_tac "finite A")
   821   apply (case_tac "finite A")
   822    prefer 2 apply (simp add: setsum_def)
   822    prefer 2 apply (simp add: setsum_def)
   823   apply (erule finite_induct, auto)
   823   apply (erule finite_induct, auto)
  1343 
  1343 
  1344 lemma card_inj_on_le:
  1344 lemma card_inj_on_le:
  1345     "[|inj_on f A; f ` A \<subseteq> B; finite B |] ==> card A \<le> card B"
  1345     "[|inj_on f A; f ` A \<subseteq> B; finite B |] ==> card A \<le> card B"
  1346 apply (subgoal_tac "finite A") 
  1346 apply (subgoal_tac "finite A") 
  1347  apply (force intro: card_mono simp add: card_image [symmetric])
  1347  apply (force intro: card_mono simp add: card_image [symmetric])
  1348 apply (blast intro: Finite_Set.finite_imageD dest: finite_subset) 
  1348 apply (blast intro: finite_imageD dest: finite_subset) 
  1349 done
  1349 done
  1350 
  1350 
  1351 lemma card_bij_eq:
  1351 lemma card_bij_eq:
  1352     "[|inj_on f A; f ` A \<subseteq> B; inj_on g B; g ` B \<subseteq> A;
  1352     "[|inj_on f A; f ` A \<subseteq> B; inj_on g B; g ` B \<subseteq> A;
  1353        finite A; finite B |] ==> card A = card B"
  1353        finite A; finite B |] ==> card A = card B"