Theorem: CategoryTheory.ConcreteCategory.injective_eq_monomorphisms_iff
File: Mathlib/CategoryTheory/ConcreteCategory/EpiMono.lean

tactic: constructor
state_before: C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
⊢ MorphismProperty.injective C = monomorphisms C ↔ (forget C).PreservesMonomorphisms
state_after: case mp
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
⊢ MorphismProperty.injective C = monomorphisms C → (forget C).PreservesMonomorphisms

case mpr
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
⊢ (forget C).PreservesMonomorphisms → MorphismProperty.injective C = monomorphisms C

tactic: intro h
state_before: case mp
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
⊢ MorphismProperty.injective C = monomorphisms C → (forget C).PreservesMonomorphisms
state_after: case mp
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
h : MorphismProperty.injective C = monomorphisms C
⊢ (forget C).PreservesMonomorphisms

tactic: constructor
state_before: case mp
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
h : MorphismProperty.injective C = monomorphisms C
⊢ (forget C).PreservesMonomorphisms
state_after: case mp.preserves
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
h : MorphismProperty.injective C = monomorphisms C
⊢ ∀ {X Y : C} (f : X ⟶ Y) [inst : Mono f], Mono ((forget C).map f)

tactic: rintro _ _ f (hf : monomorphisms C f)
state_before: case mp.preserves
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
h : MorphismProperty.injective C = monomorphisms C
⊢ ∀ {X Y : C} (f : X ⟶ Y) [inst : Mono f], Mono ((forget C).map f)
state_after: case mp.preserves
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
h : MorphismProperty.injective C = monomorphisms C
X✝ Y✝ : C
f : X✝ ⟶ Y✝
hf : monomorphisms C f
⊢ Mono ((forget C).map f)

tactic: rw [mono_iff_injective]
state_before: case mp.preserves
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
h : MorphismProperty.injective C = monomorphisms C
X✝ Y✝ : C
f : X✝ ⟶ Y✝
hf : monomorphisms C f
⊢ Mono ((forget C).map f)
state_after: case mp.preserves
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
h : MorphismProperty.injective C = monomorphisms C
X✝ Y✝ : C
f : X✝ ⟶ Y✝
hf : monomorphisms C f
⊢ Function.Injective ((forget C).map f)

tactic: rw [← h] at hf
state_before: case mp.preserves
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
h : MorphismProperty.injective C = monomorphisms C
X✝ Y✝ : C
f : X✝ ⟶ Y✝
hf : monomorphisms C f
⊢ Function.Injective ((forget C).map f)
state_after: case mp.preserves
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
h : MorphismProperty.injective C = monomorphisms C
X✝ Y✝ : C
f : X✝ ⟶ Y✝
hf : MorphismProperty.injective C f
⊢ Function.Injective ((forget C).map f)

tactic: exact hf
state_before: case mp.preserves
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
h : MorphismProperty.injective C = monomorphisms C
X✝ Y✝ : C
f : X✝ ⟶ Y✝
hf : MorphismProperty.injective C f
⊢ Function.Injective ((forget C).map f)
state_after: no goals

tactic: intro
state_before: case mpr
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
⊢ (forget C).PreservesMonomorphisms → MorphismProperty.injective C = monomorphisms C
state_after: case mpr
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
a✝ : (forget C).PreservesMonomorphisms
⊢ MorphismProperty.injective C = monomorphisms C

tactic: apply le_antisymm (injective_le_monomorphisms C)
state_before: case mpr
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
a✝ : (forget C).PreservesMonomorphisms
⊢ MorphismProperty.injective C = monomorphisms C
state_after: case mpr
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
a✝ : (forget C).PreservesMonomorphisms
⊢ monomorphisms C ≤ MorphismProperty.injective C

tactic: intro _ _ f hf
state_before: case mpr
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
a✝ : (forget C).PreservesMonomorphisms
⊢ monomorphisms C ≤ MorphismProperty.injective C
state_after: case mpr
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
a✝ : (forget C).PreservesMonomorphisms
X✝ Y✝ : C
f : X✝ ⟶ Y✝
hf : monomorphisms C f
⊢ MorphismProperty.injective C f

tactic: have : Mono f := hf
state_before: case mpr
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
a✝ : (forget C).PreservesMonomorphisms
X✝ Y✝ : C
f : X✝ ⟶ Y✝
hf : monomorphisms C f
⊢ MorphismProperty.injective C f
state_after: case mpr
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
a✝ : (forget C).PreservesMonomorphisms
X✝ Y✝ : C
f : X✝ ⟶ Y✝
hf : monomorphisms C f
this : Mono f
⊢ MorphismProperty.injective C f

tactic: change Function.Injective ((forget C).map f)
state_before: case mpr
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
a✝ : (forget C).PreservesMonomorphisms
X✝ Y✝ : C
f : X✝ ⟶ Y✝
hf : monomorphisms C f
this : Mono f
⊢ MorphismProperty.injective C f
state_after: case mpr
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
a✝ : (forget C).PreservesMonomorphisms
X✝ Y✝ : C
f : X✝ ⟶ Y✝
hf : monomorphisms C f
this : Mono f
⊢ Function.Injective ((forget C).map f)

tactic: rw [← mono_iff_injective]
state_before: case mpr
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
a✝ : (forget C).PreservesMonomorphisms
X✝ Y✝ : C
f : X✝ ⟶ Y✝
hf : monomorphisms C f
this : Mono f
⊢ Function.Injective ((forget C).map f)
state_after: case mpr
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
a✝ : (forget C).PreservesMonomorphisms
X✝ Y✝ : C
f : X✝ ⟶ Y✝
hf : monomorphisms C f
this : Mono f
⊢ Mono ((forget C).map f)

tactic: infer_instance
state_before: case mpr
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
a✝ : (forget C).PreservesMonomorphisms
X✝ Y✝ : C
f : X✝ ⟶ Y✝
hf : monomorphisms C f
this : Mono f
⊢ Mono ((forget C).map f)
state_after: no goals