l3lab/ntp-mathlib huggingface dataset:
theorem map_add_left (f₁ f₂ : M →ₗ[A] P) (g : N →ₗ[R] Q) :
    map (f₁ + f₂) g = map f₁ g + map f₂ g := by
  

Proof state:
R : Type uR
A : Type uA
B : Type uB
M : Type uM
N : Type uN
P : Type uP
Q : Type uQ
P' : Type uP'
Q' : Type uQ'
inst✝³¹ : CommSemiring R
inst✝³⁰ : Semiring A
inst✝²⁹ : Semiring B
inst✝²⁸ : Algebra R A
inst✝²⁷ : Algebra R B
inst✝²⁶ : AddCommMonoid M
inst✝²⁵ : Module R M
inst✝²⁴ : Module A M
inst✝²³ : Module B M
inst✝²² : IsScalarTower R A M
inst✝²¹ : IsScalarTower R B M
inst✝²⁰ : SMulCommClass A B M
inst✝¹⁹ : AddCommMonoid N
inst✝¹⁸ : Module R N
inst✝¹⁷ : AddCommMonoid P
inst✝¹⁶ : Module R P
inst✝¹⁵ : Module A P
inst✝¹⁴ : Module B P
inst✝¹³ : IsScalarTower R A P
inst✝¹² : IsScalarTower R B P
inst✝¹¹ : SMulCommClass A B P
inst✝¹⁰ : AddCommMonoid Q
inst✝⁹ : Module R Q
inst✝⁸ : AddCommMonoid P'
inst✝⁷ : Module R P'
inst✝⁶ : Module A P'
inst✝⁵ : Module B P'
inst✝⁴ : IsScalarTower R A P'
inst✝³ : IsScalarTower R B P'
inst✝² : SMulCommClass A B P'
inst✝¹ : AddCommMonoid Q'
inst✝ : Module R Q'
f₁ f₂ : M →ₗ[A] P
g : N →ₗ[R] Q
⊢ map (f₁ + f₂) g = map f₁ g + map f₂ g

Next tactic:
ext
theorem map_add_left (f₁ f₂ : M →ₗ[A] P) (g : N →ₗ[R] Q) :
    map (f₁ + f₂) g = map f₁ g + map f₂ g := by
  ext
  

Proof state:
case a.h.h
R : Type uR
A : Type uA
B : Type uB
M : Type uM
N : Type uN
P : Type uP
Q : Type uQ
P' : Type uP'
Q' : Type uQ'
inst✝³¹ : CommSemiring R
inst✝³⁰ : Semiring A
inst✝²⁹ : Semiring B
inst✝²⁸ : Algebra R A
inst✝²⁷ : Algebra R B
inst✝²⁶ : AddCommMonoid M
inst✝²⁵ : Module R M
inst✝²⁴ : Module A M
inst✝²³ : Module B M
inst✝²² : IsScalarTower R A M
inst✝²¹ : IsScalarTower R B M
inst✝²⁰ : SMulCommClass A B M
inst✝¹⁹ : AddCommMonoid N
inst✝¹⁸ : Module R N
inst✝¹⁷ : AddCommMonoid P
inst✝¹⁶ : Module R P
inst✝¹⁵ : Module A P
inst✝¹⁴ : Module B P
inst✝¹³ : IsScalarTower R A P
inst✝¹² : IsScalarTower R B P
inst✝¹¹ : SMulCommClass A B P
inst✝¹⁰ : AddCommMonoid Q
inst✝⁹ : Module R Q
inst✝⁸ : AddCommMonoid P'
inst✝⁷ : Module R P'
inst✝⁶ : Module A P'
inst✝⁵ : Module B P'
inst✝⁴ : IsScalarTower R A P'
inst✝³ : IsScalarTower R B P'
inst✝² : SMulCommClass A B P'
inst✝¹ : AddCommMonoid Q'
inst✝ : Module R Q'
f₁ f₂ : M →ₗ[A] P
g : N →ₗ[R] Q
x✝¹ : M
x✝ : N
⊢ ((curry (map (f₁ + f₂) g)) x✝¹) x✝ = ((curry (map f₁ g + map f₂ g)) x✝¹) x✝

Next tactic:
simp_rw [curry_apply, TensorProduct.curry_apply, restrictScalars_apply, add_apply, map_tmul,
    add_apply, add_tmul]
theorem map_add_right (f : M →ₗ[A] P) (g₁ g₂ : N →ₗ[R] Q) :
    map f (g₁ + g₂) = map f g₁ + map f g₂ := by
  

