src/HOL/Finite_Set.thy
changeset 14748 001323d6d75b
parent 14740 c8e1937110c2
child 14889 d7711d6b9014
equal deleted inserted replaced
14747:2eaff69d3d10 14748:001323d6d75b
  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)