topology.hom.openMathlib.Topology.Hom.Open

This file has been ported!

Changes since the initial port

The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.

Changes in mathlib3

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(last sync)

Changes in mathlib3port

mathlib3
mathlib3port
Diff
@@ -79,7 +79,7 @@ instance : ContinuousOpenMapClass (α →CO β) α β
 /-- Helper instance for when there's too many metavariables to apply `fun_like.has_coe_to_fun`
 directly. -/
 instance : CoeFun (α →CO β) fun _ => α → β :=
-  FunLike.hasCoeToFun
+  DFunLike.hasCoeToFun
 
 #print ContinuousOpenMap.toFun_eq_coe /-
 @[simp]
@@ -91,7 +91,7 @@ theorem toFun_eq_coe {f : α →CO β} : f.toFun = (f : α → β) :=
 #print ContinuousOpenMap.ext /-
 @[ext]
 theorem ext {f g : α →CO β} (h : ∀ a, f a = g a) : f = g :=
-  FunLike.ext f g h
+  DFunLike.ext f g h
 #align continuous_open_map.ext ContinuousOpenMap.ext
 -/
 
@@ -112,7 +112,7 @@ theorem coe_copy (f : α →CO β) (f' : α → β) (h : f' = f) : ⇑(f.copy f'
 
 #print ContinuousOpenMap.copy_eq /-
 theorem copy_eq (f : α →CO β) (f' : α → β) (h : f' = f) : f.copy f' h = f :=
-  FunLike.ext' h
+  DFunLike.ext' h
 #align continuous_open_map.copy_eq ContinuousOpenMap.copy_eq
 -/
 
@@ -190,7 +190,7 @@ theorem id_comp (f : α →CO β) : (ContinuousOpenMap.id β).comp f = f :=
 #print ContinuousOpenMap.cancel_right /-
 theorem cancel_right {g₁ g₂ : β →CO γ} {f : α →CO β} (hf : Surjective f) :
     g₁.comp f = g₂.comp f ↔ g₁ = g₂ :=
-  ⟨fun h => ext <| hf.forall.2 <| FunLike.ext_iff.1 h, congr_arg _⟩
+  ⟨fun h => ext <| hf.forall.2 <| DFunLike.ext_iff.1 h, congr_arg _⟩
 #align continuous_open_map.cancel_right ContinuousOpenMap.cancel_right
 -/
 
Diff
@@ -3,7 +3,7 @@ Copyright (c) 2022 Yaël Dillies. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Yaël Dillies
 -/
-import Mathbin.Topology.ContinuousFunction.Basic
+import Topology.ContinuousFunction.Basic
 
 #align_import topology.hom.open from "leanprover-community/mathlib"@"ad0089aca372256fe53dde13ca0dfea569bf5ac7"
 
Diff
@@ -2,14 +2,11 @@
 Copyright (c) 2022 Yaël Dillies. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Yaël Dillies
-
-! This file was ported from Lean 3 source module topology.hom.open
-! leanprover-community/mathlib commit ad0089aca372256fe53dde13ca0dfea569bf5ac7
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
 -/
 import Mathbin.Topology.ContinuousFunction.Basic
 
+#align_import topology.hom.open from "leanprover-community/mathlib"@"ad0089aca372256fe53dde13ca0dfea569bf5ac7"
+
 /-!
 # Continuous open maps
 
Diff
@@ -43,7 +43,6 @@ structure ContinuousOpenMap (α β : Type _) [TopologicalSpace α] [TopologicalS
 #align continuous_open_map ContinuousOpenMap
 -/
 
--- mathport name: «expr →CO »
 infixr:25 " →CO " => ContinuousOpenMap
 
 section
@@ -85,30 +84,40 @@ directly. -/
 instance : CoeFun (α →CO β) fun _ => α → β :=
   FunLike.hasCoeToFun
 
+#print ContinuousOpenMap.toFun_eq_coe /-
 @[simp]
 theorem toFun_eq_coe {f : α →CO β} : f.toFun = (f : α → β) :=
   rfl
 #align continuous_open_map.to_fun_eq_coe ContinuousOpenMap.toFun_eq_coe
+-/
 
+#print ContinuousOpenMap.ext /-
 @[ext]
 theorem ext {f g : α →CO β} (h : ∀ a, f a = g a) : f = g :=
   FunLike.ext f g h
 #align continuous_open_map.ext ContinuousOpenMap.ext
+-/
 
+#print ContinuousOpenMap.copy /-
 /-- Copy of a `continuous_open_map` with a new `continuous_map` equal to the old one. Useful to fix
 definitional equalities. -/
 protected def copy (f : α →CO β) (f' : α → β) (h : f' = f) : α →CO β :=
   ⟨f.toContinuousMap.copy f' <| h, h.symm.subst f.map_open'⟩
 #align continuous_open_map.copy ContinuousOpenMap.copy
+-/
 
+#print ContinuousOpenMap.coe_copy /-
 @[simp]
 theorem coe_copy (f : α →CO β) (f' : α → β) (h : f' = f) : ⇑(f.copy f' h) = f' :=
   rfl
 #align continuous_open_map.coe_copy ContinuousOpenMap.coe_copy
+-/
 
+#print ContinuousOpenMap.copy_eq /-
 theorem copy_eq (f : α →CO β) (f' : α → β) (h : f' = f) : f.copy f' h = f :=
   FunLike.ext' h
 #align continuous_open_map.copy_eq ContinuousOpenMap.copy_eq
+-/
 
 variable (α)
 
@@ -122,17 +131,21 @@ protected def id : α →CO α :=
 instance : Inhabited (α →CO α) :=
   ⟨ContinuousOpenMap.id _⟩
 
+#print ContinuousOpenMap.coe_id /-
 @[simp]
 theorem coe_id : ⇑(ContinuousOpenMap.id α) = id :=
   rfl
 #align continuous_open_map.coe_id ContinuousOpenMap.coe_id
+-/
 
 variable {α}
 
+#print ContinuousOpenMap.id_apply /-
 @[simp]
 theorem id_apply (a : α) : ContinuousOpenMap.id α a = a :=
   rfl
 #align continuous_open_map.id_apply ContinuousOpenMap.id_apply
+-/
 
 #print ContinuousOpenMap.comp /-
 /-- Composition of `continuous_open_map`s as a `continuous_open_map`. -/
@@ -141,41 +154,55 @@ def comp (f : β →CO γ) (g : α →CO β) : ContinuousOpenMap α γ :=
 #align continuous_open_map.comp ContinuousOpenMap.comp
 -/
 
+#print ContinuousOpenMap.coe_comp /-
 @[simp]
 theorem coe_comp (f : β →CO γ) (g : α →CO β) : (f.comp g : α → γ) = f ∘ g :=
   rfl
 #align continuous_open_map.coe_comp ContinuousOpenMap.coe_comp
+-/
 
+#print ContinuousOpenMap.comp_apply /-
 @[simp]
 theorem comp_apply (f : β →CO γ) (g : α →CO β) (a : α) : (f.comp g) a = f (g a) :=
   rfl
 #align continuous_open_map.comp_apply ContinuousOpenMap.comp_apply
+-/
 
+#print ContinuousOpenMap.comp_assoc /-
 @[simp]
 theorem comp_assoc (f : γ →CO δ) (g : β →CO γ) (h : α →CO β) :
     (f.comp g).comp h = f.comp (g.comp h) :=
   rfl
 #align continuous_open_map.comp_assoc ContinuousOpenMap.comp_assoc
+-/
 
+#print ContinuousOpenMap.comp_id /-
 @[simp]
 theorem comp_id (f : α →CO β) : f.comp (ContinuousOpenMap.id α) = f :=
   ext fun a => rfl
 #align continuous_open_map.comp_id ContinuousOpenMap.comp_id
+-/
 
+#print ContinuousOpenMap.id_comp /-
 @[simp]
 theorem id_comp (f : α →CO β) : (ContinuousOpenMap.id β).comp f = f :=
   ext fun a => rfl
 #align continuous_open_map.id_comp ContinuousOpenMap.id_comp
+-/
 
+#print ContinuousOpenMap.cancel_right /-
 theorem cancel_right {g₁ g₂ : β →CO γ} {f : α →CO β} (hf : Surjective f) :
     g₁.comp f = g₂.comp f ↔ g₁ = g₂ :=
   ⟨fun h => ext <| hf.forall.2 <| FunLike.ext_iff.1 h, congr_arg _⟩
 #align continuous_open_map.cancel_right ContinuousOpenMap.cancel_right
+-/
 
+#print ContinuousOpenMap.cancel_left /-
 theorem cancel_left {g : β →CO γ} {f₁ f₂ : α →CO β} (hg : Injective g) :
     g.comp f₁ = g.comp f₂ ↔ f₁ = f₂ :=
   ⟨fun h => ext fun a => hg <| by rw [← comp_apply, h, comp_apply], congr_arg _⟩
 #align continuous_open_map.cancel_left ContinuousOpenMap.cancel_left
+-/
 
 end ContinuousOpenMap
 
Diff
@@ -38,7 +38,7 @@ variable {F α β γ δ : Type _}
 #print ContinuousOpenMap /-
 /-- The type of continuous open maps from `α` to `β`, aka Priestley homomorphisms. -/
 structure ContinuousOpenMap (α β : Type _) [TopologicalSpace α] [TopologicalSpace β] extends
-  ContinuousMap α β where
+    ContinuousMap α β where
   map_open' : IsOpenMap to_fun
 #align continuous_open_map ContinuousOpenMap
 -/
@@ -53,7 +53,7 @@ section
 
 You should extend this class when you extend `continuous_open_map`. -/
 class ContinuousOpenMapClass (F : Type _) (α β : outParam <| Type _) [TopologicalSpace α]
-  [TopologicalSpace β] extends ContinuousMapClass F α β where
+    [TopologicalSpace β] extends ContinuousMapClass F α β where
   map_open (f : F) : IsOpenMap f
 #align continuous_open_map_class ContinuousOpenMapClass
 -/
Diff
@@ -85,57 +85,27 @@ directly. -/
 instance : CoeFun (α →CO β) fun _ => α → β :=
   FunLike.hasCoeToFun
 
-/- warning: continuous_open_map.to_fun_eq_coe -> ContinuousOpenMap.toFun_eq_coe is a dubious translation:
-lean 3 declaration is
-  forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2}, Eq.{max (succ u1) (succ u2)} (α -> β) (ContinuousMap.toFun.{u1, u2} α β _inst_1 _inst_2 (ContinuousOpenMap.toContinuousMap.{u1, u2} α β _inst_1 _inst_2 f)) (coeFn.{max (succ u1) (succ u2), max (succ u1) (succ u2)} (ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) (fun (_x : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) => α -> β) (ContinuousOpenMap.hasCoeToFun.{u1, u2} α β _inst_1 _inst_2) f)
-but is expected to have type
-  forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2}, Eq.{max (succ u2) (succ u1)} (α -> β) (ContinuousMap.toFun.{u2, u1} α β _inst_1 _inst_2 (ContinuousOpenMap.toContinuousMap.{u2, u1} α β _inst_1 _inst_2 f)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) α (fun (_x : α) => (fun (x._@.Mathlib.Topology.ContinuousFunction.Basic._hyg.699 : α) => β) _x) (ContinuousMapClass.toFunLike.{max u2 u1, u2, u1} (ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) α β _inst_1 _inst_2 (ContinuousOpenMapClass.toContinuousMapClass.{max u2 u1, u2, u1} (ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) α β _inst_1 _inst_2 (ContinuousOpenMap.instContinuousOpenMapClassContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2))) f)
-Case conversion may be inaccurate. Consider using '#align continuous_open_map.to_fun_eq_coe ContinuousOpenMap.toFun_eq_coeₓ'. -/
 @[simp]
 theorem toFun_eq_coe {f : α →CO β} : f.toFun = (f : α → β) :=
   rfl
 #align continuous_open_map.to_fun_eq_coe ContinuousOpenMap.toFun_eq_coe
 
