Theorem: Lean4Axiomatic.Integer.positive_mul_iff_same_sign (Lean4Axiomatic/Integer/Sign.lean)

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
⊢ Positive (a * b) ↔ SameSign a b
Tactic:
let ab := a * b
State after:
ℕ : 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

State before:
ℕ : 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
Tactic:
apply Iff.intro
State after:
case mp
ℕ : 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

case mpr
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
⊢ SameSign a b → Positive (a * b)

State before:
ℕ : 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
Tactic:
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
State after:
no goals

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
⊢ SameSign a b → Positive (a * b)
Tactic:
case mpr =>
  intro (_ : SameSign a b)
  show Positive ab
  have (SameSign.intro (s : ℤ) (_ : Sqrt1 s) nwsa nwsb) := ‹SameSign a b›
  have : NonzeroWithSign a s := nwsa
  have : NonzeroWithSign b s := nwsb
  have : s * s ≃ 1 := ‹Sqrt1 s›.elim
  have : NonzeroWithSign ab (s * s) :=
    mul_preserves_nonzeroWithSign nwsa nwsb
  have : NonzeroWithSign ab 1 :=
    NonzeroWithSign.subst_sign ‹s * s ≃ 1› ‹NonzeroWithSign ab (s * s)›
  have : Positive ab := positive_iff_sign_pos1.mpr ‹NonzeroWithSign ab 1›
  exact this
State after:
no goals

State before:
ℕ : 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
Tactic:
intro (_ : Positive ab)
State after:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
⊢ SameSign a b

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
⊢ SameSign a b
Tactic:
have : Nonzero ab := nonzero_iff_pos_or_neg.mpr (Or.inl ‹Positive ab›)
State after:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this : Nonzero ab
⊢ SameSign a b

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this : Nonzero ab
⊢ SameSign a b
Tactic:
have (And.intro (_ : Nonzero a) (_ : Nonzero b)) :=
  nonzero_factors_if_nonzero_product ‹Nonzero ab›
State after:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this : Nonzero ab
left✝ : Nonzero a
right✝ : Nonzero b
⊢ SameSign a b

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this : Nonzero ab
left✝ : Nonzero a
right✝ : Nonzero b
⊢ SameSign a b
Tactic:
have (Nonzero.intro (sa : ℤ) (_ : Sqrt1 sa) nwsa) := ‹Nonzero a›
State after:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this : Nonzero ab
left✝ : Nonzero a
right✝ : Nonzero b
sa : ℤ
sqrt1✝ : Sqrt1 sa
nwsa : NonzeroWithSign a sa
⊢ SameSign a b

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this : Nonzero ab
left✝ : Nonzero a
right✝ : Nonzero b
sa : ℤ
sqrt1✝ : Sqrt1 sa
nwsa : NonzeroWithSign a sa
⊢ SameSign a b
Tactic:
have (Nonzero.intro (sb : ℤ) (_ : Sqrt1 sb) nwsb) := ‹Nonzero b›
State after:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this : Nonzero ab
left✝ : Nonzero a
right✝ : Nonzero b
sa : ℤ
sqrt1✝¹ : Sqrt1 sa
nwsa : NonzeroWithSign a sa
sb : ℤ
sqrt1✝ : Sqrt1 sb
nwsb : NonzeroWithSign b sb
⊢ SameSign a b

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this : Nonzero ab
left✝ : Nonzero a
right✝ : Nonzero b
sa : ℤ
sqrt1✝¹ : Sqrt1 sa
nwsa : NonzeroWithSign a sa
sb : ℤ
sqrt1✝ : Sqrt1 sb
nwsb : NonzeroWithSign b sb
⊢ SameSign a b
Tactic:
have : NonzeroWithSign a sa := nwsa
State after:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this✝ : Nonzero ab
left✝ : Nonzero a
right✝ : Nonzero b
sa : ℤ
sqrt1✝¹ : Sqrt1 sa
nwsa : NonzeroWithSign a sa
sb : ℤ
sqrt1✝ : Sqrt1 sb
nwsb : NonzeroWithSign b sb
this : NonzeroWithSign a sa
⊢ SameSign a b

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this✝ : Nonzero ab
left✝ : Nonzero a
right✝ : Nonzero b
sa : ℤ
sqrt1✝¹ : Sqrt1 sa
nwsa : NonzeroWithSign a sa
sb : ℤ
sqrt1✝ : Sqrt1 sb
nwsb : NonzeroWithSign b sb
this : NonzeroWithSign a sa
⊢ SameSign a b
Tactic:
have : NonzeroWithSign b sb := nwsb
State after:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this✝¹ : Nonzero ab
left✝ : Nonzero a
right✝ : Nonzero b
sa : ℤ
sqrt1✝¹ : Sqrt1 sa
nwsa : NonzeroWithSign a sa
sb : ℤ
sqrt1✝ : Sqrt1 sb
nwsb : NonzeroWithSign b sb
this✝ : NonzeroWithSign a sa
this : NonzeroWithSign b sb
⊢ SameSign a b

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this✝¹ : Nonzero ab
left✝ : Nonzero a
right✝ : Nonzero b
sa : ℤ
sqrt1✝¹ : Sqrt1 sa
nwsa : NonzeroWithSign a sa
sb : ℤ
sqrt1✝ : Sqrt1 sb
nwsb : NonzeroWithSign b sb
this✝ : NonzeroWithSign a sa
this : NonzeroWithSign b sb
⊢ SameSign a b
Tactic:
have nwsac : NonzeroWithSign a 1 ∨ NonzeroWithSign a (-1)
  := nonzeroWithSign_cases ‹NonzeroWithSign a sa›
