Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 155c330

Browse files
committed
feat(analysis/convex/{basic,function}): add lemmas, golf (#11608)
* add `segment_subset_iff`, `open_segment_subset_iff`, use them to golf some proofs; * add `mem_segment_iff_div`, `mem_open_segment_iff_div`, use the former in the proof of `convex_iff_div`; * move the proof of `mpr` in `convex_on_iff_convex_epigraph` to a new lemma; * prove that the strict epigraph of a convex function include the open segment provided that one of the endpoints is in the strong epigraph and the other is in the epigraph; use it in the proof of `convex_on.convex_strict_epigraph`.
1 parent a52ce83 commit 155c330

File tree

3 files changed

+97
-95
lines changed

3 files changed

+97
-95
lines changed

src/analysis/convex/basic.lean

Lines changed: 65 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,16 @@ lemma open_segment_subset_segment (x y : E) :
7373
open_segment 𝕜 x y ⊆ [x -[𝕜] y] :=
7474
λ z ⟨a, b, ha, hb, hab, hz⟩, ⟨a, b, ha.le, hb.le, hab, hz⟩
7575

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+
7686
end has_scalar
7787

7888
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
101111
z ∈ open_segment 𝕜 x y :=
102112
begin
103113
obtain ⟨a, b, ha, hb, hab, hz⟩ := hz,
104-
by_cases ha' : a = 0,
114+
by_cases ha' : a = 0,
105115
{ rw [ha', zero_add] at hab,
106116
rw [ha', hab, zero_smul, one_smul, zero_add] at hz,
107117
exact (hy hz).elim },
@@ -268,6 +278,31 @@ variables [linear_ordered_field 𝕜]
268278
section add_comm_group
269279
variables [add_comm_group E] [add_comm_group F] [module 𝕜 E] [module 𝕜 F]
270280

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+
271306
@[simp] lemma left_mem_open_segment_iff [no_zero_smul_divisors 𝕜 E] {x y : E} :
272307
x ∈ open_segment 𝕜 x y ↔ x = y :=
273308
begin
@@ -479,11 +514,7 @@ variables {𝕜 s}
479514

480515
lemma convex_iff_segment_subset :
481516
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
487518

488519
lemma convex.segment_subset (h : convex 𝕜 s) {x y : E} (hx : x ∈ s) (hy : y ∈ s) :
489520
[x -[𝕜] y] ⊆ s :=
@@ -504,9 +535,10 @@ iff.intro
504535
(λ h x y hx hy a b ha hb hab,
505536
(h ha hb hab) (set.add_mem_add ⟨_, hx, rfl⟩ ⟨_, hy, rfl⟩))
506537

538+
alias convex_iff_pointwise_add_subset ↔ convex.set_combo_subset _
539+
507540
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
510542

511543
lemma convex_univ : convex 𝕜 (set.univ : set E) := λ _ _ _ _ _ _ _ _ _, trivial
512544

@@ -561,46 +593,34 @@ end has_scalar
561593
section module
562594
variables [module 𝕜 E] [module 𝕜 F] {s : set E}
563595

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+
564601
lemma convex_iff_forall_pos :
565602
convex 𝕜 s ↔ ∀ ⦃x y⦄, x ∈ s → y ∈ s → ∀ ⦃a b : 𝕜⦄, 0 < a → 0 < b → a + b = 1
566603
→ 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 𝕜
576606

577607
lemma convex_iff_pairwise_pos :
578608
convex 𝕜 s ↔ s.pairwise (λ x y, ∀ ⦃a b : 𝕜⦄, 0 < a → 0 < b → a + b = 1 → a • x + b • y ∈ s) :=
579609
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, _⟩,
581611
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] },
586612
obtain rfl | hxy := eq_or_ne x y,
587613
{ rwa convex.combo_self hab },
588-
exact h hx hy hxy ha' hb' hab,
614+
{ exact h hx hy hxy ha hb hab },
589615
end
590616

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 _)
595619

596620
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
602622

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) :=
604624
begin
605625
intros x y hx hy a b ha hb hab,
606626
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_
613633
hs.linear_image $ hf.mk' f
614634

615635
lemma convex.linear_preimage {s : set F} (hs : convex 𝕜 s) (f : E →ₗ[𝕜] F) :
616-
convex 𝕜 (s.preimage f) :=
636+
convex 𝕜 (f ⁻¹' s) :=
617637
begin
618638
intros x y hx hy a b ha hb hab,
619639
rw [mem_preimage, f.map_add, f.map_smul, f.map_smul],
620640
exact hs hx hy ha hb hab,
621641
end
622642

623643
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) :=
625645
hs.linear_preimage $ hf.mk' f
626646

627647
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]
946966
/-- Alternative definition of set convexity, using division. -/
947967
lemma convex_iff_div :
948968
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 :=
959970
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
964976

