src/HOL/ex/Birthday_Paradox.thy
changeset 50123 69b35a75caf3
parent 43238 04c886a1d1a5
child 58889 5b7a9633cfa8
--- a/src/HOL/ex/Birthday_Paradox.thy	Mon Nov 19 16:14:18 2012 +0100
+++ b/src/HOL/ex/Birthday_Paradox.thy	Mon Nov 19 12:29:02 2012 +0100
@@ -14,21 +14,7 @@
   assumes "finite S"
   assumes "\<forall>x \<in> S. finite (T x)" 
   shows "card {(x, y). x \<in> S \<and> y \<in> T x} = (\<Sum>x \<in> S. card (T x))"
-proof -
-  note `finite S`
-  moreover
-  have "{(x, y). x \<in> S \<and> y \<in> T x} = (UN x : S. Pair x ` T x)" by auto
-  moreover
-  from `\<forall>x \<in> S. finite (T x)` have "ALL x:S. finite (Pair x ` T x)" by auto
-  moreover
-  have " ALL i:S. ALL j:S. i ~= j --> Pair i ` T i Int Pair j ` T j = {}" by auto
-  moreover  
-  ultimately have "card {(x, y). x \<in> S \<and> y \<in> T x} = (SUM i:S. card (Pair i ` T i))"
-    by (auto, subst card_UN_disjoint) auto
-  also have "... = (SUM x:S. card (T x))"
-    by (subst card_image) (auto intro: inj_onI)
-  finally show ?thesis by auto
-qed
+  using card_SigmaI[OF assms, symmetric] by (auto intro!: arg_cong[where f=card] simp add: Sigma_def)
 
 lemma card_extensional_funcset_inj_on:
   assumes "finite S" "finite T" "card S \<le> card T"
@@ -36,13 +22,13 @@
 using assms
 proof (induct S arbitrary: T rule: finite_induct)
   case empty
-  from this show ?case by (simp add: Collect_conv_if extensional_funcset_empty_domain)
+  from this show ?case by (simp add: Collect_conv_if PiE_empty_domain)
 next
   case (insert x S)
   { fix x
     from `finite T` have "finite (T - {x})" by auto
     from `finite S` this have "finite (extensional_funcset S (T - {x}))"
-      by (rule finite_extensional_funcset)
+      by (rule finite_PiE)
     moreover
     have "{f : extensional_funcset S (T - {x}). inj_on f S} \<subseteq> (extensional_funcset S (T - {x}))" by auto    
     ultimately have "finite {f : extensional_funcset S (T - {x}). inj_on f S}"
@@ -75,10 +61,10 @@
 proof -
   have subset: "{f : extensional_funcset S T. inj_on f S} <= extensional_funcset S T" by auto
   from finite_subset[OF subset] assms have finite: "finite {f : extensional_funcset S T. inj_on f S}"
-    by (auto intro!: finite_extensional_funcset)
+    by (auto intro!: finite_PiE)
   have "{f \<in> extensional_funcset S T. \<not> inj_on f S} = extensional_funcset S T - {f \<in> extensional_funcset S T. inj_on f S}" by auto 
   from assms this finite subset show ?thesis
-    by (simp add: card_Diff_subset card_extensional_funcset card_extensional_funcset_inj_on)
+    by (simp add: card_Diff_subset card_PiE card_extensional_funcset_inj_on setprod_constant)
 qed
 
 lemma setprod_upto_nat_unfold:
@@ -93,9 +79,9 @@
 proof -
   from `card S = 23` `card T = 365` have "finite S" "finite T" "card S <= card T" by (auto intro: card_ge_0_finite)
   from assms show ?thesis
-    using card_extensional_funcset[OF `finite S`, of T]
+    using card_PiE[OF `finite S`, of "\<lambda>i. T"] `finite S`
       card_extensional_funcset_not_inj_on[OF `finite S` `finite T` `card S <= card T`]
-    by (simp add: fact_div_fact setprod_upto_nat_unfold)
+    by (simp add: fact_div_fact setprod_upto_nat_unfold setprod_constant)
 qed
 
 end