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

Commit 7734d38

Browse files
committed
refactor(data/real/basic): make ℝ a structure (#6024)
Preparation for 🍀, which doesn't have irreducible.
1 parent d293822 commit 7734d38

File tree

6 files changed

+169
-69
lines changed

6 files changed

+169
-69
lines changed

src/analysis/specific_limits.lean

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,8 +188,11 @@ metric.mk_uniformity_basis (λ i _, pow_pos h₀ _) $ λ ε ε0,
188188
lemma geom_lt {u : ℕ → ℝ} {c : ℝ} (hc : 0 ≤ c) {n : ℕ} (hn : 0 < n)
189189
(h : ∀ k < n, c * u k < u (k + 1)) :
190190
c ^ n * u 0 < u n :=
191-
(monotone_mul_left_of_nonneg hc).seq_pos_lt_seq_of_le_of_lt hn (by simp)
192-
(λ k hk, by simp [pow_succ, mul_assoc]) h
191+
begin
192+
refine (monotone_mul_left_of_nonneg hc).seq_pos_lt_seq_of_le_of_lt hn _ _ h,
193+
{ simp },
194+
{ simp [pow_succ, mul_assoc, le_refl] }
195+
end
193196

194197
lemma geom_le {u : ℕ → ℝ} {c : ℝ} (hc : 0 ≤ c) (n : ℕ) (h : ∀ k < n, c * u k ≤ u (k + 1)) :
195198
c ^ n * u 0 ≤ u n :=

src/data/real/basic.lean

Lines changed: 150 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,57 @@ import algebra.star.basic
1313

1414
/-- The type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
1515
numbers. -/
16-
def real := @cau_seq.completion.Cauchy ℚ _ _ _ abs _
16+
structure real := of_cauchy ::
17+
(cauchy : @cau_seq.completion.Cauchy ℚ _ _ _ abs _)
1718
notation `ℝ` := real
1819

20+
attribute [pp_using_anonymous_constructor] real
21+
1922
namespace real
2023
open cau_seq cau_seq.completion
2124

2225
variables {x y : ℝ}
2326

24-
def comm_ring_aux : comm_ring ℝ := Cauchy.comm_ring
27+
lemma ext_cauchy_iff : ∀ {x y : real}, x = y ↔ x.cauchy = y.cauchy
28+
| ⟨a⟩ ⟨b⟩ := by split; cc
29+
30+
lemma ext_cauchy {x y : real} : x.cauchy = y.cauchy → x = y :=
31+
ext_cauchy_iff.2
32+
33+
/-- The real numbers are isomorphic to the quotient of Cauchy sequences on the rationals. -/
34+
def equiv_Cauchy : ℝ ≃ cau_seq.completion.Cauchy :=
35+
⟨real.cauchy, real.of_cauchy, λ ⟨_⟩, rfl, λ _, rfl⟩
36+
37+
-- irreducible doesn't work for instances: https://github.com/leanprover-community/lean/issues/511
38+
@[irreducible] private def zero : ℝ := ⟨0
39+
@[irreducible] private def one : ℝ := ⟨1
40+
@[irreducible] private def add : ℝ → ℝ → ℝ | ⟨a⟩ ⟨b⟩ := ⟨a + b⟩
41+
@[irreducible] private def neg : ℝ → ℝ | ⟨a⟩ := ⟨-a⟩
42+
@[irreducible] private def mul : ℝ → ℝ → ℝ | ⟨a⟩ ⟨b⟩ := ⟨a * b⟩
2543

26-
instance : comm_ring ℝ := { ..comm_ring_aux }
44+
instance : has_zero ℝ := ⟨zero⟩
45+
instance : has_one ℝ := ⟨one⟩
46+
instance : has_add ℝ := ⟨add⟩
47+
instance : has_neg ℝ := ⟨neg⟩
48+
instance : has_mul ℝ := ⟨mul⟩
49+
50+
lemma zero_cauchy : (⟨0⟩ : ℝ) = 0 := show _ = zero, by rw zero
51+
lemma one_cauchy : (⟨1⟩ : ℝ) = 1 := show _ = one, by rw one
52+
lemma add_cauchy {a b} : (⟨a⟩ + ⟨b⟩ : ℝ) = ⟨a + b⟩ := show add _ _ = _, by rw add
53+
lemma neg_cauchy {a} : (-⟨a⟩ : ℝ) = ⟨-a⟩ := show neg _ = _, by rw neg
54+
lemma mul_cauchy {a b} : (⟨a⟩ * ⟨b⟩ : ℝ) = ⟨a * b⟩ := show mul _ _ = _, by rw mul
55+
56+
instance : comm_ring ℝ :=
57+
begin
58+
refine_struct { zero := 0, one := 1, mul := (*),
59+
add := (+), neg := @has_neg.neg ℝ _, sub := λ a b, a + (-b) },
60+
all_goals {
61+
repeat { rintro ⟨_⟩, },
62+
simp [← zero_cauchy, ← one_cauchy, add_cauchy, neg_cauchy, mul_cauchy],
63+
apply add_assoc <|> apply add_comm <|> apply mul_assoc <|> apply mul_comm <|>
64+
apply left_distrib <|> apply right_distrib <|> apply sub_eq_add_neg <|> skip
65+
},
66+
end
2767

2868
/- Extra instances to short-circuit type class resolution -/
2969
instance : ring ℝ := by apply_instance
@@ -41,71 +81,112 @@ instance : comm_monoid ℝ := by apply_instance
4181
instance : monoid ℝ := by apply_instance
4282
instance : comm_semigroup ℝ := by apply_instance
4383
instance : semigroup ℝ := by apply_instance
84+
instance : has_sub ℝ := by apply_instance
4485
instance : inhabited ℝ := ⟨0
4586

4687
/-- The real numbers are a *-ring, with the trivial *-structure. -/
4788
instance : star_ring ℝ := star_ring_of_comm
4889

4990
/-- Coercion `ℚ` → `ℝ` as a `ring_hom`. Note that this
5091
is `cau_seq.completion.of_rat`, not `rat.cast`. -/
51-
def of_rat : ℚ →+* ℝ := ⟨of_rat, rfl, of_rat_mul, rfl, of_rat_add⟩
92+
def of_rat : ℚ →+* ℝ :=
93+
by refine_struct { to_fun := of_cauchy ∘ of_rat };
94+
simp [of_rat_one, of_rat_zero, of_rat_mul, of_rat_add,
95+
one_cauchy, zero_cauchy, ← mul_cauchy, ← add_cauchy]
96+
97+
lemma of_rat_apply (x : ℚ) : of_rat x = of_cauchy (cau_seq.completion.of_rat x) := rfl
5298

5399
/-- Make a real number from a Cauchy sequence of rationals (by taking the equivalence class). -/
54-
def mk (x : cau_seq ℚ abs) : ℝ := cau_seq.completion.mk x
100+
def mk (x : cau_seq ℚ abs) : ℝ := cau_seq.completion.mk x
55101

56-
theorem of_rat_sub (x y : ℚ) : of_rat (x - y) = of_rat x - of_rat y :=
57-
congr_arg mk (const_sub _ _)
102+
theorem mk_eq {f g : cau_seq ℚ abs} : mk f = mk g ↔ f ≈ g :=
103+
ext_cauchy_iff.trans mk_eq
58104

59-
instance : has_lt ℝ :=
60-
⟨λ x y, quotient.lift_on₂ x y (<) $
105+
@[irreducible]
106+
private def lt : ℝ → ℝ → Prop | ⟨x⟩ ⟨y⟩ :=
107+
quotient.lift_on₂ x y (<) $
61108
λ f₁ g₁ f₂ g₂ hf hg, propext $
62109
⟨λ h, lt_of_eq_of_lt (setoid.symm hf) (lt_of_lt_of_eq h hg),
63-
λ h, lt_of_eq_of_lt hf (lt_of_lt_of_eq h (setoid.symm hg))⟩
110+
λ h, lt_of_eq_of_lt hf (lt_of_lt_of_eq h (setoid.symm hg))⟩
64111

65-
@[simp] theorem mk_lt {f g : cau_seq ℚ abs} : mk f < mk g ↔ f < g := iff.rfl
112+
instance : has_lt ℝ := ⟨lt⟩
66113

67-
theorem mk_eq {f g : cau_seq ℚ abs} : mk f = mk g ↔ f g := mk_eq
114+
lemma lt_cauchy {f g} : (⟨⟦f⟧⟩ : ℝ) < ⟨⟦g⟧⟩ ↔ f < g := show lt _ _ ↔ _, by rw lt; refl
68115

69-
theorem quotient_mk_eq_mk (f : cau_seq ℚ abs) : ⟦f⟧ = mk f := rfl
116+
@[simp] theorem mk_lt {f g : cau_seq ℚ abs} : mk f < mk g ↔ f < g :=
117+
lt_cauchy
70118

71-
theorem mk_eq_mk {f : cau_seq ℚ abs} : cau_seq.completion.mk f = mk f := rfl
119+
lemma mk_zero : mk 0 = 0 := by rw ← zero_cauchy; refl
120+
lemma mk_one : mk 1 = 1 := by rw ← one_cauchy; refl
121+
lemma mk_add {f g : cau_seq ℚ abs} : mk (f + g) = mk f + mk g := by simp [mk, add_cauchy]
122+
lemma mk_mul {f g : cau_seq ℚ abs} : mk (f * g) = mk f * mk g := by simp [mk, mul_cauchy]
123+
lemma mk_neg {f : cau_seq ℚ abs} : mk (-f) = -mk f := by simp [mk, neg_cauchy]
72124

73125
@[simp] theorem mk_pos {f : cau_seq ℚ abs} : 0 < mk f ↔ pos f :=
74-
iff_of_eq (congr_arg pos (sub_zero f))
126+
by rw [← mk_zero, mk_lt]; exact iff_of_eq (congr_arg pos (sub_zero f))
75127

76-
protected def le (x y : ℝ) : Prop := x < y ∨ x = y
77-
instance : has_le ℝ := ⟨real.le⟩
128+
@[irreducible] private def le (x y : ℝ) : Prop := x < y ∨ x = y
129+
instance : has_le ℝ := ⟨le⟩
130+
private lemma le_def {x y : ℝ} : x ≤ y ↔ x < y ∨ x = y := show le _ _ ↔ _, by rw le
78131

79132
@[simp] theorem mk_le {f g : cau_seq ℚ abs} : mk f ≤ mk g ↔ f ≤ g :=
80-
or_congr iff.rfl quotient.eq
133+
by simp [le_def, mk_eq]; refl
134+
135+
@[elab_as_eliminator]
136+
protected lemma ind_mk {C : real → Prop} (x : real) (h : ∀ y, C (mk y)) : C x :=
137+
begin
138+
cases x with x,
139+
induction x using quot.induction_on with x,
140+
exact h x
141+
end
81142

82143
theorem add_lt_add_iff_left {a b : ℝ} (c : ℝ) : c + a < c + b ↔ a < b :=
83-
quotient.induction_on₃ a b c (λ f g h,
84-
iff_of_eq (congr_arg pos $ by rw add_sub_add_left_eq_sub))
144+
begin
145+
induction a using real.ind_mk,
146+
induction b using real.ind_mk,
147+
induction c using real.ind_mk,
148+
simp only [mk_lt, ← mk_add],
149+
show pos _ ↔ pos _, rw add_sub_add_left_eq_sub
150+
end
85151

86152
instance : partial_order ℝ :=
87153
{ le := (≤), lt := (<),
88-
le_refl := λ a, or.inr rfl,
89-
le_trans := λ a b c, quotient.induction_on₃ a b c $
90-
λ f g h, by simpa [quotient_mk_eq_mk] using le_trans,
91-
lt_iff_le_not_le := λ a b, quotient.induction_on₂ a b $
92-
λ f g, by simpa [quotient_mk_eq_mk] using lt_iff_le_not_le,
93-
le_antisymm := λ a b, quotient.induction_on₂ a b $
94-
λ f g, by simpa [mk_eq, quotient_mk_eq_mk] using @cau_seq.le_antisymm _ _ f g }
154+
lt_iff_le_not_le := λ a b, real.ind_mk a $ λ a, real.ind_mk b $ λ b,
155+
by simpa using lt_iff_le_not_le,
156+
le_refl := λ a, a.ind_mk (by intro a; rw mk_le),
157+
le_trans := λ a b c, real.ind_mk a $ λ a, real.ind_mk b $ λ b, real.ind_mk c $ λ c,
158+
by simpa using le_trans,
159+
lt_iff_le_not_le := λ a b, real.ind_mk a $ λ a, real.ind_mk b $ λ b,
160+
by simpa using lt_iff_le_not_le,
161+
le_antisymm := λ a b, real.ind_mk a $ λ a, real.ind_mk b $ λ b,
162+
by simpa [mk_eq] using @cau_seq.le_antisymm _ _ a b }
95163

