-- Mathlib/AlgebraicGeometry/EllipticCurve/Projective.lean
lemma negAddY_eq' {P Q : Fin 3 → R} (hP : W'.Equation P) (hQ : W'.Equation Q) :
    W'.negAddY P Q * (P z * Q z) ^ 2 =
      (P y * Q z - Q y * P z) * ((P y * Q z - Q y * P z) ^ 2 * P z * Q z
        + W'.a₁ * (P y * Q z - Q y * P z) * P z * Q z * (P x * Q z - Q x * P z)
        - W'.a₂ * P z * Q z * (P x * Q z - Q x * P z) ^ 2 - P x * Q z * (P x * Q z - Q x * P z) ^ 2
        - Q x * P z * (P x * Q z - Q x * P z) ^ 2 - P x * Q z * (P x * Q z - Q x * P z) ^ 2)
        + P y * Q z * (P x * Q z - Q x * P z) ^ 3

Proof state:
R : Type r
inst✝ : CommRing R
W' : Projective R
P Q : Fin 3 → R
hP : W'.Equation P
hQ : W'.Equation Q
⊢ W'.negAddY P Q * (P z * Q z) ^ 2 =
    (P y * Q z - Q y * P z) *
        ((P y * Q z - Q y * P z) ^ 2 * P z * Q z +
                  W'.a₁ * (P y * Q z - Q y * P z) * P z * Q z * (P x * Q z - Q x * P z) -
                W'.a₂ * P z * Q z * (P x * Q z - Q x * P z) ^ 2 -
              P x * Q z * (P x * Q z - Q x * P z) ^ 2 -
            Q x * P z * (P x * Q z - Q x * P z) ^ 2 -
          P x * Q z * (P x * Q z - Q x * P z) ^ 2) +
      P y * Q z * (P x * Q z - Q x * P z) ^ 3

Tactic:
linear_combination (norm := (rw [negAddY]; ring1))
  (2 * Q y * P z * Q z ^ 3 - P y * Q z ^ 4) * (equation_iff _).mp hP
    + (Q y * P z ^ 4 - 2 * P y * P z ^ 3 * Q z) * (equation_iff _).mp hQ

Result:
no goals

Proof state:
case a.a
R : Type r
inst✝ : CommRing R
W' : Projective R
P Q : Fin 3 → R
hP : W'.Equation P
hQ : W'.Equation Q
⊢ (-3 * P x ^ 2 * Q x * Q y + 3 * P x * Q x ^ 2 * P y - P y ^ 2 * Q y * Q z + P y * Q y ^ 2 * P z +
                                      W'.a₁ * P x * Q y ^ 2 * P z -
                                    W'.a₁ * Q x * P y ^ 2 * Q z -
                                  W'.a₂ * P x ^ 2 * Q y * Q z +
                                W'.a₂ * Q x ^ 2 * P y * P z +
                              2 * W'.a₂ * P x * Q x * P y * Q z -
                            2 * W'.a₂ * P x * Q x * Q y * P z -
                          W'.a₃ * P y ^ 2 * Q z ^ 2 +
                        W'.a₃ * Q y ^ 2 * P z ^ 2 +
                      W'.a₄ * P x * P y * Q z ^ 2 -
                    2 * W'.a₄ * P x * Q y * P z * Q z +
                  2 * W'.a₄ * Q x * P y * P z * Q z -
                W'.a₄ * Q x * Q y * P z ^ 2 +
              3 * W'.a₆ * P y * P z * Q z ^ 2 -
            3 * W'.a₆ * Q y * P z ^ 2 * Q z) *
          (P z * Q z) ^ 2 +
        ((2 * Q y * P z * Q z ^ 3 - P y * Q z ^ 4) * 0 + (Q y * P z ^ 4 - 2 * P y * P z ^ 3 * Q z) * 0) -
      ((P y * Q z - Q y * P z) *
            ((P y * Q z - Q y * P z) ^ 2 * P z * Q z +
                      W'.a₁ * (P y * Q z - Q y * P z) * P z * Q z * (P x * Q z - Q x * P z) -
                    W'.a₂ * P z * Q z * (P x * Q z - Q x * P z) ^ 2 -
                  P x * Q z * (P x * Q z - Q x * P z) ^ 2 -
                Q x * P z * (P x * Q z - Q x * P z) ^ 2 -
              P x * Q z * (P x * Q z - Q x * P z) ^ 2) +
          P y * Q z * (P x * Q z - Q x * P z) ^ 3 +
        ((2 * Q y * P z * Q z ^ 3 - P y * Q z ^ 4) *
            (P y ^ 2 * P z + W'.a₁ * P x * P y * P z + W'.a₃ * P y * P z ^ 2 -
              (P x ^ 3 + W'.a₂ * P x ^ 2 * P z + W'.a₄ * P x * P z ^ 2 + W'.a₆ * P z ^ 3)) +
          (Q y * P z ^ 4 - 2 * P y * P z ^ 3 * Q z) *
            (Q y ^ 2 * Q z + W'.a₁ * Q x * Q y * Q z + W'.a₃ * Q y * Q z ^ 2 -
              (Q x ^ 3 + W'.a₂ * Q x ^ 2 * Q z + W'.a₄ * Q x * Q z ^ 2 + W'.a₆ * Q z ^ 3)))) =
    0

Tactic:
ring1

Result:
no goals

Proof state:
case a.a
R : Type r
inst✝ : CommRing R
W' : Projective R
P Q : Fin 3 → R
hP : W'.Equation P
hQ : W'.Equation Q
⊢ W'.negAddY P Q * (P z * Q z) ^ 2 +
        ((2 * Q y * P z * Q z ^ 3 - P y * Q z ^ 4) * 0 + (Q y * P z ^ 4 - 2 * P y * P z ^ 3 * Q z) * 0) -
      ((P y * Q z - Q y * P z) *
            ((P y * Q z - Q y * P z) ^ 2 * P z * Q z +
                      W'.a₁ * (P y * Q z - Q y * P z) * P z * Q z * (P x * Q z - Q x * P z) -
                    W'.a₂ * P z * Q z * (P x * Q z - Q x * P z) ^ 2 -
                  P x * Q z * (P x * Q z - Q x * P z) ^ 2 -
                Q x * P z * (P x * Q z - Q x * P z) ^ 2 -
              P x * Q z * (P x * Q z - Q x * P z) ^ 2) +
          P y * Q z * (P x * Q z - Q x * P z) ^ 3 +
        ((2 * Q y * P z * Q z ^ 3 - P y * Q z ^ 4) *
            (P y ^ 2 * P z + W'.a₁ * P x * P y * P z + W'.a₃ * P y * P z ^ 2 -
              (P x ^ 3 + W'.a₂ * P x ^ 2 * P z + W'.a₄ * P x * P z ^ 2 + W'.a₆ * P z ^ 3)) +
          (Q y * P z ^ 4 - 2 * P y * P z ^ 3 * Q z) *
            (Q y ^ 2 * Q z + W'.a₁ * Q x * Q y * Q z + W'.a₃ * Q y * Q z ^ 2 -
              (Q x ^ 3 + W'.a₂ * Q x ^ 2 * Q z + W'.a₄ * Q x * Q z ^ 2 + W'.a₆ * Q z ^ 3)))) =
    0

Tactic:
rw [negAddY]

Result:
case a.a
R : Type r
inst✝ : CommRing R
W' : Projective R
P Q : Fin 3 → R
hP : W'.Equation P
hQ : W'.Equation Q
⊢ (-3 * P x ^ 2 * Q x * Q y + 3 * P x * Q x ^ 2 * P y - P y ^ 2 * Q y * Q z + P y * Q y ^ 2 * P z +
                                      W'.a₁ * P x * Q y ^ 2 * P z -
                                    W'.a₁ * Q x * P y ^ 2 * Q z -
                                  W'.a₂ * P x ^ 2 * Q y * Q z +
                                W'.a₂ * Q x ^ 2 * P y * P z +
                              2 * W'.a₂ * P x * Q x * P y * Q z -
                            2 * W'.a₂ * P x * Q x * Q y * P z -
                          W'.a₃ * P y ^ 2 * Q z ^ 2 +
                        W'.a₃ * Q y ^ 2 * P z ^ 2 +
                      W'.a₄ * P x * P y * Q z ^ 2 -
                    2 * W'.a₄ * P x * Q y * P z * Q z +
                  2 * W'.a₄ * Q x * P y * P z * Q z -
                W'.a₄ * Q x * Q y * P z ^ 2 +
              3 * W'.a₆ * P y * P z * Q z ^ 2 -
            3 * W'.a₆ * Q y * P z ^ 2 * Q z) *
          (P z * Q z) ^ 2 +
        ((2 * Q y * P z * Q z ^ 3 - P y * Q z ^ 4) * 0 + (Q y * P z ^ 4 - 2 * P y * P z ^ 3 * Q z) * 0) -
      ((P y * Q z - Q y * P z) *
            ((P y * Q z - Q y * P z) ^ 2 * P z * Q z +
                      W'.a₁ * (P y * Q z - Q y * P z) * P z * Q z * (P x * Q z - Q x * P z) -
                    W'.a₂ * P z * Q z * (P x * Q z - Q x * P z) ^ 2 -
                  P x * Q z * (P x * Q z - Q x * P z) ^ 2 -
                Q x * P z * (P x * Q z - Q x * P z) ^ 2 -
              P x * Q z * (P x * Q z - Q x * P z) ^ 2) +
          P y * Q z * (P x * Q z - Q x * P z) ^ 3 +
        ((2 * Q y * P z * Q z ^ 3 - P y * Q z ^ 4) *
            (P y ^ 2 * P z + W'.a₁ * P x * P y * P z + W'.a₃ * P y * P z ^ 2 -
              (P x ^ 3 + W'.a₂ * P x ^ 2 * P z + W'.a₄ * P x * P z ^ 2 + W'.a₆ * P z ^ 3)) +
          (Q y * P z ^ 4 - 2 * P y * P z ^ 3 * Q z) *
            (Q y ^ 2 * Q z + W'.a₁ * Q x * Q y * Q z + W'.a₃ * Q y * Q z ^ 2 -
              (Q x ^ 3 + W'.a₂ * Q x ^ 2 * Q z + W'.a₄ * Q x * Q z ^ 2 + W'.a₆ * Q z ^ 3)))) =
    0