l3lab/ntp-mathlib huggingface dataset:
@[simp]
lemma smul_left_of_tower (r : S) (x y : M) : B (r • x) y = r • B x y := by
  

Proof state:
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
S : Type u_3
inst✝¹⁵ : CommSemiring S
inst✝¹⁴ : Algebra S R
inst✝¹³ : Module S M
inst✝¹² : IsScalarTower S R M
R₁ : Type u_4
M₁ : Type u_5
inst✝¹¹ : Ring R₁
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : Module R₁ M₁
R₂ : Type u_6
M₂ : Type u_7
inst✝⁸ : CommSemiring R₂
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
R₃ : Type u_8
M₃ : Type u_9
inst✝⁵ : CommRing R₃
inst✝⁴ : AddCommGroup M₃
inst✝³ : Module R₃ M₃
V : Type u_10
K : Type u_11
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
r : S
x y : M
⊢ bilin B (r • x) y = r • bilin B x y

Next tactic:
rw [← IsScalarTower.algebraMap_smul R r, smul_left, Algebra.smul_def]
@[simp]
lemma smul_right_of_tower (r : S) (x y : M) : B x (r • y) = r • B x y := by
  

Proof state:
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
S : Type u_3
inst✝¹⁵ : CommSemiring S
inst✝¹⁴ : Algebra S R
inst✝¹³ : Module S M
inst✝¹² : IsScalarTower S R M
R₁ : Type u_4
M₁ : Type u_5
inst✝¹¹ : Ring R₁
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : Module R₁ M₁
R₂ : Type u_6
M₂ : Type u_7
inst✝⁸ : CommSemiring R₂
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
R₃ : Type u_8
M₃ : Type u_9
inst✝⁵ : CommRing R₃
inst✝⁴ : AddCommGroup M₃
inst✝³ : Module R₃ M₃
V : Type u_10
K : Type u_11
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
r : S
x y : M
⊢ bilin B x (r • y) = r • bilin B x y

Next tactic:
rw [← IsScalarTower.algebraMap_smul R r, smul_right, Algebra.smul_def]
theorem coe_injective : Function.Injective ((↑) : BilinForm R M → M → M → R) := fun B D h => by
  

Proof state:
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
S : Type u_3
inst✝¹⁵ : CommSemiring S
inst✝¹⁴ : Algebra S R
inst✝¹³ : Module S M
inst✝¹² : IsScalarTower S R M
R₁ : Type u_4
M₁ : Type u_5
inst✝¹¹ : Ring R₁
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : Module R₁ M₁
R₂ : Type u_6
M₂ : Type u_7
inst✝⁸ : CommSemiring R₂
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
R₃ : Type u_8
M₃ : Type u_9
inst✝⁵ : CommRing R₃
inst✝⁴ : AddCommGroup M₃
inst✝³ : Module R₃ M₃
V : Type u_10
K : Type u_11
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
D✝ : BilinForm R M
D₁ : BilinForm R₁ M₁
B D : BilinForm R M
h : B.bilin = D.bilin
⊢ B = D

Next tactic:
cases B
theorem coe_injective : Function.Injective ((↑) : BilinForm R M → M → M → R) := fun B D h => by
  cases B
  

Proof state:
case mk
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
S : Type u_3
inst✝¹⁵ : CommSemiring S
inst✝¹⁴ : Algebra S R
inst✝¹³ : Module S M
inst✝¹² : IsScalarTower S R M
R₁ : Type u_4
M₁ : Type u_5
inst✝¹¹ : Ring R₁
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : Module R₁ M₁
R₂ : Type u_6
M₂ : Type u_7
inst✝⁸ : CommSemiring R₂
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
R₃ : Type u_8
M₃ : Type u_9
inst✝⁵ : CommRing R₃
inst✝⁴ : AddCommGroup M₃
inst✝³ : Module R₃ M₃
V : Type u_10
K : Type u_11
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
D✝ : BilinForm R M
D₁ : BilinForm R₁ M₁
D : BilinForm R M
bilin✝ : M → M → R
bilin_add_left✝ : ∀ (x y z : M), bilin✝ (x + y) z = bilin✝ x z + bilin✝ y z
bilin_smul_left✝ : ∀ (a : R) (x y : M), bilin✝ (a • x) y = a * bilin✝ x y
bilin_add_right✝ : ∀ (x y z : M), bilin✝ x (y + z) = bilin✝ x y + bilin✝ x z
bilin_smul_right✝ : ∀ (a : R) (x y : M), bilin✝ x (a • y) = a * bilin✝ x y
h :
  { bilin := bilin✝, bilin_add_left := bilin_add_left✝, bilin_smul_left := bilin_smul_left✝,
        bilin_add_right := bilin_add_right✝, bilin_smul_right := bilin_smul_right✝ }.bilin =
    D.bilin
