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

Commit b1abe23

Browse files
YaelDillieseric-wieser
authored andcommitted
feat(measure_theory/order/upper_lower): Order-connected sets in ℝⁿ are measurable (#16976)
Prove that the frontier of an order-connected set in `ℝⁿ` (with the `∞`-metric, but it doesn't actually matter) has measure zero. As a corollary, antichains in `ℝⁿ` have measure zero. Co-authored-by: @JasonKYi
1 parent 19c869e commit b1abe23

File tree

5 files changed

+320
-5
lines changed

5 files changed

+320
-5
lines changed

src/analysis/normed/order/upper_lower.lean

Lines changed: 157 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,11 @@ are measurable.
2323
-/
2424

2525
open function metric set
26+
open_locale pointwise
2627

2728
variables {α ι : Type*}
2829

29-
section metric_space
30+
section normed_ordered_group
3031
variables [normed_ordered_group α] {s : set α}
3132

3233
@[to_additive is_upper_set.thickening]
@@ -49,12 +50,22 @@ protected lemma is_lower_set.cthickening' (hs : is_lower_set s) (ε : ℝ) :
4950
is_lower_set (cthickening ε s) :=
5051
by { rw cthickening_eq_Inter_thickening'', exact is_lower_set_Inter₂ (λ δ hδ, hs.thickening' _) }
5152

52-
end metric_space
53+
@[to_additive upper_closure_interior_subset]
54+
lemma upper_closure_interior_subset' (s : set α) :
55+
(upper_closure (interior s) : set α) ⊆ interior (upper_closure s) :=
56+
upper_closure_min (interior_mono subset_upper_closure) (upper_closure s).upper.interior
57+
58+
@[to_additive lower_closure_interior_subset]
59+
lemma lower_closure_interior_subset' (s : set α) :
60+
(upper_closure (interior s) : set α) ⊆ interior (upper_closure s) :=
61+
upper_closure_min (interior_mono subset_upper_closure) (upper_closure s).upper.interior
62+
63+
end normed_ordered_group
5364

5465
/-! ### `ℝⁿ` -/
5566

5667
section finite
57-
variables [finite ι] {s : set (ι → ℝ)} {x y : ι → ℝ} {δ : ℝ}
68+
variables [finite ι] {s : set (ι → ℝ)} {x y : ι → ℝ}
5869

5970
lemma is_upper_set.mem_interior_of_forall_lt (hs : is_upper_set s) (hx : x ∈ closure s)
6071
(h : ∀ i, x i < y i) :
@@ -99,7 +110,78 @@ end
99110
end finite
100111

101112
section fintype
102-
variables [fintype ι] {s : set (ι → ℝ)} {x y : ι → ℝ} {δ : ℝ}
113+
variables [fintype ι] {s t : set (ι → ℝ)} {a₁ a₂ b₁ b₂ x y : ι → ℝ} {δ : ℝ}
114+
115+
-- TODO: Generalise those lemmas so that they also apply to `ℝ` and `euclidean_space ι ℝ`
116+
lemma dist_inf_sup (x y : ι → ℝ) : dist (x ⊓ y) (x ⊔ y) = dist x y :=
117+
begin
118+
refine congr_arg coe (finset.sup_congr rfl $ λ i _, _),
119+
simp only [real.nndist_eq', sup_eq_max, inf_eq_min, max_sub_min_eq_abs, pi.inf_apply,
120+
pi.sup_apply, real.nnabs_of_nonneg, abs_nonneg, real.to_nnreal_abs],
121+
end
122+
123+
lemma dist_mono_left : monotone_on (λ x, dist x y) (Ici y) :=
124+
begin
125+
refine λ y₁ hy₁ y₂ hy₂ hy, nnreal.coe_le_coe.2 (finset.sup_mono_fun $ λ i _, _),
126+
rw [real.nndist_eq, real.nnabs_of_nonneg (sub_nonneg_of_le (‹y ≤ _› i : y i ≤ y₁ i)),
127+
real.nndist_eq, real.nnabs_of_nonneg (sub_nonneg_of_le (‹y ≤ _› i : y i ≤ y₂ i))],
128+
exact real.to_nnreal_mono (sub_le_sub_right (hy _) _),
129+
end
130+
131+
lemma dist_mono_right : monotone_on (dist x) (Ici x) :=
132+
by simpa only [dist_comm] using dist_mono_left
133+
134+
lemma dist_anti_left : antitone_on (λ x, dist x y) (Iic y) :=
135+
begin
136+
refine λ y₁ hy₁ y₂ hy₂ hy, nnreal.coe_le_coe.2 (finset.sup_mono_fun $ λ i _, _),
137+
rw [real.nndist_eq', real.nnabs_of_nonneg (sub_nonneg_of_le (‹_ ≤ y› i : y₂ i ≤ y i)),
138+
real.nndist_eq', real.nnabs_of_nonneg (sub_nonneg_of_le (‹_ ≤ y› i : y₁ i ≤ y i))],
139+
exact real.to_nnreal_mono (sub_le_sub_left (hy _) _),
140+
end
141+
142+
lemma dist_anti_right : antitone_on (dist x) (Iic x) :=
143+
by simpa only [dist_comm] using dist_anti_left
144+
145+
lemma dist_le_dist_of_le (ha : a₂ ≤ a₁) (h₁ : a₁ ≤ b₁) (hb : b₁ ≤ b₂) : dist a₁ b₁ ≤ dist a₂ b₂ :=
146+
(dist_mono_right h₁ (h₁.trans hb) hb).trans $
147+
dist_anti_left (ha.trans $ h₁.trans hb) (h₁.trans hb) ha
148+
149+
protected lemma metric.bounded.bdd_below : bounded s → bdd_below s :=
150+
begin
151+
rintro ⟨r, hr⟩,
152+
obtain rfl | ⟨x, hx⟩ := s.eq_empty_or_nonempty,
153+
{ exact bdd_below_empty },
154+
{ exact ⟨x - const _ r, λ y hy i, sub_le_comm.1
155+
(abs_sub_le_iff.1 $ (dist_le_pi_dist _ _ _).trans $ hr _ hx _ hy).1⟩ }
156+
end
157+
158+
protected lemma metric.bounded.bdd_above : bounded s → bdd_above s :=
159+
begin
160+
rintro ⟨r, hr⟩,
161+
obtain rfl | ⟨x, hx⟩ := s.eq_empty_or_nonempty,
162+
{ exact bdd_above_empty },
163+
{ exact ⟨x + const _ r, λ y hy i, sub_le_iff_le_add'.1 $
164+
(abs_sub_le_iff.1 $ (dist_le_pi_dist _ _ _).trans $ hr _ hx _ hy).2⟩ }
165+
end
166+
167+
protected lemma bdd_below.bounded : bdd_below s → bdd_above s → bounded s :=
168+
begin
169+
rintro ⟨a, ha⟩ ⟨b, hb⟩,
170+
refine ⟨dist a b, λ x hx y hy, _⟩,
171+
rw ←dist_inf_sup,
172+
exact dist_le_dist_of_le (le_inf (ha hx) $ ha hy) inf_le_sup (sup_le (hb hx) $ hb hy),
173+
end
174+
175+
protected lemma bdd_above.bounded : bdd_above s → bdd_below s → bounded s := flip bdd_below.bounded
176+
177+
lemma bounded_iff_bdd_below_bdd_above : bounded s ↔ bdd_below s ∧ bdd_above s :=
178+
⟨λ h, ⟨h.bdd_below, h.bdd_above⟩, λ h, h.1.bounded h.2
179+
180+
lemma bdd_below.bounded_inter (hs : bdd_below s) (ht : bdd_above t) : bounded (s ∩ t) :=
181+
(hs.mono $ inter_subset_left _ _).bounded $ ht.mono $ inter_subset_right _ _
182+
183+
lemma bdd_above.bounded_inter (hs : bdd_above s) (ht : bdd_below t) : bounded (s ∩ t) :=
184+
(hs.mono $ inter_subset_left _ _).bounded $ ht.mono $ inter_subset_right _ _
103185

104186
lemma is_upper_set.exists_subset_ball (hs : is_upper_set s) (hx : x ∈ closure s) (hδ : 0 < δ) :
105187
∃ y, closed_ball y (δ/4) ⊆ closed_ball x δ ∧ closed_ball y (δ/4) ⊆ interior s :=
@@ -140,3 +222,74 @@ begin
140222
end
141223

142224
end fintype
225+
226+
section finite
227+
variables [finite ι] {s t : set (ι → ℝ)} {a₁ a₂ b₁ b₂ x y : ι → ℝ} {δ : ℝ}
228+
229+
lemma is_antichain.interior_eq_empty [nonempty ι] (hs : is_antichain (≤) s) : interior s = ∅ :=
230+
begin
231+
casesI nonempty_fintype ι,
232+
refine eq_empty_of_forall_not_mem (λ x hx, _),
233+
have hx' := interior_subset hx,
234+
rw [mem_interior_iff_mem_nhds, metric.mem_nhds_iff] at hx,
235+
obtain ⟨ε, hε, hx⟩ := hx,
236+
refine hs.not_lt hx' (hx _) (lt_add_of_pos_right _ (by positivity : 0 < const ι (ε / 2))),
237+
simpa [const, @pi_norm_const ι ℝ _ _ _ (ε / 2), abs_of_nonneg hε.lt.le],
238+
end
239+
240+
/-!
241+
#### Note
242+
243+
The closure and frontier of an antichain might not be antichains. Take for example the union
244+
of the open segments from `(0, 2)` to `(1, 1)` and from `(2, 1)` to `(3, 0)`. `(1, 1)` and `(2, 1)`
245+
are comparable and both in the closure/frontier.
246+
-/
247+
248+
protected lemma is_closed.upper_closure (hs : is_closed s) (hs' : bdd_below s) :
249+
is_closed (upper_closure s : set (ι → ℝ)) :=
250+
begin
251+
casesI nonempty_fintype ι,
252+
refine is_seq_closed.is_closed (λ f x hf hx, _),
253+
choose g hg hgf using hf,
254+
obtain ⟨a, ha⟩ := hx.bdd_above_range,
255+
obtain ⟨b, hb, φ, hφ, hbf⟩ := tendsto_subseq_of_bounded (hs'.bounded_inter
256+
bdd_above_Iic) (λ n, ⟨hg n, (hgf _).trans $ ha $ mem_range_self _⟩),
257+
exact ⟨b, closure_minimal (inter_subset_left _ _) hs hb,
258+
le_of_tendsto_of_tendsto' hbf (hx.comp hφ.tendsto_at_top) $ λ _, hgf _⟩,
259+
end
260+
261+
protected lemma is_closed.lower_closure (hs : is_closed s) (hs' : bdd_above s) :
262+
is_closed (lower_closure s : set (ι → ℝ)) :=
263+
begin
264+
casesI nonempty_fintype ι,
265+
refine is_seq_closed.is_closed (λ f x hf hx, _),
266+
choose g hg hfg using hf,
267+
haveI : bounded_ge_nhds_class ℝ := by apply_instance,
268+
obtain ⟨a, ha⟩ := hx.bdd_below_range,
269+
obtain ⟨b, hb, φ, hφ, hbf⟩ := tendsto_subseq_of_bounded (hs'.bounded_inter
270+
bdd_below_Ici) (λ n, ⟨hg n, (ha $ mem_range_self _).trans $ hfg _⟩),
271+
exact ⟨b, closure_minimal (inter_subset_left _ _) hs hb,
272+
le_of_tendsto_of_tendsto' (hx.comp hφ.tendsto_at_top) hbf $ λ _, hfg _⟩,
273+
end
274+
275+
protected lemma is_clopen.upper_closure (hs : is_clopen s) (hs' : bdd_below s) :
276+
is_clopen (upper_closure s : set (ι → ℝ)) :=
277+
⟨hs.1.upper_closure, hs.2.upper_closure hs'⟩
278+
279+
protected lemma is_clopen.lower_closure (hs : is_clopen s) (hs' : bdd_above s) :
280+
is_clopen (lower_closure s : set (ι → ℝ)) :=
281+
⟨hs.1.lower_closure, hs.2.lower_closure hs'⟩
282+
283+
lemma closure_upper_closure_comm (hs : bdd_below s) :
284+
closure (upper_closure s : set (ι → ℝ)) = upper_closure (closure s) :=
285+
(closure_minimal (upper_closure_anti subset_closure) $
286+
is_closed_closure.upper_closure hs.closure).antisymm $
287+
upper_closure_min (closure_mono subset_upper_closure) (upper_closure s).upper.closure
288+
289+
lemma closure_lower_closure_comm (hs : bdd_above s) :
290+
closure (lower_closure s : set (ι → ℝ)) = lower_closure (closure s) :=
291+
(closure_minimal (lower_closure_mono subset_closure) $
292+
is_closed_closure.lower_closure hs.closure).antisymm $
293+
lower_closure_min (closure_mono subset_lower_closure) (lower_closure s).lower.closure
294+
295+
end finite

src/data/real/nnreal.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -822,6 +822,8 @@ lemma nnabs_coe (x : ℝ≥0) : nnabs x = x := by simp
822822
lemma coe_to_nnreal_le (x : ℝ) : (to_nnreal x : ℝ) ≤ |x| :=
823823
max_le (le_abs_self _) (abs_nonneg _)
824824

825+
@[simp] lemma to_nnreal_abs (x : ℝ) : |x|.to_nnreal = x.nnabs := nnreal.coe_injective $ by simp
826+
825827
lemma cast_nat_abs_eq_nnabs_cast (n : ℤ) :
826828
(n.nat_abs : ℝ≥0) = nnabs n :=
827829
by { ext, rw [nnreal.coe_nat_cast, int.cast_nat_abs, real.coe_nnabs] }
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
/-
2+
Copyright (c) 2022 Yaël Dillies, Kexing Ying. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Yaël Dillies, Kexing Ying
5+
-/
6+
import analysis.normed.order.upper_lower
7+
import logic.lemmas
8+
import measure_theory.covering.besicovitch_vector_space
9+
10+
/-!
11+
# Order-connected sets are null-measurable
12+
13+
This file proves that order-connected sets in `ℝⁿ` under the pointwise order are null-measurable.
14+
Recall that `x ≤ y` iff `∀ i, x i ≤ y i`, and `s` is order-connected iff
15+
`∀ x y ∈ s, ∀ z, x ≤ z → z ≤ y → z ∈ s`.
16+
17+
## Main declarations
18+
19+
* `set.ord_connected.null_frontier`: The frontier of an order-connected set in `ℝⁿ` has measure `0`.
20+
21+
## Notes
22+
23+
We prove null-measurability in `ℝⁿ` with the `∞`-metric, but this transfers directly to `ℝⁿ` with
24+
the Euclidean metric because they have the same measurable sets.
25+
26+
Null-measurability can't be strengthened to measurability because any antichain (and in particular
27+
any subset of the antidiagonal `{(x, y) | x + y = 0}`) is order-connected.
28+
29+
## TODO
30+
31+
Generalize so that it also applies to `ℝ × ℝ`, for example.
32+
-/
33+
34+
open filter measure_theory metric set
35+
open_locale topology
36+
37+
variables {ι : Type*} [fintype ι] {s : set (ι → ℝ)} {x y : ι → ℝ} {δ : ℝ}
38+
39+
/-- If we can fit a small ball inside a set `s` intersected with any neighborhood of `x`, then the
40+
density of `s` near `x` is not `0`. Along with `aux₁`, this proves that `x` is a Lebesgue point of
41+
`s`. This will be used to prove that the frontier of an order-connected set is null. -/
42+
private lemma aux₀
43+
(h : ∀ δ, 0 < δ → ∃ y, closed_ball y (δ/4) ⊆ closed_ball x δ ∧ closed_ball y (δ/4) ⊆ interior s) :
44+
¬ tendsto (λ r, volume (closure s ∩ closed_ball x r) / volume (closed_ball x r)) (𝓝[>] 0)
45+
(𝓝 0) :=
46+
begin
47+
choose f hf₀ hf₁ using h,
48+
intros H,
49+
obtain ⟨ε, hε, hε', hε₀⟩ := exists_seq_strict_anti_tendsto_nhds_within (0 : ℝ),
50+
refine not_eventually.2 (frequently_of_forall $ λ _, lt_irrefl $
51+
ennreal.of_real $ 4⁻¹ ^ fintype.card ι)
52+
((tendsto.eventually_lt (H.comp hε₀) tendsto_const_nhds _).mono $ λ n, lt_of_le_of_lt _),
53+
swap,
54+
refine (ennreal.div_le_div_right (volume.mono $ subset_inter
55+
((hf₁ _ $ hε' n).trans interior_subset_closure) $ hf₀ _ $ hε' n) _).trans_eq' _,
56+
dsimp,
57+
have := hε' n,
58+
rw [real.volume_pi_closed_ball, real.volume_pi_closed_ball, ←ennreal.of_real_div_of_pos, ←div_pow,
59+
mul_div_mul_left _ _ (two_ne_zero' ℝ), div_right_comm, div_self, one_div],
60+
all_goals { positivity },
61+
end
62+
63+
/-- If we can fit a small ball inside a set `sᶜ` intersected with any neighborhood of `x`, then the
64+
density of `s` near `x` is not `1`. Along with `aux₀`, this proves that `x` is a Lebesgue point of
65+
`s`. This will be used to prove that the frontier of an order-connected set is null. -/
66+
private lemma aux₁
67+
(h : ∀ δ, 0 < δ →
68+
∃ y, closed_ball y (δ/4) ⊆ closed_ball x δ ∧ closed_ball y (δ/4) ⊆ interior sᶜ) :
69+
¬ tendsto (λ r, volume (closure s ∩ closed_ball x r) / volume (closed_ball x r)) (𝓝[>] 0)
70+
(𝓝 1) :=
71+
begin
72+
choose f hf₀ hf₁ using h,
73+
intros H,
74+
obtain ⟨ε, hε, hε', hε₀⟩ := exists_seq_strict_anti_tendsto_nhds_within (0 : ℝ),
75+
refine not_eventually.2 (frequently_of_forall $ λ _, lt_irrefl $
76+
1 - ennreal.of_real (4⁻¹ ^ fintype.card ι))
77+
((tendsto.eventually_lt tendsto_const_nhds (H.comp hε₀) $
78+
ennreal.sub_lt_self ennreal.one_ne_top one_ne_zero _).mono $ λ n, lt_of_le_of_lt' _),
79+
swap,
80+
refine (ennreal.div_le_div_right (volume.mono _) _).trans_eq _,
81+
{ exact closed_ball x (ε n) \ closed_ball (f (ε n) $ hε' n) (ε n / 4) },
82+
{ rw diff_eq_compl_inter,
83+
refine inter_subset_inter_left _ _,
84+
rw [subset_compl_comm, ←interior_compl],
85+
exact hf₁ _ _ },
86+
dsimp,
87+
have := hε' n,
88+
rw [measure_diff (hf₀ _ _) _ ((real.volume_pi_closed_ball _ _).trans_ne ennreal.of_real_ne_top),
89+
real.volume_pi_closed_ball, real.volume_pi_closed_ball, ennreal.sub_div (λ _ _, _),
90+
ennreal.div_self _ ennreal.of_real_ne_top, ←ennreal.of_real_div_of_pos, ←div_pow,
91+
mul_div_mul_left _ _ (two_ne_zero' ℝ), div_right_comm, div_self, one_div],
92+
all_goals { positivity <|> measurability },
93+
end
94+
95+
lemma is_upper_set.null_frontier (hs : is_upper_set s) : volume (frontier s) = 0 :=
96+
begin
97+
refine eq_bot_mono (volume.mono $ λ x hx, _)
98+
(besicovitch.ae_tendsto_measure_inter_div_of_measurable_set _ is_closed_closure.measurable_set),
99+
{ exact s },
100+
by_cases x ∈ closure s; simp [h],
101+
{ exact aux₁ (λ _, hs.compl.exists_subset_ball $ frontier_subset_closure $
102+
by rwa frontier_compl) },
103+
{ exact aux₀ (λ _, hs.exists_subset_ball $ frontier_subset_closure hx) }
104+
end
105+
106+
lemma is_lower_set.null_frontier (hs : is_lower_set s) : volume (frontier s) = 0 :=
107+
begin
108+
refine eq_bot_mono (volume.mono $ λ x hx, _)
109+
(besicovitch.ae_tendsto_measure_inter_div_of_measurable_set _ is_closed_closure.measurable_set),
110+
{ exact s },
111+
by_cases x ∈ closure s; simp [h],
112+
{ exact aux₁ (λ _, hs.compl.exists_subset_ball $ frontier_subset_closure $
113+
by rwa frontier_compl) },
114+
{ exact aux₀ (λ _, hs.exists_subset_ball $ frontier_subset_closure hx) }
115+
end
116+
117+
lemma set.ord_connected.null_frontier (hs : s.ord_connected) : volume (frontier s) = 0 :=
118+
begin
119+
rw ← hs.upper_closure_inter_lower_closure,
120+
refine le_bot_iff.1 ((volume.mono $ (frontier_inter_subset _ _).trans $ union_subset_union
121+
(inter_subset_left _ _) $ inter_subset_right _ _).trans $ (measure_union_le _ _).trans_eq _),
122+
rw [(upper_set.upper _).null_frontier, (lower_set.lower _).null_frontier, zero_add, bot_eq_zero],
123+
end
124+
125+
protected lemma set.ord_connected.null_measurable_set (hs : s.ord_connected) :
126+
null_measurable_set s :=
127+
null_measurable_set_of_null_frontier hs.null_frontier
128+
129+
lemma is_antichain.volume_eq_zero [nonempty ι] (hs : is_antichain (≤) s) : volume s = 0 :=
130+
le_bot_iff.1 $ (volume.mono $ by { rw [←closure_diff_interior, hs.interior_eq_empty, diff_empty],
131+
exact subset_closure }).trans_eq hs.ord_connected.null_frontier

src/order/bounds/basic.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ def is_glb (s : set α) : α → Prop := is_greatest (lower_bounds s)
6262

6363
lemma mem_upper_bounds : a ∈ upper_bounds s ↔ ∀ x ∈ s, x ≤ a := iff.rfl
6464
lemma mem_lower_bounds : a ∈ lower_bounds s ↔ ∀ x ∈ s, a ≤ x := iff.rfl
65+
lemma mem_upper_bounds_iff_subset_Iic : a ∈ upper_bounds s ↔ s ⊆ Iic a := iff.rfl
66+
lemma mem_lower_bounds_iff_subset_Ici : a ∈ lower_bounds s ↔ s ⊆ Ici a := iff.rfl
6567

6668
lemma bdd_above_def : bdd_above s ↔ ∃ x, ∀ y ∈ s, y ≤ x := iff.rfl
6769
lemma bdd_below_def : bdd_below s ↔ ∃ x, ∀ y ∈ s, x ≤ y := iff.rfl

src/topology/algebra/order/upper_lower.lean

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Authors: Yaël Dillies
55
-/
66
import algebra.order.upper_lower
77
import topology.algebra.group.basic
8+
import topology.order.basic
89

910
/-!
1011
# Topological facts about upper/lower/order-connected sets
@@ -46,7 +47,33 @@ instance ordered_comm_group.to_has_upper_lower_closure [ordered_comm_group α]
4647
is_open_upper_closure := λ s hs, by { rw [←mul_one s, ←mul_upper_closure], exact hs.mul_right },
4748
is_open_lower_closure := λ s hs, by { rw [←mul_one s, ←mul_lower_closure], exact hs.mul_right } }
4849

49-
variables [preorder α] [has_upper_lower_closure α] {s : set α}
50+
variables [preorder α]
51+
52+
section order_closed_topology
53+
variables [order_closed_topology α] {s : set α}
54+
55+
@[simp] lemma upper_bounds_closure (s : set α) :
56+
upper_bounds (closure s : set α) = upper_bounds s :=
57+
ext $ λ a, by simp_rw [mem_upper_bounds_iff_subset_Iic, is_closed_Iic.closure_subset_iff]
58+
59+
@[simp] lemma lower_bounds_closure (s : set α) :
60+
lower_bounds (closure s : set α) = lower_bounds s :=
61+
ext $ λ a, by simp_rw [mem_lower_bounds_iff_subset_Ici, is_closed_Ici.closure_subset_iff]
62+
63+
@[simp] lemma bdd_above_closure : bdd_above (closure s) ↔ bdd_above s :=
64+
by simp_rw [bdd_above, upper_bounds_closure]
65+
66+
@[simp] lemma bdd_below_closure : bdd_below (closure s) ↔ bdd_below s :=
67+
by simp_rw [bdd_below, lower_bounds_closure]
68+
69+
alias bdd_above_closure ↔ bdd_above.of_closure bdd_above.closure
70+
alias bdd_below_closure ↔ bdd_below.of_closure bdd_below.closure
71+
72+
attribute [protected] bdd_above.closure bdd_below.closure
73+
74+
end order_closed_topology
75+
76+
variables [has_upper_lower_closure α] {s : set α}
5077

5178
protected lemma is_upper_set.closure : is_upper_set s → is_upper_set (closure s) :=
5279
has_upper_lower_closure.is_upper_set_closure _

0 commit comments

Comments
 (0)