1300 by (simp add: prod.union_inter [symmetric, of A B]) |
1300 by (simp add: prod.union_inter [symmetric, of A B]) |
1301 with assms show ?thesis |
1301 with assms show ?thesis |
1302 by simp |
1302 by simp |
1303 qed |
1303 qed |
1304 |
1304 |
1305 lemma (in linordered_semidom) prod_nonneg: "(\<forall>a\<in>A. 0 \<le> f a) \<Longrightarrow> 0 \<le> prod f A" |
1305 context linordered_semidom |
|
1306 begin |
|
1307 |
|
1308 lemma prod_nonneg: "(\<forall>a\<in>A. 0 \<le> f a) \<Longrightarrow> 0 \<le> prod f A" |
1306 by (induct A rule: infinite_finite_induct) simp_all |
1309 by (induct A rule: infinite_finite_induct) simp_all |
1307 |
1310 |
1308 lemma (in linordered_semidom) prod_pos: "(\<forall>a\<in>A. 0 < f a) \<Longrightarrow> 0 < prod f A" |
1311 lemma prod_pos: "(\<forall>a\<in>A. 0 < f a) \<Longrightarrow> 0 < prod f A" |
1309 by (induct A rule: infinite_finite_induct) simp_all |
1312 by (induct A rule: infinite_finite_induct) simp_all |
1310 |
1313 |
1311 lemma (in linordered_semidom) prod_mono: |
1314 lemma prod_mono: |
1312 "(\<And>i. i \<in> A \<Longrightarrow> 0 \<le> f i \<and> f i \<le> g i) \<Longrightarrow> prod f A \<le> prod g A" |
1315 "(\<And>i. i \<in> A \<Longrightarrow> 0 \<le> f i \<and> f i \<le> g i) \<Longrightarrow> prod f A \<le> prod g A" |
1313 by (induct A rule: infinite_finite_induct) (force intro!: prod_nonneg mult_mono)+ |
1316 by (induct A rule: infinite_finite_induct) (force intro!: prod_nonneg mult_mono)+ |
1314 |
1317 |
1315 lemma (in linordered_semidom) prod_mono_strict: |
1318 lemma prod_mono_strict: |
1316 assumes "finite A" "\<And>i. i \<in> A \<Longrightarrow> 0 \<le> f i \<and> f i < g i" "A \<noteq> {}" |
1319 assumes "finite A" "\<And>i. i \<in> A \<Longrightarrow> 0 \<le> f i \<and> f i < g i" "A \<noteq> {}" |
1317 shows "prod f A < prod g A" |
1320 shows "prod f A < prod g A" |
1318 using assms |
1321 using assms |
1319 proof (induct A rule: finite_induct) |
1322 proof (induct A rule: finite_induct) |
1320 case empty |
1323 case empty |
1321 then show ?case by simp |
1324 then show ?case by simp |
1322 next |
1325 next |
1323 case insert |
1326 case insert |
1324 then show ?case by (force intro: mult_strict_mono' prod_nonneg) |
1327 then show ?case by (force intro: mult_strict_mono' prod_nonneg) |
|
1328 qed |
|
1329 |
|
1330 end |
|
1331 |
|
1332 lemma prod_mono2: |
|
1333 fixes f :: "'a \<Rightarrow> 'b :: linordered_idom" |
|
1334 assumes fin: "finite B" |
|
1335 and sub: "A \<subseteq> B" |
|
1336 and nn: "\<And>b. b \<in> B-A \<Longrightarrow> 1 \<le> f b" |
|
1337 and A: "\<And>a. a \<in> A \<Longrightarrow> 0 \<le> f a" |
|
1338 shows "prod f A \<le> prod f B" |
|
1339 proof - |
|
1340 have "prod f A \<le> prod f A * prod f (B-A)" |
|
1341 by (metis prod_ge_1 A mult_le_cancel_left1 nn not_less prod_nonneg) |
|
1342 also from fin finite_subset[OF sub fin] have "\<dots> = prod f (A \<union> (B-A))" |
|
1343 by (simp add: prod.union_disjoint del: Un_Diff_cancel) |
|
1344 also from sub have "A \<union> (B-A) = B" by blast |
|
1345 finally show ?thesis . |
|
1346 qed |
|
1347 |
|
1348 lemma less_1_prod: |
|
1349 fixes f :: "'a \<Rightarrow> 'b::linordered_idom" |
|
1350 shows "finite I \<Longrightarrow> I \<noteq> {} \<Longrightarrow> (\<And>i. i \<in> I \<Longrightarrow> 1 < f i) \<Longrightarrow> 1 < prod f I" |
|
1351 by (induct I rule: finite_ne_induct) (auto intro: less_1_mult) |
|
1352 |
|
1353 lemma less_1_prod2: |
|
1354 fixes f :: "'a \<Rightarrow> 'b::linordered_idom" |
|
1355 assumes I: "finite I" "i \<in> I" "1 < f i" "\<And>i. i \<in> I \<Longrightarrow> 1 \<le> f i" |
|
1356 shows "1 < prod f I" |
|
1357 proof - |
|
1358 have "1 < f i * prod f (I - {i})" |
|
1359 using assms |
|
1360 by (meson DiffD1 leI less_1_mult less_le_trans mult_le_cancel_left1 prod_ge_1) |
|
1361 also have "\<dots> = prod f I" |
|
1362 using assms by (simp add: prod.remove) |
|
1363 finally show ?thesis . |
1325 qed |
1364 qed |
1326 |
1365 |
1327 lemma (in linordered_field) abs_prod: "\<bar>prod f A\<bar> = (\<Prod>x\<in>A. \<bar>f x\<bar>)" |
1366 lemma (in linordered_field) abs_prod: "\<bar>prod f A\<bar> = (\<Prod>x\<in>A. \<bar>f x\<bar>)" |
1328 by (induct A rule: infinite_finite_induct) (simp_all add: abs_mult) |
1367 by (induct A rule: infinite_finite_induct) (simp_all add: abs_mult) |
1329 |
1368 |