Theorem: FreeAbelianGroup.lift_comp
File: Mathlib/GroupTheory/FreeAbelianGroup.lean

tactic: apply FreeAbelianGroup.induction_on (C := fun x ↦ lift (g ∘ f) x = lift g (map f x)) x
state_before: α✝ : Type u
β✝ : Type v
γ✝ : Type w
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝ : AddCommGroup γ
f : α → β
g : β → γ
x : FreeAbelianGroup α
⊢ (lift (g ∘ f)) x = (lift g) ((map f) x)
state_after: case C0
α✝ : Type u
β✝ : Type v
γ✝ : Type w
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝ : AddCommGroup γ
f : α → β
g : β → γ
x : FreeAbelianGroup α
⊢ (lift (g ∘ f)) 0 = (lift g) ((map f) 0)

case C1
α✝ : Type u
β✝ : Type v
γ✝ : Type w
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝ : AddCommGroup γ
f : α → β
g : β → γ
x : FreeAbelianGroup α
⊢ ∀ (x : α), (lift (g ∘ f)) (of x) = (lift g) ((map f) (of x))

case Cn
α✝ : Type u
β✝ : Type v
γ✝ : Type w
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝ : AddCommGroup γ
f : α → β
g : β → γ
x : FreeAbelianGroup α
⊢ ∀ (x : α), (lift (g ∘ f)) (of x) = (lift g) ((map f) (of x)) → (lift (g ∘ f)) (-of x) = (lift g) ((map f) (-of x))

case Cp
α✝ : Type u
β✝ : Type v
γ✝ : Type w
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝ : AddCommGroup γ
f : α → β
g : β → γ
x : FreeAbelianGroup α
⊢ ∀ (x y : FreeAbelianGroup α),
    (lift (g ∘ f)) x = (lift g) ((map f) x) →
      (lift (g ∘ f)) y = (lift g) ((map f) y) → (lift (g ∘ f)) (x + y) = (lift g) ((map f) (x + y))

tactic: simp only [map_zero]
state_before: case C0
α✝ : Type u
β✝ : Type v
γ✝ : Type w
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝ : AddCommGroup γ
f : α → β
g : β → γ
x : FreeAbelianGroup α
⊢ (lift (g ∘ f)) 0 = (lift g) ((map f) 0)
state_after: no goals

tactic: intro _
state_before: case C1
α✝ : Type u
β✝ : Type v
γ✝ : Type w
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝ : AddCommGroup γ
f : α → β
g : β → γ
x : FreeAbelianGroup α
⊢ ∀ (x : α), (lift (g ∘ f)) (of x) = (lift g) ((map f) (of x))
state_after: case C1
α✝ : Type u
β✝ : Type v
γ✝ : Type w
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝ : AddCommGroup γ
f : α → β
g : β → γ
x : FreeAbelianGroup α
x✝ : α
⊢ (lift (g ∘ f)) (of x✝) = (lift g) ((map f) (of x✝))

tactic: simp only [lift.of, map, Function.comp]
state_before: case C1
α✝ : Type u
β✝ : Type v
γ✝ : Type w
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝ : AddCommGroup γ
f : α → β
g : β → γ
x : FreeAbelianGroup α
x✝ : α
⊢ (lift (g ∘ f)) (of x✝) = (lift g) ((map f) (of x✝))
state_after: no goals

tactic: intro _ h
state_before: case Cn
α✝ : Type u
β✝ : Type v
γ✝ : Type w
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝ : AddCommGroup γ
f : α → β
g : β → γ
x : FreeAbelianGroup α
⊢ ∀ (x : α), (lift (g ∘ f)) (of x) = (lift g) ((map f) (of x)) → (lift (g ∘ f)) (-of x) = (lift g) ((map f) (-of x))
state_after: case Cn
α✝ : Type u
β✝ : Type v
γ✝ : Type w
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝ : AddCommGroup γ
f : α → β
g : β → γ
x : FreeAbelianGroup α
x✝ : α
h : (lift (g ∘ f)) (of x✝) = (lift g) ((map f) (of x✝))
⊢ (lift (g ∘ f)) (-of x✝) = (lift g) ((map f) (-of x✝))

tactic: simp only [h, AddMonoidHom.map_neg]
state_before: case Cn
α✝ : Type u
β✝ : Type v
γ✝ : Type w
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝ : AddCommGroup γ
f : α → β
g : β → γ
x : FreeAbelianGroup α
x✝ : α
h : (lift (g ∘ f)) (of x✝) = (lift g) ((map f) (of x✝))
⊢ (lift (g ∘ f)) (-of x✝) = (lift g) ((map f) (-of x✝))
state_after: no goals

tactic: intro _ _ h₁ h₂
state_before: case Cp
α✝ : Type u
β✝ : Type v
γ✝ : Type w
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝ : AddCommGroup γ
f : α → β
g : β → γ
x : FreeAbelianGroup α
⊢ ∀ (x y : FreeAbelianGroup α),
    (lift (g ∘ f)) x = (lift g) ((map f) x) →
      (lift (g ∘ f)) y = (lift g) ((map f) y) → (lift (g ∘ f)) (x + y) = (lift g) ((map f) (x + y))
state_after: case Cp
α✝ : Type u
β✝ : Type v
γ✝ : Type w
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝ : AddCommGroup γ
f : α → β
g : β → γ
x x✝ y✝ : FreeAbelianGroup α
h₁ : (lift (g ∘ f)) x✝ = (lift g) ((map f) x✝)
h₂ : (lift (g ∘ f)) y✝ = (lift g) ((map f) y✝)
⊢ (lift (g ∘ f)) (x✝ + y✝) = (lift g) ((map f) (x✝ + y✝))

tactic: simp only [h₁, h₂, AddMonoidHom.map_add]
state_before: case Cp
α✝ : Type u
β✝ : Type v
γ✝ : Type w
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝ : AddCommGroup γ
f : α → β
g : β → γ
x x✝ y✝ : FreeAbelianGroup α
h₁ : (lift (g ∘ f)) x✝ = (lift g) ((map f) x✝)
h₂ : (lift (g ∘ f)) y✝ = (lift g) ((map f) y✝)
⊢ (lift (g ∘ f)) (x✝ + y✝) = (lift g) ((map f) (x✝ + y✝))
state_after: no goals