-- Module: Mathlib.Algebra.Polynomial.RuleOfSigns
Goal:
R : Type u_1
inst : Semiring R
inst_1 : LinearOrder R
P : R[X]
h : P ≠ 0
hpz : ¬P = 0
hsl : Ne (α := SignType) ((SignType.sign : (a : R) → SignType) P.leadingCoeff : SignType) (0 : SignType)
cs : List R
h_eL : P.eraseLead.coeffList = P.eraseLead.leadingCoeff :: cs
h₁ : Ne (α := SignType) ((SignType.sign : (a : R) → SignType) P.eraseLead.leadingCoeff : SignType) (0 : SignType)
pos :
  ∀
    (h₄ :
      Eq (α := SignType) ((SignType.sign : (a : R) → SignType) P.leadingCoeff : SignType)
        ((SignType.sign : (a : R) → SignType) P.eraseLead.leadingCoeff : SignType)),
    List.length (α := SignType)
          (if
                ¬Eq (α := SignType) ((SignType.sign : (a : R) → SignType) P.leadingCoeff : SignType)
                    ((SignType.sign : (a : R) → SignType) P.eraseLead.leadingCoeff : SignType) then
              (SignType.sign : (a : R) → SignType) P.leadingCoeff ::
                List.destutter' (fun (x1 x2 : SignType) ↦ ¬x1 = x2)
                  ((SignType.sign : (a : R) → SignType) P.eraseLead.leadingCoeff)
                  (List.filter (fun (x : SignType) ↦ !decide (x = 0))
                    (List.map (⇑SignType.sign : (a : R) → SignType) cs))
            else
              List.destutter' (fun (x1 x2 : SignType) ↦ ¬x1 = x2) ((SignType.sign : (a : R) → SignType) P.leadingCoeff)
                (List.filter (fun (x : SignType) ↦ !decide (x = 0))
                  (List.map (⇑SignType.sign : (a : R) → SignType) cs)) :
            List SignType) -
        1 =
      List.length (α := SignType)
            (List.destutter' (fun (x1 x2 : SignType) ↦ ¬x1 = x2)
                ((SignType.sign : (a : R) → SignType) P.eraseLead.leadingCoeff)
                (List.filter (fun (x : SignType) ↦ !decide (x = 0))
                  (List.map (⇑SignType.sign : (a : R) → SignType) cs)) :
              List SignType) -
          1 +
        if
            Eq (α := SignType) ((SignType.sign : (a : R) → SignType) P.leadingCoeff : SignType)
              (-(SignType.sign : (a : R) → SignType) P.eraseLead.leadingCoeff : SignType) then
          1
        else 0
neg :
  ∀
    (h₄ :
      ¬Eq (α := SignType) ((SignType.sign : (a : R) → SignType) P.leadingCoeff : SignType)
          ((SignType.sign : (a : R) → SignType) P.eraseLead.leadingCoeff : SignType)),
    List.length (α := SignType)
          (if
                ¬Eq (α := SignType) ((SignType.sign : (a : R) → SignType) P.leadingCoeff : SignType)
                    ((SignType.sign : (a : R) → SignType) P.eraseLead.leadingCoeff : SignType) then
              (SignType.sign : (a : R) → SignType) P.leadingCoeff ::
                List.destutter' (fun (x1 x2 : SignType) ↦ ¬x1 = x2)
                  ((SignType.sign : (a : R) → SignType) P.eraseLead.leadingCoeff)
                  (List.filter (fun (x : SignType) ↦ !decide (x = 0))
                    (List.map (⇑SignType.sign : (a : R) → SignType) cs))
            else
              List.destutter' (fun (x1 x2 : SignType) ↦ ¬x1 = x2) ((SignType.sign : (a : R) → SignType) P.leadingCoeff)
                (List.filter (fun (x : SignType) ↦ !decide (x = 0))
                  (List.map (⇑SignType.sign : (a : R) → SignType) cs)) :
            List SignType) -
        1 =
      List.length (α := SignType)
            (List.destutter' (fun (x1 x2 : SignType) ↦ ¬x1 = x2)
                ((SignType.sign : (a : R) → SignType) P.eraseLead.leadingCoeff)
                (List.filter (fun (x : SignType) ↦ !decide (x = 0))
                  (List.map (⇑SignType.sign : (a : R) → SignType) cs)) :
              List SignType) -
          1 +
        if
            Eq (α := SignType) ((SignType.sign : (a : R) → SignType) P.leadingCoeff : SignType)
              (-(SignType.sign : (a : R) → SignType) P.eraseLead.leadingCoeff : SignType) then
          1
        else 0
⊢ List.length (α := SignType)
        (if
              ¬Eq (α := SignType) ((SignType.sign : (a : R) → SignType) P.leadingCoeff : SignType)
                  ((SignType.sign : (a : R) → SignType) P.eraseLead.leadingCoeff : SignType) then
            (SignType.sign : (a : R) → SignType) P.leadingCoeff ::
              List.destutter' (fun (x1 x2 : SignType) ↦ ¬x1 = x2)
                ((SignType.sign : (a : R) → SignType) P.eraseLead.leadingCoeff)
                (List.filter (fun (x : SignType) ↦ !decide (x = 0)) (List.map (⇑SignType.sign : (a : R) → SignType) cs))
          else
            List.destutter' (fun (x1 x2 : SignType) ↦ ¬x1 = x2) ((SignType.sign : (a : R) → SignType) P.leadingCoeff)
              (List.filter (fun (x : SignType) ↦ !decide (x = 0)) (List.map (⇑SignType.sign : (a : R) → SignType) cs)) :
          List SignType) -
      1 =
    List.length (α := SignType)
          (List.destutter' (fun (x1 x2 : SignType) ↦ ¬x1 = x2)
              ((SignType.sign : (a : R) → SignType) P.eraseLead.leadingCoeff)
              (List.filter (fun (x : SignType) ↦ !decide (x = 0)) (List.map (⇑SignType.sign : (a : R) → SignType) cs)) :
            List SignType) -
        1 +
      if
          Eq (α := SignType) ((SignType.sign : (a : R) → SignType) P.leadingCoeff : SignType)
            (-(SignType.sign : (a : R) → SignType) P.eraseLead.leadingCoeff : SignType) then
        1
      else 0

Tactic:
by_cases h₄ : SignType.sign P.leadingCoeff = SignType.sign P.eraseLead.leadingCoeff

Premises used: Polynomial.leadingCoeff, Polynomial.eraseLead, DFunLike.coe, SignType.sign