-- Mathlib/Topology/Maps/Proper/Basic.lean
/-- The composition of two proper maps is proper. -/
lemma IsProperMap.comp (hf : IsProperMap f) (hg : IsProperMap g) :
    IsProperMap (g ∘ f)

Proof state:
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
f : X → Y
g : Y → Z
hf : IsProperMap f
hg : IsProperMap g
ℱ : Filter X
z : Z
h : MapClusterPt z ℱ (g ∘ f)
⊢ ∃ x, (g ∘ f) x = z ∧ ClusterPt x ℱ

Tactic:
rw [mapClusterPt_comp] at h

Result:
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
f : X → Y
g : Y → Z
hf : IsProperMap f
hg : IsProperMap g
ℱ : Filter X
z : Z
h : MapClusterPt z (map f ℱ) g
⊢ ∃ x, (g ∘ f) x = z ∧ ClusterPt x ℱ

Proof state:
case intro.intro
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
f : X → Y
g : Y → Z
hf : IsProperMap f
hg : IsProperMap g
ℱ : Filter X
y : Y
hy : ClusterPt y (map f ℱ)
h : MapClusterPt (g y) (map f ℱ) g
⊢ ∃ x, (g ∘ f) x = g y ∧ ClusterPt x ℱ

Tactic:
rcases hf.clusterPt_of_mapClusterPt hy with ⟨x, rfl, hx⟩

Result:
case intro.intro.intro.intro
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
f : X → Y
g : Y → Z
hf : IsProperMap f
hg : IsProperMap g
ℱ : Filter X
x : X
hx : ClusterPt x ℱ
hy : ClusterPt (f x) (map f ℱ)
h : MapClusterPt (g (f x)) (map f ℱ) g
⊢ ∃ x_1, (g ∘ f) x_1 = g (f x) ∧ ClusterPt x_1 ℱ

Proof state:
case intro.intro.intro.intro
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
f : X → Y
g : Y → Z
hf : IsProperMap f
hg : IsProperMap g
ℱ : Filter X
x : X
hx : ClusterPt x ℱ
hy : ClusterPt (f x) (map f ℱ)
h : MapClusterPt (g (f x)) (map f ℱ) g
⊢ ∃ x_1, (g ∘ f) x_1 = g (f x) ∧ ClusterPt x_1 ℱ

Tactic:
use x, rfl

Result:
no goals

Proof state:
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
f : X → Y
g : Y → Z
hf : IsProperMap f
hg : IsProperMap g
⊢ IsProperMap (g ∘ f)

Tactic:
refine ⟨by fun_prop, fun ℱ z h ↦ ?_⟩

Result:
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
f : X → Y
g : Y → Z
hf : IsProperMap f
hg : IsProperMap g
ℱ : Filter X
z : Z
h : MapClusterPt z ℱ (g ∘ f)
⊢ ∃ x, (g ∘ f) x = z ∧ ClusterPt x ℱ

Proof state:
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
f : X → Y
g : Y → Z
hf : IsProperMap f
hg : IsProperMap g
⊢ Continuous (g ∘ f)

Tactic:
fun_prop

Result:
no goals

Proof state:
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
f : X → Y
g : Y → Z
hf : IsProperMap f
hg : IsProperMap g
ℱ : Filter X
z : Z
h : MapClusterPt z (map f ℱ) g
⊢ ∃ x, (g ∘ f) x = z ∧ ClusterPt x ℱ

Tactic:
rcases hg.clusterPt_of_mapClusterPt h with ⟨y, rfl, hy⟩

Result:
case intro.intro
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
f : X → Y
g : Y → Z
hf : IsProperMap f
hg : IsProperMap g
ℱ : Filter X
y : Y
hy : ClusterPt y (map f ℱ)
h : MapClusterPt (g y) (map f ℱ) g
⊢ ∃ x, (g ∘ f) x = g y ∧ ClusterPt x ℱ