-/- warning: continuous_open_map.ext -> ContinuousOpenMap.ext is a dubious translation:
-lean 3 declaration is
-  forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2} {g : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2}, (forall (a : α), Eq.{succ u2} β (coeFn.{max (succ u1) (succ u2), max (succ u1) (succ u2)} (ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) (fun (_x : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) => α -> β) (ContinuousOpenMap.hasCoeToFun.{u1, u2} α β _inst_1 _inst_2) f a) (coeFn.{max (succ u1) (succ u2), max (succ u1) (succ u2)} (ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) (fun (_x : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) => α -> β) (ContinuousOpenMap.hasCoeToFun.{u1, u2} α β _inst_1 _inst_2) g a)) -> (Eq.{max (succ u1) (succ u2)} (ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) f g)
-but is expected to have type
-  forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2} {g : ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2}, (forall (a : α), Eq.{succ u1} ((fun (x._@.Mathlib.Topology.ContinuousFunction.Basic._hyg.699 : α) => β) a) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) α (fun (_x : α) => (fun (x._@.Mathlib.Topology.ContinuousFunction.Basic._hyg.699 : α) => β) _x) (ContinuousMapClass.toFunLike.{max u2 u1, u2, u1} (ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) α β _inst_1 _inst_2 (ContinuousOpenMapClass.toContinuousMapClass.{max u2 u1, u2, u1} (ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) α β _inst_1 _inst_2 (ContinuousOpenMap.instContinuousOpenMapClassContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2))) f a) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) α (fun (_x : α) => (fun (x._@.Mathlib.Topology.ContinuousFunction.Basic._hyg.699 : α) => β) _x) (ContinuousMapClass.toFunLike.{max u2 u1, u2, u1} (ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) α β _inst_1 _inst_2 (ContinuousOpenMapClass.toContinuousMapClass.{max u2 u1, u2, u1} (ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) α β _inst_1 _inst_2 (ContinuousOpenMap.instContinuousOpenMapClassContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2))) g a)) -> (Eq.{max (succ u2) (succ u1)} (ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) f g)
-Case conversion may be inaccurate. Consider using '#align continuous_open_map.ext ContinuousOpenMap.extₓ'. -/
 @[ext]
 theorem ext {f g : α →CO β} (h : ∀ a, f a = g a) : f = g :=
   FunLike.ext f g h
 #align continuous_open_map.ext ContinuousOpenMap.ext
 
-/- warning: continuous_open_map.copy -> ContinuousOpenMap.copy is a dubious translation:
-lean 3 declaration is
-  forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] (f : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) (f' : α -> β), (Eq.{max (succ u1) (succ u2)} (α -> β) f' (coeFn.{max (succ u1) (succ u2), max (succ u1) (succ u2)} (ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) (fun (_x : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) => α -> β) (ContinuousOpenMap.hasCoeToFun.{u1, u2} α β _inst_1 _inst_2) f)) -> (ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2)
-but is expected to have type
-  forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] (f : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) (f' : α -> β), (Eq.{max (succ u1) (succ u2)} (α -> β) f' (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) α (fun (_x : α) => (fun (x._@.Mathlib.Topology.ContinuousFunction.Basic._hyg.699 : α) => β) _x) (ContinuousMapClass.toFunLike.{max u1 u2, u1, u2} (ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) α β _inst_1 _inst_2 (ContinuousOpenMapClass.toContinuousMapClass.{max u1 u2, u1, u2} (ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) α β _inst_1 _inst_2 (ContinuousOpenMap.instContinuousOpenMapClassContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2))) f)) -> (ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2)
-Case conversion may be inaccurate. Consider using '#align continuous_open_map.copy ContinuousOpenMap.copyₓ'. -/
 /-- Copy of a `continuous_open_map` with a new `continuous_map` equal to the old one. Useful to fix
 definitional equalities. -/
 protected def copy (f : α →CO β) (f' : α → β) (h : f' = f) : α →CO β :=
   ⟨f.toContinuousMap.copy f' <| h, h.symm.subst f.map_open'⟩
 #align continuous_open_map.copy ContinuousOpenMap.copy
 
