src/HOL/Finite_Set.thy
changeset 15315 a358e31572d9
parent 15314 55eec5c6d401
child 15318 e9669e0d6452
equal deleted inserted replaced
15314:55eec5c6d401 15315:a358e31572d9
   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