Proof state:
R : Type uR
A : Type uA
B : Type uB
M : Type uM
N : Type uN
P : Type uP
Q : Type uQ
P' : Type uP'
Q' : Type uQ'
inst✝³¹ : CommSemiring R
inst✝³⁰ : Semiring A
inst✝²⁹ : Semiring B
inst✝²⁸ : Algebra R A
inst✝²⁷ : Algebra R B
inst✝²⁶ : AddCommMonoid M
inst✝²⁵ : Module R M
inst✝²⁴ : Module A M
inst✝²³ : Module B M
inst✝²² : IsScalarTower R A M
inst✝²¹ : IsScalarTower R B M
inst✝²⁰ : SMulCommClass A B M
inst✝¹⁹ : AddCommMonoid N
inst✝¹⁸ : Module R N
inst✝¹⁷ : AddCommMonoid P
inst✝¹⁶ : Module R P
inst✝¹⁵ : Module A P
inst✝¹⁴ : Module B P
inst✝¹³ : IsScalarTower R A P
inst✝¹² : IsScalarTower R B P
inst✝¹¹ : SMulCommClass A B P
inst✝¹⁰ : AddCommMonoid Q
inst✝⁹ : Module R Q
inst✝⁸ : AddCommMonoid P'
inst✝⁷ : Module R P'
inst✝⁶ : Module A P'
inst✝⁵ : Module B P'
inst✝⁴ : IsScalarTower R A P'
inst✝³ : IsScalarTower R B P'
inst✝² : SMulCommClass A B P'
inst✝¹ : AddCommMonoid Q'
inst✝ : Module R Q'
f : M →ₗ[A] P
g₁ g₂ : N →ₗ[R] Q
⊢ map f (g₁ + g₂) = map f g₁ + map f g₂

Next tactic:
ext
theorem map_add_right (f : M →ₗ[A] P) (g₁ g₂ : N →ₗ[R] Q) :
    map f (g₁ + g₂) = map f g₁ + map f g₂ := by
  ext
  

Proof state:
case a.h.h
R : Type uR
A : Type uA
B : Type uB
M : Type uM
N : Type uN
P : Type uP
Q : Type uQ
P' : Type uP'
Q' : Type uQ'
inst✝³¹ : CommSemiring R
inst✝³⁰ : Semiring A
inst✝²⁹ : Semiring B
inst✝²⁸ : Algebra R A
inst✝²⁷ : Algebra R B
inst✝²⁶ : AddCommMonoid M
inst✝²⁵ : Module R M
inst✝²⁴ : Module A M
inst✝²³ : Module B M
inst✝²² : IsScalarTower R A M
inst✝²¹ : IsScalarTower R B M
inst✝²⁰ : SMulCommClass A B M
inst✝¹⁹ : AddCommMonoid N
inst✝¹⁸ : Module R N
inst✝¹⁷ : AddCommMonoid P
inst✝¹⁶ : Module R P
inst✝¹⁵ : Module A P
inst✝¹⁴ : Module B P
inst✝¹³ : IsScalarTower R A P
inst✝¹² : IsScalarTower R B P
inst✝¹¹ : SMulCommClass A B P
inst✝¹⁰ : AddCommMonoid Q
inst✝⁹ : Module R Q
inst✝⁸ : AddCommMonoid P'
inst✝⁷ : Module R P'
inst✝⁶ : Module A P'
inst✝⁵ : Module B P'
inst✝⁴ : IsScalarTower R A P'
inst✝³ : IsScalarTower R B P'
inst✝² : SMulCommClass A B P'
inst✝¹ : AddCommMonoid Q'
inst✝ : Module R Q'
f : M →ₗ[A] P
g₁ g₂ : N →ₗ[R] Q
x✝¹ : M
x✝ : N
⊢ ((curry (map f (g₁ + g₂))) x✝¹) x✝ = ((curry (map f g₁ + map f g₂)) x✝¹) x✝

Next tactic:
simp_rw [curry_apply, TensorProduct.curry_apply, restrictScalars_apply, add_apply, map_tmul,
    add_apply, tmul_add]
theorem map_smul_right (r : R) (f : M →ₗ[A] P) (g : N →ₗ[R] Q) : map f (r • g) = r • map f g := by
  

