src/HOL/Finite_Set.thy
changeset 29674 3857d7eba390
parent 29609 a010aab5bed0
child 29675 fa6f988f1c50
equal deleted inserted replaced
29658:f2584b0c76b5 29674:3857d7eba390
   895 
   895 
   896 lemma setsum_reindex_id:
   896 lemma setsum_reindex_id:
   897      "inj_on f B ==> setsum f B = setsum id (f ` B)"
   897      "inj_on f B ==> setsum f B = setsum id (f ` B)"
   898 by (auto simp add: setsum_reindex)
   898 by (auto simp add: setsum_reindex)
   899 
   899 
       
   900 lemma setsum_reindex_nonzero: 
       
   901   assumes fS: "finite S"
       
   902   and nz: "\<And> x y. x \<in> S \<Longrightarrow> y \<in> S \<Longrightarrow> x \<noteq> y \<Longrightarrow> f x = f y \<Longrightarrow> h (f x) = 0"
       
   903   shows "setsum h (f ` S) = setsum (h o f) S"
       
   904 using nz
       
   905 proof(induct rule: finite_induct[OF fS])
       
   906   case 1 thus ?case by simp
       
   907 next
       
   908   case (2 x F) 
       
   909   {assume fxF: "f x \<in> f ` F" hence "\<exists>y \<in> F . f y = f x" by auto
       
   910     then obtain y where y: "y \<in> F" "f x = f y" by auto 
       
   911     from "2.hyps" y have xy: "x \<noteq> y" by auto
       
   912     
       
   913     from "2.prems"[of x y] "2.hyps" xy y have h0: "h (f x) = 0" by simp
       
   914     have "setsum h (f ` insert x F) = setsum h (f ` F)" using fxF by auto
       
   915     also have "\<dots> = setsum (h o f) (insert x F)" 
       
   916       unfolding setsum_insert[OF `finite F` `x\<notin>F`]
       
   917       using h0 
       
   918       apply simp
       
   919       apply (rule "2.hyps"(3))
       
   920       apply (rule_tac y="y" in  "2.prems")
       
   921       apply simp_all
       
   922       done
       
   923     finally have ?case .}
       
   924   moreover
       
   925   {assume fxF: "f x \<notin> f ` F"
       
   926     have "setsum h (f ` insert x F) = h (f x) + setsum h (f ` F)" 
       
   927       using fxF "2.hyps" by simp 
       
   928     also have "\<dots> = setsum (h o f) (insert x F)"
       
   929       unfolding setsum_insert[OF `finite F` `x\<notin>F`]
       
   930       apply simp
       
   931       apply (rule cong[OF refl[of "op + (h (f x))"]])
       
   932       apply (rule "2.hyps"(3))
       
   933       apply (rule_tac y="y" in  "2.prems")
       
   934       apply simp_all
       
   935       done
       
   936     finally have ?case .}
       
   937   ultimately show ?case by blast
       
   938 qed
       
   939 
   900 lemma setsum_cong:
   940 lemma setsum_cong:
   901   "A = B ==> (!!x. x:B ==> f x = g x) ==> setsum f A = setsum g B"
   941   "A = B ==> (!!x. x:B ==> f x = g x) ==> setsum f A = setsum g B"
   902 by(fastsimp simp: setsum_def intro: comm_monoid_add.fold_image_cong)
   942 by(fastsimp simp: setsum_def intro: comm_monoid_add.fold_image_cong)
   903 
   943 
   904 lemma strong_setsum_cong[cong]:
   944 lemma strong_setsum_cong[cong]:
   912 lemma setsum_reindex_cong:
   952 lemma setsum_reindex_cong:
   913    "[|inj_on f A; B = f ` A; !!a. a:A \<Longrightarrow> g a = h (f a)|] 
   953    "[|inj_on f A; B = f ` A; !!a. a:A \<Longrightarrow> g a = h (f a)|] 
   914     ==> setsum h B = setsum g A"
   954     ==> setsum h B = setsum g A"
   915 by (simp add: setsum_reindex cong: setsum_cong)
   955 by (simp add: setsum_reindex cong: setsum_cong)
   916 
   956 
       
   957 
   917 lemma setsum_0[simp]: "setsum (%i. 0) A = 0"
   958 lemma setsum_0[simp]: "setsum (%i. 0) A = 0"
   918 apply (clarsimp simp: setsum_def)
   959 apply (clarsimp simp: setsum_def)
   919 apply (erule finite_induct, auto)
   960 apply (erule finite_induct, auto)
   920 done
   961 done
   921 
   962 
   928 by(simp add: setsum_def comm_monoid_add.fold_image_Un_Int [symmetric])
   969 by(simp add: setsum_def comm_monoid_add.fold_image_Un_Int [symmetric])
   929 
   970 
   930 lemma setsum_Un_disjoint: "finite A ==> finite B
   971 lemma setsum_Un_disjoint: "finite A ==> finite B
   931   ==> A Int B = {} ==> setsum g (A Un B) = setsum g A + setsum g B"
   972   ==> A Int B = {} ==> setsum g (A Un B) = setsum g A + setsum g B"
   932 by (subst setsum_Un_Int [symmetric], auto)
   973 by (subst setsum_Un_Int [symmetric], auto)
       
   974 
       
   975 lemma setsum_mono_zero_left: 
       
   976   assumes fT: "finite T" and ST: "S \<subseteq> T"
       
   977   and z: "\<forall>i \<in> T - S. f i = 0"
       
   978   shows "setsum f S = setsum f T"
       
   979 proof-
       
   980   have eq: "T = S \<union> (T - S)" using ST by blast
       
   981   have d: "S \<inter> (T - S) = {}" using ST by blast
       
   982   from fT ST have f: "finite S" "finite (T - S)" by (auto intro: finite_subset)
       
   983   show ?thesis 
       
   984   by (simp add: setsum_Un_disjoint[OF f d, unfolded eq[symmetric]] setsum_0'[OF z])
       
   985 qed
       
   986 
       
   987 lemma setsum_mono_zero_right: 
       
   988   assumes fT: "finite T" and ST: "S \<subseteq> T"
       
   989   and z: "\<forall>i \<in> T - S. f i = 0"
       
   990   shows "setsum f T = setsum f S"
       
   991 using setsum_mono_zero_left[OF fT ST z] by simp
       
   992 
       
   993 lemma setsum_mono_zero_cong_left: 
       
   994   assumes fT: "finite T" and ST: "S \<subseteq> T"
       
   995   and z: "\<forall>i \<in> T - S. g i = 0"
       
   996   and fg: "\<And>x. x \<in> S \<Longrightarrow> f x = g x"
       
   997   shows "setsum f S = setsum g T"
       
   998 proof-
       
   999   have eq: "T = S \<union> (T - S)" using ST by blast
       
  1000   have d: "S \<inter> (T - S) = {}" using ST by blast
       
  1001   from fT ST have f: "finite S" "finite (T - S)" by (auto intro: finite_subset)
       
  1002   show ?thesis 
       
  1003     using fg by (simp add: setsum_Un_disjoint[OF f d, unfolded eq[symmetric]] setsum_0'[OF z])
       
  1004 qed
       
  1005 
       
  1006 lemma setsum_mono_zero_cong_right: 
       
  1007   assumes fT: "finite T" and ST: "S \<subseteq> T"
       
  1008   and z: "\<forall>i \<in> T - S. f i = 0"
       
  1009   and fg: "\<And>x. x \<in> S \<Longrightarrow> f x = g x"
       
  1010   shows "setsum f T = setsum g S"
       
  1011 using setsum_mono_zero_cong_left[OF fT ST z] fg[symmetric] by auto 
       
  1012 
       
  1013 lemma setsum_delta: 
       
  1014   assumes fS: "finite S"
       
  1015   shows "setsum (\<lambda>k. if k=a then b k else 0) S = (if a \<in> S then b a else 0)"
       
  1016 proof-
       
  1017   let ?f = "(\<lambda>k. if k=a then b k else 0)"
       
  1018   {assume a: "a \<notin> S"
       
  1019     hence "\<forall> k\<in> S. ?f k = 0" by simp
       
  1020     hence ?thesis  using a by simp}
       
  1021   moreover 
       
  1022   {assume a: "a \<in> S"
       
  1023     let ?A = "S - {a}"
       
  1024     let ?B = "{a}"
       
  1025     have eq: "S = ?A \<union> ?B" using a by blast 
       
  1026     have dj: "?A \<inter> ?B = {}" by simp
       
  1027     from fS have fAB: "finite ?A" "finite ?B" by auto  
       
  1028     have "setsum ?f S = setsum ?f ?A + setsum ?f ?B"
       
  1029       using setsum_Un_disjoint[OF fAB dj, of ?f, unfolded eq[symmetric]]
       
  1030       by simp
       
  1031     then have ?thesis  using a by simp}
       
  1032   ultimately show ?thesis by blast
       
  1033 qed
       
  1034 lemma setsum_delta': 
       
  1035   assumes fS: "finite S" shows 
       
  1036   "setsum (\<lambda>k. if a = k then b k else 0) S = 
       
  1037      (if a\<in> S then b a else 0)"
       
  1038   using setsum_delta[OF fS, of a b, symmetric] 
       
  1039   by (auto intro: setsum_cong)
       
  1040 
   933 
  1041 
   934 (*But we can't get rid of finite I. If infinite, although the rhs is 0, 
  1042 (*But we can't get rid of finite I. If infinite, although the rhs is 0, 
   935   the lhs need not be, since UNION I A could still be finite.*)
  1043   the lhs need not be, since UNION I A could still be finite.*)
   936 lemma setsum_UN_disjoint:
  1044 lemma setsum_UN_disjoint:
   937     "finite I ==> (ALL i:I. finite (A i)) ==>
  1045     "finite I ==> (ALL i:I. finite (A i)) ==>
  1363 
  1471 
  1364 lemma setprod_reindex_cong: "inj_on f A ==>
  1472 lemma setprod_reindex_cong: "inj_on f A ==>
  1365     B = f ` A ==> g = h \<circ> f ==> setprod h B = setprod g A"
  1473     B = f ` A ==> g = h \<circ> f ==> setprod h B = setprod g A"
  1366 by (frule setprod_reindex, simp)
  1474 by (frule setprod_reindex, simp)
  1367 
  1475 
       
  1476 lemma strong_setprod_reindex_cong: assumes i: "inj_on f A"
       
  1477   and B: "B = f ` A" and eq: "\<And>x. x \<in> A \<Longrightarrow> g x = (h \<circ> f) x"
       
  1478   shows "setprod h B = setprod g A"
       
  1479 proof-
       
  1480     have "setprod h B = setprod (h o f) A"
       
  1481       by (simp add: B setprod_reindex[OF i, of h])
       
  1482     then show ?thesis apply simp
       
  1483       apply (rule setprod_cong)
       
  1484       apply simp
       
  1485       by (erule eq[symmetric])
       
  1486 qed
       
  1487 
  1368 
  1488 
  1369 lemma setprod_1: "setprod (%i. 1) A = 1"
  1489 lemma setprod_1: "setprod (%i. 1) A = 1"
  1370 apply (case_tac "finite A")
  1490 apply (case_tac "finite A")
  1371 apply (erule finite_induct, auto simp add: mult_ac)
  1491 apply (erule finite_induct, auto simp add: mult_ac)
  1372 done
  1492 done
  1382 by(simp add: setprod_def fold_image_Un_Int[symmetric])
  1502 by(simp add: setprod_def fold_image_Un_Int[symmetric])
  1383 
  1503 
  1384 lemma setprod_Un_disjoint: "finite A ==> finite B
  1504 lemma setprod_Un_disjoint: "finite A ==> finite B
  1385   ==> A Int B = {} ==> setprod g (A Un B) = setprod g A * setprod g B"
  1505   ==> A Int B = {} ==> setprod g (A Un B) = setprod g A * setprod g B"
  1386 by (subst setprod_Un_Int [symmetric], auto)
  1506 by (subst setprod_Un_Int [symmetric], auto)
       
  1507 
       
  1508 lemma setprod_delta: 
       
  1509   assumes fS: "finite S"
       
  1510   shows "setprod (\<lambda>k. if k=a then b k else 1) S = (if a \<in> S then b a else 1)"
       
  1511 proof-
       
  1512   let ?f = "(\<lambda>k. if k=a then b k else 1)"
       
  1513   {assume a: "a \<notin> S"
       
  1514     hence "\<forall> k\<in> S. ?f k = 1" by simp
       
  1515     hence ?thesis  using a by (simp add: setprod_1 cong add: setprod_cong) }
       
  1516   moreover 
       
  1517   {assume a: "a \<in> S"
       
  1518     let ?A = "S - {a}"
       
  1519     let ?B = "{a}"
       
  1520     have eq: "S = ?A \<union> ?B" using a by blast 
       
  1521     have dj: "?A \<inter> ?B = {}" by simp
       
  1522     from fS have fAB: "finite ?A" "finite ?B" by auto  
       
  1523     have fA1: "setprod ?f ?A = 1" apply (rule setprod_1') by auto
       
  1524     have "setprod ?f ?A * setprod ?f ?B = setprod ?f S"
       
  1525       using setprod_Un_disjoint[OF fAB dj, of ?f, unfolded eq[symmetric]]
       
  1526       by simp
       
  1527     then have ?thesis  using a by (simp add: fA1 cong add: setprod_cong cong del: if_weak_cong)}
       
  1528   ultimately show ?thesis by blast
       
  1529 qed
       
  1530 
       
  1531 lemma setprod_delta': 
       
  1532   assumes fS: "finite S" shows 
       
  1533   "setprod (\<lambda>k. if a = k then b k else 1) S = 
       
  1534      (if a\<in> S then b a else 1)"
       
  1535   using setprod_delta[OF fS, of a b, symmetric] 
       
  1536   by (auto intro: setprod_cong)
       
  1537 
  1387 
  1538 
  1388 lemma setprod_UN_disjoint:
  1539 lemma setprod_UN_disjoint:
  1389     "finite I ==> (ALL i:I. finite (A i)) ==>
  1540     "finite I ==> (ALL i:I. finite (A i)) ==>
  1390         (ALL i:I. ALL j:I. i \<noteq> j --> A i Int A j = {}) ==>
  1541         (ALL i:I. ALL j:I. i \<noteq> j --> A i Int A j = {}) ==>
  1391       setprod f (UNION I A) = setprod (%i. setprod f (A i)) I"
  1542       setprod f (UNION I A) = setprod (%i. setprod f (A i)) I"
  1672 
  1823 
  1673 lemma setprod_constant: "finite A ==> (\<Prod>x\<in> A. (y::'a::{recpower, comm_monoid_mult})) = y^(card A)"
  1824 lemma setprod_constant: "finite A ==> (\<Prod>x\<in> A. (y::'a::{recpower, comm_monoid_mult})) = y^(card A)"
  1674 apply (erule finite_induct)
  1825 apply (erule finite_induct)
  1675 apply (auto simp add: power_Suc)
  1826 apply (auto simp add: power_Suc)
  1676 done
  1827 done
       
  1828 
       
  1829 lemma setprod_gen_delta:
       
  1830   assumes fS: "finite S"
       
  1831   shows "setprod (\<lambda>k. if k=a then b k else c) S = (if a \<in> S then (b a ::'a::{comm_monoid_mult, recpower}) * c^ (card S - 1) else c^ card S)"
       
  1832 proof-
       
  1833   let ?f = "(\<lambda>k. if k=a then b k else c)"
       
  1834   {assume a: "a \<notin> S"
       
  1835     hence "\<forall> k\<in> S. ?f k = c" by simp
       
  1836     hence ?thesis  using a setprod_constant[OF fS, of c] by (simp add: setprod_1 cong add: setprod_cong) }
       
  1837   moreover 
       
  1838   {assume a: "a \<in> S"
       
  1839     let ?A = "S - {a}"
       
  1840     let ?B = "{a}"
       
  1841     have eq: "S = ?A \<union> ?B" using a by blast 
       
  1842     have dj: "?A \<inter> ?B = {}" by simp
       
  1843     from fS have fAB: "finite ?A" "finite ?B" by auto  
       
  1844     have fA0:"setprod ?f ?A = setprod (\<lambda>i. c) ?A"
       
  1845       apply (rule setprod_cong) by auto
       
  1846     have cA: "card ?A = card S - 1" using fS a by auto
       
  1847     have fA1: "setprod ?f ?A = c ^ card ?A"  unfolding fA0 apply (rule setprod_constant) using fS by auto
       
  1848     have "setprod ?f ?A * setprod ?f ?B = setprod ?f S"
       
  1849       using setprod_Un_disjoint[OF fAB dj, of ?f, unfolded eq[symmetric]]
       
  1850       by simp
       
  1851     then have ?thesis using a cA
       
  1852       by (simp add: fA1 ring_simps cong add: setprod_cong cong del: if_weak_cong)}
       
  1853   ultimately show ?thesis by blast
       
  1854 qed
       
  1855 
  1677 
  1856 
  1678 lemma setsum_bounded:
  1857 lemma setsum_bounded:
  1679   assumes le: "\<And>i. i\<in>A \<Longrightarrow> f i \<le> (K::'a::{semiring_1, pordered_ab_semigroup_add})"
  1858   assumes le: "\<And>i. i\<in>A \<Longrightarrow> f i \<le> (K::'a::{semiring_1, pordered_ab_semigroup_add})"
  1680   shows "setsum f A \<le> of_nat(card A) * K"
  1859   shows "setsum f A \<le> of_nat(card A) * K"
  1681 proof (cases "finite A")
  1860 proof (cases "finite A")