-/- warning: continuous_open_map.coe_copy -> ContinuousOpenMap.coe_copy is a dubious translation:
-lean 3 declaration is
-  forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] (f : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) (f' : α -> β) (h : Eq.{max (succ u1) (succ u2)} (α -> β) f' (coeFn.{max (succ u1) (succ u2), max (succ u1) (succ u2)} (ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) (fun (_x : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) => α -> β) (ContinuousOpenMap.hasCoeToFun.{u1, u2} α β _inst_1 _inst_2) f)), Eq.{max (succ u1) (succ u2)} (α -> β) (coeFn.{max (succ u1) (succ u2), max (succ u1) (succ u2)} (ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) (fun (_x : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) => α -> β) (ContinuousOpenMap.hasCoeToFun.{u1, u2} α β _inst_1 _inst_2) (ContinuousOpenMap.copy.{u1, u2} α β _inst_1 _inst_2 f f' h)) f'
-but is expected to have type
-  forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] (f : ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) (f' : α -> β) (h : Eq.{max (succ u2) (succ u1)} (α -> β) f' (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) α (fun (_x : α) => (fun (x._@.Mathlib.Topology.ContinuousFunction.Basic._hyg.699 : α) => β) _x) (ContinuousMapClass.toFunLike.{max u2 u1, u2, u1} (ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) α β _inst_1 _inst_2 (ContinuousOpenMapClass.toContinuousMapClass.{max u2 u1, u2, u1} (ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) α β _inst_1 _inst_2 (ContinuousOpenMap.instContinuousOpenMapClassContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2))) f)), Eq.{max (succ u2) (succ u1)} (forall (ᾰ : α), (fun (x._@.Mathlib.Topology.ContinuousFunction.Basic._hyg.699 : α) => β) ᾰ) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) α (fun (_x : α) => (fun (x._@.Mathlib.Topology.ContinuousFunction.Basic._hyg.699 : α) => β) _x) (ContinuousMapClass.toFunLike.{max u2 u1, u2, u1} (ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) α β _inst_1 _inst_2 (ContinuousOpenMapClass.toContinuousMapClass.{max u2 u1, u2, u1} (ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) α β _inst_1 _inst_2 (ContinuousOpenMap.instContinuousOpenMapClassContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2))) (ContinuousOpenMap.copy.{u2, u1} α β _inst_1 _inst_2 f f' h)) f'
-Case conversion may be inaccurate. Consider using '#align continuous_open_map.coe_copy ContinuousOpenMap.coe_copyₓ'. -/
 @[simp]
 theorem coe_copy (f : α →CO β) (f' : α → β) (h : f' = f) : ⇑(f.copy f' h) = f' :=
   rfl
 #align continuous_open_map.coe_copy ContinuousOpenMap.coe_copy
 
-/- warning: continuous_open_map.copy_eq -> ContinuousOpenMap.copy_eq is a dubious translation:
-lean 3 declaration is
-  forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] (f : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) (f' : α -> β) (h : Eq.{max (succ u1) (succ u2)} (α -> β) f' (coeFn.{max (succ u1) (succ u2), max (succ u1) (succ u2)} (ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) (fun (_x : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) => α -> β) (ContinuousOpenMap.hasCoeToFun.{u1, u2} α β _inst_1 _inst_2) f)), Eq.{max (succ u1) (succ u2)} (ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) (ContinuousOpenMap.copy.{u1, u2} α β _inst_1 _inst_2 f f' h) f
-but is expected to have type
-  forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] (f : ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) (f' : α -> β) (h : Eq.{max (succ u2) (succ u1)} (α -> β) f' (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) α (fun (_x : α) => (fun (x._@.Mathlib.Topology.ContinuousFunction.Basic._hyg.699 : α) => β) _x) (ContinuousMapClass.toFunLike.{max u2 u1, u2, u1} (ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) α β _inst_1 _inst_2 (ContinuousOpenMapClass.toContinuousMapClass.{max u2 u1, u2, u1} (ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) α β _inst_1 _inst_2 (ContinuousOpenMap.instContinuousOpenMapClassContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2))) f)), Eq.{max (succ u2) (succ u1)} (ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) (ContinuousOpenMap.copy.{u2, u1} α β _inst_1 _inst_2 f f' h) f
-Case conversion may be inaccurate. Consider using '#align continuous_open_map.copy_eq ContinuousOpenMap.copy_eqₓ'. -/
 theorem copy_eq (f : α →CO β) (f' : α → β) (h : f' = f) : f.copy f' h = f :=
   FunLike.ext' h
 #align continuous_open_map.copy_eq ContinuousOpenMap.copy_eq
@@ -152,12 +122,6 @@ protected def id : α →CO α :=
 instance : Inhabited (α →CO α) :=
   ⟨ContinuousOpenMap.id _⟩
 
-/- warning: continuous_open_map.coe_id -> ContinuousOpenMap.coe_id is a dubious translation:
-lean 3 declaration is
-  forall (α : Type.{u1}) [_inst_1 : TopologicalSpace.{u1} α], Eq.{succ u1} (α -> α) (coeFn.{succ u1, succ u1} (ContinuousOpenMap.{u1, u1} α α _inst_1 _inst_1) (fun (_x : ContinuousOpenMap.{u1, u1} α α _inst_1 _inst_1) => α -> α) (ContinuousOpenMap.hasCoeToFun.{u1, u1} α α _inst_1 _inst_1) (ContinuousOpenMap.id.{u1} α _inst_1)) (id.{succ u1} α)
-but is expected to have type
-  forall (α : Type.{u1}) [_inst_1 : TopologicalSpace.{u1} α], Eq.{succ u1} (forall (ᾰ : α), (fun (x._@.Mathlib.Topology.ContinuousFunction.Basic._hyg.699 : α) => α) ᾰ) (FunLike.coe.{succ u1, succ u1, succ u1} (ContinuousOpenMap.{u1, u1} α α _inst_1 _inst_1) α (fun (_x : α) => (fun (x._@.Mathlib.Topology.ContinuousFunction.Basic._hyg.699 : α) => α) _x) (ContinuousMapClass.toFunLike.{u1, u1, u1} (ContinuousOpenMap.{u1, u1} α α _inst_1 _inst_1) α α _inst_1 _inst_1 (ContinuousOpenMapClass.toContinuousMapClass.{u1, u1, u1} (ContinuousOpenMap.{u1, u1} α α _inst_1 _inst_1) α α _inst_1 _inst_1 (ContinuousOpenMap.instContinuousOpenMapClassContinuousOpenMap.{u1, u1} α α _inst_1 _inst_1))) (ContinuousOpenMap.id.{u1} α _inst_1)) (id.{succ u1} α)
-Case conversion may be inaccurate. Consider using '#align continuous_open_map.coe_id ContinuousOpenMap.coe_idₓ'. -/
 @[simp]
 theorem coe_id : ⇑(ContinuousOpenMap.id α) = id :=
   rfl
@@ -165,12 +129,6 @@ theorem coe_id : ⇑(ContinuousOpenMap.id α) = id :=
 
 variable {α}
 
-/- warning: continuous_open_map.id_apply -> ContinuousOpenMap.id_apply is a dubious translation:
-lean 3 declaration is
-  forall {α : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} α] (a : α), Eq.{succ u1} α (coeFn.{succ u1, succ u1} (ContinuousOpenMap.{u1, u1} α α _inst_1 _inst_1) (fun (_x : ContinuousOpenMap.{u1, u1} α α _inst_1 _inst_1) => α -> α) (ContinuousOpenMap.hasCoeToFun.{u1, u1} α α _inst_1 _inst_1) (ContinuousOpenMap.id.{u1} α _inst_1) a) a
-but is expected to have type
-  forall {α : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} α] (a : α), Eq.{succ u1} ((fun (x._@.Mathlib.Topology.ContinuousFunction.Basic._hyg.699 : α) => α) a) (FunLike.coe.{succ u1, succ u1, succ u1} (ContinuousOpenMap.{u1, u1} α α _inst_1 _inst_1) α (fun (_x : α) => (fun (x._@.Mathlib.Topology.ContinuousFunction.Basic._hyg.699 : α) => α) _x) (ContinuousMapClass.toFunLike.{u1, u1, u1} (ContinuousOpenMap.{u1, u1} α α _inst_1 _inst_1) α α _inst_1 _inst_1 (ContinuousOpenMapClass.toContinuousMapClass.{u1, u1, u1} (ContinuousOpenMap.{u1, u1} α α _inst_1 _inst_1) α α _inst_1 _inst_1 (ContinuousOpenMap.instContinuousOpenMapClassContinuousOpenMap.{u1, u1} α α _inst_1 _inst_1))) (ContinuousOpenMap.id.{u1} α _inst_1) a) a
-Case conversion may be inaccurate. Consider using '#align continuous_open_map.id_apply ContinuousOpenMap.id_applyₓ'. -/
 @[simp]
 theorem id_apply (a : α) : ContinuousOpenMap.id α a = a :=
   rfl