⊢ { bilin := bilin✝, bilin_add_left := bilin_add_left✝, bilin_smul_left := bilin_smul_left✝,
      bilin_add_right := bilin_add_right✝, bilin_smul_right := bilin_smul_right✝ } =
    D

Next tactic:
cases D
theorem coe_injective : Function.Injective ((↑) : BilinForm R M → M → M → R) := fun B D h => by
  cases B
  cases D
  

Proof state:
case mk.mk
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
S : Type u_3
inst✝¹⁵ : CommSemiring S
inst✝¹⁴ : Algebra S R
inst✝¹³ : Module S M
inst✝¹² : IsScalarTower S R M
R₁ : Type u_4
M₁ : Type u_5
inst✝¹¹ : Ring R₁
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : Module R₁ M₁
R₂ : Type u_6
M₂ : Type u_7
inst✝⁸ : CommSemiring R₂
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
R₃ : Type u_8
M₃ : Type u_9
inst✝⁵ : CommRing R₃
inst✝⁴ : AddCommGroup M₃
inst✝³ : Module R₃ M₃
V : Type u_10
K : Type u_11
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
D : BilinForm R M
D₁ : BilinForm R₁ M₁
bilin✝¹ : M → M → R
bilin_add_left✝¹ : ∀ (x y z : M), bilin✝¹ (x + y) z = bilin✝¹ x z + bilin✝¹ y z
bilin_smul_left✝¹ : ∀ (a : R) (x y : M), bilin✝¹ (a • x) y = a * bilin✝¹ x y
bilin_add_right✝¹ : ∀ (x y z : M), bilin✝¹ x (y + z) = bilin✝¹ x y + bilin✝¹ x z
bilin_smul_right✝¹ : ∀ (a : R) (x y : M), bilin✝¹ x (a • y) = a * bilin✝¹ x y
bilin✝ : M → M → R
bilin_add_left✝ : ∀ (x y z : M), bilin✝ (x + y) z = bilin✝ x z + bilin✝ y z
bilin_smul_left✝ : ∀ (a : R) (x y : M), bilin✝ (a • x) y = a * bilin✝ x y
bilin_add_right✝ : ∀ (x y z : M), bilin✝ x (y + z) = bilin✝ x y + bilin✝ x z
bilin_smul_right✝ : ∀ (a : R) (x y : M), bilin✝ x (a • y) = a * bilin✝ x y
h :
  { bilin := bilin✝¹, bilin_add_left := bilin_add_left✝¹, bilin_smul_left := bilin_smul_left✝¹,
        bilin_add_right := bilin_add_right✝¹, bilin_smul_right := bilin_smul_right✝¹ }.bilin =
    { bilin := bilin✝, bilin_add_left := bilin_add_left✝, bilin_smul_left := bilin_smul_left✝,
        bilin_add_right := bilin_add_right✝, bilin_smul_right := bilin_smul_right✝ }.bilin
⊢ { bilin := bilin✝¹, bilin_add_left := bilin_add_left✝¹, bilin_smul_left := bilin_smul_left✝¹,
      bilin_add_right := bilin_add_right✝¹, bilin_smul_right := bilin_smul_right✝¹ } =
    { bilin := bilin✝, bilin_add_left := bilin_add_left✝, bilin_smul_left := bilin_smul_left✝,
      bilin_add_right := bilin_add_right✝, bilin_smul_right := bilin_smul_right✝ }

Next tactic:
congr
@[ext]
theorem ext (H : ∀ x y : M, B x y = D x y) : B = D :=
  coe_injective <| by
    

