Skip to content

Commit c59e595

Browse files
committed
chore: replace continuity by fun_prop, easy cases (#13880)
Inspired by #12661: let's start with some easy instances, so we can focus on the difficult ones. In particular, this PR does not depend on any in-progress bugfixes, not tries to change a default value `by continuity` to `by fun_prop`. I am not at all confident about the tagging of lemmas with fun_prop: I remember this being subtle, but can't find any documentation on this. @lecopivo Can you advise on these lemmas (or simply link to the right documentation if I just overlooked it)?
1 parent 435827a commit c59e595

File tree

13 files changed

+45
-45
lines changed

13 files changed

+45
-45
lines changed

Mathlib/Topology/CompactOpen.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ section Curry
374374
If `a × β` is locally compact, this is continuous. If `α` and `β` are both locally
375375
compact, then this is a homeomorphism, see `Homeomorph.curry`. -/
376376
def curry (f : C(X × Y, Z)) : C(X, C(Y, Z)) where
377-
toFun a := ⟨Function.curry f a, f.continuous.comp <| by continuity
377+
toFun a := ⟨Function.curry f a, f.continuous.comp <| by fun_prop
378378
continuous_toFun := (continuous_comp f).comp continuous_coev
379379
#align continuous_map.curry ContinuousMap.curry
380380

Mathlib/Topology/Connected/PathConnected.lean

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ instance Path.funLike : FunLike (Path x y) I X where
8888
-- Porting note (#10754): added this instance so that we can use `FunLike.coe` for `CoeFun`
8989
-- this also fixed very strange `simp` timeout issues
9090
instance Path.continuousMapClass : ContinuousMapClass (Path x y) I X where
91-
map_continuous := fun γ => show Continuous γ.toContinuousMap by continuity
91+
map_continuous γ := show Continuous γ.toContinuousMap by fun_prop
9292

9393
-- Porting note: not necessary in light of the instance above
9494
/-
@@ -246,7 +246,7 @@ theorem _root_.Continuous.path_extend {γ : Y → Path x y} {f : Y → ℝ} (hγ
246246
#align continuous.path_extend Continuous.path_extend
247247

248248
/-- A useful special case of `Continuous.path_extend`. -/
249-
@[continuity]
249+
@[continuity, fun_prop]
250250
theorem continuous_extend : Continuous γ.extend :=
251251
γ.continuous.Icc_extend'
252252
#align path.continuous_extend Path.continuous_extend
@@ -326,7 +326,7 @@ def trans (γ : Path x y) (γ' : Path y z) : Path x z where
326326
refine
327327
(Continuous.if_le ?_ ?_ continuous_id continuous_const (by norm_num)).comp
328328
continuous_subtype_val <;>
329-
continuity
329+
fun_prop
330330
source' := by norm_num
331331
target' := by norm_num
332332
#align path.trans Path.trans
@@ -472,7 +472,7 @@ theorem cast_coe (γ : Path x y) {x' y'} (hx : x' = x) (hy : y' = y) : (γ.cast
472472
rfl
473473
#align path.cast_coe Path.cast_coe
474474

475-
@[continuity]
475+
@[continuity, fun_prop]
476476
theorem symm_continuous_family {ι : Type*} [TopologicalSpace ι]
477477
{a b : ι → X} (γ : ∀ t : ι, Path (a t) (b t)) (h : Continuous ↿γ) :
478478
Continuous ↿fun t => (γ t).symm :=
@@ -666,7 +666,7 @@ theorem truncate_continuous_family {a b : X} (γ : Path a b) :
666666
@[continuity]
667667
theorem truncate_const_continuous_family {a b : X} (γ : Path a b)
668668
(t : ℝ) : Continuous ↿(γ.truncate t) := by
669-
have key : Continuous (fun x => (t, x) : ℝ × I → ℝ × ℝ × I) := by continuity
669+
have key : Continuous (fun x => (t, x) : ℝ × I → ℝ × ℝ × I) := by fun_prop
670670
exact γ.truncate_continuous_family.comp key
671671
#align path.truncate_const_continuous_family Path.truncate_const_continuous_family
672672

@@ -709,7 +709,7 @@ path defined by `γ ∘ f`.
709709
def reparam (γ : Path x y) (f : I → I) (hfcont : Continuous f) (hf₀ : f 0 = 0) (hf₁ : f 1 = 1) :
710710
Path x y where
711711
toFun := γ ∘ f
712-
continuous_toFun := by continuity
712+
continuous_toFun := by fun_prop
713713
source' := by simp [hf₀]
714714
target' := by simp [hf₁]
715715
#align path.reparam Path.reparam
@@ -834,7 +834,7 @@ theorem JoinedIn.somePath_mem (h : JoinedIn F x y) (t : I) : h.somePath t ∈ F
834834
theorem JoinedIn.joined_subtype (h : JoinedIn F x y) :
835835
Joined (⟨x, h.source_mem⟩ : F) (⟨y, h.target_mem⟩ : F) :=
836836
⟨{ toFun := fun t => ⟨h.somePath t, h.somePath_mem t⟩
837-
continuous_toFun := by continuity
837+
continuous_toFun := by fun_prop
838838
source' := by simp
839839
target' := by simp }⟩
840840
#align joined_in.joined_subtype JoinedIn.joined_subtype
@@ -1202,7 +1202,7 @@ instance Quotient.instPathConnectedSpace {s : Setoid X} [PathConnectedSpace X] :
12021202
/-- This is a special case of `NormedSpace.instPathConnectedSpace` (and
12031203
`TopologicalAddGroup.pathConnectedSpace`). It exists only to simplify dependencies. -/
12041204
instance Real.instPathConnectedSpace : PathConnectedSpace ℝ where
1205-
joined x y := ⟨⟨⟨fun (t : I) ↦ (1 - t) * x + t * y, by continuity⟩, by simp, by simp⟩⟩
1205+
joined x y := ⟨⟨⟨fun (t : I) ↦ (1 - t) * x + t * y, by fun_prop⟩, by simp, by simp⟩⟩
12061206
nonempty := inferInstance
12071207

12081208
theorem pathConnectedSpace_iff_eq : PathConnectedSpace X ↔ ∃ x : X, pathComponent x = univ := by

Mathlib/Topology/Constructions.lean

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -950,26 +950,26 @@ theorem continuous_sum_elim {f : X → Z} {g : Y → Z} :
950950
continuous_sum_dom
951951
#align continuous_sum_elim continuous_sum_elim
952952

953-
@[continuity]
953+
@[continuity, fun_prop]
954954
theorem Continuous.sum_elim {f : X → Z} {g : Y → Z} (hf : Continuous f) (hg : Continuous g) :
955955
Continuous (Sum.elim f g) :=
956956
continuous_sum_elim.2 ⟨hf, hg⟩
957957
#align continuous.sum_elim Continuous.sum_elim
958958

959-
@[continuity]
959+
@[continuity, fun_prop]
960960
theorem continuous_isLeft : Continuous (isLeft : X ⊕ Y → Bool) :=
961961
continuous_sum_dom.2 ⟨continuous_const, continuous_const⟩
962962

963-
@[continuity]
963+
@[continuity, fun_prop]
964964
theorem continuous_isRight : Continuous (isRight : X ⊕ Y → Bool) :=
965965
continuous_sum_dom.2 ⟨continuous_const, continuous_const⟩
966966

967-
@[continuity]
967+
@[continuity, fun_prop]
968968
-- Porting note: the proof was `continuous_sup_rng_left continuous_coinduced_rng`
969969
theorem continuous_inl : Continuous (@inl X Y) := ⟨fun _ => And.left⟩
970970
#align continuous_inl continuous_inl
971971

972-
@[continuity]
972+
@[continuity, fun_prop]
973973
-- Porting note: the proof was `continuous_sup_rng_right continuous_coinduced_rng`
974974
theorem continuous_inr : Continuous (@inr X Y) := ⟨fun _ => And.right⟩
975975
#align continuous_inr continuous_inr
@@ -1048,7 +1048,7 @@ theorem continuous_sum_map {f : X → Y} {g : Z → W} :
10481048
embedding_inl.continuous_iff.symm.and embedding_inr.continuous_iff.symm
10491049
#align continuous_sum_map continuous_sum_map
10501050

1051-
@[continuity]
1051+
@[continuity, fun_prop]
10521052
theorem Continuous.sum_map {f : X → Y} {g : Z → W} (hf : Continuous f) (hg : Continuous g) :
10531053
Continuous (Sum.map f g) :=
10541054
continuous_sum_map.2 ⟨hf, hg⟩
@@ -1093,7 +1093,7 @@ theorem closedEmbedding_subtype_val (h : IsClosed { a | p a }) :
10931093
⟨embedding_subtype_val, by rwa [Subtype.range_coe_subtype]⟩
10941094
#align closed_embedding_subtype_coe closedEmbedding_subtype_val
10951095

1096-
@[continuity]
1096+
@[continuity, fun_prop]
10971097
theorem continuous_subtype_val : Continuous (@Subtype.val X p) :=
10981098
continuous_induced_dom
10991099
#align continuous_subtype_val continuous_subtype_val
@@ -1123,7 +1123,7 @@ nonrec theorem IsClosed.closedEmbedding_subtype_val {s : Set X} (hs : IsClosed s
11231123
closedEmbedding_subtype_val hs
11241124
#align is_closed.closed_embedding_subtype_coe IsClosed.closedEmbedding_subtype_val
11251125

1126-
@[continuity]
1126+
@[continuity, fun_prop]
11271127
theorem Continuous.subtype_mk {f : Y → X} (h : Continuous f) (hp : ∀ x, p (f x)) :
11281128
Continuous fun x => (⟨f x, hp x⟩ : Subtype p) :=
11291129
continuous_induced_rng.2 h
@@ -1190,18 +1190,18 @@ theorem ContinuousAt.restrictPreimage {f : X → Y} {s : Set Y} {x : f ⁻¹' s}
11901190
h.restrict _
11911191
#align continuous_at.restrict_preimage ContinuousAt.restrictPreimage
11921192

1193-
@[continuity]
1193+
@[continuity, fun_prop]
11941194
theorem Continuous.codRestrict {f : X → Y} {s : Set Y} (hf : Continuous f) (hs : ∀ a, f a ∈ s) :
11951195
Continuous (s.codRestrict f hs) :=
11961196
hf.subtype_mk hs
11971197
#align continuous.cod_restrict Continuous.codRestrict
11981198

1199-
@[continuity]
1199+
@[continuity, fun_prop]
12001200
theorem Continuous.restrict {f : X → Y} {s : Set X} {t : Set Y} (h1 : MapsTo f s t)
12011201
(h2 : Continuous f) : Continuous (h1.restrict f s t) :=
12021202
(h2.comp continuous_subtype_val).codRestrict _
12031203

1204-
@[continuity]
1204+
@[continuity, fun_prop]
12051205
theorem Continuous.restrictPreimage {f : X → Y} {s : Set Y} (h : Continuous f) :
12061206
Continuous (s.restrictPreimage f) :=
12071207
h.restrict _
@@ -1246,12 +1246,12 @@ theorem quotientMap_quot_mk : QuotientMap (@Quot.mk X r) :=
12461246
⟨Quot.exists_rep, rfl⟩
12471247
#align quotient_map_quot_mk quotientMap_quot_mk
12481248

1249-
@[continuity]
1249+
@[continuity, fun_prop]
12501250
theorem continuous_quot_mk : Continuous (@Quot.mk X r) :=
12511251
continuous_coinduced_rng
12521252
#align continuous_quot_mk continuous_quot_mk
12531253

1254-
@[continuity]
1254+
@[continuity, fun_prop]
12551255
theorem continuous_quot_lift {f : X → Y} (hr : ∀ a b, r a b → f a = f b) (h : Continuous f) :
12561256
Continuous (Quot.lift f hr : Quot r → Y) :=
12571257
continuous_coinduced_dom.2 h
@@ -1276,7 +1276,8 @@ theorem Continuous.quotient_liftOn' {f : X → Y} (h : Continuous f)
12761276
h.quotient_lift hs
12771277
#align continuous.quotient_lift_on' Continuous.quotient_liftOn'
12781278

1279-
@[continuity] theorem Continuous.quotient_map' {t : Setoid Y} {f : X → Y} (hf : Continuous f)
1279+
@[continuity, fun_prop]
1280+
theorem Continuous.quotient_map' {t : Setoid Y} {f : X → Y} (hf : Continuous f)
12801281
(H : (s.r ⇒ t.r) f f) : Continuous (Quotient.map' f H) :=
12811282
(continuous_quotient_mk'.comp hf).quotient_lift _
12821283
#align continuous.quotient_map' Continuous.quotient_map'
@@ -1395,7 +1396,7 @@ theorem Continuous.update [DecidableEq ι] (hf : Continuous f) (i : ι) {g : X
13951396
#align continuous.update Continuous.update
13961397

13971398
/-- `Function.update f i x` is continuous in `(f, x)`. -/
1398-
@[continuity]
1399+
@[continuity, fun_prop]
13991400
theorem continuous_update [DecidableEq ι] (i : ι) :
14001401
Continuous fun f : (∀ j, π j) × π i => update f.1 i f.2 :=
14011402
continuous_fst.update i continuous_snd
@@ -1587,7 +1588,7 @@ section Sigma
15871588
variable {ι κ : Type*} {σ : ι → Type*} {τ : κ → Type*} [∀ i, TopologicalSpace (σ i)]
15881589
[∀ k, TopologicalSpace (τ k)] [TopologicalSpace X]
15891590

1590-
@[continuity]
1591+
@[continuity, fun_prop]
15911592
theorem continuous_sigmaMk {i : ι} : Continuous (@Sigma.mk ι σ i) :=
15921593
continuous_iSup_rng continuous_coinduced_rng
15931594
#align continuous_sigma_mk continuous_sigmaMk
@@ -1674,7 +1675,7 @@ theorem continuous_sigma_iff {f : Sigma σ → X} :
16741675
#align continuous_sigma_iff continuous_sigma_iff
16751676

16761677
/-- A map out of a sum type is continuous if its restriction to each summand is. -/
1677-
@[continuity]
1678+
@[continuity, fun_prop]
16781679
theorem continuous_sigma {f : Sigma σ → X} (hf : ∀ i, Continuous fun a => f ⟨i, a⟩) :
16791680
Continuous f :=
16801681
continuous_sigma_iff.2 hf
@@ -1702,7 +1703,7 @@ theorem continuous_sigma_map {f₁ : ι → κ} {f₂ : ∀ i, σ i → τ (f₁
17021703
continuous_sigma_iff.trans <| by simp only [Sigma.map, embedding_sigmaMk.continuous_iff, comp]
17031704
#align continuous_sigma_map continuous_sigma_map
17041705

1705-
@[continuity]
1706+
@[continuity, fun_prop]
17061707
theorem Continuous.sigma_map {f₁ : ι → κ} {f₂ : ∀ i, σ i → τ (f₁ i)} (hf : ∀ i, Continuous (f₂ i)) :
17071708
Continuous (Sigma.map f₁ f₂) :=
17081709
continuous_sigma_map.2 hf

Mathlib/Topology/ContinuousFunction/Polynomial.lean

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,7 @@ with domain restricted to some subset of the semiring of coefficients.
5454
-/
5555
@[simps]
5656
def toContinuousMapOn (p : R[X]) (X : Set R) : C(X, R) :=
57-
-- Porting note: Old proof was `⟨fun x : X => p.toContinuousMap x, by continuity⟩`
58-
fun x : X => p.toContinuousMap x, Continuous.comp (by continuity) (by continuity)⟩
57+
fun x : X => p.toContinuousMap x, by fun_prop⟩
5958
#align polynomial.to_continuous_map_on Polynomial.toContinuousMapOn
6059

6160
open ContinuousMap in

Mathlib/Topology/Gluing.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ def MkCore.t' (h : MkCore.{u}) (i j k : h.J) :
389389
-- Porting note: was `continuity`, see https://github.com/leanprover-community/mathlib4/issues/5030
390390
have : Continuous (h.t i j) := map_continuous (self := ContinuousMap.toContinuousMapClass) _
391391
set_option tactic.skipAssignedInstances false in
392-
exact ((Continuous.subtype_mk (by continuity) _).prod_mk (by continuity)).subtype_mk _
392+
exact ((Continuous.subtype_mk (by fun_prop) _).prod_mk (by fun_prop)).subtype_mk _
393393

394394
set_option linter.uppercaseLean3 false in
395395
#align Top.glue_data.mk_core.t' TopCat.GlueData.MkCore.t'

Mathlib/Topology/Homotopy/HSpaces.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ def qRight (p : I × I) : I :=
174174

175175
theorem continuous_qRight : Continuous qRight :=
176176
continuous_projIcc.comp <|
177-
Continuous.div (by continuity) (by continuity) fun x => (add_pos zero_lt_one).ne'
177+
Continuous.div (by fun_prop) (by fun_prop) fun x (add_pos zero_lt_one).ne'
178178
#align unit_interval.continuous_Q_right unitInterval.continuous_qRight
179179

180180
theorem qRight_zero_left (θ : I) : qRight (0, θ) = 0 :=

Mathlib/Topology/Homotopy/HomotopyGroup.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ theorem continuous_toLoop (i : N) : Continuous (@toLoop N X _ x _ i) :=
220220
/-- Generalized loop from a loop by uncurrying $I → (I^{N\setminus\{j\}} → X)$ into $I^N → X$. -/
221221
@[simps]
222222
def fromLoop (i : N) (p : Ω (Ω^ { j // j ≠ i } X x) const) : Ω^ N X x :=
223-
⟨(ContinuousMap.comp ⟨Subtype.val, by continuity⟩ p.toContinuousMap).uncurry.comp
223+
⟨(ContinuousMap.comp ⟨Subtype.val, by fun_prop⟩ p.toContinuousMap).uncurry.comp
224224
(Cube.splitAt i).toContinuousMap,
225225
by
226226
rintro y ⟨j, Hj⟩

Mathlib/Topology/MetricSpace/Algebra.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ instance (priority := 100) BoundedSMul.continuousSMul : ContinuousSMul α β whe
152152
rw [Metric.continuous_iff]
153153
rintro ⟨a, b⟩ ε ε0
154154
obtain ⟨δ, δ0, hδε⟩ : ∃ δ > 0, δ * (δ + dist b 0) + dist a 0 * δ < ε := by
155-
have : Continuous fun δ ↦ δ * (δ + dist b 0) + dist a 0 * δ := by continuity
155+
have : Continuous fun δ ↦ δ * (δ + dist b 0) + dist a 0 * δ := by fun_prop
156156
refine ((this.tendsto' _ _ ?_).eventually (gt_mem_nhds ε0)).exists_gt
157157
simp
158158
refine ⟨δ, δ0, fun (a', b') hab' => ?_⟩

Mathlib/Topology/MetricSpace/Completion.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ open UniformSpace Completion NNReal
191191
theorem LipschitzWith.completion_extension [MetricSpace β] [CompleteSpace β] {f : α → β}
192192
{K : ℝ≥0} (h : LipschitzWith K f) : LipschitzWith K (Completion.extension f) :=
193193
LipschitzWith.of_dist_le_mul fun x y => induction_on₂ x y
194-
(isClosed_le (by continuity) (by continuity)) <| by
194+
(isClosed_le (by fun_prop) (by fun_prop)) <| by
195195
simpa only [extension_coe h.uniformContinuous, Completion.dist_eq] using h.dist_le_mul
196196

197197
theorem LipschitzWith.completion_map [PseudoMetricSpace β] {f : α → β} {K : ℝ≥0}
@@ -201,7 +201,7 @@ theorem LipschitzWith.completion_map [PseudoMetricSpace β] {f : α → β} {K :
201201
theorem Isometry.completion_extension [MetricSpace β] [CompleteSpace β] {f : α → β}
202202
(h : Isometry f) : Isometry (Completion.extension f) :=
203203
Isometry.of_dist_eq fun x y => induction_on₂ x y
204-
(isClosed_eq (by continuity) (by continuity)) fun _ _ ↦ by
204+
(isClosed_eq (by fun_prop) (by fun_prop)) fun _ _ ↦ by
205205
simp only [extension_coe h.uniformContinuous, Completion.dist_eq, h.dist_eq]
206206

207207
theorem Isometry.completion_map [PseudoMetricSpace β] {f : α → β}

Mathlib/Topology/Order.lean

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ theorem isOpen_discrete (s : Set α) : IsOpen s := (@DiscreteTopology.eq_bot α
293293
theorem denseRange_discrete {ι : Type*} {f : ι → α} : DenseRange f ↔ Surjective f := by
294294
rw [DenseRange, dense_discrete, range_iff_surjective]
295295

296-
@[nontriviality, continuity]
296+
@[nontriviality, continuity, fun_prop]
297297
theorem continuous_of_discreteTopology [TopologicalSpace β] {f : α → β} : Continuous f :=
298298
continuous_def.2 fun _ _ => isOpen_discrete _
299299
#align continuous_of_discrete_topology continuous_of_discreteTopology
@@ -690,7 +690,7 @@ lemma continuous_generateFrom_iff {t : TopologicalSpace α} {b : Set (Set β)} :
690690
alias ⟨_, continuous_generateFrom⟩ := continuous_generateFrom_iff
691691
#align continuous_generated_from continuous_generateFrom
692692

693-
@[continuity]
693+
@[continuity, fun_prop]
694694
theorem continuous_induced_dom {t : TopologicalSpace β} : Continuous[induced f t, t] f :=
695695
continuous_iff_le_induced.2 le_rfl
696696
#align continuous_induced_dom continuous_induced_dom
@@ -794,12 +794,12 @@ theorem continuous_iInf_rng {t₁ : TopologicalSpace α} {t₂ : ι → Topologi
794794
simp only [continuous_iff_coinduced_le, le_iInf_iff]
795795
#align continuous_infi_rng continuous_iInf_rng
796796

797-
@[continuity]
797+
@[continuity, fun_prop]
798798
theorem continuous_bot {t : TopologicalSpace β} : Continuous[⊥, t] f :=
799799
continuous_iff_le_induced.2 bot_le
800800
#align continuous_bot continuous_bot
801801

802-
@[continuity]
802+
@[continuity, fun_prop]
803803
theorem continuous_top {t : TopologicalSpace α} : Continuous[t, ⊤] f :=
804804
continuous_iff_coinduced_le.2 le_top
805805
#align continuous_top continuous_top

0 commit comments

Comments
 (0)