1002 lemma setprod_insert [simp]: "[| finite A; a \<notin> A |] ==> |
1002 lemma setprod_insert [simp]: "[| finite A; a \<notin> A |] ==> |
1003 setprod f (insert a A) = f a * setprod f A" |
1003 setprod f (insert a A) = f a * setprod f A" |
1004 by (auto simp add: setprod_def LC_def LC.fold_insert |
1004 by (auto simp add: setprod_def LC_def LC.fold_insert |
1005 mult_left_commute) |
1005 mult_left_commute) |
1006 |
1006 |
1007 lemma setprod_reindex [rule_format]: "finite B ==> |
1007 lemma setprod_reindex [rule_format]: |
1008 inj_on f B --> setprod h (f ` B) = setprod (h \<circ> f) B" |
1008 "finite B ==> inj_on f B --> setprod h (f ` B) = setprod (h \<circ> f) B" |
1009 apply (rule finite_induct, assumption, force) |
1009 apply (rule finite_induct, assumption, force) |
1010 apply (rule impI, auto) |
1010 apply (rule impI, auto) |
1011 apply (simp add: inj_on_def) |
1011 apply (simp add: inj_on_def) |
1012 apply (subgoal_tac "f x \<notin> f ` F") |
1012 apply (subgoal_tac "f x \<notin> f ` F") |
1013 apply (subgoal_tac "finite (f ` F)") |
1013 apply (subgoal_tac "finite (f ` F)") |
1014 apply (auto simp add: setprod_insert) |
1014 apply (auto simp add: setprod_insert) |
1015 apply (simp add: inj_on_def) |
1015 apply (simp add: inj_on_def) |
1016 done |
1016 done |
1017 |
1017 |
1018 lemma setprod_reindex_id: "finite B ==> inj_on f B ==> |
1018 lemma setprod_reindex_id: "finite B ==> inj_on f B ==> |
1019 setprod f B = setprod id (f ` B)" |
1019 setprod f B = setprod id (f ` B)" |
1020 by (auto simp add: setprod_reindex id_o) |
1020 by (auto simp add: setprod_reindex id_o) |
1021 |
1021 |
1323 apply (erule rev_mp, subst card_Diff_singleton) |
1323 apply (erule rev_mp, subst card_Diff_singleton) |
1324 apply (auto intro: finite_subset) |
1324 apply (auto intro: finite_subset) |
1325 done |
1325 done |
1326 |
1326 |
1327 lemma card_inj_on_le: |
1327 lemma card_inj_on_le: |
1328 "[|inj_on f A; f ` A \<subseteq> B; finite A; finite B |] ==> card A <= card B" |
1328 "[|inj_on f A; f ` A \<subseteq> B; finite B |] ==> card A \<le> card B" |
1329 by (auto intro: card_mono simp add: card_image [symmetric]) |
1329 apply (subgoal_tac "finite A") |
|
1330 apply (force intro: card_mono simp add: card_image [symmetric]) |
|
1331 apply (blast intro: Finite_Set.finite_imageD dest: finite_subset) |
|
1332 done |
1330 |
1333 |
1331 lemma card_bij_eq: |
1334 lemma card_bij_eq: |
1332 "[|inj_on f A; f ` A \<subseteq> B; inj_on g B; g ` B \<subseteq> A; |
1335 "[|inj_on f A; f ` A \<subseteq> B; inj_on g B; g ` B \<subseteq> A; |
1333 finite A; finite B |] ==> card A = card B" |
1336 finite A; finite B |] ==> card A = card B" |
1334 by (auto intro: le_anti_sym card_inj_on_le) |
1337 by (auto intro: le_anti_sym card_inj_on_le) |