src/HOL/Groups_Big.thy
changeset 68975 5ce4d117cea7
parent 68361 20375f232f3b
child 69127 4596b580d1dd
--- a/src/HOL/Groups_Big.thy	Mon Sep 10 21:33:14 2018 +0200
+++ b/src/HOL/Groups_Big.thy	Tue Sep 11 16:21:54 2018 +0100
@@ -1006,9 +1006,18 @@
 qed
 
 lemma card_Union_disjoint:
-  "finite C \<Longrightarrow> \<forall>A\<in>C. finite A \<Longrightarrow> \<forall>A\<in>C. \<forall>B\<in>C. A \<noteq> B \<longrightarrow> A \<inter> B = {} \<Longrightarrow>
-    card (\<Union>C) = sum card C"
-  by (frule card_UN_disjoint [of C id]) simp_all
+  assumes "pairwise disjnt C" and fin: "\<And>A. A \<in> C \<Longrightarrow> finite A"
+  shows "card (\<Union>C) = sum card C"
+proof (cases "finite C")
+  case True
+  then show ?thesis
+    using card_UN_disjoint [OF True, of "\<lambda>x. x"] assms
+    by (simp add: disjnt_def fin pairwise_def)
+next
+  case False
+  then show ?thesis
+    using assms card_eq_0_iff finite_UnionD by fastforce
+qed
 
 lemma sum_multicount_gen:
   assumes "finite s" "finite t" "\<forall>j\<in>t. (card {i\<in>s. R i j} = k j)"
@@ -1035,42 +1044,42 @@
 
 lemma sum_card_image:
   assumes "finite A"
-  assumes "\<forall>s\<in>A. \<forall>t\<in>A. s \<noteq> t \<longrightarrow> (f s) \<inter> (f t) = {}"
+  assumes "pairwise (\<lambda>s t. disjnt (f s) (f t)) A"
   shows "sum card (f ` A) = sum (\<lambda>a. card (f a)) A"
 using assms
 proof (induct A)
-  case empty
-  from this show ?case by simp
-next
   case (insert a A)
   show ?case
   proof cases
     assume "f a = {}"
-    from this insert show ?case
-      by (subst sum.mono_neutral_right[where S="f ` A"]) auto
+    with insert show ?case
+      by (subst sum.mono_neutral_right[where S="f ` A"]) (auto simp: pairwise_insert)
   next
     assume "f a \<noteq> {}"
-    from this have "sum card (insert (f a) (f ` A)) = card (f a) + sum card (f ` A)"
-      using insert by (subst sum.insert) auto
-    from this insert show ?case by simp
+    then have "sum card (insert (f a) (f ` A)) = card (f a) + sum card (f ` A)"
+      using insert
+      by (subst sum.insert) (auto simp: pairwise_insert)
+    with insert show ?case by (simp add: pairwise_insert)
   qed
-qed
+qed simp
 
 lemma card_Union_image:
   assumes "finite S"
-  assumes "\<forall>s\<in>f ` S. finite s"
-  assumes "\<forall>s\<in>S. \<forall>t\<in>S. s \<noteq> t \<longrightarrow> (f s) \<inter> (f t) = {}"
+  assumes "\<And>s. s \<in> S \<Longrightarrow> finite (f s)"
+  assumes "pairwise (\<lambda>s t. disjnt (f s) (f t)) S"
   shows "card (\<Union>(f ` S)) = sum (\<lambda>x. card (f x)) S"
 proof -
-  have "\<forall>A\<in>f ` S. \<forall>B\<in>f ` S. A \<noteq> B \<longrightarrow> A \<inter> B = {}"
-    using assms(3) by (metis image_iff)
-  from this have "card (\<Union>(f ` S)) = sum card (f ` S)"
-    using assms(1, 2) by (subst card_Union_disjoint) auto
+  have "pairwise disjnt (f ` S)"
+    using assms(3)
+    by (metis pairwiseD pairwise_imageI) 
+  then have "card (\<Union>(f ` S)) = sum card (f ` S)"
+    by (subst card_Union_disjoint) (use assms in auto)
   also have "... = sum (\<lambda>x. card (f x)) S"
-    using assms(1, 3) by (auto simp add: sum_card_image)
+    by (metis (mono_tags, lifting) assms(1) assms(3) sum_card_image)
   finally show ?thesis .
 qed
 
+
 subsubsection \<open>Cardinality of products\<close>
 
 lemma card_SigmaI [simp]:
@@ -1152,7 +1161,7 @@
 
 context linordered_nonzero_semiring
 begin
-  
+
 lemma prod_ge_1: "(\<And>x. x \<in> A \<Longrightarrow> 1 \<le> f x) \<Longrightarrow> 1 \<le> prod f A"
 proof (induct A rule: infinite_finite_induct)
   case infinite
@@ -1434,5 +1443,5 @@
     using insert by auto
   finally show ?case .
 qed
- 
+
 end