Proof state:
R : Type uR
A : Type uA
B : Type uB
M : Type uM
N : Type uN
P : Type uP
Q : Type uQ
P' : Type uP'
Q' : Type uQ'
inst✝³¹ : CommSemiring R
inst✝³⁰ : Semiring A
inst✝²⁹ : Semiring B
inst✝²⁸ : Algebra R A
inst✝²⁷ : Algebra R B
inst✝²⁶ : AddCommMonoid M
inst✝²⁵ : Module R M
inst✝²⁴ : Module A M
inst✝²³ : Module B M
inst✝²² : IsScalarTower R A M
inst✝²¹ : IsScalarTower R B M
inst✝²⁰ : SMulCommClass A B M
inst✝¹⁹ : AddCommMonoid N
inst✝¹⁸ : Module R N
inst✝¹⁷ : AddCommMonoid P
inst✝¹⁶ : Module R P
inst✝¹⁵ : Module A P
inst✝¹⁴ : Module B P
inst✝¹³ : IsScalarTower R A P
inst✝¹² : IsScalarTower R B P
inst✝¹¹ : SMulCommClass A B P
inst✝¹⁰ : AddCommMonoid Q
inst✝⁹ : Module R Q
inst✝⁸ : AddCommMonoid P'
inst✝⁷ : Module R P'
inst✝⁶ : Module A P'
inst✝⁵ : Module B P'
inst✝⁴ : IsScalarTower R A P'
inst✝³ : IsScalarTower R B P'
inst✝² : SMulCommClass A B P'
inst✝¹ : AddCommMonoid Q'
inst✝ : Module R Q'
r : R
f : M →ₗ[A] P
g : N →ₗ[R] Q
⊢ map f (r • g) = r • map f g

Next tactic:
ext
theorem map_smul_right (r : R) (f : M →ₗ[A] P) (g : N →ₗ[R] Q) : map f (r • g) = r • map f g := by
  ext
  

Proof state:
case a.h.h
R : Type uR
A : Type uA
B : Type uB
M : Type uM
N : Type uN
P : Type uP
Q : Type uQ
P' : Type uP'
Q' : Type uQ'
inst✝³¹ : CommSemiring R
inst✝³⁰ : Semiring A
inst✝²⁹ : Semiring B
inst✝²⁸ : Algebra R A
inst✝²⁷ : Algebra R B
inst✝²⁶ : AddCommMonoid M
inst✝²⁵ : Module R M
inst✝²⁴ : Module A M
inst✝²³ : Module B M
inst✝²² : IsScalarTower R A M
inst✝²¹ : IsScalarTower R B M
inst✝²⁰ : SMulCommClass A B M
inst✝¹⁹ : AddCommMonoid N
inst✝¹⁸ : Module R N
inst✝¹⁷ : AddCommMonoid P
inst✝¹⁶ : Module R P
inst✝¹⁵ : Module A P
inst✝¹⁴ : Module B P
inst✝¹³ : IsScalarTower R A P
inst✝¹² : IsScalarTower R B P
inst✝¹¹ : SMulCommClass A B P
inst✝¹⁰ : AddCommMonoid Q
inst✝⁹ : Module R Q
inst✝⁸ : AddCommMonoid P'
inst✝⁷ : Module R P'
inst✝⁶ : Module A P'
inst✝⁵ : Module B P'
inst✝⁴ : IsScalarTower R A P'
inst✝³ : IsScalarTower R B P'
inst✝² : SMulCommClass A B P'
inst✝¹ : AddCommMonoid Q'
inst✝ : Module R Q'
r : R
f : M →ₗ[A] P
g : N →ₗ[R] Q
x✝¹ : M
x✝ : N
⊢ ((curry (map f (r • g))) x✝¹) x✝ = ((curry (r • map f g)) x✝¹) x✝

Next tactic:
simp_rw [curry_apply, TensorProduct.curry_apply, restrictScalars_apply, smul_apply, map_tmul,
    smul_apply, tmul_smul]
theorem map_smul_left (b : B) (f : M →ₗ[A] P) (g : N →ₗ[R] Q) : map (b • f) g = b • map f g := by
  