Proof state:
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
S : Type u_3
inst✝¹⁵ : CommSemiring S
inst✝¹⁴ : Algebra S R
inst✝¹³ : Module S M
inst✝¹² : IsScalarTower S R M
R₁ : Type u_4
M₁ : Type u_5
inst✝¹¹ : Ring R₁
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : Module R₁ M₁
R₂ : Type u_6
M₂ : Type u_7
inst✝⁸ : CommSemiring R₂
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
R₃ : Type u_8
M₃ : Type u_9
inst✝⁵ : CommRing R₃
inst✝⁴ : AddCommGroup M₃
inst✝³ : Module R₃ M₃
V : Type u_10
K : Type u_11
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
D : BilinForm R M
D₁ : BilinForm R₁ M₁
H : ∀ (x y : M), bilin B x y = bilin D x y
⊢ B.bilin = D.bilin

Next tactic:
funext
@[ext]
theorem ext (H : ∀ x y : M, B x y = D x y) : B = D :=
  coe_injective <| by
    funext
    

Proof state:
case h.h
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
S : Type u_3
inst✝¹⁵ : CommSemiring S
inst✝¹⁴ : Algebra S R
inst✝¹³ : Module S M
inst✝¹² : IsScalarTower S R M
R₁ : Type u_4
M₁ : Type u_5
inst✝¹¹ : Ring R₁
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : Module R₁ M₁
R₂ : Type u_6
M₂ : Type u_7
inst✝⁸ : CommSemiring R₂
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
R₃ : Type u_8
M₃ : Type u_9
inst✝⁵ : CommRing R₃
inst✝⁴ : AddCommGroup M₃
inst✝³ : Module R₃ M₃
V : Type u_10
K : Type u_11
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
D : BilinForm R M
D₁ : BilinForm R₁ M₁
H : ∀ (x y : M), bilin B x y = bilin D x y
x✝¹ x✝ : M
⊢ bilin B x✝¹ x✝ = bilin D x✝¹ x✝