State after:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this✝¹ : Nonzero ab
left✝ : Nonzero a
right✝ : Nonzero b
sa : ℤ
sqrt1✝¹ : Sqrt1 sa
nwsa : NonzeroWithSign a sa
sb : ℤ
sqrt1✝ : Sqrt1 sb
nwsb : NonzeroWithSign b sb
this✝ : NonzeroWithSign a sa
this : NonzeroWithSign b sb
nwsac : NonzeroWithSign a 1 ∨ NonzeroWithSign a (-1)
⊢ SameSign a b

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this✝¹ : Nonzero ab
left✝ : Nonzero a
right✝ : Nonzero b
sa : ℤ
sqrt1✝¹ : Sqrt1 sa
nwsa : NonzeroWithSign a sa
sb : ℤ
sqrt1✝ : Sqrt1 sb
nwsb : NonzeroWithSign b sb
this✝ : NonzeroWithSign a sa
this : NonzeroWithSign b sb
nwsac : NonzeroWithSign a 1 ∨ NonzeroWithSign a (-1)
⊢ SameSign a b
Tactic:
have nwsbc : NonzeroWithSign b 1 ∨ NonzeroWithSign b (-1)
  := nonzeroWithSign_cases ‹NonzeroWithSign b sb›
State after:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this✝¹ : Nonzero ab
left✝ : Nonzero a
right✝ : Nonzero b
sa : ℤ
sqrt1✝¹ : Sqrt1 sa
nwsa : NonzeroWithSign a sa
sb : ℤ
sqrt1✝ : Sqrt1 sb
nwsb : NonzeroWithSign b sb
this✝ : NonzeroWithSign a sa
this : NonzeroWithSign b sb
nwsac : NonzeroWithSign a 1 ∨ NonzeroWithSign a (-1)
nwsbc : NonzeroWithSign b 1 ∨ NonzeroWithSign b (-1)
⊢ SameSign a b

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this✝¹ : Nonzero ab
left✝ : Nonzero a
right✝ : Nonzero b
sa : ℤ
sqrt1✝¹ : Sqrt1 sa
nwsa : NonzeroWithSign a sa
sb : ℤ
sqrt1✝ : Sqrt1 sb
nwsb : NonzeroWithSign b sb
this✝ : NonzeroWithSign a sa
this : NonzeroWithSign b sb
nwsac : NonzeroWithSign a 1 ∨ NonzeroWithSign a (-1)
nwsbc : NonzeroWithSign b 1 ∨ NonzeroWithSign b (-1)
⊢ SameSign a b
Tactic:
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)
State after:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this✝² : Nonzero ab
left✝ : Nonzero a
right✝ : Nonzero b
sa : ℤ
sqrt1✝¹ : Sqrt1 sa
nwsa : NonzeroWithSign a sa
sb : ℤ
sqrt1✝ : Sqrt1 sb
nwsb : NonzeroWithSign b sb
this✝¹ : NonzeroWithSign a sa
this✝ : NonzeroWithSign b sb
nwsac : NonzeroWithSign a 1 ∨ NonzeroWithSign a (-1)
nwsbc : NonzeroWithSign b 1 ∨ NonzeroWithSign b (-1)
this : SameSign a b ∨ NonzeroWithSign ab (-1)
⊢ SameSign a b

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this✝² : Nonzero ab
left✝ : Nonzero a
right✝ : Nonzero b
sa : ℤ
sqrt1✝¹ : Sqrt1 sa
nwsa : NonzeroWithSign a sa
sb : ℤ
sqrt1✝ : Sqrt1 sb
nwsb : NonzeroWithSign b sb
this✝¹ : NonzeroWithSign a sa
this✝ : NonzeroWithSign b sb
nwsac : NonzeroWithSign a 1 ∨ NonzeroWithSign a (-1)
nwsbc : NonzeroWithSign b 1 ∨ NonzeroWithSign b (-1)
this : SameSign a b ∨ NonzeroWithSign ab (-1)
⊢ SameSign a b
Tactic:
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
State after:
no goals

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this✝² : Nonzero ab
left✝ : Nonzero a
right✝ : Nonzero b
sa : ℤ
sqrt1✝¹ : Sqrt1 sa
nwsa : NonzeroWithSign a sa
sb : ℤ
sqrt1✝ : Sqrt1 sb
nwsb : NonzeroWithSign b sb
this✝¹ : NonzeroWithSign a sa
this✝ : NonzeroWithSign b sb
nwsac : NonzeroWithSign a 1 ∨ NonzeroWithSign a (-1)
nwsbc : NonzeroWithSign b 1 ∨ NonzeroWithSign b (-1)
this : SameSign a b ∨ NonzeroWithSign ab (-1)
h✝ : SameSign a b
⊢ SameSign a b
Tactic:
exact ‹SameSign a b›
State after:
no goals

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this✝² : Nonzero ab
left✝ : Nonzero a
right✝ : Nonzero b
sa : ℤ
sqrt1✝¹ : Sqrt1 sa
nwsa : NonzeroWithSign a sa
sb : ℤ
sqrt1✝ : Sqrt1 sb
nwsb : NonzeroWithSign b sb
this✝¹ : NonzeroWithSign a sa
this✝ : NonzeroWithSign b sb
nwsac : NonzeroWithSign a 1 ∨ NonzeroWithSign a (-1)
nwsbc : NonzeroWithSign b 1 ∨ NonzeroWithSign b (-1)
this : SameSign a b ∨ NonzeroWithSign ab (-1)
h✝ : NonzeroWithSign ab (-1)
⊢ SameSign a b
Tactic:
have : Negative ab :=
  negative_iff_sign_neg1.mpr ‹NonzeroWithSign ab (-1)›
