671 apply (rule the_equality) |
671 apply (rule the_equality) |
672 apply (auto intro: finite_imp_foldSet |
672 apply (auto intro: finite_imp_foldSet |
673 cong add: conj_cong simp add: fold_def [symmetric] fold_equality) |
673 cong add: conj_cong simp add: fold_def [symmetric] fold_equality) |
674 done |
674 done |
675 |
675 |
|
676 lemma (in ACf) fold_rec: |
|
677 assumes fin: "finite A" and a: "a:A" |
|
678 shows "fold f g z A = f (g a) (fold f g z (A - {a}))" |
|
679 proof- |
|
680 have A: "A = insert a (A - {a})" using a by blast |
|
681 hence "fold f g z A = fold f g z (insert a (A - {a}))" by simp |
|
682 also have "\<dots> = f (g a) (fold f g z (A - {a}))" |
|
683 by(rule fold_insert) (simp add:fin)+ |
|
684 finally show ?thesis . |
|
685 qed |
|
686 |
676 |
687 |
677 text{* A simplified version for idempotent functions: *} |
688 text{* A simplified version for idempotent functions: *} |
678 |
689 |
679 lemma (in ACIf) fold_insert_idem: |
690 lemma (in ACIf) fold_insert_idem: |
680 assumes finA: "finite A" |
691 assumes finA: "finite A" |
1062 by (simp add:setsum_Un_disjoint del:Un_Diff_cancel) |
1073 by (simp add:setsum_Un_disjoint del:Un_Diff_cancel) |
1063 also have "A \<union> (B-A) = B" using sub by blast |
1074 also have "A \<union> (B-A) = B" using sub by blast |
1064 finally show ?thesis . |
1075 finally show ?thesis . |
1065 qed |
1076 qed |
1066 |
1077 |
1067 lemma setsum_negf: "finite A ==> setsum (%x. - (f x)::'a::ab_group_add) A = |
1078 lemma setsum_negf: |
1068 - setsum f A" |
1079 "setsum (%x. - (f x)::'a::ab_group_add) A = - setsum f A" |
1069 by (induct set: Finites, auto) |
1080 proof (cases "finite A") |
1070 |
1081 case True thus ?thesis by (induct set: Finites, auto) |
1071 lemma setsum_subtractf: "finite A ==> setsum (%x. ((f x)::'a::ab_group_add) - g x) A = |
1082 next |
|
1083 case False thus ?thesis by (simp add: setsum_def) |
|
1084 qed |
|
1085 |
|
1086 lemma setsum_subtractf: |
|
1087 "setsum (%x. ((f x)::'a::ab_group_add) - g x) A = |
1072 setsum f A - setsum g A" |
1088 setsum f A - setsum g A" |
1073 by (simp add: diff_minus setsum_addf setsum_negf) |
1089 proof (cases "finite A") |
1074 |
1090 case True thus ?thesis by (simp add: diff_minus setsum_addf setsum_negf) |
1075 lemma setsum_nonneg: "[| finite A; |
1091 next |
1076 \<forall>x \<in> A. (0::'a::{pordered_ab_semigroup_add, comm_monoid_add}) \<le> f x |] ==> |
1092 case False thus ?thesis by (simp add: setsum_def) |
1077 0 \<le> setsum f A"; |
1093 qed |
|
1094 |
|
1095 lemma setsum_nonneg: |
|
1096 assumes nn: "\<forall>x\<in>A. (0::'a::{pordered_ab_semigroup_add,comm_monoid_add}) \<le> f x" |
|
1097 shows "0 \<le> setsum f A" |
|
1098 proof (cases "finite A") |
|
1099 case True thus ?thesis using nn |
1078 apply (induct set: Finites, auto) |
1100 apply (induct set: Finites, auto) |
1079 apply (subgoal_tac "0 + 0 \<le> f x + setsum f F", simp) |
1101 apply (subgoal_tac "0 + 0 \<le> f x + setsum f F", simp) |
1080 apply (blast intro: add_mono) |
1102 apply (blast intro: add_mono) |
1081 done |
1103 done |
1082 |
1104 next |
1083 lemma setsum_nonpos: "[| finite A; |
1105 case False thus ?thesis by (simp add: setsum_def) |
1084 \<forall>x \<in> A. f x \<le> (0::'a::{pordered_ab_semigroup_add, comm_monoid_add}) |] ==> |
1106 qed |
1085 setsum f A \<le> 0"; |
1107 |
|
1108 lemma setsum_nonpos: |
|
1109 assumes np: "\<forall>x\<in>A. f x \<le> (0::'a::{pordered_ab_semigroup_add,comm_monoid_add})" |
|
1110 shows "setsum f A \<le> 0" |
|
1111 proof (cases "finite A") |
|
1112 case True thus ?thesis using np |
1086 apply (induct set: Finites, auto) |
1113 apply (induct set: Finites, auto) |
1087 apply (subgoal_tac "f x + setsum f F \<le> 0 + 0", simp) |
1114 apply (subgoal_tac "f x + setsum f F \<le> 0 + 0", simp) |
1088 apply (blast intro: add_mono) |
1115 apply (blast intro: add_mono) |
1089 done |
1116 done |
|
1117 next |
|
1118 case False thus ?thesis by (simp add: setsum_def) |
|
1119 qed |
1090 |
1120 |
1091 lemma setsum_mult: |
1121 lemma setsum_mult: |
1092 fixes f :: "'a => ('b::semiring_0_cancel)" |
1122 fixes f :: "'a => ('b::semiring_0_cancel)" |
1093 shows "r * setsum f A = setsum (%n. r * f n) A" |
1123 shows "r * setsum f A = setsum (%n. r * f n) A" |
1094 proof (cases "finite A") |
1124 proof (cases "finite A") |
1101 qed |
1131 qed |
1102 next |
1132 next |
1103 case False thus ?thesis by (simp add: setsum_def) |
1133 case False thus ?thesis by (simp add: setsum_def) |
1104 qed |
1134 qed |
1105 |
1135 |
1106 lemma setsum_abs: |
1136 lemma setsum_abs[iff]: |
1107 fixes f :: "'a => ('b::lordered_ab_group_abs)" |
1137 fixes f :: "'a => ('b::lordered_ab_group_abs)" |
1108 assumes fin: "finite A" |
|
1109 shows "abs (setsum f A) \<le> setsum (%i. abs(f i)) A" |
1138 shows "abs (setsum f A) \<le> setsum (%i. abs(f i)) A" |
1110 using fin |
1139 proof (cases "finite A") |
1111 proof (induct) |
1140 case True |
1112 case empty thus ?case by simp |
1141 thus ?thesis |
1113 next |
1142 proof (induct) |
1114 case (insert x A) |
1143 case empty thus ?case by simp |
1115 thus ?case by (auto intro: abs_triangle_ineq order_trans) |
1144 next |
1116 qed |
1145 case (insert x A) |
1117 |
1146 thus ?case by (auto intro: abs_triangle_ineq order_trans) |
1118 lemma setsum_abs_ge_zero: |
1147 qed |
|
1148 next |
|
1149 case False thus ?thesis by (simp add: setsum_def) |
|
1150 qed |
|
1151 |
|
1152 lemma setsum_abs_ge_zero[iff]: |
1119 fixes f :: "'a => ('b::lordered_ab_group_abs)" |
1153 fixes f :: "'a => ('b::lordered_ab_group_abs)" |
1120 assumes fin: "finite A" |
|
1121 shows "0 \<le> setsum (%i. abs(f i)) A" |
1154 shows "0 \<le> setsum (%i. abs(f i)) A" |
1122 using fin |
1155 proof (cases "finite A") |
1123 proof (induct) |
1156 case True |
1124 case empty thus ?case by simp |
1157 thus ?thesis |
1125 next |
1158 proof (induct) |
1126 case (insert x A) thus ?case by (auto intro: order_trans) |
1159 case empty thus ?case by simp |
|
1160 next |
|
1161 case (insert x A) thus ?case by (auto intro: order_trans) |
|
1162 qed |
|
1163 next |
|
1164 case False thus ?thesis by (simp add: setsum_def) |
1127 qed |
1165 qed |
1128 |
1166 |
1129 |
1167 |
1130 subsection {* Generalized product over a set *} |
1168 subsection {* Generalized product over a set *} |
1131 |
1169 |