Theorem: CategoryTheory.Localization.LeftBousfield.W_isoClosure
File: Mathlib/CategoryTheory/Localization/Bousfield.lean

tactic: ext X Y f
state_before: C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
⊢ W (isoClosure P) = W P
state_after: case h
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
⊢ W (isoClosure P) f ↔ W P f

tactic: constructor
state_before: case h
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
⊢ W (isoClosure P) f ↔ W P f
state_after: case h.mp
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
⊢ W (isoClosure P) f → W P f

case h.mpr
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
⊢ W P f → W (isoClosure P) f

tactic: intro hf Z hZ
state_before: case h.mp
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
⊢ W (isoClosure P) f → W P f
state_after: case h.mp
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
hf : W (isoClosure P) f
Z : C
hZ : P Z
⊢ Function.Bijective fun g => f ≫ g

tactic: exact hf _ (le_isoClosure _ _ hZ)
state_before: case h.mp
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
hf : W (isoClosure P) f
Z : C
hZ : P Z
⊢ Function.Bijective fun g => f ≫ g
state_after: no goals

tactic: rintro hf Z ⟨Z', hZ', ⟨e⟩⟩
state_before: case h.mpr
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
⊢ W P f → W (isoClosure P) f
state_after: case h.mpr.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
hf : W P f
Z Z' : C
hZ' : P Z'
e : Z ≅ Z'
⊢ Function.Bijective fun g => f ≫ g

tactic: constructor
state_before: case h.mpr.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
hf : W P f
Z Z' : C
hZ' : P Z'
e : Z ≅ Z'
⊢ Function.Bijective fun g => f ≫ g
state_after: case h.mpr.intro.intro.intro.left
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
hf : W P f
Z Z' : C
hZ' : P Z'
e : Z ≅ Z'
⊢ Function.Injective fun g => f ≫ g

case h.mpr.intro.intro.intro.right
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
hf : W P f
Z Z' : C
hZ' : P Z'
e : Z ≅ Z'
⊢ Function.Surjective fun g => f ≫ g

tactic: intro g₁ g₂ eq
state_before: case h.mpr.intro.intro.intro.left
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
hf : W P f
Z Z' : C
hZ' : P Z'
e : Z ≅ Z'
⊢ Function.Injective fun g => f ≫ g
state_after: case h.mpr.intro.intro.intro.left
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
hf : W P f
Z Z' : C
hZ' : P Z'
e : Z ≅ Z'
g₁ g₂ : Y ⟶ Z
eq : (fun g => f ≫ g) g₁ = (fun g => f ≫ g) g₂
⊢ g₁ = g₂

tactic: rw [← cancel_mono e.hom]
state_before: case h.mpr.intro.intro.intro.left
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
hf : W P f
Z Z' : C
hZ' : P Z'
e : Z ≅ Z'
g₁ g₂ : Y ⟶ Z
eq : (fun g => f ≫ g) g₁ = (fun g => f ≫ g) g₂
⊢ g₁ = g₂
state_after: case h.mpr.intro.intro.intro.left
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
hf : W P f
Z Z' : C
hZ' : P Z'
e : Z ≅ Z'
g₁ g₂ : Y ⟶ Z
eq : (fun g => f ≫ g) g₁ = (fun g => f ≫ g) g₂
⊢ g₁ ≫ e.hom = g₂ ≫ e.hom

tactic: apply (hf _ hZ').1
state_before: case h.mpr.intro.intro.intro.left
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
hf : W P f
Z Z' : C
hZ' : P Z'
e : Z ≅ Z'
g₁ g₂ : Y ⟶ Z
eq : (fun g => f ≫ g) g₁ = (fun g => f ≫ g) g₂
⊢ g₁ ≫ e.hom = g₂ ≫ e.hom
state_after: case h.mpr.intro.intro.intro.left.a
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
hf : W P f
Z Z' : C
hZ' : P Z'
e : Z ≅ Z'
g₁ g₂ : Y ⟶ Z
eq : (fun g => f ≫ g) g₁ = (fun g => f ≫ g) g₂
⊢ (fun g => f ≫ g) (g₁ ≫ e.hom) = (fun g => f ≫ g) (g₂ ≫ e.hom)

tactic: simp only [reassoc_of% eq]
state_before: case h.mpr.intro.intro.intro.left.a
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
hf : W P f
Z Z' : C
hZ' : P Z'
e : Z ≅ Z'
g₁ g₂ : Y ⟶ Z
eq : (fun g => f ≫ g) g₁ = (fun g => f ≫ g) g₂
⊢ (fun g => f ≫ g) (g₁ ≫ e.hom) = (fun g => f ≫ g) (g₂ ≫ e.hom)
state_after: no goals

tactic: intro g
state_before: case h.mpr.intro.intro.intro.right
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
hf : W P f
Z Z' : C
hZ' : P Z'
e : Z ≅ Z'
⊢ Function.Surjective fun g => f ≫ g
state_after: case h.mpr.intro.intro.intro.right
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
hf : W P f
Z Z' : C
hZ' : P Z'
e : Z ≅ Z'
g : X ⟶ Z
⊢ ∃ a, (fun g => f ≫ g) a = g

tactic: obtain ⟨a, h⟩ := (hf _ hZ').2 (g ≫ e.hom)
state_before: case h.mpr.intro.intro.intro.right
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
hf : W P f
Z Z' : C
hZ' : P Z'
e : Z ≅ Z'
g : X ⟶ Z
⊢ ∃ a, (fun g => f ≫ g) a = g
state_after: case h.mpr.intro.intro.intro.right.intro
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
hf : W P f
Z Z' : C
hZ' : P Z'
e : Z ≅ Z'
g : X ⟶ Z
a : Y ⟶ Z'
h : (fun g => f ≫ g) a = g ≫ e.hom
⊢ ∃ a, (fun g => f ≫ g) a = g

tactic: exact ⟨a ≫ e.inv, by simp only [reassoc_of% h, e.hom_inv_id, comp_id]⟩
state_before: case h.mpr.intro.intro.intro.right.intro
C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
hf : W P f
Z Z' : C
hZ' : P Z'
e : Z ≅ Z'
g : X ⟶ Z
a : Y ⟶ Z'
h : (fun g => f ≫ g) a = g ≫ e.hom
⊢ ∃ a, (fun g => f ≫ g) a = g
state_after: no goals

tactic: simp only [reassoc_of% h, e.hom_inv_id, comp_id]
state_before: C : Type u_1
D : Type u_2
inst✝¹ : Category.{u_3, u_1} C
inst✝ : Category.{?u.563, u_2} D
P : C → Prop
X Y : C
f : X ⟶ Y
hf : W P f
Z Z' : C
hZ' : P Z'
e : Z ≅ Z'
g : X ⟶ Z
a : Y ⟶ Z'
h : (fun g => f ≫ g) a = g ≫ e.hom
⊢ (fun g => f ≫ g) (a ≫ e.inv) = g
state_after: no goals