Proof state:
R : Type uR
A : Type uA
B : Type uB
M : Type uM
N : Type uN
P : Type uP
Q : Type uQ
P' : Type uP'
Q' : Type uQ'
inst✝³¹ : CommSemiring R
inst✝³⁰ : Semiring A
inst✝²⁹ : Semiring B
inst✝²⁸ : Algebra R A
inst✝²⁷ : Algebra R B
inst✝²⁶ : AddCommMonoid M
inst✝²⁵ : Module R M
inst✝²⁴ : Module A M
inst✝²³ : Module B M
inst✝²² : IsScalarTower R A M
inst✝²¹ : IsScalarTower R B M
inst✝²⁰ : SMulCommClass A B M
inst✝¹⁹ : AddCommMonoid N
inst✝¹⁸ : Module R N
inst✝¹⁷ : AddCommMonoid P
inst✝¹⁶ : Module R P
inst✝¹⁵ : Module A P
inst✝¹⁴ : Module B P
inst✝¹³ : IsScalarTower R A P
inst✝¹² : IsScalarTower R B P
inst✝¹¹ : SMulCommClass A B P
inst✝¹⁰ : AddCommMonoid Q
inst✝⁹ : Module R Q
inst✝⁸ : AddCommMonoid P'
inst✝⁷ : Module R P'
inst✝⁶ : Module A P'
inst✝⁵ : Module B P'
inst✝⁴ : IsScalarTower R A P'
inst✝³ : IsScalarTower R B P'
inst✝² : SMulCommClass A B P'
inst✝¹ : AddCommMonoid Q'
inst✝ : Module R Q'
b : B
f : M →ₗ[A] P
g : N →ₗ[R] Q
⊢ map (b • f) g = b • map f g

Next tactic:
ext
theorem map_smul_left (b : B) (f : M →ₗ[A] P) (g : N →ₗ[R] Q) : map (b • f) g = b • map f g := by
  ext
  

Proof state:
case a.h.h
R : Type uR
A : Type uA
B : Type uB
M : Type uM
N : Type uN
P : Type uP
Q : Type uQ
P' : Type uP'
Q' : Type uQ'
inst✝³¹ : CommSemiring R
inst✝³⁰ : Semiring A
inst✝²⁹ : Semiring B
inst✝²⁸ : Algebra R A
inst✝²⁷ : Algebra R B
inst✝²⁶ : AddCommMonoid M
inst✝²⁵ : Module R M
inst✝²⁴ : Module A M
inst✝²³ : Module B M
inst✝²² : IsScalarTower R A M
inst✝²¹ : IsScalarTower R B M
inst✝²⁰ : SMulCommClass A B M
inst✝¹⁹ : AddCommMonoid N
inst✝¹⁸ : Module R N
inst✝¹⁷ : AddCommMonoid P
inst✝¹⁶ : Module R P
inst✝¹⁵ : Module A P
inst✝¹⁴ : Module B P
inst✝¹³ : IsScalarTower R A P
inst✝¹² : IsScalarTower R B P
inst✝¹¹ : SMulCommClass A B P
inst✝¹⁰ : AddCommMonoid Q
inst✝⁹ : Module R Q
inst✝⁸ : AddCommMonoid P'
inst✝⁷ : Module R P'
inst✝⁶ : Module A P'
inst✝⁵ : Module B P'
inst✝⁴ : IsScalarTower R A P'
inst✝³ : IsScalarTower R B P'
inst✝² : SMulCommClass A B P'
inst✝¹ : AddCommMonoid Q'
inst✝ : Module R Q'
b : B
f : M →ₗ[A] P
g : N →ₗ[R] Q
x✝¹ : M
x✝ : N
⊢ ((curry (map (b • f) g)) x✝¹) x✝ = ((curry (b • map f g)) x✝¹) x✝