@@ -183,79 +141,37 @@ def comp (f : β →CO γ) (g : α →CO β) : ContinuousOpenMap α γ :=
 #align continuous_open_map.comp ContinuousOpenMap.comp
 -/
 
-/- warning: continuous_open_map.coe_comp -> ContinuousOpenMap.coe_comp is a dubious translation:
-lean 3 declaration is
-  forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] (f : ContinuousOpenMap.{u2, u3} β γ _inst_2 _inst_3) (g : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2), Eq.{max (succ u1) (succ u3)} ((fun (_x : ContinuousOpenMap.{u1, u3} α γ _inst_1 _inst_3) => α -> γ) (ContinuousOpenMap.comp.{u1, u2, u3} α β γ _inst_1 _inst_2 _inst_3 f g)) (coeFn.{max (succ u1) (succ u3), max (succ u1) (succ u3)} (ContinuousOpenMap.{u1, u3} α γ _inst_1 _inst_3) (fun (_x : ContinuousOpenMap.{u1, u3} α γ _inst_1 _inst_3) => α -> γ) (ContinuousOpenMap.hasCoeToFun.{u1, u3} α γ _inst_1 _inst_3) (ContinuousOpenMap.comp.{u1, u2, u3} α β γ _inst_1 _inst_2 _inst_3 f g)) (Function.comp.{succ u1, succ u2, succ u3} α β γ (coeFn.{max (succ u2) (succ u3), max (succ u2) (succ u3)} (ContinuousOpenMap.{u2, u3} β γ _inst_2 _inst_3) (fun (_x : ContinuousOpenMap.{u2, u3} β γ _inst_2 _inst_3) => β -> γ) (ContinuousOpenMap.hasCoeToFun.{u2, u3} β γ _inst_2 _inst_3) f) (coeFn.{max (succ u1) (succ u2), max (succ u1) (succ u2)} (ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) (fun (_x : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) => α -> β) (ContinuousOpenMap.hasCoeToFun.{u1, u2} α β _inst_1 _inst_2) g))
-but is expected to have type
-  forall {α : Type.{u1}} {β : Type.{u3}} {γ : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u3} β] [_inst_3 : TopologicalSpace.{u2} γ] (f : ContinuousOpenMap.{u3, u2} β γ _inst_2 _inst_3) (g : ContinuousOpenMap.{u1, u3} α β _inst_1 _inst_2), Eq.{max (succ u1) (succ u2)} (forall (a : α), (fun (x._@.Mathlib.Topology.ContinuousFunction.Basic._hyg.699 : α) => γ) a) (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (ContinuousOpenMap.{u1, u2} α γ _inst_1 _inst_3) α (fun (_x : α) => (fun (x._@.Mathlib.Topology.ContinuousFunction.Basic._hyg.699 : α) => γ) _x) (ContinuousMapClass.toFunLike.{max u1 u2, u1, u2} (ContinuousOpenMap.{u1, u2} α γ _inst_1 _inst_3) α γ _inst_1 _inst_3 (ContinuousOpenMapClass.toContinuousMapClass.{max u1 u2, u1, u2} (ContinuousOpenMap.{u1, u2} α γ _inst_1 _inst_3) α γ _inst_1 _inst_3 (ContinuousOpenMap.instContinuousOpenMapClassContinuousOpenMap.{u1, u2} α γ _inst_1 _inst_3))) (ContinuousOpenMap.comp.{u1, u3, u2} α β γ _inst_1 _inst_2 _inst_3 f g)) (Function.comp.{succ u1, succ u3, succ u2} α β γ (FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (ContinuousOpenMap.{u3, u2} β γ _inst_2 _inst_3) β (fun (_x : β) => (fun (x._@.Mathlib.Topology.ContinuousFunction.Basic._hyg.699 : β) => γ) _x) (ContinuousMapClass.toFunLike.{max u3 u2, u3, u2} (ContinuousOpenMap.{u3, u2} β γ _inst_2 _inst_3) β γ _inst_2 _inst_3 (ContinuousOpenMapClass.toContinuousMapClass.{max u3 u2, u3, u2} (ContinuousOpenMap.{u3, u2} β γ _inst_2 _inst_3) β γ _inst_2 _inst_3 (ContinuousOpenMap.instContinuousOpenMapClassContinuousOpenMap.{u3, u2} β γ _inst_2 _inst_3))) f) (FunLike.coe.{max (succ u1) (succ u3), succ u1, succ u3} (ContinuousOpenMap.{u1, u3} α β _inst_1 _inst_2) α (fun (_x : α) => (fun (x._@.Mathlib.Topology.ContinuousFunction.Basic._hyg.699 : α) => β) _x) (ContinuousMapClass.toFunLike.{max u1 u3, u1, u3} (ContinuousOpenMap.{u1, u3} α β _inst_1 _inst_2) α β _inst_1 _inst_2 (ContinuousOpenMapClass.toContinuousMapClass.{max u1 u3, u1, u3} (ContinuousOpenMap.{u1, u3} α β _inst_1 _inst_2) α β _inst_1 _inst_2 (ContinuousOpenMap.instContinuousOpenMapClassContinuousOpenMap.{u1, u3} α β _inst_1 _inst_2))) g))
-Case conversion may be inaccurate. Consider using '#align continuous_open_map.coe_comp ContinuousOpenMap.coe_compₓ'. -/
 @[simp]
 theorem coe_comp (f : β →CO γ) (g : α →CO β) : (f.comp g : α → γ) = f ∘ g :=
   rfl
 #align continuous_open_map.coe_comp ContinuousOpenMap.coe_comp
 
