l3lab/ntp-mathlib huggingface dataset:
/-- `SMulCommClass R' R'₂ M` implies `SMulCommClass R' R'₂ (M ⊗[R] N)` -/
instance smulCommClass_left [SMulCommClass R' R'₂ M] : SMulCommClass R' R'₂ (M ⊗[R] N) where
  smul_comm r' r'₂ x :=
    TensorProduct.induction_on x (by simp_rw [TensorProduct.smul_zero])
      (fun m n => by simp_rw [smul_tmul', smul_comm]) fun x y ihx ihy => by
      simp_rw [TensorProduct.smul_add]; 

Proof state:
R : Type u_1
inst✝²² : CommSemiring R
R' : Type u_2
inst✝²¹ : Monoid R'
R'' : Type u_3
inst✝²⁰ : Semiring R''
M : Type u_4
N : Type u_5
P : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : AddCommMonoid N
inst✝¹⁷ : AddCommMonoid P
inst✝¹⁶ : AddCommMonoid Q
inst✝¹⁵ : AddCommMonoid S
inst✝¹⁴ : AddCommMonoid T
inst✝¹³ : Module R M
inst✝¹² : Module R N
inst✝¹¹ : Module R P
inst✝¹⁰ : Module R Q
inst✝⁹ : Module R S
inst✝⁸ : Module R T
inst✝⁷ : DistribMulAction R' M
inst✝⁶ : Module R'' M
inst✝⁵ : SMulCommClass R R' M
inst✝⁴ : SMulCommClass R R'' M
R'₂ : Type u_10
inst✝³ : Monoid R'₂
inst✝² : DistribMulAction R'₂ M
inst✝¹ : SMulCommClass R R'₂ M
inst✝ : SMulCommClass R' R'₂ M
r' : R'
r'₂ : R'₂
x✝ x y : M ⊗[R] N
ihx : r' • r'₂ • x = r'₂ • r' • x
ihy : r' • r'₂ • y = r'₂ • r' • y
⊢ r' • r'₂ • x + r' • r'₂ • y = r'₂ • r' • x + r'₂ • r' • y

Next tactic:
rw [ihx, ihy]
/-- `IsScalarTower R'₂ R' M` implies `IsScalarTower R'₂ R' (M ⊗[R] N)` -/
instance isScalarTower_left [IsScalarTower R'₂ R' M] : IsScalarTower R'₂ R' (M ⊗[R] N) :=
  ⟨fun s r x =>
    x.induction_on (by 

Proof state:
R : Type u_1
inst✝²³ : CommSemiring R
R' : Type u_2
inst✝²² : Monoid R'
R'' : Type u_3
inst✝²¹ : Semiring R''
M : Type u_4
N : Type u_5
P : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝²⁰ : AddCommMonoid M
inst✝¹⁹ : AddCommMonoid N
inst✝¹⁸ : AddCommMonoid P
inst✝¹⁷ : AddCommMonoid Q
inst✝¹⁶ : AddCommMonoid S
inst✝¹⁵ : AddCommMonoid T
inst✝¹⁴ : Module R M
inst✝¹³ : Module R N
inst✝¹² : Module R P
inst✝¹¹ : Module R Q
inst✝¹⁰ : Module R S
inst✝⁹ : Module R T
inst✝⁸ : DistribMulAction R' M
inst✝⁷ : Module R'' M
inst✝⁶ : SMulCommClass R R' M
inst✝⁵ : SMulCommClass R R'' M
R'₂ : Type u_10
inst✝⁴ : Monoid R'₂
inst✝³ : DistribMulAction R'₂ M
inst✝² : SMulCommClass R R'₂ M
inst✝¹ : SMul R'₂ R'
inst✝ : IsScalarTower R'₂ R' M
s : R'₂
r : R'
x : M ⊗[R] N
⊢ (s • r) • 0 = s • r • 0

Next tactic:
simp
/-- `IsScalarTower R'₂ R' M` implies `IsScalarTower R'₂ R' (M ⊗[R] N)` -/
instance isScalarTower_left [IsScalarTower R'₂ R' M] : IsScalarTower R'₂ R' (M ⊗[R] N) :=
  ⟨fun s r x =>
    x.induction_on (by simp)
      (fun m n => by 

Proof state:
R : Type u_1
inst✝²³ : CommSemiring R
R' : Type u_2
inst✝²² : Monoid R'
R'' : Type u_3
inst✝²¹ : Semiring R''
M : Type u_4
N : Type u_5
P : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝²⁰ : AddCommMonoid M
inst✝¹⁹ : AddCommMonoid N
inst✝¹⁸ : AddCommMonoid P
inst✝¹⁷ : AddCommMonoid Q
inst✝¹⁶ : AddCommMonoid S
inst✝¹⁵ : AddCommMonoid T
inst✝¹⁴ : Module R M
inst✝¹³ : Module R N
inst✝¹² : Module R P
inst✝¹¹ : Module R Q
inst✝¹⁰ : Module R S
inst✝⁹ : Module R T
inst✝⁸ : DistribMulAction R' M
inst✝⁷ : Module R'' M
inst✝⁶ : SMulCommClass R R' M
inst✝⁵ : SMulCommClass R R'' M
R'₂ : Type u_10
inst✝⁴ : Monoid R'₂
inst✝³ : DistribMulAction R'₂ M
inst✝² : SMulCommClass R R'₂ M
inst✝¹ : SMul R'₂ R'
inst✝ : IsScalarTower R'₂ R' M
s : R'₂
r : R'
x : M ⊗[R] N
m : M
n : N
⊢ (s • r) • m ⊗ₜ[R] n = s • r • m ⊗ₜ[R] n

Next tactic:
rw [smul_tmul', smul_tmul', smul_tmul', smul_assoc]
/-- `IsScalarTower R'₂ R' M` implies `IsScalarTower R'₂ R' (M ⊗[R] N)` -/
instance isScalarTower_left [IsScalarTower R'₂ R' M] : IsScalarTower R'₂ R' (M ⊗[R] N) :=
  ⟨fun s r x =>
    x.induction_on (by simp)
      (fun m n => by rw [smul_tmul', smul_tmul', smul_tmul', smul_assoc]) fun x y ihx ihy => by
      

Proof state:
R : Type u_1
inst✝²³ : CommSemiring R
R' : Type u_2
inst✝²² : Monoid R'
R'' : Type u_3
inst✝²¹ : Semiring R''
M : Type u_4
N : Type u_5
P : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝²⁰ : AddCommMonoid M
inst✝¹⁹ : AddCommMonoid N
inst✝¹⁸ : AddCommMonoid P
inst✝¹⁷ : AddCommMonoid Q
inst✝¹⁶ : AddCommMonoid S
inst✝¹⁵ : AddCommMonoid T
inst✝¹⁴ : Module R M
inst✝¹³ : Module R N
inst✝¹² : Module R P
inst✝¹¹ : Module R Q
inst✝¹⁰ : Module R S
inst✝⁹ : Module R T
inst✝⁸ : DistribMulAction R' M
inst✝⁷ : Module R'' M
inst✝⁶ : SMulCommClass R R' M
inst✝⁵ : SMulCommClass R R'' M
R'₂ : Type u_10
inst✝⁴ : Monoid R'₂
inst✝³ : DistribMulAction R'₂ M
inst✝² : SMulCommClass R R'₂ M
inst✝¹ : SMul R'₂ R'
inst✝ : IsScalarTower R'₂ R' M
s : R'₂
r : R'
x✝ x y : M ⊗[R] N
ihx : (s • r) • x = s • r • x
ihy : (s • r) • y = s • r • y
⊢ (s • r) • (x + y) = s • r • (x + y)

Next tactic:
rw [smul_add, smul_add, smul_add, ihx, ihy]
/-- `IsScalarTower R'₂ R' N` implies `IsScalarTower R'₂ R' (M ⊗[R] N)` -/
instance isScalarTower_right [IsScalarTower R'₂ R' N] : IsScalarTower R'₂ R' (M ⊗[R] N) :=
  ⟨fun s r x =>
    x.induction_on (by 

Proof state:
R : Type u_1
inst✝²⁷ : CommSemiring R
R' : Type u_2
inst✝²⁶ : Monoid R'
R'' : Type u_3
inst✝²⁵ : Semiring R''
M : Type u_4
N : Type u_5
P : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝²⁴ : AddCommMonoid M
inst✝²³ : AddCommMonoid N
inst✝²² : AddCommMonoid P
inst✝²¹ : AddCommMonoid Q
inst✝²⁰ : AddCommMonoid S
inst✝¹⁹ : AddCommMonoid T
inst✝¹⁸ : Module R M
inst✝¹⁷ : Module R N
inst✝¹⁶ : Module R P
inst✝¹⁵ : Module R Q
inst✝¹⁴ : Module R S
inst✝¹³ : Module R T
inst✝¹² : DistribMulAction R' M
inst✝¹¹ : Module R'' M
inst✝¹⁰ : SMulCommClass R R' M
inst✝⁹ : SMulCommClass R R'' M
R'₂ : Type u_10
inst✝⁸ : Monoid R'₂
inst✝⁷ : DistribMulAction R'₂ M
inst✝⁶ : SMulCommClass R R'₂ M
inst✝⁵ : SMul R'₂ R'
inst✝⁴ : DistribMulAction R'₂ N
inst✝³ : DistribMulAction R' N
inst✝² : CompatibleSMul R R'₂ M N
inst✝¹ : CompatibleSMul R R' M N
inst✝ : IsScalarTower R'₂ R' N
s : R'₂
r : R'
x : M ⊗[R] N
⊢ (s • r) • 0 = s • r • 0

Next tactic:
simp
/-- `IsScalarTower R'₂ R' N` implies `IsScalarTower R'₂ R' (M ⊗[R] N)` -/
instance isScalarTower_right [IsScalarTower R'₂ R' N] : IsScalarTower R'₂ R' (M ⊗[R] N) :=
  ⟨fun s r x =>
    x.induction_on (by simp)
      (fun m n => by 

Proof state:
R : Type u_1
inst✝²⁷ : CommSemiring R
R' : Type u_2
inst✝²⁶ : Monoid R'
R'' : Type u_3
inst✝²⁵ : Semiring R''
M : Type u_4
N : Type u_5
P : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝²⁴ : AddCommMonoid M
inst✝²³ : AddCommMonoid N
inst✝²² : AddCommMonoid P
inst✝²¹ : AddCommMonoid Q
inst✝²⁰ : AddCommMonoid S
inst✝¹⁹ : AddCommMonoid T
inst✝¹⁸ : Module R M
inst✝¹⁷ : Module R N
inst✝¹⁶ : Module R P
inst✝¹⁵ : Module R Q
inst✝¹⁴ : Module R S
inst✝¹³ : Module R T
inst✝¹² : DistribMulAction R' M
inst✝¹¹ : Module R'' M
inst✝¹⁰ : SMulCommClass R R' M
inst✝⁹ : SMulCommClass R R'' M
R'₂ : Type u_10
inst✝⁸ : Monoid R'₂
inst✝⁷ : DistribMulAction R'₂ M
inst✝⁶ : SMulCommClass R R'₂ M
inst✝⁵ : SMul R'₂ R'
inst✝⁴ : DistribMulAction R'₂ N
inst✝³ : DistribMulAction R' N
inst✝² : CompatibleSMul R R'₂ M N
inst✝¹ : CompatibleSMul R R' M N
inst✝ : IsScalarTower R'₂ R' N
s : R'₂
r : R'
x : M ⊗[R] N
m : M
n : N
⊢ (s • r) • m ⊗ₜ[R] n = s • r • m ⊗ₜ[R] n

Next tactic:
rw [← tmul_smul, ← tmul_smul, ← tmul_smul, smul_assoc]
/-- `IsScalarTower R'₂ R' N` implies `IsScalarTower R'₂ R' (M ⊗[R] N)` -/
instance isScalarTower_right [IsScalarTower R'₂ R' N] : IsScalarTower R'₂ R' (M ⊗[R] N) :=
  ⟨fun s r x =>
    x.induction_on (by simp)
      (fun m n => by rw [← tmul_smul, ← tmul_smul, ← tmul_smul, smul_assoc]) fun x y ihx ihy => by
      

Proof state:
R : Type u_1
inst✝²⁷ : CommSemiring R
R' : Type u_2
inst✝²⁶ : Monoid R'
R'' : Type u_3
inst✝²⁵ : Semiring R''
M : Type u_4
N : Type u_5
P : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝²⁴ : AddCommMonoid M
inst✝²³ : AddCommMonoid N
inst✝²² : AddCommMonoid P
inst✝²¹ : AddCommMonoid Q
inst✝²⁰ : AddCommMonoid S
inst✝¹⁹ : AddCommMonoid T
inst✝¹⁸ : Module R M
inst✝¹⁷ : Module R N
inst✝¹⁶ : Module R P
inst✝¹⁵ : Module R Q
inst✝¹⁴ : Module R S
inst✝¹³ : Module R T
inst✝¹² : DistribMulAction R' M
inst✝¹¹ : Module R'' M
inst✝¹⁰ : SMulCommClass R R' M
inst✝⁹ : SMulCommClass R R'' M
R'₂ : Type u_10
inst✝⁸ : Monoid R'₂
inst✝⁷ : DistribMulAction R'₂ M
inst✝⁶ : SMulCommClass R R'₂ M
inst✝⁵ : SMul R'₂ R'
inst✝⁴ : DistribMulAction R'₂ N
inst✝³ : DistribMulAction R' N
inst✝² : CompatibleSMul R R'₂ M N
inst✝¹ : CompatibleSMul R R' M N
inst✝ : IsScalarTower R'₂ R' N
s : R'₂
r : R'
x✝ x y : M ⊗[R] N
ihx : (s • r) • x = s • r • x
ihy : (s • r) • y = s • r • y
⊢ (s • r) • (x + y) = s • r • (x + y)

Next tactic:
rw [smul_add, smul_add, smul_add, ihx, ihy]
/-- The canonical bilinear map `M → N → M ⊗[R] N`. -/
def mk : M →ₗ[R] N →ₗ[R] M ⊗[R] N :=
  LinearMap.mk₂ R (· ⊗ₜ ·) add_tmul (fun c m n => by 

Proof state:
R : Type u_1
inst✝¹⁸ : CommSemiring R
R' : Type u_2
inst✝¹⁷ : Monoid R'
R'' : Type u_3
inst✝¹⁶ : Semiring R''
M : Type u_4
N : Type u_5
P : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : AddCommMonoid N
inst✝¹³ : AddCommMonoid P
inst✝¹² : AddCommMonoid Q
inst✝¹¹ : AddCommMonoid S
inst✝¹⁰ : AddCommMonoid T
inst✝⁹ : Module R M
inst✝⁸ : Module R N
inst✝⁷ : Module R P
inst✝⁶ : Module R Q
inst✝⁵ : Module R S
inst✝⁴ : Module R T
inst✝³ : DistribMulAction R' M
inst✝² : Module R'' M
inst✝¹ : SMulCommClass R R' M
inst✝ : SMulCommClass R R'' M
c : R
m : M
n : N
⊢ (fun x x_1 => x ⊗ₜ[R] x_1) (c • m) n = c • (fun x x_1 => x ⊗ₜ[R] x_1) m n

Next tactic:
simp_rw [smul_tmul, tmul_smul]
theorem ite_tmul (x₁ : M) (x₂ : N) (P : Prop) [Decidable P] :
    (if P then x₁ else 0) ⊗ₜ[R] x₂ = if P then x₁ ⊗ₜ x₂ else 0 := by 

Proof state:
R : Type u_1
inst✝¹⁹ : CommSemiring R
R' : Type u_2
inst✝¹⁸ : Monoid R'
R'' : Type u_3
inst✝¹⁷ : Semiring R''
M : Type u_4
N : Type u_5
P✝ : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : AddCommMonoid N
inst✝¹⁴ : AddCommMonoid P✝
inst✝¹³ : AddCommMonoid Q
inst✝¹² : AddCommMonoid S
inst✝¹¹ : AddCommMonoid T
inst✝¹⁰ : Module R M
inst✝⁹ : Module R N
inst✝⁸ : Module R P✝
inst✝⁷ : Module R Q
inst✝⁶ : Module R S
inst✝⁵ : Module R T
inst✝⁴ : DistribMulAction R' M
inst✝³ : Module R'' M
inst✝² : SMulCommClass R R' M
inst✝¹ : SMulCommClass R R'' M
x₁ : M
x₂ : N
P : Prop
inst✝ : Decidable P
⊢ (if P then x₁ else 0) ⊗ₜ[R] x₂ = if P then x₁ ⊗ₜ[R] x₂ else 0

Next tactic:
split_ifs
theorem ite_tmul (x₁ : M) (x₂ : N) (P : Prop) [Decidable P] :
    (if P then x₁ else 0) ⊗ₜ[R] x₂ = if P then x₁ ⊗ₜ x₂ else 0 := by split_ifs <;> 

Proof state:
case pos
R : Type u_1
inst✝¹⁹ : CommSemiring R
R' : Type u_2
inst✝¹⁸ : Monoid R'
R'' : Type u_3
inst✝¹⁷ : Semiring R''
M : Type u_4
N : Type u_5
P✝ : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : AddCommMonoid N
inst✝¹⁴ : AddCommMonoid P✝
inst✝¹³ : AddCommMonoid Q
inst✝¹² : AddCommMonoid S
inst✝¹¹ : AddCommMonoid T
inst✝¹⁰ : Module R M
inst✝⁹ : Module R N
inst✝⁸ : Module R P✝
inst✝⁷ : Module R Q
inst✝⁶ : Module R S
inst✝⁵ : Module R T
inst✝⁴ : DistribMulAction R' M
inst✝³ : Module R'' M
inst✝² : SMulCommClass R R' M
inst✝¹ : SMulCommClass R R'' M
x₁ : M
x₂ : N
P : Prop
inst✝ : Decidable P
h✝ : P
⊢ x₁ ⊗ₜ[R] x₂ = x₁ ⊗ₜ[R] x₂

Next tactic:
simp
theorem ite_tmul (x₁ : M) (x₂ : N) (P : Prop) [Decidable P] :
    (if P then x₁ else 0) ⊗ₜ[R] x₂ = if P then x₁ ⊗ₜ x₂ else 0 := by split_ifs <;> 

Proof state:
case neg
R : Type u_1
inst✝¹⁹ : CommSemiring R
R' : Type u_2
inst✝¹⁸ : Monoid R'
R'' : Type u_3
inst✝¹⁷ : Semiring R''
M : Type u_4
N : Type u_5
P✝ : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : AddCommMonoid N
inst✝¹⁴ : AddCommMonoid P✝
inst✝¹³ : AddCommMonoid Q
inst✝¹² : AddCommMonoid S
inst✝¹¹ : AddCommMonoid T
inst✝¹⁰ : Module R M
inst✝⁹ : Module R N
inst✝⁸ : Module R P✝
inst✝⁷ : Module R Q
inst✝⁶ : Module R S
inst✝⁵ : Module R T
inst✝⁴ : DistribMulAction R' M
inst✝³ : Module R'' M
inst✝² : SMulCommClass R R' M
inst✝¹ : SMulCommClass R R'' M
x₁ : M
x₂ : N
P : Prop
inst✝ : Decidable P
h✝ : ¬P
⊢ 0 ⊗ₜ[R] x₂ = 0

Next tactic:
simp
theorem tmul_ite (x₁ : M) (x₂ : N) (P : Prop) [Decidable P] :
    (x₁ ⊗ₜ[R] if P then x₂ else 0) = if P then x₁ ⊗ₜ x₂ else 0 := by 

Proof state:
R : Type u_1
inst✝¹⁹ : CommSemiring R
R' : Type u_2
inst✝¹⁸ : Monoid R'
R'' : Type u_3
inst✝¹⁷ : Semiring R''
M : Type u_4
N : Type u_5
P✝ : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : AddCommMonoid N
inst✝¹⁴ : AddCommMonoid P✝
inst✝¹³ : AddCommMonoid Q
inst✝¹² : AddCommMonoid S
inst✝¹¹ : AddCommMonoid T
inst✝¹⁰ : Module R M
inst✝⁹ : Module R N
inst✝⁸ : Module R P✝
inst✝⁷ : Module R Q
inst✝⁶ : Module R S
inst✝⁵ : Module R T
inst✝⁴ : DistribMulAction R' M
inst✝³ : Module R'' M
inst✝² : SMulCommClass R R' M
inst✝¹ : SMulCommClass R R'' M
x₁ : M
x₂ : N
P : Prop
inst✝ : Decidable P
⊢ (x₁ ⊗ₜ[R] if P then x₂ else 0) = if P then x₁ ⊗ₜ[R] x₂ else 0

Next tactic:
split_ifs
theorem tmul_ite (x₁ : M) (x₂ : N) (P : Prop) [Decidable P] :
    (x₁ ⊗ₜ[R] if P then x₂ else 0) = if P then x₁ ⊗ₜ x₂ else 0 := by split_ifs <;> 

Proof state:
case pos
R : Type u_1
inst✝¹⁹ : CommSemiring R
R' : Type u_2
inst✝¹⁸ : Monoid R'
R'' : Type u_3
inst✝¹⁷ : Semiring R''
M : Type u_4
N : Type u_5
P✝ : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : AddCommMonoid N
inst✝¹⁴ : AddCommMonoid P✝
inst✝¹³ : AddCommMonoid Q
inst✝¹² : AddCommMonoid S
inst✝¹¹ : AddCommMonoid T
inst✝¹⁰ : Module R M
inst✝⁹ : Module R N
inst✝⁸ : Module R P✝
inst✝⁷ : Module R Q
inst✝⁶ : Module R S
inst✝⁵ : Module R T
inst✝⁴ : DistribMulAction R' M
inst✝³ : Module R'' M
inst✝² : SMulCommClass R R' M
inst✝¹ : SMulCommClass R R'' M
x₁ : M
x₂ : N
P : Prop
inst✝ : Decidable P
h✝ : P
⊢ x₁ ⊗ₜ[R] x₂ = x₁ ⊗ₜ[R] x₂

Next tactic:
simp
theorem tmul_ite (x₁ : M) (x₂ : N) (P : Prop) [Decidable P] :
    (x₁ ⊗ₜ[R] if P then x₂ else 0) = if P then x₁ ⊗ₜ x₂ else 0 := by split_ifs <;> 

Proof state:
case neg
R : Type u_1
inst✝¹⁹ : CommSemiring R
R' : Type u_2
inst✝¹⁸ : Monoid R'
R'' : Type u_3
inst✝¹⁷ : Semiring R''
M : Type u_4
N : Type u_5
P✝ : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : AddCommMonoid N
inst✝¹⁴ : AddCommMonoid P✝
inst✝¹³ : AddCommMonoid Q
inst✝¹² : AddCommMonoid S
inst✝¹¹ : AddCommMonoid T
inst✝¹⁰ : Module R M
inst✝⁹ : Module R N
inst✝⁸ : Module R P✝
inst✝⁷ : Module R Q
inst✝⁶ : Module R S
inst✝⁵ : Module R T
inst✝⁴ : DistribMulAction R' M
inst✝³ : Module R'' M
inst✝² : SMulCommClass R R' M
inst✝¹ : SMulCommClass R R'' M
x₁ : M
x₂ : N
P : Prop
inst✝ : Decidable P
h✝ : ¬P
⊢ x₁ ⊗ₜ[R] 0 = 0

Next tactic:
simp
theorem sum_tmul {α : Type*} (s : Finset α) (m : α → M) (n : N) :
    (∑ a in s, m a) ⊗ₜ[R] n = ∑ a in s, m a ⊗ₜ[R] n := by
  

Proof state:
R : Type u_1
inst✝¹⁸ : CommSemiring R
R' : Type u_2
inst✝¹⁷ : Monoid R'
R'' : Type u_3
inst✝¹⁶ : Semiring R''
M : Type u_4
N : Type u_5
P : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : AddCommMonoid N
inst✝¹³ : AddCommMonoid P
inst✝¹² : AddCommMonoid Q
inst✝¹¹ : AddCommMonoid S
inst✝¹⁰ : AddCommMonoid T
inst✝⁹ : Module R M
inst✝⁸ : Module R N
inst✝⁷ : Module R P
inst✝⁶ : Module R Q
inst✝⁵ : Module R S
inst✝⁴ : Module R T
inst✝³ : DistribMulAction R' M
inst✝² : Module R'' M
inst✝¹ : SMulCommClass R R' M
inst✝ : SMulCommClass R R'' M
α : Type u_10
s : Finset α
m : α → M
n : N
⊢ (∑ a in s, m a) ⊗ₜ[R] n = ∑ a in s, m a ⊗ₜ[R] n

Next tactic:
classical
    induction' s using Finset.induction with a s has ih h
    · simp
    · simp [Finset.sum_insert has, add_tmul, ih]
theorem sum_tmul {α : Type*} (s : Finset α) (m : α → M) (n : N) :
    (∑ a in s, m a) ⊗ₜ[R] n = ∑ a in s, m a ⊗ₜ[R] n := by
  classical
    

Proof state:
R : Type u_1
inst✝¹⁸ : CommSemiring R
R' : Type u_2
inst✝¹⁷ : Monoid R'
R'' : Type u_3
inst✝¹⁶ : Semiring R''
M : Type u_4
N : Type u_5
P : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : AddCommMonoid N
inst✝¹³ : AddCommMonoid P
inst✝¹² : AddCommMonoid Q
inst✝¹¹ : AddCommMonoid S
inst✝¹⁰ : AddCommMonoid T
inst✝⁹ : Module R M
inst✝⁸ : Module R N
inst✝⁷ : Module R P
inst✝⁶ : Module R Q
inst✝⁵ : Module R S
inst✝⁴ : Module R T
inst✝³ : DistribMulAction R' M
inst✝² : Module R'' M
inst✝¹ : SMulCommClass R R' M
inst✝ : SMulCommClass R R'' M
α : Type u_10
s : Finset α
m : α → M
n : N
⊢ (∑ a in s, m a) ⊗ₜ[R] n = ∑ a in s, m a ⊗ₜ[R] n

Next tactic:
induction' s using Finset.induction with a s has ih h
theorem sum_tmul {α : Type*} (s : Finset α) (m : α → M) (n : N) :
    (∑ a in s, m a) ⊗ₜ[R] n = ∑ a in s, m a ⊗ₜ[R] n := by
  classical
    induction' s using Finset.induction with a s has ih h
    · 

Proof state:
case empty
R : Type u_1
inst✝¹⁸ : CommSemiring R
R' : Type u_2
inst✝¹⁷ : Monoid R'
R'' : Type u_3
inst✝¹⁶ : Semiring R''
M : Type u_4
N : Type u_5
P : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : AddCommMonoid N
inst✝¹³ : AddCommMonoid P
inst✝¹² : AddCommMonoid Q
inst✝¹¹ : AddCommMonoid S
inst✝¹⁰ : AddCommMonoid T
inst✝⁹ : Module R M
inst✝⁸ : Module R N
inst✝⁷ : Module R P
inst✝⁶ : Module R Q
inst✝⁵ : Module R S
inst✝⁴ : Module R T
inst✝³ : DistribMulAction R' M
inst✝² : Module R'' M
inst✝¹ : SMulCommClass R R' M
inst✝ : SMulCommClass R R'' M
α : Type u_10
m : α → M
n : N
⊢ (∑ a in ∅, m a) ⊗ₜ[R] n = ∑ a in ∅, m a ⊗ₜ[R] n

Next tactic:
simp
theorem sum_tmul {α : Type*} (s : Finset α) (m : α → M) (n : N) :
    (∑ a in s, m a) ⊗ₜ[R] n = ∑ a in s, m a ⊗ₜ[R] n := by
  classical
    induction' s using Finset.induction with a s has ih h
    · simp
    · 

Proof state:
case insert
R : Type u_1
inst✝¹⁸ : CommSemiring R
R' : Type u_2
inst✝¹⁷ : Monoid R'
R'' : Type u_3
inst✝¹⁶ : Semiring R''
M : Type u_4
N : Type u_5
P : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : AddCommMonoid N
inst✝¹³ : AddCommMonoid P
inst✝¹² : AddCommMonoid Q
inst✝¹¹ : AddCommMonoid S
inst✝¹⁰ : AddCommMonoid T
inst✝⁹ : Module R M
inst✝⁸ : Module R N
inst✝⁷ : Module R P
inst✝⁶ : Module R Q
inst✝⁵ : Module R S
inst✝⁴ : Module R T
inst✝³ : DistribMulAction R' M
inst✝² : Module R'' M
inst✝¹ : SMulCommClass R R' M
inst✝ : SMulCommClass R R'' M
α : Type u_10
m : α → M
n : N
a : α
s : Finset α
has : a ∉ s
ih : (∑ a in s, m a) ⊗ₜ[R] n = ∑ a in s, m a ⊗ₜ[R] n
⊢ (∑ a in insert a s, m a) ⊗ₜ[R] n = ∑ a in insert a s, m a ⊗ₜ[R] n

Next tactic:
simp [Finset.sum_insert has, add_tmul, ih]
theorem tmul_sum (m : M) {α : Type*} (s : Finset α) (n : α → N) :
    (m ⊗ₜ[R] ∑ a in s, n a) = ∑ a in s, m ⊗ₜ[R] n a := by
  

Proof state:
R : Type u_1
inst✝¹⁸ : CommSemiring R
R' : Type u_2
inst✝¹⁷ : Monoid R'
R'' : Type u_3
inst✝¹⁶ : Semiring R''
M : Type u_4
N : Type u_5
P : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : AddCommMonoid N
inst✝¹³ : AddCommMonoid P
inst✝¹² : AddCommMonoid Q
inst✝¹¹ : AddCommMonoid S
inst✝¹⁰ : AddCommMonoid T
inst✝⁹ : Module R M
inst✝⁸ : Module R N
inst✝⁷ : Module R P
inst✝⁶ : Module R Q
inst✝⁵ : Module R S
inst✝⁴ : Module R T
inst✝³ : DistribMulAction R' M
inst✝² : Module R'' M
inst✝¹ : SMulCommClass R R' M
inst✝ : SMulCommClass R R'' M
m : M
α : Type u_10
s : Finset α
n : α → N
⊢ m ⊗ₜ[R] ∑ a in s, n a = ∑ a in s, m ⊗ₜ[R] n a

Next tactic:
classical
    induction' s using Finset.induction with a s has ih h
    · simp
    · simp [Finset.sum_insert has, tmul_add, ih]
theorem tmul_sum (m : M) {α : Type*} (s : Finset α) (n : α → N) :
    (m ⊗ₜ[R] ∑ a in s, n a) = ∑ a in s, m ⊗ₜ[R] n a := by
  classical
    

Proof state:
R : Type u_1
inst✝¹⁸ : CommSemiring R
R' : Type u_2
inst✝¹⁷ : Monoid R'
R'' : Type u_3
inst✝¹⁶ : Semiring R''
M : Type u_4
N : Type u_5
P : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : AddCommMonoid N
inst✝¹³ : AddCommMonoid P
inst✝¹² : AddCommMonoid Q
inst✝¹¹ : AddCommMonoid S
inst✝¹⁰ : AddCommMonoid T
inst✝⁹ : Module R M
inst✝⁸ : Module R N
inst✝⁷ : Module R P
inst✝⁶ : Module R Q
inst✝⁵ : Module R S
inst✝⁴ : Module R T
inst✝³ : DistribMulAction R' M
inst✝² : Module R'' M
inst✝¹ : SMulCommClass R R' M
inst✝ : SMulCommClass R R'' M
m : M
α : Type u_10
s : Finset α
n : α → N
⊢ m ⊗ₜ[R] ∑ a in s, n a = ∑ a in s, m ⊗ₜ[R] n a

Next tactic:
induction' s using Finset.induction with a s has ih h
theorem tmul_sum (m : M) {α : Type*} (s : Finset α) (n : α → N) :
    (m ⊗ₜ[R] ∑ a in s, n a) = ∑ a in s, m ⊗ₜ[R] n a := by
  classical
    induction' s using Finset.induction with a s has ih h
    · 

Proof state:
case empty
R : Type u_1
inst✝¹⁸ : CommSemiring R
R' : Type u_2
inst✝¹⁷ : Monoid R'
R'' : Type u_3
inst✝¹⁶ : Semiring R''
M : Type u_4
N : Type u_5
P : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : AddCommMonoid N
inst✝¹³ : AddCommMonoid P
inst✝¹² : AddCommMonoid Q
inst✝¹¹ : AddCommMonoid S
inst✝¹⁰ : AddCommMonoid T
inst✝⁹ : Module R M
inst✝⁸ : Module R N
inst✝⁷ : Module R P
inst✝⁶ : Module R Q
inst✝⁵ : Module R S
inst✝⁴ : Module R T
inst✝³ : DistribMulAction R' M
inst✝² : Module R'' M
inst✝¹ : SMulCommClass R R' M
inst✝ : SMulCommClass R R'' M
m : M
α : Type u_10
n : α → N
⊢ m ⊗ₜ[R] ∑ a in ∅, n a = ∑ a in ∅, m ⊗ₜ[R] n a

Next tactic:
simp
theorem tmul_sum (m : M) {α : Type*} (s : Finset α) (n : α → N) :
    (m ⊗ₜ[R] ∑ a in s, n a) = ∑ a in s, m ⊗ₜ[R] n a := by
  classical
    induction' s using Finset.induction with a s has ih h
    · simp
    · 

Proof state:
case insert
R : Type u_1
inst✝¹⁸ : CommSemiring R
R' : Type u_2
inst✝¹⁷ : Monoid R'
R'' : Type u_3
inst✝¹⁶ : Semiring R''
M : Type u_4
N : Type u_5
P : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : AddCommMonoid N
inst✝¹³ : AddCommMonoid P
inst✝¹² : AddCommMonoid Q
inst✝¹¹ : AddCommMonoid S
inst✝¹⁰ : AddCommMonoid T
inst✝⁹ : Module R M
inst✝⁸ : Module R N
inst✝⁷ : Module R P
inst✝⁶ : Module R Q
inst✝⁵ : Module R S
inst✝⁴ : Module R T
inst✝³ : DistribMulAction R' M
inst✝² : Module R'' M
inst✝¹ : SMulCommClass R R' M
inst✝ : SMulCommClass R R'' M
m : M
α : Type u_10
n : α → N
a : α
s : Finset α
has : a ∉ s
ih : m ⊗ₜ[R] ∑ a in s, n a = ∑ a in s, m ⊗ₜ[R] n a
⊢ m ⊗ₜ[R] ∑ a in insert a s, n a = ∑ a in insert a s, m ⊗ₜ[R] n a

Next tactic:
simp [Finset.sum_insert has, tmul_add, ih]
/-- The simple (aka pure) elements span the tensor product. -/
theorem span_tmul_eq_top : Submodule.span R { t : M ⊗[R] N | ∃ m n, m ⊗ₜ n = t } = ⊤ := by
  

Proof state:
R : Type u_1
inst✝¹⁸ : CommSemiring R
R' : Type u_2
inst✝¹⁷ : Monoid R'
R'' : Type u_3
inst✝¹⁶ : Semiring R''
M : Type u_4
N : Type u_5
P : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : AddCommMonoid N
inst✝¹³ : AddCommMonoid P
inst✝¹² : AddCommMonoid Q
inst✝¹¹ : AddCommMonoid S
inst✝¹⁰ : AddCommMonoid T
inst✝⁹ : Module R M
inst✝⁸ : Module R N
inst✝⁷ : Module R P
inst✝⁶ : Module R Q
inst✝⁵ : Module R S
inst✝⁴ : Module R T
inst✝³ : DistribMulAction R' M
inst✝² : Module R'' M
inst✝¹ : SMulCommClass R R' M
inst✝ : SMulCommClass R R'' M
⊢ Submodule.span R {t | ∃ m n, m ⊗ₜ[R] n = t} = ⊤

Next tactic:
ext t
/-- The simple (aka pure) elements span the tensor product. -/
theorem span_tmul_eq_top : Submodule.span R { t : M ⊗[R] N | ∃ m n, m ⊗ₜ n = t } = ⊤ := by
  ext t; 

Proof state:
case h
R : Type u_1
inst✝¹⁸ : CommSemiring R
R' : Type u_2
inst✝¹⁷ : Monoid R'
R'' : Type u_3
inst✝¹⁶ : Semiring R''
M : Type u_4
N : Type u_5
P : Type u_6
Q : Type u_7
S : Type u_8
T : Type u_9
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : AddCommMonoid N
inst✝¹³ : AddCommMonoid P
inst✝¹² : AddCommMonoid Q
inst✝¹¹ : AddCommMonoid S
inst✝¹⁰ : AddCommMonoid T
inst✝⁹ : Module R M
inst✝⁸ : Module R N
inst✝⁷ : Module R P
inst✝⁶ : Module R Q
inst✝⁵ : Module R S
inst✝⁴ : Module R T
inst✝³ : DistribMulAction R' M
inst✝² : Module R'' M
inst✝¹ : SMulCommClass R R' M
inst✝ : SMulCommClass R R'' M
t : M ⊗[R] N
⊢ t ∈ Submodule.span R {t | ∃ m n, m ⊗ₜ[R] n = t} ↔ t ∈ ⊤

Next tactic:
simp only [Submodule.mem_top, iff_true_iff]