965977
lemma convex.mem_smul_of_zero_mem (h : convex 𝕜 s) {x : E} (zero_mem : (0 : E) ∈ s)
966978
(hx : x ∈ s) {t : 𝕜} (ht : 1 ≤ t) :
@@ -1004,24 +1016,11 @@ lemma set.ord_connected.convex_of_chain [ordered_semiring 𝕜] [ordered_add_com
10041016
[module 𝕜 E] [ordered_smul 𝕜 E] {s : set E} (hs : s.ord_connected) (h : zorn.chain (≤) s) :
10051017
convex 𝕜 s :=
10061018
begin
1007-
intros x y hx hy a b ha hb hab,
1019+
refine convex_iff_segment_subset.mpr (λ x y hx hy, _),
10081020
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) }
10251024
end
10261025

10271026
lemma set.ord_connected.convex [ordered_semiring 𝕜] [linear_ordered_add_comm_monoid E] [module 𝕜 E]

src/analysis/convex/function.lean

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,15 @@ lemma convex_on_const (c : β) (hs : convex 𝕜 s) : convex_on 𝕜 s (λ x:E,
133133
lemma concave_on_const (c : β) (hs : convex 𝕜 s) : concave_on 𝕜 s (λ x:E, c) :=
134134
@convex_on_const _ _ (order_dual β) _ _ _ _ _ _ c hs
135135

136+
lemma convex_on_of_convex_epigraph (h : convex 𝕜 {p : E × β | p.1 ∈ s ∧ f p.1 ≤ p.2}) :
137+
convex_on 𝕜 s f :=
138+
⟨λ x y hx hy a b ha hb hab, (@h (x, f x) (y, f y) ⟨hx, le_rfl⟩ ⟨hy, le_rfl⟩ a b ha hb hab).1,
139+
λ x y hx hy a b ha hb hab, (@h (x, f x) (y, f y) ⟨hx, le_rfl⟩ ⟨hy, le_rfl⟩ a b ha hb hab).2
140+
141+
lemma concave_on_of_convex_hypograph (h : convex 𝕜 {p : E × β | p.1 ∈ s ∧ p.2 ≤ f p.1}) :
142+
concave_on 𝕜 s f :=
143+
@convex_on_of_convex_epigraph 𝕜 E (order_dual β) _ _ _ _ _ _ _ h
144+
136145
end module
137146

138147
section ordered_smul
@@ -167,9 +176,7 @@ hf.dual.convex_epigraph
167176

168177
lemma convex_on_iff_convex_epigraph :
169178
convex_on 𝕜 s f ↔ convex 𝕜 {p : E × β | p.1 ∈ s ∧ f p.1 ≤ p.2} :=
170-
⟨convex_on.convex_epigraph, λ h,
171-
⟨λ x y hx hy a b ha hb hab, (@h (x, f x) (y, f y) ⟨hx, le_rfl⟩ ⟨hy, le_rfl⟩ a b ha hb hab).1,
172-
λ x y hx hy a b ha hb hab, (@h (x, f x) (y, f y) ⟨hx, le_rfl⟩ ⟨hy, le_rfl⟩ a b ha hb hab).2⟩⟩
179+
⟨convex_on.convex_epigraph, convex_on_of_convex_epigraph⟩
173180

174181
lemma concave_on_iff_convex_hypograph :
175182
concave_on 𝕜 s f ↔ convex 𝕜 {p : E × β | p.1 ∈ s ∧ p.2 ≤ f p.1} :=
@@ -258,17 +265,7 @@ lemma linear_map.concave_on (f : E →ₗ[𝕜] β) {s : set E} (hs : convex
258265

259266
lemma strict_convex_on.convex_on {s : set E} {f : E → β} (hf : strict_convex_on 𝕜 s f) :
260267
convex_on 𝕜 s f :=
261-
⟨hf.1, λ x y hx hy a b ha hb hab, begin
262-
obtain rfl | hxy := eq_or_ne x y,
263-
{ rw [convex.combo_self hab, convex.combo_self hab] },
264-
obtain rfl | ha' := ha.eq_or_lt,
265-
{ rw zero_add at hab,
266-
rw [hab, zero_smul, zero_smul, one_smul, one_smul, zero_add, zero_add] },
267-
obtain rfl | hb' := hb.eq_or_lt,
268-
{ rw add_zero at hab,
269-
rw [hab, zero_smul, zero_smul, one_smul, one_smul, add_zero, add_zero] },
270-
exact (hf.2 hx hy hxy ha' hb' hab).le,
271-
end
268+
convex_on_iff_pairwise_pos.mpr ⟨hf.1, λ x hx y hy hxy a b ha hb hab, (hf.2 hx hy hxy ha hb hab).le⟩
272269

273270
lemma strict_concave_on.concave_on {s : set E} {f : E → β} (hf : strict_concave_on 𝕜 s f) :
274271
concave_on 𝕜 s f :=
@@ -399,17 +396,27 @@ convex_iff_forall_pos.2 $ λ x y hx hy a b ha hb hab, ⟨hf.1 hx.1 hy.1 ha.le hb
399396
lemma concave_on.convex_gt (hf : concave_on 𝕜 s f) (r : β) : convex 𝕜 {x ∈ s | r < f x} :=
400397
hf.dual.convex_lt r
401398

402-
lemma convex_on.convex_strict_epigraph (hf : convex_on 𝕜 s f) :
403-
convex 𝕜 {p : E × β | p.1 ∈ s ∧ f p.1 < p.2} :=
399+
lemma convex_on.open_segment_subset_strict_epigraph (hf : convex_on 𝕜 s f) (p q : E × β)
400+
(hp : p.1 ∈ s ∧ f p.1 < p.2) (hq : q.1 ∈ s ∧ f q.1 ≤ q.2) :
401+
open_segment 𝕜 p q ⊆ {p : E × β | p.1 ∈ s ∧ f p.1 < p.2} :=
404402
begin
405-
rw convex_iff_forall_pos,
406-
rintro ⟨x, r⟩ ⟨y, t⟩ ⟨hx, hr⟩ ⟨hy, ht⟩ a b ha hb hab,
407-
refine ⟨hf.1 hx hy ha.le hb.le hab, _⟩,
408-
calc f (a • x + b • y) ≤ a • f x + b • f y : hf.2 hx hy ha.le hb.le hab
409-
... < a • r + b • t : add_lt_add (smul_lt_smul_of_pos hr ha)
410-
(smul_lt_smul_of_pos ht hb)
403+
rintro _ ⟨a, b, ha, hb, hab, rfl⟩,
404+
refine ⟨hf.1 hp.1 hq.1 ha.le hb.le hab, _⟩,
405+
calc f (a • p.1 + b • q.1) ≤ a • f p.1 + b • f q.1 : hf.2 hp.1 hq.1 ha.le hb.le hab
406+
... < a • p.2 + b • q.2 :
407+
add_lt_add_of_lt_of_le (smul_lt_smul_of_pos hp.2 ha) (smul_le_smul_of_nonneg hq.2 hb.le)
411408
end
412409

410+
lemma concave_on.open_segment_subset_strict_hypograph (hf : concave_on 𝕜 s f) (p q : E × β)
411+
(hp : p.1 ∈ s ∧ p.2 < f p.1) (hq : q.1 ∈ s ∧ q.2 ≤ f q.1) :
412+
open_segment 𝕜 p q ⊆ {p : E × β | p.1 ∈ s ∧ p.2 < f p.1} :=
413+
hf.dual.open_segment_subset_strict_epigraph p q hp hq
414+
415+
lemma convex_on.convex_strict_epigraph (hf : convex_on 𝕜 s f) :
416+
convex 𝕜 {p : E × β | p.1 ∈ s ∧ f p.1 < p.2} :=
417+
convex_iff_open_segment_subset.mpr $
418+
λ p q hp hq, hf.open_segment_subset_strict_epigraph p q hp ⟨hq.1, hq.2.le⟩
419+
413420
lemma concave_on.convex_strict_hypograph (hf : concave_on 𝕜 s f) :
414421
convex 𝕜 {p : E × β | p.1 ∈ s ∧ p.2 < f p.1} :=
415422
hf.dual.convex_strict_epigraph

src/analysis/convex/strict.lean

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,7 @@ variables {𝕜 s} {x y : E}
4545

4646
lemma strict_convex_iff_open_segment_subset :
4747
strict_convex 𝕜 s ↔ s.pairwise (λ x y, open_segment 𝕜 x y ⊆ interior s) :=
48-
begin
49-
split,
50-
{ rintro h x hx y hy hxy z ⟨a, b, ha, hb, hab, rfl⟩,
51-
exact h hx hy hxy ha hb hab },
52-
{ rintro h x hx y hy hxy a b ha hb hab,
53-
exact h hx hy hxy ⟨a, b, ha, hb, hab, rfl⟩ }
54-
end
48+
forall₅_congr $ λ x hx y hy hxy, (open_segment_subset_iff 𝕜).symm
5549

5650
lemma strict_convex.open_segment_subset (hs : strict_convex 𝕜 s) (hx : x ∈ s) (hy : y ∈ s)
5751
(h : x ≠ y) :
@@ -103,6 +97,7 @@ variables [module 𝕜 E] [module 𝕜 F] {s : set E}
10397
protected lemma strict_convex.convex (hs : strict_convex 𝕜 s) : convex 𝕜 s :=
10498
convex_iff_pairwise_pos.2 $ λ x hx y hy hxy a b ha hb hab, interior_subset $ hs hx hy hxy ha hb hab
10599

100+
/-- An open convex set is strictly convex. -/
106101
protected lemma convex.strict_convex (h : is_open s) (hs : convex 𝕜 s) : strict_convex 𝕜 s :=
107102
λ x hx y hy _ a b ha hb hab, h.interior_eq.symm ▸ hs hx hy ha.le hb.le hab
108103

@@ -398,6 +393,7 @@ Relates `convex` and `set.ord_connected`.
398393
section
399394
variables [topological_space E]
400395

396+
/-- A set in a linear ordered field is strictly convex if and only if it is convex. -/
401397
@[simp] lemma strict_convex_iff_convex [linear_ordered_field 𝕜] [topological_space 𝕜]
402398
[order_topology 𝕜] {s : set 𝕜} :
403399
strict_convex 𝕜 s ↔ convex 𝕜 s :=

0 commit comments

Comments
 (0)