-/- warning: continuous_open_map.comp_apply -> ContinuousOpenMap.comp_apply is a dubious translation:
-lean 3 declaration is
-  forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] (f : ContinuousOpenMap.{u2, u3} β γ _inst_2 _inst_3) (g : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) (a : α), Eq.{succ u3} γ (coeFn.{max (succ u1) (succ u3), max (succ u1) (succ u3)} (ContinuousOpenMap.{u1, u3} α γ _inst_1 _inst_3) (fun (_x : ContinuousOpenMap.{u1, u3} α γ _inst_1 _inst_3) => α -> γ) (ContinuousOpenMap.hasCoeToFun.{u1, u3} α γ _inst_1 _inst_3) (ContinuousOpenMap.comp.{u1, u2, u3} α β γ _inst_1 _inst_2 _inst_3 f g) a) (coeFn.{max (succ u2) (succ u3), max (succ u2) (succ u3)} (ContinuousOpenMap.{u2, u3} β γ _inst_2 _inst_3) (fun (_x : ContinuousOpenMap.{u2, u3} β γ _inst_2 _inst_3) => β -> γ) (ContinuousOpenMap.hasCoeToFun.{u2, u3} β γ _inst_2 _inst_3) f (coeFn.{max (succ u1) (succ u2), max (succ u1) (succ u2)} (ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) (fun (_x : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) => α -> β) (ContinuousOpenMap.hasCoeToFun.{u1, u2} α β _inst_1 _inst_2) g a))
-but is expected to have type
-  forall {α : Type.{u1}} {β : Type.{u3}} {γ : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u3} β] [_inst_3 : TopologicalSpace.{u2} γ] (f : ContinuousOpenMap.{u3, u2} β γ _inst_2 _inst_3) (g : ContinuousOpenMap.{u1, u3} α β _inst_1 _inst_2) (a : α), Eq.{succ u2} ((fun (x._@.Mathlib.Topology.ContinuousFunction.Basic._hyg.699 : α) => γ) a) (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (ContinuousOpenMap.{u1, u2} α γ _inst_1 _inst_3) α (fun (_x : α) => (fun (x._@.Mathlib.Topology.ContinuousFunction.Basic._hyg.699 : α) => γ) _x) (ContinuousMapClass.toFunLike.{max u1 u2, u1, u2} (ContinuousOpenMap.{u1, u2} α γ _inst_1 _inst_3) α γ _inst_1 _inst_3 (ContinuousOpenMapClass.toContinuousMapClass.{max u1 u2, u1, u2} (ContinuousOpenMap.{u1, u2} α γ _inst_1 _inst_3) α γ _inst_1 _inst_3 (ContinuousOpenMap.instContinuousOpenMapClassContinuousOpenMap.{u1, u2} α γ _inst_1 _inst_3))) (ContinuousOpenMap.comp.{u1, u3, u2} α β γ _inst_1 _inst_2 _inst_3 f g) a) (FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (ContinuousOpenMap.{u3, u2} β γ _inst_2 _inst_3) β (fun (_x : β) => (fun (x._@.Mathlib.Topology.ContinuousFunction.Basic._hyg.699 : β) => γ) _x) (ContinuousMapClass.toFunLike.{max u3 u2, u3, u2} (ContinuousOpenMap.{u3, u2} β γ _inst_2 _inst_3) β γ _inst_2 _inst_3 (ContinuousOpenMapClass.toContinuousMapClass.{max u3 u2, u3, u2} (ContinuousOpenMap.{u3, u2} β γ _inst_2 _inst_3) β γ _inst_2 _inst_3 (ContinuousOpenMap.instContinuousOpenMapClassContinuousOpenMap.{u3, u2} β γ _inst_2 _inst_3))) f (FunLike.coe.{max (succ u1) (succ u3), succ u1, succ u3} (ContinuousOpenMap.{u1, u3} α β _inst_1 _inst_2) α (fun (_x : α) => (fun (x._@.Mathlib.Topology.ContinuousFunction.Basic._hyg.699 : α) => β) _x) (ContinuousMapClass.toFunLike.{max u1 u3, u1, u3} (ContinuousOpenMap.{u1, u3} α β _inst_1 _inst_2) α β _inst_1 _inst_2 (ContinuousOpenMapClass.toContinuousMapClass.{max u1 u3, u1, u3} (ContinuousOpenMap.{u1, u3} α β _inst_1 _inst_2) α β _inst_1 _inst_2 (ContinuousOpenMap.instContinuousOpenMapClassContinuousOpenMap.{u1, u3} α β _inst_1 _inst_2))) g a))
-Case conversion may be inaccurate. Consider using '#align continuous_open_map.comp_apply ContinuousOpenMap.comp_applyₓ'. -/
 @[simp]
 theorem comp_apply (f : β →CO γ) (g : α →CO β) (a : α) : (f.comp g) a = f (g a) :=
   rfl
 #align continuous_open_map.comp_apply ContinuousOpenMap.comp_apply
 
-/- warning: continuous_open_map.comp_assoc -> ContinuousOpenMap.comp_assoc is a dubious translation:
-lean 3 declaration is
-  forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} {δ : Type.{u4}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] [_inst_4 : TopologicalSpace.{u4} δ] (f : ContinuousOpenMap.{u3, u4} γ δ _inst_3 _inst_4) (g : ContinuousOpenMap.{u2, u3} β γ _inst_2 _inst_3) (h : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2), Eq.{max (succ u1) (succ u4)} (ContinuousOpenMap.{u1, u4} α δ _inst_1 _inst_4) (ContinuousOpenMap.comp.{u1, u2, u4} α β δ _inst_1 _inst_2 _inst_4 (ContinuousOpenMap.comp.{u2, u3, u4} β γ δ _inst_2 _inst_3 _inst_4 f g) h) (ContinuousOpenMap.comp.{u1, u3, u4} α γ δ _inst_1 _inst_3 _inst_4 f (ContinuousOpenMap.comp.{u1, u2, u3} α β γ _inst_1 _inst_2 _inst_3 g h))
-but is expected to have type
-  forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u4}} {δ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u4} γ] [_inst_4 : TopologicalSpace.{u3} δ] (f : ContinuousOpenMap.{u4, u3} γ δ _inst_3 _inst_4) (g : ContinuousOpenMap.{u2, u4} β γ _inst_2 _inst_3) (h : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2), Eq.{max (succ u1) (succ u3)} (ContinuousOpenMap.{u1, u3} α δ _inst_1 _inst_4) (ContinuousOpenMap.comp.{u1, u2, u3} α β δ _inst_1 _inst_2 _inst_4 (ContinuousOpenMap.comp.{u2, u4, u3} β γ δ _inst_2 _inst_3 _inst_4 f g) h) (ContinuousOpenMap.comp.{u1, u4, u3} α γ δ _inst_1 _inst_3 _inst_4 f (ContinuousOpenMap.comp.{u1, u2, u4} α β γ _inst_1 _inst_2 _inst_3 g h))
-Case conversion may be inaccurate. Consider using '#align continuous_open_map.comp_assoc ContinuousOpenMap.comp_assocₓ'. -/
 @[simp]
 theorem comp_assoc (f : γ →CO δ) (g : β →CO γ) (h : α →CO β) :
     (f.comp g).comp h = f.comp (g.comp h) :=
   rfl
 #align continuous_open_map.comp_assoc ContinuousOpenMap.comp_assoc
 
-/- warning: continuous_open_map.comp_id -> ContinuousOpenMap.comp_id is a dubious translation:
-lean 3 declaration is
-  forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] (f : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2), Eq.{max (succ u1) (succ u2)} (ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) (ContinuousOpenMap.comp.{u1, u1, u2} α α β _inst_1 _inst_1 _inst_2 f (ContinuousOpenMap.id.{u1} α _inst_1)) f
-but is expected to have type
-  forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] (f : ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2), Eq.{max (succ u2) (succ u1)} (ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) (ContinuousOpenMap.comp.{u2, u2, u1} α α β _inst_1 _inst_1 _inst_2 f (ContinuousOpenMap.id.{u2} α _inst_1)) f
-Case conversion may be inaccurate. Consider using '#align continuous_open_map.comp_id ContinuousOpenMap.comp_idₓ'. -/
 @[simp]
 theorem comp_id (f : α →CO β) : f.comp (ContinuousOpenMap.id α) = f :=
   ext fun a => rfl
 #align continuous_open_map.comp_id ContinuousOpenMap.comp_id
 
