src/HOL/SetInterval.thy
changeset 31509 00ede188c5d6
parent 31505 6f589131ba94
child 31998 2c7a24f74db9
equal deleted inserted replaced
31508:1ea1c70aba00 31509:00ede188c5d6
   856 lemma setsum_natinterval_difff:
   856 lemma setsum_natinterval_difff:
   857   fixes f:: "nat \<Rightarrow> ('a::ab_group_add)"
   857   fixes f:: "nat \<Rightarrow> ('a::ab_group_add)"
   858   shows  "setsum (\<lambda>k. f k - f(k + 1)) {(m::nat) .. n} =
   858   shows  "setsum (\<lambda>k. f k - f(k + 1)) {(m::nat) .. n} =
   859           (if m <= n then f m - f(n + 1) else 0)"
   859           (if m <= n then f m - f(n + 1) else 0)"
   860 by (induct n, auto simp add: algebra_simps not_le le_Suc_eq)
   860 by (induct n, auto simp add: algebra_simps not_le le_Suc_eq)
       
   861 
       
   862 lemmas setsum_restrict_set' = setsum_restrict_set[unfolded Int_def]
       
   863 
       
   864 lemma setsum_setsum_restrict:
       
   865   "finite S \<Longrightarrow> finite T \<Longrightarrow> setsum (\<lambda>x. setsum (\<lambda>y. f x y) {y. y\<in> T \<and> R x y}) S = setsum (\<lambda>y. setsum (\<lambda>x. f x y) {x. x \<in> S \<and> R x y}) T"
       
   866   by (simp add: setsum_restrict_set'[unfolded mem_def] mem_def)
       
   867      (rule setsum_commute)
       
   868 
       
   869 lemma setsum_image_gen: assumes fS: "finite S"
       
   870   shows "setsum g S = setsum (\<lambda>y. setsum g {x. x \<in> S \<and> f x = y}) (f ` S)"
       
   871 proof-
       
   872   { fix x assume "x \<in> S" then have "{y. y\<in> f`S \<and> f x = y} = {f x}" by auto }
       
   873   hence "setsum g S = setsum (\<lambda>x. setsum (\<lambda>y. g x) {y. y\<in> f`S \<and> f x = y}) S"
       
   874     by simp
       
   875   also have "\<dots> = setsum (\<lambda>y. setsum g {x. x \<in> S \<and> f x = y}) (f ` S)"
       
   876     by (rule setsum_setsum_restrict[OF fS finite_imageI[OF fS]])
       
   877   finally show ?thesis .
       
   878 qed
       
   879 
       
   880 lemma setsum_multicount_gen:
       
   881   assumes "finite s" "finite t" "\<forall>j\<in>t. (card {i\<in>s. R i j} = k j)"
       
   882   shows "setsum (\<lambda>i. (card {j\<in>t. R i j})) s = setsum k t" (is "?l = ?r")
       
   883 proof-
       
   884   have "?l = setsum (\<lambda>i. setsum (\<lambda>x.1) {j\<in>t. R i j}) s" by auto
       
   885   also have "\<dots> = ?r" unfolding setsum_setsum_restrict[OF assms(1-2)]
       
   886     using assms(3) by auto
       
   887   finally show ?thesis .
       
   888 qed
       
   889 
       
   890 lemma setsum_multicount:
       
   891   assumes "finite S" "finite T" "\<forall>j\<in>T. (card {i\<in>S. R i j} = k)"
       
   892   shows "setsum (\<lambda>i. card {j\<in>T. R i j}) S = k * card T" (is "?l = ?r")
       
   893 proof-
       
   894   have "?l = setsum (\<lambda>i. k) T" by(rule setsum_multicount_gen)(auto simp:assms)
       
   895   also have "\<dots> = ?r" by(simp add: setsum_constant mult_commute)
       
   896   finally show ?thesis by auto
       
   897 qed
   861 
   898 
   862 
   899 
   863 subsection{* Shifting bounds *}
   900 subsection{* Shifting bounds *}
   864 
   901 
   865 lemma setsum_shift_bounds_nat_ivl:
   902 lemma setsum_shift_bounds_nat_ivl: