-- Mathlib/RingTheory/IsTensorProduct.lean
theorem Algebra.IsPushout.symm (h : Algebra.IsPushout R S R' S') : Algebra.IsPushout R R' S S'

Proof state:
R : Type u_1
S : Type v₃
inst✝¹⁰ : CommSemiring R
inst✝⁹ : CommSemiring S
inst✝⁸ : Algebra R S
R' : Type u_6
S' : Type u_7
inst✝⁷ : CommSemiring R'
inst✝⁶ : CommSemiring S'
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
h : IsPushout R S R' S'
x✝ : Algebra R' (S ⊗[R] R') := TensorProduct.includeRight.toAlgebra
r : R'
x : R' ⊗[R] S
⊢ ⋯.equiv ((TensorProduct.comm R R' S) (r • x)) = r • ⋯.equiv ((TensorProduct.comm R R' S) x)

Tactic:
refine TensorProduct.induction_on x ?_ ?_ ?_

Result:
case refine_1
R : Type u_1
S : Type v₃
inst✝¹⁰ : CommSemiring R
inst✝⁹ : CommSemiring S
inst✝⁸ : Algebra R S
R' : Type u_6
S' : Type u_7
inst✝⁷ : CommSemiring R'
inst✝⁶ : CommSemiring S'
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
h : IsPushout R S R' S'
x✝ : Algebra R' (S ⊗[R] R') := TensorProduct.includeRight.toAlgebra
r : R'
x : R' ⊗[R] S
⊢ ⋯.equiv ((TensorProduct.comm R R' S) (r • 0)) = r • ⋯.equiv ((TensorProduct.comm R R' S) 0)

case refine_2
R : Type u_1
S : Type v₃
inst✝¹⁰ : CommSemiring R
inst✝⁹ : CommSemiring S
inst✝⁸ : Algebra R S
R' : Type u_6
S' : Type u_7
inst✝⁷ : CommSemiring R'
inst✝⁶ : CommSemiring S'
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
h : IsPushout R S R' S'
x✝ : Algebra R' (S ⊗[R] R') := TensorProduct.includeRight.toAlgebra
r : R'
x : R' ⊗[R] S
⊢ ∀ (x : R') (y : S),
    ⋯.equiv ((TensorProduct.comm R R' S) (r • x ⊗ₜ[R] y)) = r • ⋯.equiv ((TensorProduct.comm R R' S) (x ⊗ₜ[R] y))

case refine_3
R : Type u_1
S : Type v₃
inst✝¹⁰ : CommSemiring R
inst✝⁹ : CommSemiring S
inst✝⁸ : Algebra R S
R' : Type u_6
S' : Type u_7
inst✝⁷ : CommSemiring R'
inst✝⁶ : CommSemiring S'
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
h : IsPushout R S R' S'
x✝ : Algebra R' (S ⊗[R] R') := TensorProduct.includeRight.toAlgebra
r : R'
x : R' ⊗[R] S
⊢ ∀ (x y : R' ⊗[R] S),
    ⋯.equiv ((TensorProduct.comm R R' S) (r • x)) = r • ⋯.equiv ((TensorProduct.comm R R' S) x) →
      ⋯.equiv ((TensorProduct.comm R R' S) (r • y)) = r • ⋯.equiv ((TensorProduct.comm R R' S) y) →
        ⋯.equiv ((TensorProduct.comm R R' S) (r • (x + y))) = r • ⋯.equiv ((TensorProduct.comm R R' S) (x + y))

Proof state:
R : Type u_1
S : Type v₃
inst✝¹⁰ : CommSemiring R
inst✝⁹ : CommSemiring S
inst✝⁸ : Algebra R S
R' : Type u_6
S' : Type u_7
inst✝⁷ : CommSemiring R'
inst✝⁶ : CommSemiring S'
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
h : IsPushout R S R' S'
x✝ : Algebra R' (S ⊗[R] R') := TensorProduct.includeRight.toAlgebra
e : R' ⊗[R] S ≃ₗ[R'] S' :=
  let __src := _root_.TensorProduct.comm R R' S ≪≫ₗ LinearEquiv.restrictScalars R ⋯.equiv;
  { toAddHom := (↑__src).toAddHom, map_smul' := ⋯, invFun := __src.invFun, left_inv := ⋯, right_inv := ⋯ }
this : (toAlgHom R S S').toLinearMap = ↑R ↑e ∘ₗ (TensorProduct.mk R R' S) 1
⊢ IsPushout R R' S S'

Tactic:
constructor

Result:
case out
R : Type u_1
S : Type v₃
inst✝¹⁰ : CommSemiring R
inst✝⁹ : CommSemiring S
inst✝⁸ : Algebra R S
R' : Type u_6
S' : Type u_7
inst✝⁷ : CommSemiring R'
inst✝⁶ : CommSemiring S'
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
h : IsPushout R S R' S'
x✝ : Algebra R' (S ⊗[R] R') := TensorProduct.includeRight.toAlgebra
e : R' ⊗[R] S ≃ₗ[R'] S' :=
  let __src := _root_.TensorProduct.comm R R' S ≪≫ₗ LinearEquiv.restrictScalars R ⋯.equiv;
  { toAddHom := (↑__src).toAddHom, map_smul' := ⋯, invFun := __src.invFun, left_inv := ⋯, right_inv := ⋯ }
this : (toAlgHom R S S').toLinearMap = ↑R ↑e ∘ₗ (TensorProduct.mk R R' S) 1
⊢ IsBaseChange R' (toAlgHom R S S').toLinearMap

Proof state:
case refine_1
R : Type u_1
S : Type v₃
inst✝¹⁰ : CommSemiring R
inst✝⁹ : CommSemiring S
inst✝⁸ : Algebra R S
R' : Type u_6
S' : Type u_7
inst✝⁷ : CommSemiring R'
inst✝⁶ : CommSemiring S'
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
h : IsPushout R S R' S'
x✝ : Algebra R' (S ⊗[R] R') := TensorProduct.includeRight.toAlgebra
r : R'
x : R' ⊗[R] S
⊢ ⋯.equiv ((TensorProduct.comm R R' S) (r • 0)) = r • ⋯.equiv ((TensorProduct.comm R R' S) 0)

Tactic:
simp only [smul_zero, map_zero]

Result:
no goals

Proof state:
case refine_2
R : Type u_1
S : Type v₃
inst✝¹⁰ : CommSemiring R
inst✝⁹ : CommSemiring S
inst✝⁸ : Algebra R S
R' : Type u_6
S' : Type u_7
inst✝⁷ : CommSemiring R'
inst✝⁶ : CommSemiring S'
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
h : IsPushout R S R' S'
x✝ : Algebra R' (S ⊗[R] R') := TensorProduct.includeRight.toAlgebra
r : R'
x : R' ⊗[R] S
⊢ ∀ (x : R') (y : S),
    ⋯.equiv ((TensorProduct.comm R R' S) (r • x ⊗ₜ[R] y)) = r • ⋯.equiv ((TensorProduct.comm R R' S) (x ⊗ₜ[R] y))

Tactic:
intro x y

Result:
case refine_2
R : Type u_1
S : Type v₃
inst✝¹⁰ : CommSemiring R
inst✝⁹ : CommSemiring S
inst✝⁸ : Algebra R S
R' : Type u_6
S' : Type u_7
inst✝⁷ : CommSemiring R'
inst✝⁶ : CommSemiring S'
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
h : IsPushout R S R' S'
x✝¹ : Algebra R' (S ⊗[R] R') := TensorProduct.includeRight.toAlgebra
r : R'
x✝ : R' ⊗[R] S
x : R'
y : S
⊢ ⋯.equiv ((TensorProduct.comm R R' S) (r • x ⊗ₜ[R] y)) = r • ⋯.equiv ((TensorProduct.comm R R' S) (x ⊗ₜ[R] y))

Proof state:
R : Type u_1
S : Type v₃
inst✝¹⁰ : CommSemiring R
inst✝⁹ : CommSemiring S
inst✝⁸ : Algebra R S
R' : Type u_6
S' : Type u_7
inst✝⁷ : CommSemiring R'
inst✝⁶ : CommSemiring S'
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
h : IsPushout R S R' S'
x✝ : Algebra R' (S ⊗[R] R') := TensorProduct.includeRight.toAlgebra
e : R' ⊗[R] S ≃ₗ[R'] S' :=
  let __src := _root_.TensorProduct.comm R R' S ≪≫ₗ LinearEquiv.restrictScalars R ⋯.equiv;
  { toAddHom := (↑__src).toAddHom, map_smul' := ⋯, invFun := __src.invFun, left_inv := ⋯, right_inv := ⋯ }
⊢ (toAlgHom R S S').toLinearMap = ↑R ↑e ∘ₗ (TensorProduct.mk R R' S) 1

Tactic:
ext

Result:
case h
R : Type u_1
S : Type v₃
inst✝¹⁰ : CommSemiring R
inst✝⁹ : CommSemiring S
inst✝⁸ : Algebra R S
R' : Type u_6
S' : Type u_7
inst✝⁷ : CommSemiring R'
inst✝⁶ : CommSemiring S'
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
h : IsPushout R S R' S'
x✝¹ : Algebra R' (S ⊗[R] R') := TensorProduct.includeRight.toAlgebra
e : R' ⊗[R] S ≃ₗ[R'] S' :=
  let __src := _root_.TensorProduct.comm R R' S ≪≫ₗ LinearEquiv.restrictScalars R ⋯.equiv;
  { toAddHom := (↑__src).toAddHom, map_smul' := ⋯, invFun := __src.invFun, left_inv := ⋯, right_inv := ⋯ }
x✝ : S
⊢ (toAlgHom R S S').toLinearMap x✝ = (↑R ↑e ∘ₗ (TensorProduct.mk R R' S) 1) x✝