96164
instance : preorder ℝ := by apply_instance
97165

98-
theorem of_rat_lt {x y : ℚ} : of_rat x < of_rat y ↔ x < y := const_lt
166+
theorem of_rat_lt {x y : ℚ} : of_rat x < of_rat y ↔ x < y :=
167+
begin
168+
rw [mk_lt] {md := tactic.transparency.semireducible},
169+
exact const_lt
170+
end
99171

100-
protected theorem zero_lt_one : (0 : ℝ) < 1 := of_rat_lt.2 zero_lt_one
172+
protected theorem zero_lt_one : (0 : ℝ) < 1 :=
173+
by convert of_rat_lt.2 zero_lt_one; simp
101174

102175
protected theorem mul_pos {a b : ℝ} : 0 < a → 0 < b → 0 < a * b :=
103-
quotient.induction_on₂ a b $ λ f g,
104-
show pos (f - 0) → pos (g - 0) → pos (f * g - 0),
105-
by simpa using cau_seq.mul_pos
176+
begin
177+
induction a using real.ind_mk with a,
178+
induction b using real.ind_mk with b,
179+
simpa only [mk_lt, mk_pos, ← mk_mul] using cau_seq.mul_pos
180+
end
106181

107182
instance : ordered_ring ℝ :=
108-
{ add_le_add_left := λ a b h c, h.imp (real.add_lt_add_iff_left c).2 (λ h, h ▸ rfl),
183+
{ add_le_add_left :=
184+
begin
185+
simp only [le_iff_eq_or_lt],
186+
rintros a b ⟨rfl, h⟩,
187+
{ simp },
188+
{ exact λ c, or.inr ((add_lt_add_iff_left c).2 ‹_›) }
189+
end,
109190
zero_le_one := le_of_lt real.zero_lt_one,
110191
mul_pos := @real.mul_pos,
111192
.. real.comm_ring, .. real.partial_order, .. real.semiring }
@@ -114,18 +195,17 @@ instance : ordered_semiring ℝ := by apply_instance
114195
instance : ordered_add_comm_group ℝ := by apply_instance
115196
instance : ordered_cancel_add_comm_monoid ℝ := by apply_instance
116197
instance : ordered_add_comm_monoid ℝ := by apply_instance
117-
instance : has_one ℝ := by apply_instance
118-
instance : has_zero ℝ := by apply_instance
119-
instance : has_mul ℝ := by apply_instance
120-
instance : has_add ℝ := by apply_instance
121-
instance : has_sub ℝ := by apply_instance
122198
instance : nontrivial ℝ := ⟨⟨0, 1, ne_of_lt real.zero_lt_one⟩⟩
123199

124200
open_locale classical
125201

126202
noncomputable instance : linear_order ℝ :=
127-
{ le_total := λ a b, quotient.induction_on₂ a b $
128-
λ f g, by simpa [quotient_mk_eq_mk] using le_total f g,
203+
{ le_total := begin
204+
intros a b,
205+
induction a using real.ind_mk with a,
206+
induction b using real.ind_mk with b,
207+
simpa using le_total a b,
208+
end,
129209
decidable_le := by apply_instance,
130210
.. real.partial_order }
131211

@@ -138,10 +218,21 @@ noncomputable instance : linear_ordered_semiring ℝ := by apply_instance
138218
instance : domain ℝ :=
139219
{ .. real.nontrivial, .. real.comm_ring, .. linear_ordered_ring.to_domain }
140220

221+
@[irreducible] private noncomputable def inv' : ℝ → ℝ | ⟨a⟩ := ⟨a⁻¹⟩
222+
noncomputable instance : has_inv ℝ := ⟨inv'⟩
223+
lemma inv_cauchy {f} : (⟨f⟩ : ℝ)⁻¹ = ⟨f⁻¹⟩ := show inv' _ = _, by rw inv'
224+
141225
noncomputable instance : linear_ordered_field ℝ :=
142-
{ ..real.linear_ordered_comm_ring,
143-
..real.domain,
144-
..cau_seq.completion.field }
226+
{ inv := has_inv.inv,
227+
mul_inv_cancel := begin
228+
rintros ⟨a⟩ h,
229+
rw mul_comm,
230+
simp only [inv_cauchy, mul_cauchy, ← one_cauchy, ← zero_cauchy, ne.def] at *,
231+
exact cau_seq.completion.inv_mul_cancel h,
232+
end,
233+
inv_zero := by simp [← zero_cauchy, inv_cauchy],
234+
..real.linear_ordered_comm_ring,
235+
..real.domain }
145236

146237
/- Extra instances to short-circuit type class resolution -/
147238

@@ -166,23 +257,30 @@ of_rat.eq_rat_cast
166257

167258
theorem le_mk_of_forall_le {f : cau_seq ℚ abs} :
168259
(∃ i, ∀ j ≥ i, x ≤ f j) → x ≤ mk f :=
169-
quotient.induction_on x $ λ g h, le_of_not_lt $
170-
λ ⟨K, K0, hK⟩,
171-
let ⟨i, H⟩ := exists_forall_ge_and h $
172-
exists_forall_ge_and hK (f.cauchy₃ $ half_pos K0) in
173260
begin
261+
intro h,
262+
induction x using real.ind_mk with x,
263+
apply le_of_not_lt,
264+
rw mk_lt,
265+
rintro ⟨K, K0, hK⟩,
266+
obtain ⟨i, H⟩ := exists_forall_ge_and h
267+
(exists_forall_ge_and hK (f.cauchy₃ $ half_pos K0)),
174268
apply not_lt_of_le (H _ (le_refl _)).1,
175269
rw ← of_rat_eq_cast,
270+
rw [mk_lt] {md := tactic.transparency.semireducible},
176271
refine ⟨_, half_pos K0, i, λ j ij, _⟩,
177272
have := add_le_add (H _ ij).2.1
178273
(le_of_lt (abs_lt.1 $ (H _ (le_refl _)).2.2 _ ij).1),
179274
rwa [← sub_eq_add_neg, sub_self_div_two, sub_apply, sub_add_sub_cancel] at this
180275
end
181276

182-
theorem mk_le_of_forall_le {f : cau_seq ℚ abs} {x : ℝ} :
183-
(∃ i, ∀ j ≥ i, (f j : ℝ) ≤ x) → mk f ≤ x
184-
| ⟨i, H⟩ := by rw [← neg_le_neg_iff, ← mk_eq_mk, mk_neg]; exact
185-
le_mk_of_forall_le ⟨i, λ j ij, by simp [H _ ij]⟩
277+
theorem mk_le_of_forall_le {f : cau_seq ℚ abs} {x : ℝ}
278+
(h : ∃ i, ∀ j ≥ i, (f j : ℝ) ≤ x) : mk f ≤ x :=
279+
begin
280+
cases h with i H,
281+
rw [← neg_le_neg_iff, ← mk_neg],
282+
exact le_mk_of_forall_le ⟨i, λ j ij, by simp [H _ ij]⟩
283+
end
186284

187285
theorem mk_near_of_forall_near {f : cau_seq ℚ abs} {x : ℝ} {ε : ℝ}
188286
(H : ∃ i, ∀ j ≥ i, abs ((f j : ℝ) - x) ≤ ε) : abs (mk f - x) ≤ ε :=
@@ -193,17 +291,11 @@ abs_sub_le_iff.2
193291
H.imp $ λ i h j ij, sub_le.1 (abs_sub_le_iff.1 $ h j ij).2
194292

195293
instance : archimedean ℝ :=
196-
archimedean_iff_rat_le.2 $ λ x, quotient.induction_on x $ λ f,
294+
archimedean_iff_rat_le.2 $ λ x, real.ind_mk x $ λ f,
197295
let ⟨M, M0, H⟩ := f.bounded' 0 in
198296
⟨M, mk_le_of_forall_le ⟨0, λ i _,
199297
rat.cast_le.2 $ le_of_lt (abs_lt.1 (H i)).2⟩⟩
200298

201-
/- mark `real` irreducible in order to prevent `auto_cases` unfolding reals,
202-
since users rarely want to consider real numbers as Cauchy sequences.
203-
Marking `comm_ring_aux` `irreducible` is done to ensure that there are no problems
204-
with non definitionally equal instances, caused by making `real` irreducible-/
205-
attribute [irreducible] real comm_ring_aux
206-
207299
noncomputable instance : floor_ring ℝ := archimedean.floor_ring _
208300

209301
theorem is_cau_seq_iff_lift {f : ℕ → ℚ} : is_cau_seq abs f ↔ is_cau_seq abs (λ i, (f i : ℝ)) :=
@@ -296,13 +388,9 @@ theorem Sup_le (S : set ℝ) (h₁ : ∃ x, x ∈ S) (h₂ : ∃ x, ∀ y ∈ S,
296388
by simp [Sup_def, h₁, h₂]; exact
297389
classical.some_spec (exists_sup S h₁ h₂) y
298390

299-
section
300-
-- this proof times out without this
301-
local attribute [instance, priority 1000] classical.prop_decidable
302391
theorem lt_Sup (S : set ℝ) (h₁ : ∃ x, x ∈ S) (h₂ : ∃ x, ∀ y ∈ S, y ≤ x)
303392
{y} : y < Sup S ↔ ∃ z ∈ S, y < z :=
304393
by simpa [not_forall] using not_congr (@Sup_le S h₁ h₂ y)
305-
end
306394

307395
theorem le_Sup (S : set ℝ) (h₂ : ∃ x, ∀ y ∈ S, y ≤ x) {x} (xS : x ∈ S) : x ≤ Sup S :=
308396
(Sup_le S ⟨_, xS⟩ h₂).1 (le_refl _) _ xS
@@ -410,6 +498,4 @@ end
410498

411499
noncomputable instance : cau_seq.is_complete ℝ abs := ⟨cau_seq_converges⟩
412500

413-
attribute [irreducible] real.le
414-
415501
end real

src/data/real/cardinality.lean

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import set_theory.cardinal_ordinal
77
import analysis.specific_limits
88
import data.rat.denumerable
99
import data.set.intervals.image_preimage
10+
1011
/-!
1112
# The cardinality of the reals
1213
@@ -34,9 +35,11 @@ We conclude that all intervals with distinct endpoints have cardinality continuu
3435
## Tags
3536
continuum, cardinality, reals, cardinality of the reals
3637
-/
38+
3739
open nat set
3840
open_locale cardinal
3941
noncomputable theory
42+
4043
namespace cardinal
4144

4245
variables {c : ℝ} {f g : ℕ → bool} {n : ℕ}
@@ -141,7 +144,8 @@ end
141144
lemma mk_real : #ℝ = 2 ^ omega.{0} :=
142145
begin
143146
apply le_antisymm,
144-
{ dsimp [real], apply le_trans mk_quotient_le, apply le_trans (mk_subtype_le _),
147+
{ rw real.equiv_Cauchy.cardinal_eq,
148+
apply mk_quotient_le.trans, apply (mk_subtype_le _).trans,
145149
rw [←power_def, mk_nat, mk_rat, power_self_eq (le_refl _)] },
146150
{ convert mk_le_of_injective (cantor_function_injective _ _),
147151
rw [←power_def, mk_bool, mk_nat], exact 1 / 3, norm_num, norm_num }

src/measure_theory/lebesgue_measure.lean

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,8 @@ by simpa only [mul_comm] using real.map_volume_mul_left h
365365

366366
@[simp] lemma map_volume_neg : measure.map has_neg.neg (volume : measure ℝ) = volume :=
367367
eq.symm $ real.measure_ext_Ioo_rat $ λ p q,
368-
by simp [measure.map_apply measurable_neg measurable_set_Ioo]
368+
by simp [show measure.map has_neg.neg volume (Ioo (p : ℝ) q) = _,
369+
from measure.map_apply measurable_neg measurable_set_Ioo]
369370

370371
end real
371372

0 commit comments

Comments
 (0)