@@ -73,6 +73,16 @@ lemma open_segment_subset_segment (x y : E) :
73
73
open_segment 𝕜 x y ⊆ [x -[𝕜] y] :=
74
74
λ z ⟨a, b, ha, hb, hab, hz⟩, ⟨a, b, ha.le, hb.le, hab, hz⟩
75
75
76
+ lemma segment_subset_iff {x y : E} {s : set E} :
77
+ [x -[𝕜] y] ⊆ s ↔ ∀ a b : 𝕜, 0 ≤ a → 0 ≤ b → a + b = 1 → a • x + b • y ∈ s :=
78
+ ⟨λ H a b ha hb hab, H ⟨a, b, ha, hb, hab, rfl⟩,
79
+ λ H z ⟨a, b, ha, hb, hab, hz⟩, hz ▸ H a b ha hb hab⟩
80
+
81
+ lemma open_segment_subset_iff {x y : E} {s : set E} :
82
+ open_segment 𝕜 x y ⊆ s ↔ ∀ a b : 𝕜, 0 < a → 0 < b → a + b = 1 → a • x + b • y ∈ s :=
83
+ ⟨λ H a b ha hb hab, H ⟨a, b, ha, hb, hab, rfl⟩,
84
+ λ H z ⟨a, b, ha, hb, hab, hz⟩, hz ▸ H a b ha hb hab⟩
85
+
76
86
end has_scalar
77
87
78
88
open_locale convex
@@ -101,7 +111,7 @@ lemma mem_open_segment_of_ne_left_right {x y z : E} (hx : x ≠ z) (hy : y ≠ z
101
111
z ∈ open_segment 𝕜 x y :=
102
112
begin
103
113
obtain ⟨a, b, ha, hb, hab, hz⟩ := hz,
104
- by_cases ha' : a = 0 ,
114
+ by_cases ha' : a = 0 ,
105
115
{ rw [ha', zero_add] at hab,
106
116
rw [ha', hab, zero_smul, one_smul, zero_add] at hz,
107
117
exact (hy hz).elim },
@@ -268,6 +278,31 @@ variables [linear_ordered_field 𝕜]
268
278
section add_comm_group
269
279
variables [add_comm_group E] [add_comm_group F] [module 𝕜 E] [module 𝕜 F]
270
280
281
+ lemma mem_segment_iff_div {x y z : E} : x ∈ [y -[𝕜] z] ↔
282
+ ∃ a b : 𝕜, 0 ≤ a ∧ 0 ≤ b ∧ 0 < a + b ∧ (a / (a + b)) • y + (b / (a + b)) • z = x :=
283
+ begin
284
+ split,
285
+ { rintro ⟨a, b, ha, hb, hab, rfl⟩,
286
+ use [a, b, ha, hb],
287
+ simp * },
288
+ { rintro ⟨a, b, ha, hb, hab, rfl⟩,
289
+ refine ⟨a / (a + b), b / (a + b), div_nonneg ha hab.le, div_nonneg hb hab.le, _, rfl⟩,
290
+ rw [← add_div, div_self hab.ne'] }
291
+ end
292
+
293
+ lemma mem_open_segment_iff_div {x y z : E} : x ∈ open_segment 𝕜 y z ↔
294
+ ∃ a b : 𝕜, 0 < a ∧ 0 < b ∧ (a / (a + b)) • y + (b / (a + b)) • z = x :=
295
+ begin
296
+ split,
297
+ { rintro ⟨a, b, ha, hb, hab, rfl⟩,
298
+ use [a, b, ha, hb],
299
+ rw [hab, div_one, div_one] },
300
+ { rintro ⟨a, b, ha, hb, rfl⟩,
301
+ have hab : 0 < a + b, from add_pos ha hb,
302
+ refine ⟨a / (a + b), b / (a + b), div_pos ha hab, div_pos hb hab, _, rfl⟩,
303
+ rw [← add_div, div_self hab.ne'] }
304
+ end
305
+
271
306
@[simp] lemma left_mem_open_segment_iff [no_zero_smul_divisors 𝕜 E] {x y : E} :
272
307
x ∈ open_segment 𝕜 x y ↔ x = y :=
273
308
begin
@@ -479,11 +514,7 @@ variables {𝕜 s}
479
514
480
515
lemma convex_iff_segment_subset :
481
516
convex 𝕜 s ↔ ∀ ⦃x y⦄, x ∈ s → y ∈ s → [x -[𝕜] y] ⊆ s :=
482
- begin
483
- refine forall₄_congr (λ x y hx hy, ⟨_, λ h a b ha hb hab, h ⟨a, b, ha, hb, hab, rfl⟩⟩),
484
- rintro h _ ⟨a, b, ha, hb, hab, rfl⟩,
485
- exact h ha hb hab,
486
- end
517
+ forall₄_congr $ λ x y hx hy, (segment_subset_iff _).symm
487
518
488
519
lemma convex.segment_subset (h : convex 𝕜 s) {x y : E} (hx : x ∈ s) (hy : y ∈ s) :
489
520
[x -[𝕜] y] ⊆ s :=
@@ -504,9 +535,10 @@ iff.intro
504
535
(λ h x y hx hy a b ha hb hab,
505
536
(h ha hb hab) (set.add_mem_add ⟨_, hx, rfl⟩ ⟨_, hy, rfl⟩))
506
537
538
+ alias convex_iff_pointwise_add_subset ↔ convex.set_combo_subset _
539
+
507
540
lemma convex_empty : convex 𝕜 (∅ : set E) :=
508
- by simp only [convex_iff_pointwise_add_subset, add_empty, forall_const, empty_subset,
509
- implies_true_iff, smul_set_empty]
541
+ λ x y, false.elim
510
542
511
543
lemma convex_univ : convex 𝕜 (set.univ : set E) := λ _ _ _ _ _ _ _ _ _, trivial
512
544
@@ -561,46 +593,34 @@ end has_scalar
561
593
section module
562
594
variables [module 𝕜 E] [module 𝕜 F] {s : set E}
563
595
596
+ lemma convex_iff_open_segment_subset :
597
+ convex 𝕜 s ↔ ∀ ⦃x y⦄, x ∈ s → y ∈ s → open_segment 𝕜 x y ⊆ s :=
598
+ convex_iff_segment_subset.trans $ forall₄_congr $ λ x y hx hy,
599
+ (open_segment_subset_iff_segment_subset hx hy).symm
600
+
564
601
lemma convex_iff_forall_pos :
565
602
convex 𝕜 s ↔ ∀ ⦃x y⦄, x ∈ s → y ∈ s → ∀ ⦃a b : 𝕜⦄, 0 < a → 0 < b → a + b = 1
566
603
→ a • x + b • y ∈ s :=
567
- begin
568
- refine ⟨λ h x y hx hy a b ha hb hab, h hx hy ha.le hb.le hab, _⟩,
569
- intros h x y hx hy a b ha hb hab,
570
- cases ha.eq_or_lt with ha ha,
571
- { subst a, rw [zero_add] at hab, simp [hab, hy] },
572
- cases hb.eq_or_lt with hb hb,
573
- { subst b, rw [add_zero] at hab, simp [hab, hx] },
574
- exact h hx hy ha hb hab
575
- end
604
+ convex_iff_open_segment_subset.trans $ forall₄_congr $ λ x y hx hy,
605
+ open_segment_subset_iff 𝕜
576
606
577
607
lemma convex_iff_pairwise_pos :
578
608
convex 𝕜 s ↔ s.pairwise (λ x y, ∀ ⦃a b : 𝕜⦄, 0 < a → 0 < b → a + b = 1 → a • x + b • y ∈ s) :=
579
609
begin
580
- refine ⟨λ h x hx y hy _ a b ha hb hab , h hx hy ha.le hb.le hab , _⟩,
610
+ refine convex_iff_forall_pos.trans ⟨λ h x hx y hy _, h hx hy, _⟩,
581
611
intros h x y hx hy a b ha hb hab,
582
- obtain rfl | ha' := ha.eq_or_lt,
583
- { rw [zero_add] at hab, rwa [hab, zero_smul, one_smul, zero_add] },
584
- obtain rfl | hb' := hb.eq_or_lt,
585
- { rw [add_zero] at hab, rwa [hab, zero_smul, one_smul, add_zero] },
586
612
obtain rfl | hxy := eq_or_ne x y,
587
613
{ rwa convex.combo_self hab },
588
- exact h hx hy hxy ha' hb' hab,
614
+ { exact h hx hy hxy ha hb hab } ,
589
615
end
590
616
591
- lemma convex_iff_open_segment_subset :
592
- convex 𝕜 s ↔ ∀ ⦃x y⦄, x ∈ s → y ∈ s → open_segment 𝕜 x y ⊆ s :=
593
- convex_iff_segment_subset.trans $ forall₄_congr $ λ x y hx hy,
594
- (open_segment_subset_iff_segment_subset hx hy).symm
617
+ protected lemma set.subsingleton.convex {s : set E} (h : s.subsingleton) : convex 𝕜 s :=
618
+ convex_iff_pairwise_pos.mpr (h.pairwise _)
595
619
596
620
lemma convex_singleton (c : E) : convex 𝕜 ({c} : set E) :=
597
- begin
598
- intros x y hx hy a b ha hb hab,
599
- rw [set.eq_of_mem_singleton hx, set.eq_of_mem_singleton hy, ←add_smul, hab, one_smul],
600
- exact mem_singleton c
601
- end
621
+ subsingleton_singleton.convex
602
622
603
- lemma convex.linear_image (hs : convex 𝕜 s) (f : E →ₗ[𝕜] F) : convex 𝕜 (s.image f ) :=
623
+ lemma convex.linear_image (hs : convex 𝕜 s) (f : E →ₗ[𝕜] F) : convex 𝕜 (f '' s ) :=
604
624
begin
605
625
intros x y hx hy a b ha hb hab,
606
626
obtain ⟨x', hx', rfl⟩ := mem_image_iff_bex.1 hx,
@@ -613,15 +633,15 @@ lemma convex.is_linear_image (hs : convex 𝕜 s) {f : E → F} (hf : is_linear_
613
633
hs.linear_image $ hf.mk' f
614
634
615
635
lemma convex.linear_preimage {s : set F} (hs : convex 𝕜 s) (f : E →ₗ[𝕜] F) :
616
- convex 𝕜 (s.preimage f ) :=
636
+ convex 𝕜 (f ⁻¹' s ) :=
617
637
begin
618
638
intros x y hx hy a b ha hb hab,
619
639
rw [mem_preimage, f.map_add, f.map_smul, f.map_smul],
620
640
exact hs hx hy ha hb hab,
621
641
end
622
642
623
643
lemma convex.is_linear_preimage {s : set F} (hs : convex 𝕜 s) {f : E → F} (hf : is_linear_map 𝕜 f) :
624
- convex 𝕜 (preimage f s) :=
644
+ convex 𝕜 (f ⁻¹' s) :=
625
645
hs.linear_preimage $ hf.mk' f
626
646
627
647
lemma convex.add {t : set E} (hs : convex 𝕜 s) (ht : convex 𝕜 t) : convex 𝕜 (s + t) :=
@@ -946,21 +966,13 @@ variables [add_comm_group E] [add_comm_group F] [module 𝕜 E] [module 𝕜 F]
946
966
/-- Alternative definition of set convexity, using division. -/
947
967
lemma convex_iff_div :
948
968
convex 𝕜 s ↔ ∀ ⦃x y : E⦄, x ∈ s → y ∈ s → ∀ ⦃a b : 𝕜⦄,
949
- 0 ≤ a → 0 ≤ b → 0 < a + b → (a/(a+b)) • x + (b/(a+b)) • y ∈ s :=
950
- ⟨λ h x y hx hy a b ha hb hab, begin
951
- apply h hx hy,
952
- { have ha', from mul_le_mul_of_nonneg_left ha (inv_pos.2 hab).le,
953
- rwa [mul_zero, ←div_eq_inv_mul] at ha' },
954
- { have hb', from mul_le_mul_of_nonneg_left hb (inv_pos.2 hab).le,
955
- rwa [mul_zero, ←div_eq_inv_mul] at hb' },
956
- { rw ←add_div,
957
- exact div_self hab.ne' }
958
- end , λ h x y hx hy a b ha hb hab,
969
+ 0 ≤ a → 0 ≤ b → 0 < a + b → (a / (a + b)) • x + (b / (a + b)) • y ∈ s :=
959
970
begin
960
- have h', from h hx hy ha hb,
961
- rw [hab, div_one, div_one] at h',
962
- exact h' zero_lt_one
963
- end ⟩
971
+ simp only [convex_iff_segment_subset, subset_def, mem_segment_iff_div],
972
+ refine forall₄_congr (λ x y hx hy, ⟨λ H a b ha hb hab, H _ ⟨a, b, ha, hb, hab, rfl⟩, _⟩),
973
+ rintro H _ ⟨a, b, ha, hb, hab, rfl⟩,
974
+ exact H ha hb hab
975
+ end
964
976
965
977
lemma convex.mem_smul_of_zero_mem (h : convex 𝕜 s) {x : E} (zero_mem : (0 : E) ∈ s)
966
978
(hx : x ∈ s) {t : 𝕜} (ht : 1 ≤ t) :
@@ -1004,24 +1016,11 @@ lemma set.ord_connected.convex_of_chain [ordered_semiring 𝕜] [ordered_add_com
1004
1016
[module 𝕜 E] [ordered_smul 𝕜 E] {s : set E} (hs : s.ord_connected) (h : zorn.chain (≤) s) :
1005
1017
convex 𝕜 s :=
1006
1018
begin
1007
- intros x y hx hy a b ha hb hab ,
1019
+ refine convex_iff_segment_subset.mpr (λ x y hx hy, _) ,
1008
1020
obtain hxy | hyx := h.total_of_refl hx hy,
1009
- { refine hs.out hx hy (mem_Icc.2 ⟨_, _⟩),
1010
- calc
1011
- x = a • x + b • x : (convex.combo_self hab _).symm
1012
- ... ≤ a • x + b • y : add_le_add_left (smul_le_smul_of_nonneg hxy hb) _,
1013
- calc
1014
- a • x + b • y
1015
- ≤ a • y + b • y : add_le_add_right (smul_le_smul_of_nonneg hxy ha) _
1016
- ... = y : convex.combo_self hab _ },
1017
- { refine hs.out hy hx (mem_Icc.2 ⟨_, _⟩),
1018
- calc
1019
- y = a • y + b • y : (convex.combo_self hab _).symm
1020
- ... ≤ a • x + b • y : add_le_add_right (smul_le_smul_of_nonneg hyx ha) _,
1021
- calc
1022
- a • x + b • y
1023
- ≤ a • x + b • x : add_le_add_left (smul_le_smul_of_nonneg hyx hb) _
1024
- ... = x : convex.combo_self hab _ }
1021
+ { exact (segment_subset_Icc hxy).trans (hs.out hx hy) },
1022
+ { rw segment_symm,
1023
+ exact (segment_subset_Icc hyx).trans (hs.out hy hx) }
1025
1024
end
1026
1025
1027
1026
lemma set.ord_connected.convex [ordered_semiring 𝕜] [linear_ordered_add_comm_monoid E] [module 𝕜 E]
0 commit comments