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") |