Skip to content

Commit 5aecc61

Browse files
committed
Update Separation.lean
1 parent b35b093 commit 5aecc61

1 file changed

Lines changed: 52 additions & 74 deletions

File tree

Mathlib/Analysis/LocallyConvex/Separation.lean

Lines changed: 52 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,7 @@ theorem geometric_hahn_banach_point_point [T1Space E] (hxy : x ≠ y) :
312312
(convex_singleton y) isClosed_singleton (disjoint_singleton.2 hxy)
313313
exact ⟨f, by linarith [hs x rfl, ht y rfl]⟩
314314

315+
/-- A closed convex set is the intersection of halfspaces. -/
315316
theorem iInter_halfSpaces_eq (hs₁ : Convex ℝ s) (hs₂ : IsClosed s) :
316317
⋂ l : StrongDual 𝕜 E, { x | ∃ y ∈ s, re (l x) ≤ re (l y) } = s := by
317318
rw [Set.iInter_setOf]
@@ -321,80 +322,57 @@ theorem iInter_halfSpaces_eq (hs₁ : Convex ℝ s) (hs₂ : IsClosed s) :
321322
obtain ⟨y, hy, hxy⟩ := hx l
322323
exact ((hxy.trans_lt (hlA y hy)).trans hl).false
323324