-/- warning: continuous_open_map.id_comp -> ContinuousOpenMap.id_comp is a dubious translation:
-lean 3 declaration is
-  forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] (f : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2), Eq.{max (succ u1) (succ u2)} (ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) (ContinuousOpenMap.comp.{u1, u2, u2} α β β _inst_1 _inst_2 _inst_2 (ContinuousOpenMap.id.{u2} β _inst_2) f) f
-but is expected to have type
-  forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] (f : ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2), Eq.{max (succ u2) (succ u1)} (ContinuousOpenMap.{u2, u1} α β _inst_1 _inst_2) (ContinuousOpenMap.comp.{u2, u1, u1} α β β _inst_1 _inst_2 _inst_2 (ContinuousOpenMap.id.{u1} β _inst_2) f) f
-Case conversion may be inaccurate. Consider using '#align continuous_open_map.id_comp ContinuousOpenMap.id_compₓ'. -/
 @[simp]
 theorem id_comp (f : α →CO β) : (ContinuousOpenMap.id β).comp f = f :=
   ext fun a => rfl
 #align continuous_open_map.id_comp ContinuousOpenMap.id_comp
 
-/- warning: continuous_open_map.cancel_right -> ContinuousOpenMap.cancel_right is a dubious translation:
-lean 3 declaration is
-  forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] {g₁ : ContinuousOpenMap.{u2, u3} β γ _inst_2 _inst_3} {g₂ : ContinuousOpenMap.{u2, u3} β γ _inst_2 _inst_3} {f : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2}, (Function.Surjective.{succ u1, succ u2} α β (coeFn.{max (succ u1) (succ u2), max (succ u1) (succ u2)} (ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) (fun (_x : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) => α -> β) (ContinuousOpenMap.hasCoeToFun.{u1, u2} α β _inst_1 _inst_2) f)) -> (Iff (Eq.{max (succ u1) (succ u3)} (ContinuousOpenMap.{u1, u3} α γ _inst_1 _inst_3) (ContinuousOpenMap.comp.{u1, u2, u3} α β γ _inst_1 _inst_2 _inst_3 g₁ f) (ContinuousOpenMap.comp.{u1, u2, u3} α β γ _inst_1 _inst_2 _inst_3 g₂ f)) (Eq.{max (succ u2) (succ u3)} (ContinuousOpenMap.{u2, u3} β γ _inst_2 _inst_3) g₁ g₂))
-but is expected to have type
-  forall {α : Type.{u1}} {β : Type.{u3}} {γ : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u3} β] [_inst_3 : TopologicalSpace.{u2} γ] {g₁ : ContinuousOpenMap.{u3, u2} β γ _inst_2 _inst_3} {g₂ : ContinuousOpenMap.{u3, u2} β γ _inst_2 _inst_3} {f : ContinuousOpenMap.{u1, u3} α β _inst_1 _inst_2}, (Function.Surjective.{succ u1, succ u3} α β (FunLike.coe.{max (succ u1) (succ u3), succ u1, succ u3} (ContinuousOpenMap.{u1, u3} α β _inst_1 _inst_2) α (fun (_x : α) => (fun (x._@.Mathlib.Topology.ContinuousFunction.Basic._hyg.699 : α) => β) _x) (ContinuousMapClass.toFunLike.{max u1 u3, u1, u3} (ContinuousOpenMap.{u1, u3} α β _inst_1 _inst_2) α β _inst_1 _inst_2 (ContinuousOpenMapClass.toContinuousMapClass.{max u1 u3, u1, u3} (ContinuousOpenMap.{u1, u3} α β _inst_1 _inst_2) α β _inst_1 _inst_2 (ContinuousOpenMap.instContinuousOpenMapClassContinuousOpenMap.{u1, u3} α β _inst_1 _inst_2))) f)) -> (Iff (Eq.{max (succ u1) (succ u2)} (ContinuousOpenMap.{u1, u2} α γ _inst_1 _inst_3) (ContinuousOpenMap.comp.{u1, u3, u2} α β γ _inst_1 _inst_2 _inst_3 g₁ f) (ContinuousOpenMap.comp.{u1, u3, u2} α β γ _inst_1 _inst_2 _inst_3 g₂ f)) (Eq.{max (succ u3) (succ u2)} (ContinuousOpenMap.{u3, u2} β γ _inst_2 _inst_3) g₁ g₂))
-Case conversion may be inaccurate. Consider using '#align continuous_open_map.cancel_right ContinuousOpenMap.cancel_rightₓ'. -/
 theorem cancel_right {g₁ g₂ : β →CO γ} {f : α →CO β} (hf : Surjective f) :
     g₁.comp f = g₂.comp f ↔ g₁ = g₂ :=
   ⟨fun h => ext <| hf.forall.2 <| FunLike.ext_iff.1 h, congr_arg _⟩
 #align continuous_open_map.cancel_right ContinuousOpenMap.cancel_right
 
-/- warning: continuous_open_map.cancel_left -> ContinuousOpenMap.cancel_left is a dubious translation:
-lean 3 declaration is
-  forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] {g : ContinuousOpenMap.{u2, u3} β γ _inst_2 _inst_3} {f₁ : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2} {f₂ : ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2}, (Function.Injective.{succ u2, succ u3} β γ (coeFn.{max (succ u2) (succ u3), max (succ u2) (succ u3)} (ContinuousOpenMap.{u2, u3} β γ _inst_2 _inst_3) (fun (_x : ContinuousOpenMap.{u2, u3} β γ _inst_2 _inst_3) => β -> γ) (ContinuousOpenMap.hasCoeToFun.{u2, u3} β γ _inst_2 _inst_3) g)) -> (Iff (Eq.{max (succ u1) (succ u3)} (ContinuousOpenMap.{u1, u3} α γ _inst_1 _inst_3) (ContinuousOpenMap.comp.{u1, u2, u3} α β γ _inst_1 _inst_2 _inst_3 g f₁) (ContinuousOpenMap.comp.{u1, u2, u3} α β γ _inst_1 _inst_2 _inst_3 g f₂)) (Eq.{max (succ u1) (succ u2)} (ContinuousOpenMap.{u1, u2} α β _inst_1 _inst_2) f₁ f₂))
-but is expected to have type
-  forall {α : Type.{u1}} {β : Type.{u3}} {γ : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u3} β] [_inst_3 : TopologicalSpace.{u2} γ] {g : ContinuousOpenMap.{u3, u2} β γ _inst_2 _inst_3} {f₁ : ContinuousOpenMap.{u1, u3} α β _inst_1 _inst_2} {f₂ : ContinuousOpenMap.{u1, u3} α β _inst_1 _inst_2}, (Function.Injective.{succ u3, succ u2} β γ (FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (ContinuousOpenMap.{u3, u2} β γ _inst_2 _inst_3) β (fun (_x : β) => (fun (x._@.Mathlib.Topology.ContinuousFunction.Basic._hyg.699 : β) => γ) _x) (ContinuousMapClass.toFunLike.{max u3 u2, u3, u2} (ContinuousOpenMap.{u3, u2} β γ _inst_2 _inst_3) β γ _inst_2 _inst_3 (ContinuousOpenMapClass.toContinuousMapClass.{max u3 u2, u3, u2} (ContinuousOpenMap.{u3, u2} β γ _inst_2 _inst_3) β γ _inst_2 _inst_3 (ContinuousOpenMap.instContinuousOpenMapClassContinuousOpenMap.{u3, u2} β γ _inst_2 _inst_3))) g)) -> (Iff (Eq.{max (succ u1) (succ u2)} (ContinuousOpenMap.{u1, u2} α γ _inst_1 _inst_3) (ContinuousOpenMap.comp.{u1, u3, u2} α β γ _inst_1 _inst_2 _inst_3 g f₁) (ContinuousOpenMap.comp.{u1, u3, u2} α β γ _inst_1 _inst_2 _inst_3 g f₂)) (Eq.{max (succ u1) (succ u3)} (ContinuousOpenMap.{u1, u3} α β _inst_1 _inst_2) f₁ f₂))
-Case conversion may be inaccurate. Consider using '#align continuous_open_map.cancel_left ContinuousOpenMap.cancel_leftₓ'. -/
 theorem cancel_left {g : β →CO γ} {f₁ f₂ : α →CO β} (hg : Injective g) :
     g.comp f₁ = g.comp f₂ ↔ f₁ = f₂ :=
   ⟨fun h => ext fun a => hg <| by rw [← comp_apply, h, comp_apply], congr_arg _⟩