Next tactic:
exact H _ _
instance : Add (BilinForm R M) where
  add B D :=
    { bilin := fun x y => B x y + D x y
      bilin_add_left := fun x y z => by 

Proof state:
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
S : Type u_3
inst✝¹⁵ : CommSemiring S
inst✝¹⁴ : Algebra S R
inst✝¹³ : Module S M
inst✝¹² : IsScalarTower S R M
R₁ : Type u_4
M₁ : Type u_5
inst✝¹¹ : Ring R₁
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : Module R₁ M₁
R₂ : Type u_6
M₂ : Type u_7
inst✝⁸ : CommSemiring R₂
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
R₃ : Type u_8
M₃ : Type u_9
inst✝⁵ : CommRing R₃
inst✝⁴ : AddCommGroup M₃
inst✝³ : Module R₃ M₃
V : Type u_10
K : Type u_11
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
D✝ : BilinForm R M
D₁ : BilinForm R₁ M₁
B D : BilinForm R M
x y z : M
⊢ (fun x y => bilin B x y + bilin D x y) (x + y) z =
    (fun x y => bilin B x y + bilin D x y) x z + (fun x y => bilin B x y + bilin D x y) y z

Next tactic:
simp only [add_left, add_left, add_add_add_comm]
instance : Add (BilinForm R M) where
  add B D :=
    { bilin := fun x y => B x y + D x y
      bilin_add_left := fun x y z => by simp only [add_left, add_left, add_add_add_comm]
      bilin_smul_left := fun a x y => by 

Proof state:
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
S : Type u_3
inst✝¹⁵ : CommSemiring S
inst✝¹⁴ : Algebra S R
inst✝¹³ : Module S M
inst✝¹² : IsScalarTower S R M
R₁ : Type u_4
M₁ : Type u_5
inst✝¹¹ : Ring R₁
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : Module R₁ M₁
R₂ : Type u_6
M₂ : Type u_7
inst✝⁸ : CommSemiring R₂
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
R₃ : Type u_8
M₃ : Type u_9
inst✝⁵ : CommRing R₃
inst✝⁴ : AddCommGroup M₃
inst✝³ : Module R₃ M₃
V : Type u_10
K : Type u_11
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
D✝ : BilinForm R M
D₁ : BilinForm R₁ M₁
B D : BilinForm R M
a : R
x y : M
⊢ (fun x y => bilin B x y + bilin D x y) (a • x) y = a * (fun x y => bilin B x y + bilin D x y) x y

Next tactic:
simp only [smul_left, smul_left, mul_add]
instance : Add (BilinForm R M) where
  add B D :=
    { bilin := fun x y => B x y + D x y
      bilin_add_left := fun x y z => by simp only [add_left, add_left, add_add_add_comm]
      bilin_smul_left := fun a x y => by simp only [smul_left, smul_left, mul_add]
      bilin_add_right := fun x y z => by 

Proof state:
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
S : Type u_3
inst✝¹⁵ : CommSemiring S
inst✝¹⁴ : Algebra S R
inst✝¹³ : Module S M
inst✝¹² : IsScalarTower S R M
R₁ : Type u_4
M₁ : Type u_5
inst✝¹¹ : Ring R₁
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : Module R₁ M₁
R₂ : Type u_6
M₂ : Type u_7
inst✝⁸ : CommSemiring R₂
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
R₃ : Type u_8
M₃ : Type u_9
inst✝⁵ : CommRing R₃
inst✝⁴ : AddCommGroup M₃
inst✝³ : Module R₃ M₃
V : Type u_10
K : Type u_11
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
D✝ : BilinForm R M
D₁ : BilinForm R₁ M₁
B D : BilinForm R M
x y z : M
⊢ (fun x y => bilin B x y + bilin D x y) x (y + z) =
    (fun x y => bilin B x y + bilin D x y) x y + (fun x y => bilin B x y + bilin D x y) x z

Next tactic:
simp only [add_right, add_right, add_add_add_comm]
instance : Add (BilinForm R M) where
  add B D :=
    { bilin := fun x y => B x y + D x y
      bilin_add_left := fun x y z => by simp only [add_left, add_left, add_add_add_comm]
      bilin_smul_left := fun a x y => by simp only [smul_left, smul_left, mul_add]
      bilin_add_right := fun x y z => by simp only [add_right, add_right, add_add_add_comm]
      bilin_smul_right := fun a x y => by 

Proof state:
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
S : Type u_3
inst✝¹⁵ : CommSemiring S
inst✝¹⁴ : Algebra S R
inst✝¹³ : Module S M
inst✝¹² : IsScalarTower S R M
R₁ : Type u_4
M₁ : Type u_5
inst✝¹¹ : Ring R₁
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : Module R₁ M₁
R₂ : Type u_6
M₂ : Type u_7
inst✝⁸ : CommSemiring R₂
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
R₃ : Type u_8
M₃ : Type u_9
inst✝⁵ : CommRing R₃
inst✝⁴ : AddCommGroup M₃
inst✝³ : Module R₃ M₃
V : Type u_10
K : Type u_11
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
D✝ : BilinForm R M
D₁ : BilinForm R₁ M₁
B D : BilinForm R M
a : R
x y : M
⊢ (fun x y => bilin B x y + bilin D x y) x (a • y) = a * (fun x y => bilin B x y + bilin D x y) x y

Next tactic:
simp only [smul_right, smul_right, mul_add]
/-- `BilinForm R M` inherits the scalar action by `α` on `R` if this is compatible with
multiplication.

When `R` itself is commutative, this provides an `R`-action via `Algebra.id`. -/
instance {α} [Monoid α] [DistribMulAction α R] [SMulCommClass α R R] : SMul α (BilinForm R M) where
  smul c B :=
    { bilin := fun x y => c • B x y
      bilin_add_left := fun x y z => by 

Proof state:
R : Type u_1
M : Type u_2
inst✝²¹ : Semiring R
inst✝²⁰ : AddCommMonoid M
inst✝¹⁹ : Module R M
S : Type u_3
inst✝¹⁸ : CommSemiring S
inst✝¹⁷ : Algebra S R
inst✝¹⁶ : Module S M
inst✝¹⁵ : IsScalarTower S R M
R₁ : Type u_4
M₁ : Type u_5
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type u_6
M₂ : Type u_7
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type u_8
M₃ : Type u_9
inst✝⁸ : CommRing R₃
inst✝⁷ : AddCommGroup M₃
inst✝⁶ : Module R₃ M₃
V : Type u_10
K : Type u_11
inst✝⁵ : Field K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
D : BilinForm R M
D₁ : BilinForm R₁ M₁
α : Type ?u.185189
inst✝² : Monoid α
inst✝¹ : DistribMulAction α R
inst✝ : SMulCommClass α R R
c : α
B : BilinForm R M
x y z : M
⊢ (fun x y => c • bilin B x y) (x + y) z = (fun x y => c • bilin B x y) x z + (fun x y => c • bilin B x y) y z

Next tactic:
simp only [add_left, smul_add]
/-- `BilinForm R M` inherits the scalar action by `α` on `R` if this is compatible with
multiplication.

When `R` itself is commutative, this provides an `R`-action via `Algebra.id`. -/
instance {α} [Monoid α] [DistribMulAction α R] [SMulCommClass α R R] : SMul α (BilinForm R M) where
  smul c B :=
    { bilin := fun x y => c • B x y
      bilin_add_left := fun x y z => by simp only [add_left, smul_add]
      bilin_smul_left := fun a x y => by 

Proof state:
R : Type u_1
M : Type u_2
inst✝²¹ : Semiring R
inst✝²⁰ : AddCommMonoid M
inst✝¹⁹ : Module R M
S : Type u_3
inst✝¹⁸ : CommSemiring S
inst✝¹⁷ : Algebra S R
inst✝¹⁶ : Module S M
inst✝¹⁵ : IsScalarTower S R M
R₁ : Type u_4
M₁ : Type u_5
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type u_6
M₂ : Type u_7
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type u_8
M₃ : Type u_9
inst✝⁸ : CommRing R₃
inst✝⁷ : AddCommGroup M₃
inst✝⁶ : Module R₃ M₃
V : Type u_10
K : Type u_11
inst✝⁵ : Field K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
D : BilinForm R M
D₁ : BilinForm R₁ M₁
α : Type ?u.185189
inst✝² : Monoid α
inst✝¹ : DistribMulAction α R
inst✝ : SMulCommClass α R R
c : α
B : BilinForm R M
a : R
x y : M
⊢ (fun x y => c • bilin B x y) (a • x) y = a * (fun x y => c • bilin B x y) x y

Next tactic:
simp only [smul_left, mul_smul_comm]
/-- `BilinForm R M` inherits the scalar action by `α` on `R` if this is compatible with
multiplication.

When `R` itself is commutative, this provides an `R`-action via `Algebra.id`. -/
instance {α} [Monoid α] [DistribMulAction α R] [SMulCommClass α R R] : SMul α (BilinForm R M) where
  smul c B :=
    { bilin := fun x y => c • B x y
      bilin_add_left := fun x y z => by simp only [add_left, smul_add]
      bilin_smul_left := fun a x y => by simp only [smul_left, mul_smul_comm]
      bilin_add_right := fun x y z => by 

Proof state:
R : Type u_1
M : Type u_2
inst✝²¹ : Semiring R
inst✝²⁰ : AddCommMonoid M
inst✝¹⁹ : Module R M
S : Type u_3
inst✝¹⁸ : CommSemiring S
inst✝¹⁷ : Algebra S R
inst✝¹⁶ : Module S M
inst✝¹⁵ : IsScalarTower S R M
R₁ : Type u_4
M₁ : Type u_5
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type u_6
M₂ : Type u_7
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type u_8
M₃ : Type u_9
inst✝⁸ : CommRing R₃
inst✝⁷ : AddCommGroup M₃
inst✝⁶ : Module R₃ M₃
V : Type u_10
K : Type u_11
inst✝⁵ : Field K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
D : BilinForm R M
D₁ : BilinForm R₁ M₁
α : Type ?u.185189
inst✝² : Monoid α
inst✝¹ : DistribMulAction α R
inst✝ : SMulCommClass α R R
c : α
B : BilinForm R M
x y z : M
⊢ (fun x y => c • bilin B x y) x (y + z) = (fun x y => c • bilin B x y) x y + (fun x y => c • bilin B x y) x z

Next tactic:
simp only [add_right, smul_add]
/-- `BilinForm R M` inherits the scalar action by `α` on `R` if this is compatible with
multiplication.

When `R` itself is commutative, this provides an `R`-action via `Algebra.id`. -/
instance {α} [Monoid α] [DistribMulAction α R] [SMulCommClass α R R] : SMul α (BilinForm R M) where
  smul c B :=
    { bilin := fun x y => c • B x y
      bilin_add_left := fun x y z => by simp only [add_left, smul_add]
      bilin_smul_left := fun a x y => by simp only [smul_left, mul_smul_comm]
      bilin_add_right := fun x y z => by simp only [add_right, smul_add]
      bilin_smul_right := fun a x y => by 

Proof state:
R : Type u_1
M : Type u_2
inst✝²¹ : Semiring R
inst✝²⁰ : AddCommMonoid M
inst✝¹⁹ : Module R M
S : Type u_3
inst✝¹⁸ : CommSemiring S
inst✝¹⁷ : Algebra S R
inst✝¹⁶ : Module S M
inst✝¹⁵ : IsScalarTower S R M
R₁ : Type u_4
M₁ : Type u_5
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type u_6
M₂ : Type u_7
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type u_8
M₃ : Type u_9
inst✝⁸ : CommRing R₃
inst✝⁷ : AddCommGroup M₃
inst✝⁶ : Module R₃ M₃
V : Type u_10
K : Type u_11
inst✝⁵ : Field K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
D : BilinForm R M
D₁ : BilinForm R₁ M₁
α : Type ?u.185189
inst✝² : Monoid α
inst✝¹ : DistribMulAction α R
inst✝ : SMulCommClass α R R
c : α
B : BilinForm R M
a : R
x y : M
⊢ (fun x y => c • bilin B x y) x (a • y) = a * (fun x y => c • bilin B x y) x y

Next tactic:
simp only [smul_right, mul_smul_comm]
instance : Neg (BilinForm R₁ M₁) where
  neg B :=
    { bilin := fun x y => -B x y
      bilin_add_left := fun x y z => by 

Proof state:
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
S : Type u_3
inst✝¹⁵ : CommSemiring S
inst✝¹⁴ : Algebra S R
inst✝¹³ : Module S M
inst✝¹² : IsScalarTower S R M
R₁ : Type u_4
M₁ : Type u_5
inst✝¹¹ : Ring R₁
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : Module R₁ M₁
R₂ : Type u_6
M₂ : Type u_7
inst✝⁸ : CommSemiring R₂
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
R₃ : Type u_8
M₃ : Type u_9
inst✝⁵ : CommRing R₃
inst✝⁴ : AddCommGroup M₃
inst✝³ : Module R₃ M₃
V : Type u_10
K : Type u_11
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
D : BilinForm R M
D₁ B : BilinForm R₁ M₁
x y z : M₁
⊢ (fun x y => -bilin B x y) (x + y) z = (fun x y => -bilin B x y) x z + (fun x y => -bilin B x y) y z

Next tactic:
simp only [add_left, neg_add]
instance : Neg (BilinForm R₁ M₁) where
  neg B :=
    { bilin := fun x y => -B x y
      bilin_add_left := fun x y z => by simp only [add_left, neg_add]
      bilin_smul_left := fun a x y => by 

Proof state:
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
S : Type u_3
inst✝¹⁵ : CommSemiring S
inst✝¹⁴ : Algebra S R
inst✝¹³ : Module S M
inst✝¹² : IsScalarTower S R M
R₁ : Type u_4
M₁ : Type u_5
inst✝¹¹ : Ring R₁
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : Module R₁ M₁
R₂ : Type u_6
M₂ : Type u_7
inst✝⁸ : CommSemiring R₂
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
R₃ : Type u_8
M₃ : Type u_9
inst✝⁵ : CommRing R₃
inst✝⁴ : AddCommGroup M₃
inst✝³ : Module R₃ M₃
V : Type u_10
K : Type u_11
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
D : BilinForm R M
D₁ B : BilinForm R₁ M₁
a : R₁
x y : M₁
⊢ (fun x y => -bilin B x y) (a • x) y = a * (fun x y => -bilin B x y) x y

Next tactic:
simp only [smul_left, mul_neg]
instance : Neg (BilinForm R₁ M₁) where
  neg B :=
    { bilin := fun x y => -B x y
      bilin_add_left := fun x y z => by simp only [add_left, neg_add]
      bilin_smul_left := fun a x y => by simp only [smul_left, mul_neg]
      bilin_add_right := fun x y z => by 

Proof state:
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
S : Type u_3
inst✝¹⁵ : CommSemiring S
inst✝¹⁴ : Algebra S R
inst✝¹³ : Module S M
inst✝¹² : IsScalarTower S R M
R₁ : Type u_4
M₁ : Type u_5
inst✝¹¹ : Ring R₁
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : Module R₁ M₁
R₂ : Type u_6
M₂ : Type u_7
inst✝⁸ : CommSemiring R₂
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
R₃ : Type u_8
M₃ : Type u_9
inst✝⁵ : CommRing R₃
inst✝⁴ : AddCommGroup M₃
inst✝³ : Module R₃ M₃
V : Type u_10
K : Type u_11
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
D : BilinForm R M
D₁ B : BilinForm R₁ M₁
x y z : M₁
⊢ (fun x y => -bilin B x y) x (y + z) = (fun x y => -bilin B x y) x y + (fun x y => -bilin B x y) x z

Next tactic:
simp only [add_right, neg_add]
instance : Neg (BilinForm R₁ M₁) where
  neg B :=
    { bilin := fun x y => -B x y
      bilin_add_left := fun x y z => by simp only [add_left, neg_add]
      bilin_smul_left := fun a x y => by simp only [smul_left, mul_neg]
      bilin_add_right := fun x y z => by simp only [add_right, neg_add]
      bilin_smul_right := fun a x y => by 

Proof state:
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
S : Type u_3
inst✝¹⁵ : CommSemiring S
inst✝¹⁴ : Algebra S R
inst✝¹³ : Module S M
inst✝¹² : IsScalarTower S R M
R₁ : Type u_4
M₁ : Type u_5
inst✝¹¹ : Ring R₁
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : Module R₁ M₁
R₂ : Type u_6
M₂ : Type u_7
inst✝⁸ : CommSemiring R₂
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
R₃ : Type u_8
M₃ : Type u_9
inst✝⁵ : CommRing R₃
inst✝⁴ : AddCommGroup M₃
inst✝³ : Module R₃ M₃
V : Type u_10
K : Type u_11
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
D : BilinForm R M
D₁ B : BilinForm R₁ M₁
a : R₁
x y : M₁
⊢ (fun x y => -bilin B x y) x (a • y) = a * (fun x y => -bilin B x y) x y

Next tactic:
simp only [smul_right, mul_neg]
instance : Sub (BilinForm R₁ M₁) where
  sub B D :=
    { bilin := fun x y => B x y - D x y
      bilin_add_left := fun x y z => by 

Proof state:
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
S : Type u_3
inst✝¹⁵ : CommSemiring S
inst✝¹⁴ : Algebra S R
inst✝¹³ : Module S M
inst✝¹² : IsScalarTower S R M
R₁ : Type u_4
M₁ : Type u_5
inst✝¹¹ : Ring R₁
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : Module R₁ M₁
R₂ : Type u_6
M₂ : Type u_7
inst✝⁸ : CommSemiring R₂
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
R₃ : Type u_8
M₃ : Type u_9
inst✝⁵ : CommRing R₃
inst✝⁴ : AddCommGroup M₃
inst✝³ : Module R₃ M₃
V : Type u_10
K : Type u_11
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
D✝ : BilinForm R M
D₁ B D : BilinForm R₁ M₁
x y z : M₁
⊢ (fun x y => bilin B x y - bilin D x y) (x + y) z =
    (fun x y => bilin B x y - bilin D x y) x z + (fun x y => bilin B x y - bilin D x y) y z

Next tactic:
simp only [add_left, add_left, add_sub_add_comm]