960 lemma setsum_Un_ring: "finite A ==> finite B ==> |
960 lemma setsum_Un_ring: "finite A ==> finite B ==> |
961 (setsum f (A Un B) :: 'a :: ab_group_add) = |
961 (setsum f (A Un B) :: 'a :: ab_group_add) = |
962 setsum f A + setsum f B - setsum f (A Int B)" |
962 setsum f A + setsum f B - setsum f (A Int B)" |
963 by (subst setsum_Un_Int [symmetric], auto simp add: ring_eq_simps) |
963 by (subst setsum_Un_Int [symmetric], auto simp add: ring_eq_simps) |
964 |
964 |
965 lemma setsum_diff1: "(setsum f (A - {a}) :: nat) = |
965 lemma setsum_diff1_nat: "(setsum f (A - {a}) :: nat) = |
966 (if a:A then setsum f A - f a else setsum f A)" |
966 (if a:A then setsum f A - f a else setsum f A)" |
967 apply (case_tac "finite A") |
967 apply (case_tac "finite A") |
968 prefer 2 apply (simp add: setsum_def) |
968 prefer 2 apply (simp add: setsum_def) |
969 apply (erule finite_induct) |
969 apply (erule finite_induct) |
970 apply (auto simp add: insert_Diff_if) |
970 apply (auto simp add: insert_Diff_if) |
971 apply (drule_tac a = a in mk_disjoint_insert, auto) |
971 apply (drule_tac a = a in mk_disjoint_insert, auto) |
972 done |
972 done |
973 |
973 |
|
974 lemma setsum_diff1: "finite A \<Longrightarrow> |
|
975 (setsum f (A - {a}) :: ('a::{pordered_ab_group_add})) = |
|
976 (if a:A then setsum f A - f a else setsum f A)" |
|
977 by (erule finite_induct) (auto simp add: insert_Diff_if) |
|
978 |
974 (* By Jeremy Siek: *) |
979 (* By Jeremy Siek: *) |
975 |
980 |
976 lemma setsum_diff: |
981 lemma setsum_diff_nat: |
977 assumes finB: "finite B" |
982 assumes finB: "finite B" |
978 shows "B \<subseteq> A \<Longrightarrow> (setsum f (A - B) :: nat) = (setsum f A) - (setsum f B)" |
983 shows "B \<subseteq> A \<Longrightarrow> (setsum f (A - B) :: nat) = (setsum f A) - (setsum f B)" |
979 using finB |
984 using finB |
980 proof (induct) |
985 proof (induct) |
981 show "setsum f (A - {}) = (setsum f A) - (setsum f {})" by simp |
986 show "setsum f (A - {}) = (setsum f A) - (setsum f {})" by simp |
983 fix F x assume finF: "finite F" and xnotinF: "x \<notin> F" |
988 fix F x assume finF: "finite F" and xnotinF: "x \<notin> F" |
984 and xFinA: "insert x F \<subseteq> A" |
989 and xFinA: "insert x F \<subseteq> A" |
985 and IH: "F \<subseteq> A \<Longrightarrow> setsum f (A - F) = setsum f A - setsum f F" |
990 and IH: "F \<subseteq> A \<Longrightarrow> setsum f (A - F) = setsum f A - setsum f F" |
986 from xnotinF xFinA have xinAF: "x \<in> (A - F)" by simp |
991 from xnotinF xFinA have xinAF: "x \<in> (A - F)" by simp |
987 from xinAF have A: "setsum f ((A - F) - {x}) = setsum f (A - F) - f x" |
992 from xinAF have A: "setsum f ((A - F) - {x}) = setsum f (A - F) - f x" |
988 by (simp add: setsum_diff1) |
993 by (simp add: setsum_diff1_nat) |
989 from xFinA have "F \<subseteq> A" by simp |
994 from xFinA have "F \<subseteq> A" by simp |
990 with IH have "setsum f (A - F) = setsum f A - setsum f F" by simp |
995 with IH have "setsum f (A - F) = setsum f A - setsum f F" by simp |
991 with A have B: "setsum f ((A - F) - {x}) = setsum f A - setsum f F - f x" |
996 with A have B: "setsum f ((A - F) - {x}) = setsum f A - setsum f F - f x" |
992 by simp |
997 by simp |
993 from xnotinF have "A - insert x F = (A - F) - {x}" by auto |
998 from xnotinF have "A - insert x F = (A - F) - {x}" by auto |
996 from finF xnotinF have "setsum f (insert x F) = setsum f F + f x" by simp |
1001 from finF xnotinF have "setsum f (insert x F) = setsum f F + f x" by simp |
997 with C have "setsum f (A - insert x F) = setsum f A - setsum f (insert x F)" |
1002 with C have "setsum f (A - insert x F) = setsum f A - setsum f (insert x F)" |
998 by simp |
1003 by simp |
999 thus "setsum f (A - insert x F) = setsum f A - setsum f (insert x F)" by simp |
1004 thus "setsum f (A - insert x F) = setsum f A - setsum f (insert x F)" by simp |
1000 qed |
1005 qed |
|
1006 |
|
1007 lemma setsum_diff: |
|
1008 assumes le: "finite A" "B \<subseteq> A" |
|
1009 shows "setsum f (A - B) = setsum f A - ((setsum f B)::('a::pordered_ab_group_add))" |
|
1010 proof - |
|
1011 from le have finiteB: "finite B" using finite_subset by auto |
|
1012 show ?thesis using le finiteB |
|
1013 proof (induct rule: Finites.induct[OF finiteB]) |
|
1014 case 1 |
|
1015 thus ?case by auto |
|
1016 next |
|
1017 case 2 |
|
1018 thus ?case using le |
|
1019 apply auto |
|
1020 apply (subst Diff_insert) |
|
1021 apply (subst setsum_diff1) |
|
1022 apply (auto simp add: insert_absorb) |
|
1023 done |
|
1024 qed |
|
1025 qed |
1001 |
1026 |
1002 lemma setsum_mono: |
1027 lemma setsum_mono: |
1003 assumes le: "\<And>i. i\<in>K \<Longrightarrow> f (i::'a) \<le> ((g i)::('b::{comm_monoid_add, pordered_ab_semigroup_add}))" |
1028 assumes le: "\<And>i. i\<in>K \<Longrightarrow> f (i::'a) \<le> ((g i)::('b::{comm_monoid_add, pordered_ab_semigroup_add}))" |
1004 shows "(\<Sum>i\<in>K. f i) \<le> (\<Sum>i\<in>K. g i)" |
1029 shows "(\<Sum>i\<in>K. f i) \<le> (\<Sum>i\<in>K. g i)" |
1005 proof (cases "finite K") |
1030 proof (cases "finite K") |
1016 next |
1041 next |
1017 case False |
1042 case False |
1018 thus ?thesis |
1043 thus ?thesis |
1019 by (simp add: setsum_def) |
1044 by (simp add: setsum_def) |
1020 qed |
1045 qed |
1021 |
|
1022 lemma finite_setsum_diff1: "finite A \<Longrightarrow> (setsum f (A - {a}) :: ('a::{pordered_ab_group_add})) = |
|
1023 (if a:A then setsum f A - f a else setsum f A)" |
|
1024 by (erule finite_induct) (auto simp add: insert_Diff_if) |
|
1025 |
|
1026 lemma finite_setsum_diff: |
|
1027 assumes le: "finite A" "B \<subseteq> A" |
|
1028 shows "setsum f (A - B) = setsum f A - ((setsum f B)::('a::pordered_ab_group_add))" |
|
1029 proof - |
|
1030 from le have finiteB: "finite B" using finite_subset by auto |
|
1031 show ?thesis using le finiteB |
|
1032 proof (induct rule: Finites.induct[OF finiteB]) |
|
1033 case 1 |
|
1034 thus ?case by auto |
|
1035 next |
|
1036 case 2 |
|
1037 thus ?case using le |
|
1038 apply auto |
|
1039 apply (subst Diff_insert) |
|
1040 apply (subst finite_setsum_diff1) |
|
1041 apply (auto simp add: insert_absorb) |
|
1042 done |
|
1043 qed |
|
1044 qed |
|
1045 |
1046 |
1046 lemma setsum_negf: "finite A ==> setsum (%x. - (f x)::'a::ab_group_add) A = |
1047 lemma setsum_negf: "finite A ==> setsum (%x. - (f x)::'a::ab_group_add) A = |
1047 - setsum f A" |
1048 - setsum f A" |
1048 by (induct set: Finites, auto) |
1049 by (induct set: Finites, auto) |
1049 |
1050 |