State after:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this✝³ : Nonzero ab
left✝ : Nonzero a
right✝ : Nonzero b
sa : ℤ
sqrt1✝¹ : Sqrt1 sa
nwsa : NonzeroWithSign a sa
sb : ℤ
sqrt1✝ : Sqrt1 sb
nwsb : NonzeroWithSign b sb
this✝² : NonzeroWithSign a sa
this✝¹ : NonzeroWithSign b sb
nwsac : NonzeroWithSign a 1 ∨ NonzeroWithSign a (-1)
nwsbc : NonzeroWithSign b 1 ∨ NonzeroWithSign b (-1)
this✝ : SameSign a b ∨ NonzeroWithSign ab (-1)
h✝ : NonzeroWithSign ab (-1)
this : Negative ab
⊢ SameSign a b

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this✝³ : Nonzero ab
left✝ : Nonzero a
right✝ : Nonzero b
sa : ℤ
sqrt1✝¹ : Sqrt1 sa
nwsa : NonzeroWithSign a sa
sb : ℤ
sqrt1✝ : Sqrt1 sb
nwsb : NonzeroWithSign b sb
this✝² : NonzeroWithSign a sa
this✝¹ : NonzeroWithSign b sb
nwsac : NonzeroWithSign a 1 ∨ NonzeroWithSign a (-1)
nwsbc : NonzeroWithSign b 1 ∨ NonzeroWithSign b (-1)
this✝ : SameSign a b ∨ NonzeroWithSign ab (-1)
h✝ : NonzeroWithSign ab (-1)
this : Negative ab
⊢ SameSign a b
Tactic:
have positive_and_negative : Positive ab ∧ Negative ab :=
  And.intro ‹Positive ab› ‹Negative ab›
