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" |