case mp =>
  intro (_ : Positive ab)
  show SameSign a b
  have : Nonzero ab := nonzero_iff_pos_or_neg.mpr (Or.inl ‹Positive ab›)
  have (And.intro (_ : Nonzero a) (_ : Nonzero b)) :=
    nonzero_factors_if_nonzero_product ‹Nonzero ab›
  have (Nonzero.intro (sa : ℤ) (_ : Sqrt1 sa) nwsa) := ‹Nonzero a›
  have (Nonzero.intro (sb : ℤ) (_ : Sqrt1 sb) nwsb) := ‹Nonzero b›
  have : NonzeroWithSign a sa := nwsa
  have : NonzeroWithSign b sb := nwsb
  have nwsac : NonzeroWithSign a 1 ∨ NonzeroWithSign a (-1)
    := nonzeroWithSign_cases ‹NonzeroWithSign a sa›
  have nwsbc : NonzeroWithSign b 1 ∨ NonzeroWithSign b (-1)
    := nonzeroWithSign_cases ‹NonzeroWithSign b sb›
  have : SameSign a b ∨ NonzeroWithSign ab (-1) := match nwsac with
  | Or.inl (nwsa : NonzeroWithSign a 1) =>
    match nwsbc with
    | Or.inl (nwsb : NonzeroWithSign b 1) =>
      Or.inl (SameSign.mk nwsa nwsb)
    | Or.inr (nwsb : NonzeroWithSign b (-1)) =>
      have : NonzeroWithSign ab (1 * -1) :=
        mul_preserves_nonzeroWithSign nwsa nwsb
      have : NonzeroWithSign ab (-1) :=
        NonzeroWithSign.subst_sign AA.identL ‹NonzeroWithSign ab (1 * -1)›
      Or.inr ‹NonzeroWithSign ab (-1)›
  | Or.inr (nwsa : NonzeroWithSign a (-1)) =>
    match nwsbc with
    | Or.inl (nwsb : NonzeroWithSign b 1) =>
      have : NonzeroWithSign ab (-1 * 1) :=
        mul_preserves_nonzeroWithSign nwsa nwsb
      have : NonzeroWithSign ab (-1) :=
        NonzeroWithSign.subst_sign AA.identR ‹NonzeroWithSign ab (-1 * 1)›
      Or.inr ‹NonzeroWithSign ab (-1)›
    | Or.inr (nwsb : NonzeroWithSign b (-1)) =>
      Or.inl (SameSign.mk nwsa nwsb)
  match ‹SameSign a b ∨ NonzeroWithSign ab (-1)› with
  | Or.inl (_ : SameSign a b) =>
    exact ‹SameSign a b›
  | Or.inr (_ : NonzeroWithSign ab (-1)) =>
    have : Negative ab :=
      negative_iff_sign_neg1.mpr ‹NonzeroWithSign ab (-1)›
    have positive_and_negative : Positive ab ∧ Negative ab :=
      And.intro ‹Positive ab› ‹Negative ab›
    exact absurd positive_and_negative not_positive_and_negative
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
⊢ Positive (a * b) → SameSign a b
no goals