State after:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this✝³ : Nonzero ab
left✝ : Nonzero a
right✝ : Nonzero b
sa : ℤ
sqrt1✝¹ : Sqrt1 sa
nwsa : NonzeroWithSign a sa
sb : ℤ
sqrt1✝ : Sqrt1 sb
nwsb : NonzeroWithSign b sb
this✝² : NonzeroWithSign a sa
this✝¹ : NonzeroWithSign b sb
nwsac : NonzeroWithSign a 1 ∨ NonzeroWithSign a (-1)
nwsbc : NonzeroWithSign b 1 ∨ NonzeroWithSign b (-1)
this✝ : SameSign a b ∨ NonzeroWithSign ab (-1)
h✝ : NonzeroWithSign ab (-1)
this : Negative ab
positive_and_negative : Positive ab ∧ Negative ab
⊢ SameSign a b

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : Positive ab
this✝³ : Nonzero ab
left✝ : Nonzero a
right✝ : Nonzero b
sa : ℤ
sqrt1✝¹ : Sqrt1 sa
nwsa : NonzeroWithSign a sa
sb : ℤ
sqrt1✝ : Sqrt1 sb
nwsb : NonzeroWithSign b sb
this✝² : NonzeroWithSign a sa
this✝¹ : NonzeroWithSign b sb
nwsac : NonzeroWithSign a 1 ∨ NonzeroWithSign a (-1)
nwsbc : NonzeroWithSign b 1 ∨ NonzeroWithSign b (-1)
this✝ : SameSign a b ∨ NonzeroWithSign ab (-1)
h✝ : NonzeroWithSign ab (-1)
this : Negative ab
positive_and_negative : Positive ab ∧ Negative ab
⊢ SameSign a b
Tactic:
exact absurd positive_and_negative not_positive_and_negative
State after:
no goals

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
⊢ SameSign a b → Positive (a * b)
Tactic:
intro (_ : SameSign a b)
State after:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : SameSign a b
⊢ Positive (a * b)

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : SameSign a b
⊢ Positive (a * b)
Tactic:
show Positive ab
State after:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : SameSign a b
⊢ Positive ab

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : SameSign a b
⊢ Positive ab
Tactic:
have (SameSign.intro (s : ℤ) (_ : Sqrt1 s) nwsa nwsb) := ‹SameSign a b›
State after:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : SameSign a b
s : ℤ
sqrt1✝ : Sqrt1 s
nwsa : NonzeroWithSign a s
nwsb : NonzeroWithSign b s
⊢ Positive ab

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : SameSign a b
s : ℤ
sqrt1✝ : Sqrt1 s
nwsa : NonzeroWithSign a s
nwsb : NonzeroWithSign b s
⊢ Positive ab
Tactic:
have : NonzeroWithSign a s := nwsa
State after:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : SameSign a b
s : ℤ
sqrt1✝ : Sqrt1 s
nwsa : NonzeroWithSign a s
nwsb : NonzeroWithSign b s
this : NonzeroWithSign a s
⊢ Positive ab

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : SameSign a b
s : ℤ
sqrt1✝ : Sqrt1 s
nwsa : NonzeroWithSign a s
nwsb : NonzeroWithSign b s
this : NonzeroWithSign a s
⊢ Positive ab
Tactic:
have : NonzeroWithSign b s := nwsb
State after:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : SameSign a b
s : ℤ
sqrt1✝ : Sqrt1 s
nwsa : NonzeroWithSign a s
nwsb : NonzeroWithSign b s
this✝ : NonzeroWithSign a s
this : NonzeroWithSign b s
⊢ Positive ab

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : SameSign a b
s : ℤ
sqrt1✝ : Sqrt1 s
nwsa : NonzeroWithSign a s
nwsb : NonzeroWithSign b s
this✝ : NonzeroWithSign a s
this : NonzeroWithSign b s
⊢ Positive ab
Tactic:
have : s * s ≃ 1 := ‹Sqrt1 s›.elim
State after:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : SameSign a b
s : ℤ
sqrt1✝ : Sqrt1 s
nwsa : NonzeroWithSign a s
nwsb : NonzeroWithSign b s
this✝¹ : NonzeroWithSign a s
this✝ : NonzeroWithSign b s
this : s * s ≃ 1
⊢ Positive ab

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : SameSign a b
s : ℤ
sqrt1✝ : Sqrt1 s
nwsa : NonzeroWithSign a s
nwsb : NonzeroWithSign b s
this✝¹ : NonzeroWithSign a s
this✝ : NonzeroWithSign b s
this : s * s ≃ 1
⊢ Positive ab
Tactic:
have : NonzeroWithSign ab (s * s) :=
  mul_preserves_nonzeroWithSign nwsa nwsb