324-
end
325+
/-- A variant of `iInter_halfSpaces_eq`. -/
326+
theorem iInter_halfSpaces_const_eq (hs₁ : Convex ℝ s) (hs₂ : IsClosed s) :
327+
∃ (L : (sᶜ : Set E) → StrongDual 𝕜 E) (c : (sᶜ : Set E) → ℝ),
328+
⋂ y, { x | re (L y x) ≤ c y } = s := by
329+
have (y : (sᶜ : Set E)) := geometric_hahn_banach_closed_point (𝕜 := 𝕜) hs₁ hs₂ y.2
330+
choose L c hLc using this
331+
refine ⟨L, c, ?_⟩
332+
rw [iInter_setOf]
333+
refine subset_antisymm (fun x hx => ?_) fun x hx l => ((hLc l).1 x hx).le
334+
by_contra!
335+
simp only [Subtype.forall, mem_compl_iff, mem_setOf_eq] at hx
336+
linarith [(hLc ⟨x, this⟩).2, hx x this]
337+
338+
/-- A closed convex set with a Lindelöf complement is the intersection of countably many
339+
halfspaces. -/
340+
theorem _root_.IsLindelof.iInter_countable_halfSpaces_const_eq (hs₁ : Convex ℝ s) (hs₂ : IsClosed s)
341+
(hs₃ : IsLindelof sᶜ) : ∃ (u : Set (sᶜ : Set E)) (L : u → StrongDual 𝕜 E) (c : u → ℝ),
342+
u.Countable ∧ ⋂ y, { x | re (L y x) ≤ c y } = s := by
343+
obtain ⟨L, c, hLc⟩ := iInter_halfSpaces_const_eq (𝕜 := 𝕜) hs₁ hs₂
344+
let t : (sᶜ : Set E) → Set E := fun y => { x | re (L y x) ≤ c y }
345+
have htc y : IsClosed (t y) := by
346+
suffices t y = re ∘ (L y) ⁻¹' Iic (c y) from by
347+
simpa [this] using IsClosed.preimage (by fun_prop) isClosed_Iic
348+
grind
349+
have hst : sᶜ ∩ ⋂ y, t y = ∅ := by grind
350+
obtain ⟨u, hu, hu'⟩ := hs₃.elim_countable_subfamily_closed t htc hst
351+
refine ⟨u, fun y => L y, fun y => c y, hu, subset_antisymm (fun z hz => ?_) ?_⟩
352+
· by_contra!
353+
have : z ∈ (∅ : Set E) := by
354+
simp only [← hu', biInter_eq_iInter]
355+
exact ⟨this, fun i hi => hz i hi⟩
356+
grind
357+
· rw (config := {occs := .pos [1]}) [← hLc]
358+
have : u ⊆ (univ : Set (sᶜ : Set E)) := by grind
359+
have := biInter_subset_biInter_left (t := t) this
360+
simp only [t, biInter_eq_iInter] at this
361+
convert this
362+
simp
363+
364+
/-- `IsLindelof.iInter_countable_halfSpaces_const_eq` for product spaces. -/
365+
theorem _root_.IsLindelof.iInter_nat_halfSpaces_const_eq {F : Type*} [AddCommGroup F] [Module ℝ F]
366+
[TopologicalSpace F] [Module 𝕜 F] [IsScalarTower ℝ 𝕜 F] [IsTopologicalAddGroup F]
367+
[ContinuousSMul 𝕜 F] [LocallyConvexSpace ℝ F] {s : Set (E × F)} (hs₁ : Convex ℝ s)
368+
(hs₂ : IsClosed s) (hs₃ : IsLindelof sᶜ) :
369+
∃ (u : Set (sᶜ : Set (E × F))) (L : u → StrongDual 𝕜 E) (T : u → StrongDual 𝕜 F) (c : u → ℝ),
370+
u.Countable ∧ ⋂ y, { x | re (L y x.1) + re (T y x.2) ≤ c y } = s := by
371+
obtain ⟨u, LT, c, eq1, eq2⟩ := hs₃.iInter_countable_halfSpaces_const_eq (𝕜 := 𝕜) hs₁ hs₂
372+
refine ⟨u, fun i ↦ (LT i).comp (.inl 𝕜 E F), fun i ↦ (LT i).comp (.inr 𝕜 E F), c, eq1, ?_⟩
373+
convert eq2
374+
simp [← map_add]
325375

326-
section Countable
327-
328-
variable [NormedAddCommGroup E] [NormedSpace ℝ E] [Module 𝕜 E] [ContinuousSMul 𝕜 E]
329-
[SecondCountableTopology E]
330-
331-
/-- A closed convex set `s` is the intersection of countably many half spaces in a separable Banach
332-
space. Moreover, these halfspaces are all nontrivial if `s` is nonempty and not equal to `univ`. -/
333-
theorem iInter_nat_halfSpaces_eq (hs₁ : Convex ℝ s) (hs₂ : IsClosed s) :
334-
∃ (L : ℕ → E →L[𝕜] 𝕜) (c : ℕ → ℝ),
335-
⋂ (i : ℕ), {x | c i ≤ re (L i x)} = s ∧
336-
(s.Nonempty → s ≠ univ → ∀ i, ∃ x, re (L i x) ≠ 0) := by
337-
obtain rfl | hs₃ := s.eq_empty_or_nonempty
338-
· exact ⟨0, 1, by simp [iInter_eq_empty_iff]⟩
339-
obtain rfl | hs_univ := eq_or_ne s univ
340-
· exact ⟨0, 0, by simp [nonempty_iff_ne_empty]⟩
341-
-- choose a countable dense set of sᶜ
342-
obtain ⟨f, hfmem, hf⟩ : ∃ f : ℕ → E, (∀ i, f i ∈ sᶜ) ∧ sᶜ ⊆ closure (range f) := by
343-
have : Nonempty ↑sᶜ := (nonempty_compl.mpr hs_univ).to_subtype
344-
refine ⟨fun i ↦ (denseSeq ↑sᶜ i : E), by simp, fun x hx ↦ ?_⟩
345-
change ↑(Subtype.mk x hx) ∈ closure (range (((↑) : ↑sᶜ → E) ∘ _))
346-
rw [range_comp, ← closure_subtype, (denseRange_denseSeq ↑sᶜ).closure_range]
347-
trivial
348-
-- for each point x ∈ sᶜ, use hahn banach to find a hyperplane that separates s and an open ball
349-
-- around x
350-
have φc i : ∃ (φ : E →L[𝕜] 𝕜) (c : ℝ),
351-
(∀ a ∈ ball (f i) (infDist (f i) s), re (φ a) < c) ∧ ∀ b ∈ s, c ≤ re (φ b) :=
352-
geometric_hahn_banach_open (convex_ball _ _) isOpen_ball hs₁ disjoint_ball_infDist
353-
choose L c hLc using φc
354-
refine ⟨L, c, ?_, fun _ _ j ↦ ?_⟩
355-
· ext x
356-
simp only [mem_iInter, mem_setOf_eq]
357-
refine ⟨fun hx ↦ ?_, fun hx i ↦ (hLc i).2 x hx⟩
358-
contrapose! hx
359-
have pos : 0 < infDist x s / 2 := by
360-
refine div_pos ?_ (by positivity)
361-
exact (IsClosed.notMem_iff_infDist_pos hs₂ hs₃).mp hx
362-
obtain ⟨_, ⟨i, rfl⟩, hi⟩ := Metric.mem_closure_iff.mp (hf hx) _ pos
363-
refine ⟨i, (hLc i).1 _ ?_⟩
364-
have hfix : infDist (f i) s ≥ infDist x s / 2 := by
365-
by_contra! hp
366-
obtain ⟨y, hy1, hy2⟩ := (infDist_lt_iff hs₃).mp hp
367-
have hxy : dist x y < infDist x s := by linarith [dist_triangle x (f i) y]
368-
exact notMem_of_dist_lt_infDist hxy hy1
369-
rw [mem_ball]
370-
linarith
371-
· obtain hl | hr := le_or_gt (c j) 0
372-
· use f j
373-
have : re (L j (f j)) < c j := (hLc j).1 _ <| mem_ball_self <|
374-
(IsClosed.notMem_iff_infDist_pos hs₂ hs₃).mp (hfmem j)
375-
linarith
376-
· obtain ⟨x, hxs⟩ := hs₃
377-
use x
378-
have : c j ≤ re (L j x) := (hLc j).2 _ hxs
379-
linarith
380-
381-
/-- `iInter_nat_halfSpaces_eq` for product spaces. -/
382-
theorem iInter_nat_halfSpaces_eq_of_prod {F : Type*} {s : Set (E × F)} [NormedAddCommGroup F]
383-
[NormedSpace ℝ F] [Module 𝕜 F] [ContinuousSMul 𝕜 F] [SecondCountableTopology F]
384-
(hs₁ : Convex ℝ s) (hs₂ : IsClosed s) :
385-
∃ (L : ℕ → E →L[𝕜] 𝕜) (T : ℕ → F →L[𝕜] 𝕜) (c : ℕ → ℝ),
386-
⋂ (i : ℕ), {(x, y) | c i ≤ re (L i x) + re (T i y)} = s
387-
∧ (s.Nonempty → s ≠ univ → ∀ i, ∃ (x : E) (y : F), re (L i x) + re (T i y) ≠ 0) := by
388-
obtain ⟨LT, c, eq1, eq2⟩ := iInter_nat_halfSpaces_eq (𝕜 := 𝕜) hs₁ hs₂
389-
refine ⟨fun i ↦ (LT i).comp (.inl 𝕜 E F), fun i ↦ (LT i).comp (.inr 𝕜 E F), c, ?_,
390-
fun hs₃ hsne i ↦ ?_⟩
391-
· rw [← eq1]
392-
refine iInter_congr fun i ↦ ?_
393-
ext
394-
simp [← map_add]
395-
· obtain ⟨z, hz⟩ := eq2 hs₃ hsne i
396-
exact ⟨z.1, z.2, by simpa [← map_add] using hz⟩
397-
398-
end Countable
376+
end
399377

400378
end RCLike

0 commit comments

Comments
 (0)