src/HOL/Finite_Set.thy
changeset 15542 ee6cd48cf840
parent 15539 333a88244569
child 15543 0024472afce7
equal deleted inserted replaced
15541:206d779ba96d 15542:ee6cd48cf840
   898 lemma setsum_reindex_cong:
   898 lemma setsum_reindex_cong:
   899      "[|inj_on f A; B = f ` A; !!a. g a = h (f a)|] 
   899      "[|inj_on f A; B = f ` A; !!a. g a = h (f a)|] 
   900       ==> setsum h B = setsum g A"
   900       ==> setsum h B = setsum g A"
   901   by (simp add: setsum_reindex cong: setsum_cong)
   901   by (simp add: setsum_reindex cong: setsum_cong)
   902 
   902 
   903 lemma setsum_0: "setsum (%i. 0) A = 0"
   903 lemma setsum_0[simp]: "setsum (%i. 0) A = 0"
   904 apply (clarsimp simp: setsum_def)
   904 apply (clarsimp simp: setsum_def)
   905 apply (erule finite_induct, auto simp:ACf.fold_insert [OF ACf_add])
   905 apply (erule finite_induct, auto simp:ACf.fold_insert [OF ACf_add])
   906 done
   906 done
   907 
   907 
   908 lemma setsum_0': "ALL a:F. f a = 0 ==> setsum f F = 0"
   908 lemma setsum_0': "ALL a:F. f a = 0 ==> setsum f F = 0"
  1117   also have "\<dots> = setsum f (A \<union> (B-A))" using fin finite_subset[OF sub fin]
  1117   also have "\<dots> = setsum f (A \<union> (B-A))" using fin finite_subset[OF sub fin]
  1118     by (simp add:setsum_Un_disjoint del:Un_Diff_cancel)
  1118     by (simp add:setsum_Un_disjoint del:Un_Diff_cancel)
  1119   also have "A \<union> (B-A) = B" using sub by blast
  1119   also have "A \<union> (B-A) = B" using sub by blast
  1120   finally show ?thesis .
  1120   finally show ?thesis .
  1121 qed
  1121 qed
  1122 (*
  1122 
  1123 lemma setsum_mono2_nat:
       
  1124   assumes fin: "finite B" and sub: "A \<subseteq> B"
       
  1125 shows "setsum f A \<le> (setsum f B :: nat)"
       
  1126 proof -
       
  1127   have "setsum f A \<le> setsum f A + setsum f (B-A)" by arith
       
  1128   also have "\<dots> = setsum f (A \<union> (B-A))" using fin finite_subset[OF sub fin]
       
  1129     by (simp add:setsum_Un_disjoint del:Un_Diff_cancel)
       
  1130   also have "A \<union> (B-A) = B" using sub by blast
       
  1131   finally show ?thesis .
       
  1132 qed
       
  1133 *)
       
  1134 lemma setsum_mult: 
  1123 lemma setsum_mult: 
  1135   fixes f :: "'a => ('b::semiring_0_cancel)"
  1124   fixes f :: "'a => ('b::semiring_0_cancel)"
  1136   shows "r * setsum f A = setsum (%n. r * f n) A"
  1125   shows "r * setsum f A = setsum (%n. r * f n) A"
  1137 proof (cases "finite A")
  1126 proof (cases "finite A")
  1138   case True
  1127   case True
  1539 
  1528 
  1540 lemma setprod_constant: "finite A ==> (\<Prod>x: A. (y::'a::recpower)) = y^(card A)"
  1529 lemma setprod_constant: "finite A ==> (\<Prod>x: A. (y::'a::recpower)) = y^(card A)"
  1541   apply (erule finite_induct)
  1530   apply (erule finite_induct)
  1542   apply (auto simp add: power_Suc)
  1531   apply (auto simp add: power_Suc)
  1543   done
  1532   done
       
  1533 
       
  1534 lemma setsum_bounded:
       
  1535   assumes le: "\<And>i. i\<in>A \<Longrightarrow> f i \<le> (K::'a::{comm_semiring_1_cancel, pordered_ab_semigroup_add})"
       
  1536   shows "setsum f A \<le> of_nat(card A) * K"
       
  1537 proof (cases "finite A")
       
  1538   case True
       
  1539   thus ?thesis using le setsum_mono[where K=A and g = "%x. K"] by simp
       
  1540 next
       
  1541   case False thus ?thesis by (simp add: setsum_def)
       
  1542 qed
  1544 
  1543 
  1545 
  1544 
  1546 subsubsection {* Cardinality of unions *}
  1545 subsubsection {* Cardinality of unions *}
  1547 
  1546 
  1548 lemma of_nat_id[simp]: "(of_nat n :: nat) = n"
  1547 lemma of_nat_id[simp]: "(of_nat n :: nat) = n"