State after:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : SameSign a b
s : ℤ
sqrt1✝ : Sqrt1 s
nwsa : NonzeroWithSign a s
nwsb : NonzeroWithSign b s
this✝² : NonzeroWithSign a s
this✝¹ : NonzeroWithSign b s
this✝ : s * s ≃ 1
this : NonzeroWithSign ab (s * s)
⊢ Positive ab

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : SameSign a b
s : ℤ
sqrt1✝ : Sqrt1 s
nwsa : NonzeroWithSign a s
nwsb : NonzeroWithSign b s
this✝² : NonzeroWithSign a s
this✝¹ : NonzeroWithSign b s
this✝ : s * s ≃ 1
this : NonzeroWithSign ab (s * s)
⊢ Positive ab
Tactic:
have : NonzeroWithSign ab 1 :=
  NonzeroWithSign.subst_sign ‹s * s ≃ 1› ‹NonzeroWithSign ab (s * s)›
State after:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : SameSign a b
s : ℤ
sqrt1✝ : Sqrt1 s
nwsa : NonzeroWithSign a s
nwsb : NonzeroWithSign b s
this✝³ : NonzeroWithSign a s
this✝² : NonzeroWithSign b s
this✝¹ : s * s ≃ 1
this✝ : NonzeroWithSign ab (s * s)
this : NonzeroWithSign ab 1
⊢ Positive ab

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : SameSign a b
s : ℤ
sqrt1✝ : Sqrt1 s
nwsa : NonzeroWithSign a s
nwsb : NonzeroWithSign b s
this✝³ : NonzeroWithSign a s
this✝² : NonzeroWithSign b s
this✝¹ : s * s ≃ 1
this✝ : NonzeroWithSign ab (s * s)
this : NonzeroWithSign ab 1
⊢ Positive ab
Tactic:
have : Positive ab := positive_iff_sign_pos1.mpr ‹NonzeroWithSign ab 1›
State after:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : SameSign a b
s : ℤ
sqrt1✝ : Sqrt1 s
nwsa : NonzeroWithSign a s
nwsb : NonzeroWithSign b s
this✝⁴ : NonzeroWithSign a s
this✝³ : NonzeroWithSign b s
this✝² : s * s ≃ 1
this✝¹ : NonzeroWithSign ab (s * s)
this✝ : NonzeroWithSign ab 1
this : Positive ab
⊢ Positive ab

State before:
ℕ : Type
inst✝⁵ : Natural ℕ
ℤ : Type
inst✝⁴ : Core ℤ
inst✝³ : Addition ℤ
inst✝² : Multiplication ℤ
inst✝¹ : Negation ℤ
inst✝ : Sign ℤ
a b : ℤ
ab : ℤ := a * b
x✝ : SameSign a b
s : ℤ
sqrt1✝ : Sqrt1 s
nwsa : NonzeroWithSign a s
nwsb : NonzeroWithSign b s
this✝⁴ : NonzeroWithSign a s
this✝³ : NonzeroWithSign b s
this✝² : s * s ≃ 1
this✝¹ : NonzeroWithSign ab (s * s)
this✝ : NonzeroWithSign ab 1
this : Positive ab
⊢ Positive ab
Tactic:
exact this
State after:
no goals