Next tactic:
simp_rw [curry_apply, TensorProduct.curry_apply, restrictScalars_apply, smul_apply, map_tmul,
    smul_apply, smul_tmul']
/-- Heterobasic version of `TensorProduct.assoc`:

Linear equivalence between `(M ⊗[A] N) ⊗[R] P` and `M ⊗[A] (N ⊗[R] P)`.

Note this is especially useful with `A = R` (where it is a "more linear" version of
`TensorProduct.assoc`), or with `B = A`. -/
def assoc : (M ⊗[A] P) ⊗[R] Q ≃ₗ[B] M ⊗[A] (P ⊗[R] Q) :=
  LinearEquiv.ofLinear
    (lift <| lift <| lcurry R A B P Q _ ∘ₗ mk A B M (P ⊗[R] Q))
    (lift <| uncurry R A B P Q _ ∘ₗ curry (mk R B _ Q))
    (by 

Proof state:
R : Type uR
A : Type uA
B : Type uB
M : Type uM
N : Type uN
P : Type uP
Q : Type uQ
P' : Type uP'
Q' : Type uQ'
inst✝²⁴ : CommSemiring R
inst✝²³ : CommSemiring A
inst✝²² : Semiring B
inst✝²¹ : Algebra R A
inst✝²⁰ : Algebra R B
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
inst✝¹⁷ : Module A M
inst✝¹⁶ : Module B M
inst✝¹⁵ : IsScalarTower R A M
inst✝¹⁴ : IsScalarTower R B M
inst✝¹³ : SMulCommClass A B M
inst✝¹² : AddCommMonoid N
inst✝¹¹ : Module R N
inst✝¹⁰ : AddCommMonoid P
inst✝⁹ : Module R P
inst✝⁸ : Module A P
inst✝⁷ : Module B P
inst✝⁶ : IsScalarTower R A P
inst✝⁵ : IsScalarTower R B P
inst✝⁴ : SMulCommClass A B P
inst✝³ : AddCommMonoid Q
inst✝² : Module R Q
inst✝¹ : Algebra A B
inst✝ : IsScalarTower A B M
⊢ comp (lift (lift (lcurry R A B P Q (M ⊗[A] P ⊗[R] Q) ∘ₗ mk A B M (P ⊗[R] Q))))
      (lift (uncurry R A B P Q ((M ⊗[A] P) ⊗[R] Q) ∘ₗ curry (mk R B (M ⊗[A] P) Q))) =
    LinearMap.id

Next tactic:
ext
/-- Heterobasic version of `TensorProduct.assoc`:

Linear equivalence between `(M ⊗[A] N) ⊗[R] P` and `M ⊗[A] (N ⊗[R] P)`.

Note this is especially useful with `A = R` (where it is a "more linear" version of
`TensorProduct.assoc`), or with `B = A`. -/
def assoc : (M ⊗[A] P) ⊗[R] Q ≃ₗ[B] M ⊗[A] (P ⊗[R] Q) :=
  LinearEquiv.ofLinear
    (lift <| lift <| lcurry R A B P Q _ ∘ₗ mk A B M (P ⊗[R] Q))
    (lift <| uncurry R A B P Q _ ∘ₗ curry (mk R B _ Q))
    (by ext; 

Proof state:
case a.h.a.h.h
R : Type uR
A : Type uA
B : Type uB
M : Type uM
N : Type uN
P : Type uP
Q : Type uQ
P' : Type uP'
Q' : Type uQ'
inst✝²⁴ : CommSemiring R
inst✝²³ : CommSemiring A
inst✝²² : Semiring B
inst✝²¹ : Algebra R A
inst✝²⁰ : Algebra R B
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
inst✝¹⁷ : Module A M
inst✝¹⁶ : Module B M
inst✝¹⁵ : IsScalarTower R A M
inst✝¹⁴ : IsScalarTower R B M
inst✝¹³ : SMulCommClass A B M
inst✝¹² : AddCommMonoid N
inst✝¹¹ : Module R N
inst✝¹⁰ : AddCommMonoid P
inst✝⁹ : Module R P
inst✝⁸ : Module A P
inst✝⁷ : Module B P
inst✝⁶ : IsScalarTower R A P
inst✝⁵ : IsScalarTower R B P
inst✝⁴ : SMulCommClass A B P
inst✝³ : AddCommMonoid Q
inst✝² : Module R Q
inst✝¹ : Algebra A B
inst✝ : IsScalarTower A B M
x✝² : M
x✝¹ : P
x✝ : Q
⊢ ((curry
          ((curry
              (comp (lift (lift (lcurry R A B P Q (M ⊗[A] P ⊗[R] Q) ∘ₗ mk A B M (P ⊗[R] Q))))
                (lift (uncurry R A B P Q ((M ⊗[A] P) ⊗[R] Q) ∘ₗ curry (mk R B (M ⊗[A] P) Q)))))
            x✝²))
        x✝¹)
      x✝ =
    ((curry ((curry LinearMap.id) x✝²)) x✝¹) x✝

Next tactic:
rfl
/-- Heterobasic version of `TensorProduct.assoc`:

Linear equivalence between `(M ⊗[A] N) ⊗[R] P` and `M ⊗[A] (N ⊗[R] P)`.

Note this is especially useful with `A = R` (where it is a "more linear" version of
`TensorProduct.assoc`), or with `B = A`. -/
def assoc : (M ⊗[A] P) ⊗[R] Q ≃ₗ[B] M ⊗[A] (P ⊗[R] Q) :=
  LinearEquiv.ofLinear
    (lift <| lift <| lcurry R A B P Q _ ∘ₗ mk A B M (P ⊗[R] Q))
    (lift <| uncurry R A B P Q _ ∘ₗ curry (mk R B _ Q))
    (by ext; rfl)
    (by 

Proof state:
R : Type uR
A : Type uA
B : Type uB
M : Type uM
N : Type uN
P : Type uP
Q : Type uQ
P' : Type uP'
Q' : Type uQ'
inst✝²⁴ : CommSemiring R
inst✝²³ : CommSemiring A
inst✝²² : Semiring B
inst✝²¹ : Algebra R A
inst✝²⁰ : Algebra R B
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
inst✝¹⁷ : Module A M
inst✝¹⁶ : Module B M
inst✝¹⁵ : IsScalarTower R A M
inst✝¹⁴ : IsScalarTower R B M
inst✝¹³ : SMulCommClass A B M
inst✝¹² : AddCommMonoid N
inst✝¹¹ : Module R N
inst✝¹⁰ : AddCommMonoid P
inst✝⁹ : Module R P
inst✝⁸ : Module A P
inst✝⁷ : Module B P
inst✝⁶ : IsScalarTower R A P
inst✝⁵ : IsScalarTower R B P
inst✝⁴ : SMulCommClass A B P
inst✝³ : AddCommMonoid Q
inst✝² : Module R Q
inst✝¹ : Algebra A B
inst✝ : IsScalarTower A B M
⊢ comp (lift (uncurry R A B P Q ((M ⊗[A] P) ⊗[R] Q) ∘ₗ curry (mk R B (M ⊗[A] P) Q)))
      (lift (lift (lcurry R A B P Q (M ⊗[A] P ⊗[R] Q) ∘ₗ mk A B M (P ⊗[R] Q)))) =
    LinearMap.id

Next tactic:
ext
/-- Heterobasic version of `TensorProduct.assoc`:

Linear equivalence between `(M ⊗[A] N) ⊗[R] P` and `M ⊗[A] (N ⊗[R] P)`.

Note this is especially useful with `A = R` (where it is a "more linear" version of
`TensorProduct.assoc`), or with `B = A`. -/
def assoc : (M ⊗[A] P) ⊗[R] Q ≃ₗ[B] M ⊗[A] (P ⊗[R] Q) :=
  LinearEquiv.ofLinear
    (lift <| lift <| lcurry R A B P Q _ ∘ₗ mk A B M (P ⊗[R] Q))
    (lift <| uncurry R A B P Q _ ∘ₗ curry (mk R B _ Q))
    (by ext; rfl)
    (by ext; 

Proof state:
case a.a.h.h.h
R : Type uR
A : Type uA
B : Type uB
M : Type uM
N : Type uN
P : Type uP
Q : Type uQ
P' : Type uP'
Q' : Type uQ'
inst✝²⁴ : CommSemiring R
inst✝²³ : CommSemiring A
inst✝²² : Semiring B
inst✝²¹ : Algebra R A
inst✝²⁰ : Algebra R B
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
inst✝¹⁷ : Module A M
inst✝¹⁶ : Module B M
inst✝¹⁵ : IsScalarTower R A M
inst✝¹⁴ : IsScalarTower R B M
inst✝¹³ : SMulCommClass A B M
inst✝¹² : AddCommMonoid N
inst✝¹¹ : Module R N
inst✝¹⁰ : AddCommMonoid P
inst✝⁹ : Module R P
inst✝⁸ : Module A P
inst✝⁷ : Module B P
inst✝⁶ : IsScalarTower R A P
inst✝⁵ : IsScalarTower R B P
inst✝⁴ : SMulCommClass A B P
inst✝³ : AddCommMonoid Q
inst✝² : Module R Q
inst✝¹ : Algebra A B
inst✝ : IsScalarTower A B M
x✝² : M
x✝¹ : P
x✝ : Q
⊢ (((curry
            (curry
              (comp (lift (uncurry R A B P Q ((M ⊗[A] P) ⊗[R] Q) ∘ₗ curry (mk R B (M ⊗[A] P) Q)))
                (lift (lift (lcurry R A B P Q (M ⊗[A] P ⊗[R] Q) ∘ₗ mk A B M (P ⊗[R] Q)))))))
          x✝²)
        x✝¹)
      x✝ =
    (((curry (curry LinearMap.id)) x✝²) x✝¹) x✝

Next tactic:
rfl
@[simp]
lemma baseChange_bot : (⊥ : Submodule R M).baseChange A = ⊥ := by 

Proof state:
R : Type u_1
M : Type u_2
A : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
p : Submodule R M
⊢ baseChange A ⊥ = ⊥

Next tactic:
simp [baseChange]
@[simp]
lemma baseChange_top : (⊤ : Submodule R M).baseChange A = ⊤ := by
  

Proof state:
R : Type u_1
M : Type u_2
A : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
p : Submodule R M
⊢ baseChange A ⊤ = ⊤

Next tactic:
rw [baseChange, map_top, eq_top_iff']
@[simp]
lemma baseChange_top : (⊤ : Submodule R M).baseChange A = ⊤ := by
  rw [baseChange, map_top, eq_top_iff']
  

Proof state:
R : Type u_1
M : Type u_2
A : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
p : Submodule R M
⊢ ∀ (x : A ⊗[R] M), x ∈ span A ↑(LinearMap.range ((TensorProduct.mk R A M) 1))

Next tactic:
intro x
@[simp]
lemma baseChange_top : (⊤ : Submodule R M).baseChange A = ⊤ := by
  rw [baseChange, map_top, eq_top_iff']
  intro x
  

Proof state:
R : Type u_1
M : Type u_2
A : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
p : Submodule R M
x : A ⊗[R] M
⊢ x ∈ span A ↑(LinearMap.range ((TensorProduct.mk R A M) 1))

Next tactic:
refine x.induction_on (by simp) (fun a y ↦ ?_) (fun _ _ ↦ Submodule.add_mem _)
@[simp]
lemma baseChange_top : (⊤ : Submodule R M).baseChange A = ⊤ := by
  rw [baseChange, map_top, eq_top_iff']
  intro x
  refine x.induction_on (by 

Proof state:
R : Type u_1
M : Type u_2
A : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
p : Submodule R M
x : A ⊗[R] M
⊢ 0 ∈ span A ↑(LinearMap.range ((TensorProduct.mk R A M) 1))

Next tactic:
simp
@[simp]
lemma baseChange_top : (⊤ : Submodule R M).baseChange A = ⊤ := by
  rw [baseChange, map_top, eq_top_iff']
  intro x
  refine x.induction_on (by simp) (fun a y ↦ ?_) (fun _ _ ↦ Submodule.add_mem _)
  

Proof state:
R : Type u_1
M : Type u_2
A : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
p : Submodule R M
x : A ⊗[R] M
a : A
y : M
⊢ a ⊗ₜ[R] y ∈ span A ↑(LinearMap.range ((TensorProduct.mk R A M) 1))

Next tactic:
rw [← mul_one a, ← smul_eq_mul, ← smul_tmul']
@[simp]
lemma baseChange_top : (⊤ : Submodule R M).baseChange A = ⊤ := by
  rw [baseChange, map_top, eq_top_iff']
  intro x
  refine x.induction_on (by simp) (fun a y ↦ ?_) (fun _ _ ↦ Submodule.add_mem _)
  rw [← mul_one a, ← smul_eq_mul, ← smul_tmul']
  

Proof state:
R : Type u_1
M : Type u_2
A : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
p : Submodule R M
x : A ⊗[R] M
a : A
y : M
⊢ a • 1 ⊗ₜ[R] y ∈ span A ↑(LinearMap.range ((TensorProduct.mk R A M) 1))

Next tactic:
refine smul_mem _ _ (subset_span ?_)
@[simp]
lemma baseChange_top : (⊤ : Submodule R M).baseChange A = ⊤ := by
  rw [baseChange, map_top, eq_top_iff']
  intro x
  refine x.induction_on (by simp) (fun a y ↦ ?_) (fun _ _ ↦ Submodule.add_mem _)
  rw [← mul_one a, ← smul_eq_mul, ← smul_tmul']
  refine smul_mem _ _ (subset_span ?_)
  

Proof state:
R : Type u_1
M : Type u_2
A : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
p : Submodule R M
x : A ⊗[R] M
a : A
y : M
⊢ 1 ⊗ₜ[R] y ∈ ↑(LinearMap.range ((TensorProduct.mk R A M) 1))

Next tactic:
simp
variable {A p} in
lemma tmul_mem_baseChange_of_mem (a : A) {m : M} (hm : m ∈ p) :
    a ⊗ₜ[R] m ∈ p.baseChange A := by
  

Proof state:
R : Type u_1
M : Type u_2
A : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
p : Submodule R M
a : A
m : M
hm : m ∈ p
⊢ a ⊗ₜ[R] m ∈ baseChange A p

Next tactic:
rw [← mul_one a, ← smul_eq_mul, ← smul_tmul']
variable {A p} in
lemma tmul_mem_baseChange_of_mem (a : A) {m : M} (hm : m ∈ p) :
    a ⊗ₜ[R] m ∈ p.baseChange A := by
  rw [← mul_one a, ← smul_eq_mul, ← smul_tmul']
  

Proof state:
R : Type u_1
M : Type u_2
A : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
p : Submodule R M
a : A
m : M
hm : m ∈ p
⊢ a • 1 ⊗ₜ[R] m ∈ baseChange A p

Next tactic:
exact smul_mem (baseChange A p) a (subset_span ⟨m, hm, rfl⟩)
@[simp]
lemma baseChange_span (s : Set M) :
    (span R s).baseChange A = span A (TensorProduct.mk R A M 1 '' s) := by
  

Proof state:
R : Type u_1
M : Type u_2
A : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
p : Submodule R M
s : Set M
⊢ baseChange A (span R s) = span A (⇑((TensorProduct.mk R A M) 1) '' s)

Next tactic:
simp only [baseChange, map_coe]
@[simp]
lemma baseChange_span (s : Set M) :
    (span R s).baseChange A = span A (TensorProduct.mk R A M 1 '' s) := by
  simp only [baseChange, map_coe]
  

Proof state:
R : Type u_1
M : Type u_2
A : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
p : Submodule R M
s : Set M
⊢ span A (⇑((TensorProduct.mk R A M) 1) '' ↑(span R s)) = span A (⇑((TensorProduct.mk R A M) 1) '' s)

Next tactic:
refine le_antisymm (span_le.mpr ?_) (span_mono <| Set.image_subset _ subset_span)
@[simp]
lemma baseChange_span (s : Set M) :
    (span R s).baseChange A = span A (TensorProduct.mk R A M 1 '' s) := by
  simp only [baseChange, map_coe]
  refine le_antisymm (span_le.mpr ?_) (span_mono <| Set.image_subset _ subset_span)
  

Proof state:
R : Type u_1
M : Type u_2
A : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
p : Submodule R M
s : Set M
⊢ ⇑((TensorProduct.mk R A M) 1) '' ↑(span R s) ⊆ ↑(span A (⇑((TensorProduct.mk R A M) 1) '' s))

Next tactic:
rintro - ⟨m : M, hm : m ∈ span R s, rfl⟩
@[simp]
lemma baseChange_span (s : Set M) :
    (span R s).baseChange A = span A (TensorProduct.mk R A M 1 '' s) := by
  simp only [baseChange, map_coe]
  refine le_antisymm (span_le.mpr ?_) (span_mono <| Set.image_subset _ subset_span)
  rintro - ⟨m : M, hm : m ∈ span R s, rfl⟩
  

Proof state:
case intro.intro
R : Type u_1
M : Type u_2
A : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
p : Submodule R M
s : Set M
m : M
hm : m ∈ span R s
⊢ ((TensorProduct.mk R A M) 1) m ∈ ↑(span A (⇑((TensorProduct.mk R A M) 1) '' s))

Next tactic:
apply span_induction (p := fun m' ↦ (1 : A) ⊗ₜ[R] m' ∈ span A (TensorProduct.mk R A M 1 '' s)) hm
@[simp]
lemma baseChange_span (s : Set M) :
    (span R s).baseChange A = span A (TensorProduct.mk R A M 1 '' s) := by
  simp only [baseChange, map_coe]
  refine le_antisymm (span_le.mpr ?_) (span_mono <| Set.image_subset _ subset_span)
  rintro - ⟨m : M, hm : m ∈ span R s, rfl⟩
  apply span_induction (p := fun m' ↦ (1 : A) ⊗ₜ[R] m' ∈ span A (TensorProduct.mk R A M 1 '' s)) hm
  · 

Proof state:
case intro.intro.Hs
R : Type u_1
M : Type u_2
A : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
p : Submodule R M
s : Set M
m : M
hm : m ∈ span R s
⊢ ∀ x ∈ s, 1 ⊗ₜ[R] x ∈ span A (⇑((TensorProduct.mk R A M) 1) '' s)

Next tactic:
intro m hm
@[simp]
lemma baseChange_span (s : Set M) :
    (span R s).baseChange A = span A (TensorProduct.mk R A M 1 '' s) := by
  simp only [baseChange, map_coe]
  refine le_antisymm (span_le.mpr ?_) (span_mono <| Set.image_subset _ subset_span)
  rintro - ⟨m : M, hm : m ∈ span R s, rfl⟩
  apply span_induction (p := fun m' ↦ (1 : A) ⊗ₜ[R] m' ∈ span A (TensorProduct.mk R A M 1 '' s)) hm
  · intro m hm
    

Proof state:
case intro.intro.Hs
R : Type u_1
M : Type u_2
A : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
p : Submodule R M
s : Set M
m✝ : M
hm✝ : m✝ ∈ span R s
m : M
hm : m ∈ s
⊢ 1 ⊗ₜ[R] m ∈ span A (⇑((TensorProduct.mk R A M) 1) '' s)

Next tactic:
exact subset_span ⟨m, hm, rfl⟩