Diff
@@ -76,10 +76,7 @@ variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ] [Topo
 instance : ContinuousOpenMapClass (α →CO β) α β
     where
   coe f := f.toFun
-  coe_injective' f g h := by
-    obtain ⟨⟨_, _⟩, _⟩ := f
-    obtain ⟨⟨_, _⟩, _⟩ := g
-    congr
+  coe_injective' f g h := by obtain ⟨⟨_, _⟩, _⟩ := f; obtain ⟨⟨_, _⟩, _⟩ := g; congr
   map_continuous f := f.continuous_toFun
   map_open f := f.map_open'
 

Changes in mathlib4

mathlib3
mathlib4
style: homogenise porting notes (#11145)

Homogenises porting notes via capitalisation and addition of whitespace.

It makes the following changes:

  • converts "--porting note" into "-- Porting note";
  • converts "porting note" into "Porting note".
Diff
@@ -78,7 +78,7 @@ theorem toFun_eq_coe {f : α →CO β} : f.toFun = (f : α → β) :=
   rfl
 #align continuous_open_map.to_fun_eq_coe ContinuousOpenMap.toFun_eq_coe
 
-@[simp] -- porting note: new, simpNF of `toFun_eq_coe`
+@[simp] -- Porting note: new, simpNF of `toFun_eq_coe`
 theorem coe_toContinuousMap (f : α →CO β) : (f.toContinuousMap : α → β) = f := rfl
 
 @[ext]
refactor(Data/FunLike): use unbundled inheritance from FunLike (#8386)

The FunLike hierarchy is very big and gets scanned through each time we need a coercion (via the CoeFun instance). It looks like unbundled inheritance suits Lean 4 better here. The only class that still extends FunLike is EquivLike, since that has a custom coe_injective' field that is easier to implement. All other classes should take FunLike or EquivLike as a parameter.

Zulip thread

Important changes

Previously, morphism classes would be Type-valued and extend FunLike:

/-- `MyHomClass F A B` states that `F` is a type of `MyClass.op`-preserving morphisms.
You should extend this class when you extend `MyHom`. -/
class MyHomClass (F : Type*) (A B : outParam <| Type*) [MyClass A] [MyClass B]
  extends FunLike F A B :=
(map_op : ∀ (f : F) (x y : A), f (MyClass.op x y) = MyClass.op (f x) (f y))

After this PR, they should be Prop-valued and take FunLike as a parameter:

/-- `MyHomClass F A B` states that `F` is a type of `MyClass.op`-preserving morphisms.
You should extend this class when you extend `MyHom`. -/
class MyHomClass (F : Type*) (A B : outParam <| Type*) [MyClass A] [MyClass B]
  [FunLike F A B] : Prop :=
(map_op : ∀ (f : F) (x y : A), f (MyClass.op x y) = MyClass.op (f x) (f y))

(Note that A B stay marked as outParam even though they are not purely required to be so due to the FunLike parameter already filling them in. This is required to see through type synonyms, which is important in the category theory library. Also, I think keeping them as outParam is slightly faster.)

Similarly, MyEquivClass should take EquivLike as a parameter.

As a result, every mention of [MyHomClass F A B] should become [FunLike F A B] [MyHomClass F A B].

Remaining issues

Slower (failing) search

While overall this gives some great speedups, there are some cases that are noticeably slower. In particular, a failing application of a lemma such as map_mul is more expensive. This is due to suboptimal processing of arguments. For example:

variable [FunLike F M N] [Mul M] [Mul N] (f : F) (x : M) (y : M)

theorem map_mul [MulHomClass F M N] : f (x * y) = f x * f y

example [AddHomClass F A B] : f (x * y) = f x * f y := map_mul f _ _

Before this PR, applying map_mul f gives the goals [Mul ?M] [Mul ?N] [MulHomClass F ?M ?N]. Since M and N are out_params, [MulHomClass F ?M ?N] is synthesized first, supplies values for ?M and ?N and then the Mul M and Mul N instances can be found.

After this PR, the goals become [FunLike F ?M ?N] [Mul ?M] [Mul ?N] [MulHomClass F ?M ?N]. Now [FunLike F ?M ?N] is synthesized first, supplies values for ?M and ?N and then the Mul M and Mul N instances can be found, before trying MulHomClass F M N which fails. Since the Mul hierarchy is very big, this can be slow to fail, especially when there is no such Mul instance.

A long-term but harder to achieve solution would be to specify the order in which instance goals get solved. For example, we'd like to change the arguments to map_mul to look like [FunLike F M N] [Mul M] [Mul N] [highPriority <| MulHomClass F M N] because MulHomClass fails or succeeds much faster than the others.

As a consequence, the simpNF linter is much slower since by design it tries and fails to apply many map_ lemmas. The same issue occurs a few times in existing calls to simp [map_mul], where map_mul is tried "too soon" and fails. Thanks to the speedup of leanprover/lean4#2478 the impact is very limited, only in files that already were close to the timeout.

simp not firing sometimes

This affects map_smulₛₗ and related definitions. For simp lemmas Lean apparently uses a slightly different mechanism to find instances, so that rw can find every argument to map_smulₛₗ successfully but simp can't: leanprover/lean4#3701.

Missing instances due to unification failing

Especially in the category theory library, we might sometimes have a type A which is also accessible as a synonym (Bundled A hA).1. Instance synthesis doesn't always work if we have f : A →* B but x * y : (Bundled A hA).1 or vice versa. This seems to be mostly fixed by keeping A B as outParams in MulHomClass F A B. (Presumably because Lean will do a definitional check A =?= (Bundled A hA).1 instead of using the syntax in the discrimination tree.)

Workaround for issues

The timeouts can be worked around for now by specifying which map_mul we mean, either as map_mul f for some explicit f, or as e.g. MonoidHomClass.map_mul.

map_smulₛₗ not firing as simp lemma can be worked around by going back to the pre-FunLike situation and making LinearMap.map_smulₛₗ a simp lemma instead of the generic map_smulₛₗ. Writing simp [map_smulₛₗ _] also works.

Co-authored-by: Matthew Ballard <matt@mrb.email> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Scott Morrison <scott@tqft.net> Co-authored-by: Anne Baanen <Vierkantor@users.noreply.github.com>

Diff
@@ -43,7 +43,7 @@ section
 
 You should extend this class when you extend `ContinuousOpenMap`. -/
 class ContinuousOpenMapClass (F : Type*) (α β : outParam <| Type*) [TopologicalSpace α]
-  [TopologicalSpace β] extends ContinuousMapClass F α β where
+  [TopologicalSpace β] [FunLike F α β] extends ContinuousMapClass F α β : Prop where
   map_open (f : F) : IsOpenMap f
 #align continuous_open_map_class ContinuousOpenMapClass
 
@@ -51,7 +51,8 @@ end
 
 export ContinuousOpenMapClass (map_open)
 
-instance [TopologicalSpace α] [TopologicalSpace β] [ContinuousOpenMapClass F α β] :
+instance [TopologicalSpace α] [TopologicalSpace β] [FunLike F α β]
+    [ContinuousOpenMapClass F α β] :
     CoeTC F (α →CO β) :=
   ⟨fun f => ⟨f, map_open f⟩⟩
 
@@ -62,12 +63,14 @@ namespace ContinuousOpenMap
 
 variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ] [TopologicalSpace δ]
 
-instance : ContinuousOpenMapClass (α →CO β) α β where
+instance instFunLike : FunLike (α →CO β) α β where
   coe f := f.toFun
   coe_injective' f g h := by
     obtain ⟨⟨_, _⟩, _⟩ := f
     obtain ⟨⟨_, _⟩, _⟩ := g
     congr
+
+instance : ContinuousOpenMapClass (α →CO β) α β where
   map_continuous f := f.continuous_toFun
   map_open f := f.map_open'
 
chore(*): rename FunLike to DFunLike (#9785)

This prepares for the introduction of a non-dependent synonym of FunLike, which helps a lot with keeping #8386 readable.

This is entirely search-and-replace in 680197f combined with manual fixes in 4145626, e900597 and b8428f8. The commands that generated this change:

sed -i 's/\bFunLike\b/DFunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean
sed -i 's/\btoFunLike\b/toDFunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean
sed -i 's/import Mathlib.Data.DFunLike/import Mathlib.Data.FunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean
sed -i 's/\bHom_FunLike\b/Hom_DFunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean     
sed -i 's/\binstFunLike\b/instDFunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean
sed -i 's/\bfunLike\b/instDFunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean
sed -i 's/\btoo many metavariables to apply `fun_like.has_coe_to_fun`/too many metavariables to apply `DFunLike.hasCoeToFun`/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean

Co-authored-by: Anne Baanen <Vierkantor@users.noreply.github.com>

Diff
@@ -12,7 +12,7 @@ import Mathlib.Topology.ContinuousFunction.Basic
 
 This file defines bundled continuous open maps.
 
-We use the `FunLike` design, so each type of morphisms has a companion typeclass which is meant to
+We use the `DFunLike` design, so each type of morphisms has a companion typeclass which is meant to
 be satisfied by itself and all stricter types.
 
 ## Types of morphisms
@@ -80,7 +80,7 @@ theorem coe_toContinuousMap (f : α →CO β) : (f.toContinuousMap : α → β)
 
 @[ext]
 theorem ext {f g : α →CO β} (h : ∀ a, f a = g a) : f = g :=
-  FunLike.ext f g h
+  DFunLike.ext f g h
 #align continuous_open_map.ext ContinuousOpenMap.ext
 
 /-- Copy of a `ContinuousOpenMap` with a new `ContinuousMap` equal to the old one. Useful to fix
@@ -95,7 +95,7 @@ theorem coe_copy (f : α →CO β) (f' : α → β) (h : f' = f) : ⇑(f.copy f'
 #align continuous_open_map.coe_copy ContinuousOpenMap.coe_copy
 
 theorem copy_eq (f : α →CO β) (f' : α → β) (h : f' = f) : f.copy f' h = f :=
-  FunLike.ext' h
+  DFunLike.ext' h
 #align continuous_open_map.copy_eq ContinuousOpenMap.copy_eq
 
 variable (α)
@@ -154,7 +154,7 @@ theorem id_comp (f : α →CO β) : (ContinuousOpenMap.id β).comp f = f :=
 @[simp]
 theorem cancel_right {g₁ g₂ : β →CO γ} {f : α →CO β} (hf : Surjective f) :
     g₁.comp f = g₂.comp f ↔ g₁ = g₂ :=
-  ⟨fun h => ext <| hf.forall.2 <| FunLike.ext_iff.1 h, fun h => congr_arg₂ _ h rfl⟩
+  ⟨fun h => ext <| hf.forall.2 <| DFunLike.ext_iff.1 h, fun h => congr_arg₂ _ h rfl⟩
 #align continuous_open_map.cancel_right ContinuousOpenMap.cancel_right
 
 @[simp]
chore: @[simp] cancel_(right|left) (#6300)

Co-authored-by: Scott Morrison <scott.morrison@gmail.com>

Diff
@@ -151,15 +151,16 @@ theorem id_comp (f : α →CO β) : (ContinuousOpenMap.id β).comp f = f :=
   ext fun _ => rfl
 #align continuous_open_map.id_comp ContinuousOpenMap.id_comp
 
+@[simp]
 theorem cancel_right {g₁ g₂ : β →CO γ} {f : α →CO β} (hf : Surjective f) :
     g₁.comp f = g₂.comp f ↔ g₁ = g₂ :=
   ⟨fun h => ext <| hf.forall.2 <| FunLike.ext_iff.1 h, fun h => congr_arg₂ _ h rfl⟩
 #align continuous_open_map.cancel_right ContinuousOpenMap.cancel_right
 
+@[simp]
 theorem cancel_left {g : β →CO γ} {f₁ f₂ : α →CO β} (hg : Injective g) :
     g.comp f₁ = g.comp f₂ ↔ f₁ = f₂ :=
   ⟨fun h => ext fun a => hg <| by rw [← comp_apply, h, comp_apply], congr_arg _⟩
 #align continuous_open_map.cancel_left ContinuousOpenMap.cancel_left
 
 end ContinuousOpenMap
-
chore: banish Type _ and Sort _ (#6499)

We remove all possible occurences of Type _ and Sort _ in favor of Type* and Sort*.

This has nice performance benefits.

Diff
@@ -27,10 +27,10 @@ be satisfied by itself and all stricter types.
 
 open Function
 
-variable {F α β γ δ : Type _}
+variable {F α β γ δ : Type*}
 
 /-- The type of continuous open maps from `α` to `β`, aka Priestley homomorphisms. -/
-structure ContinuousOpenMap (α β : Type _) [TopologicalSpace α] [TopologicalSpace β] extends
+structure ContinuousOpenMap (α β : Type*) [TopologicalSpace α] [TopologicalSpace β] extends
   ContinuousMap α β where
   map_open' : IsOpenMap toFun
 #align continuous_open_map ContinuousOpenMap
@@ -42,7 +42,7 @@ section
 /-- `ContinuousOpenMapClass F α β` states that `F` is a type of continuous open maps.
 
 You should extend this class when you extend `ContinuousOpenMap`. -/
-class ContinuousOpenMapClass (F : Type _) (α β : outParam <| Type _) [TopologicalSpace α]
+class ContinuousOpenMapClass (F : Type*) (α β : outParam <| Type*) [TopologicalSpace α]
   [TopologicalSpace β] extends ContinuousMapClass F α β where
   map_open (f : F) : IsOpenMap f
 #align continuous_open_map_class ContinuousOpenMapClass
chore: script to replace headers with #align_import statements (#5979)

Open in Gitpod

Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com>

Diff
@@ -2,14 +2,11 @@
 Copyright (c) 2022 Yaël Dillies. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Yaël Dillies
-
-! This file was ported from Lean 3 source module topology.hom.open
-! leanprover-community/mathlib commit 98e83c3d541c77cdb7da20d79611a780ff8e7d90
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
 -/
 import Mathlib.Topology.ContinuousFunction.Basic
 
+#align_import topology.hom.open from "leanprover-community/mathlib"@"98e83c3d541c77cdb7da20d79611a780ff8e7d90"
+
 /-!
 # Continuous open maps
 
feat: port Topology.Hom.Open (#2172)

Co-authored-by: Ruben Van de Velde <65514131+Ruben-VandeVelde@users.noreply.github.com>

Dependencies 8 + 308

309 files ported (97.5%)
134923 lines ported (96.4%)
Show graph

The unported dependencies are