src/HOL/Finite_Set.thy
changeset 15535 a0cf3a19ee36
parent 15532 9712d41db5b8
child 15539 333a88244569
equal deleted inserted replaced
15534:fad04f5f822f 15535:a0cf3a19ee36
   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