Theorem: Lean4Axiomatic.Rational.mul_split_zero (Lean4Axiomatic/Rational/Sign.lean)

State before:
ℕ ℤ ℚ : Type
inst✝⁹ : Natural ℕ
inst✝⁸ : Integer ℤ
inst✝⁷ : Core ℚ
inst✝⁶ : Addition ℚ
inst✝⁵ : Multiplication ℚ
inst✝⁴ : Negation ℚ
inst✝³ : Subtraction ℚ
inst✝² : Reciprocation ℚ
inst✝¹ : Division ℚ
inst✝ : Sign ℚ
p q : ℚ
⊢ p * q ≃ 0 ↔ p ≃ 0 ∨ q ≃ 0
Tactic:
apply Iff.intro
State after:
case mp
ℕ ℤ ℚ : Type
inst✝⁹ : Natural ℕ
inst✝⁸ : Integer ℤ
inst✝⁷ : Core ℚ
inst✝⁶ : Addition ℚ
inst✝⁵ : Multiplication ℚ
inst✝⁴ : Negation ℚ
inst✝³ : Subtraction ℚ
inst✝² : Reciprocation ℚ
inst✝¹ : Division ℚ
inst✝ : Sign ℚ
p q : ℚ
⊢ p * q ≃ 0 → p ≃ 0 ∨ q ≃ 0

case mpr
ℕ ℤ ℚ : Type
inst✝⁹ : Natural ℕ
inst✝⁸ : Integer ℤ
inst✝⁷ : Core ℚ
inst✝⁶ : Addition ℚ
inst✝⁵ : Multiplication ℚ
inst✝⁴ : Negation ℚ
inst✝³ : Subtraction ℚ
inst✝² : Reciprocation ℚ
inst✝¹ : Division ℚ
inst✝ : Sign ℚ
p q : ℚ
⊢ p ≃ 0 ∨ q ≃ 0 → p * q ≃ 0

State before:
ℕ ℤ ℚ : Type
inst✝⁹ : Natural ℕ
inst✝⁸ : Integer ℤ
inst✝⁷ : Core ℚ
inst✝⁶ : Addition ℚ
inst✝⁵ : Multiplication ℚ
inst✝⁴ : Negation ℚ
inst✝³ : Subtraction ℚ
inst✝² : Reciprocation ℚ
inst✝¹ : Division ℚ
inst✝ : Sign ℚ
p q : ℚ
⊢ p * q ≃ 0 → p ≃ 0 ∨ q ≃ 0
Tactic:
case mp =>
  intro (_ : p * q ≃ 0)
  show p ≃ 0 ∨ q ≃ 0
  have : sgn p * sgn q ≃ 0 := calc
    sgn p * sgn q ≃ _ := Rel.symm sgn_compat_mul
    sgn (p * q)   ≃ _ := sgn_zero.mp ‹p * q ≃ 0›
    0             ≃ _ := Rel.refl
  have : sgn p ≃ 0 ∨ sgn q ≃ 0 := Integer.mul_split_zero.mp this
  have : p ≃ 0 ∨ q ≃ 0 := match this with
  | Or.inl (_ : sgn p ≃ 0) =>
    have : p ≃ 0 := sgn_zero.mpr ‹sgn p ≃ 0›
    Or.inl this
  | Or.inr (_ : sgn q ≃ 0) =>
    have : q ≃ 0 := sgn_zero.mpr ‹sgn q ≃ 0›
    Or.inr this
  exact this
State after:
no goals

State before:
ℕ ℤ ℚ : Type
inst✝⁹ : Natural ℕ
inst✝⁸ : Integer ℤ
inst✝⁷ : Core ℚ
inst✝⁶ : Addition ℚ
inst✝⁵ : Multiplication ℚ
inst✝⁴ : Negation ℚ
inst✝³ : Subtraction ℚ
inst✝² : Reciprocation ℚ
inst✝¹ : Division ℚ
inst✝ : Sign ℚ
p q : ℚ
⊢ p ≃ 0 ∨ q ≃ 0 → p * q ≃ 0
Tactic:
case mpr =>
  intro (_ : p ≃ 0 ∨ q ≃ 0)
  show p * q ≃ 0
  match ‹p ≃ 0 ∨ q ≃ 0› with
  | Or.inl (_ : p ≃ 0) => calc
    p * q ≃ _ := mul_substL ‹p ≃ 0›
    0 * q ≃ _ := mul_absorbL
    0     ≃ _ := eqv_refl
  | Or.inr (_ : q ≃ 0) => calc
    p * q ≃ _ := mul_substR ‹q ≃ 0›
    p * 0 ≃ _ := mul_absorbR
    0     ≃ _ := eqv_refl
State after:
no goals

State before:
ℕ ℤ ℚ : Type
inst✝⁹ : Natural ℕ
inst✝⁸ : Integer ℤ
inst✝⁷ : Core ℚ
inst✝⁶ : Addition ℚ
inst✝⁵ : Multiplication ℚ
inst✝⁴ : Negation ℚ
inst✝³ : Subtraction ℚ
inst✝² : Reciprocation ℚ
inst✝¹ : Division ℚ
inst✝ : Sign ℚ
p q : ℚ
⊢ p * q ≃ 0 → p ≃ 0 ∨ q ≃ 0
Tactic:
intro (_ : p * q ≃ 0)
State after:
ℕ ℤ ℚ : Type
inst✝⁹ : Natural ℕ
inst✝⁸ : Integer ℤ
inst✝⁷ : Core ℚ
inst✝⁶ : Addition ℚ
inst✝⁵ : Multiplication ℚ
inst✝⁴ : Negation ℚ
inst✝³ : Subtraction ℚ
inst✝² : Reciprocation ℚ
inst✝¹ : Division ℚ
inst✝ : Sign ℚ
p q : ℚ
x✝ : p * q ≃ 0
⊢ p ≃ 0 ∨ q ≃ 0

State before:
ℕ ℤ ℚ : Type
inst✝⁹ : Natural ℕ
inst✝⁸ : Integer ℤ
inst✝⁷ : Core ℚ
inst✝⁶ : Addition ℚ
inst✝⁵ : Multiplication ℚ
inst✝⁴ : Negation ℚ
inst✝³ : Subtraction ℚ
inst✝² : Reciprocation ℚ
inst✝¹ : Division ℚ
inst✝ : Sign ℚ
p q : ℚ
x✝ : p * q ≃ 0
⊢ p ≃ 0 ∨ q ≃ 0
Tactic:
have : sgn p * sgn q ≃ 0 := calc
  sgn p * sgn q ≃ _ := Rel.symm sgn_compat_mul
  sgn (p * q)   ≃ _ := sgn_zero.mp ‹p * q ≃ 0›
  0             ≃ _ := Rel.refl
State after:
ℕ ℤ ℚ : Type
inst✝⁹ : Natural ℕ
inst✝⁸ : Integer ℤ
inst✝⁷ : Core ℚ
inst✝⁶ : Addition ℚ
inst✝⁵ : Multiplication ℚ
inst✝⁴ : Negation ℚ
inst✝³ : Subtraction ℚ
inst✝² : Reciprocation ℚ
inst✝¹ : Division ℚ
inst✝ : Sign ℚ
p q : ℚ
x✝ : p * q ≃ 0
this : sgn p * sgn q ≃ 0
⊢ p ≃ 0 ∨ q ≃ 0

State before:
ℕ ℤ ℚ : Type
inst✝⁹ : Natural ℕ
inst✝⁸ : Integer ℤ
inst✝⁷ : Core ℚ
inst✝⁶ : Addition ℚ
inst✝⁵ : Multiplication ℚ
inst✝⁴ : Negation ℚ
inst✝³ : Subtraction ℚ
inst✝² : Reciprocation ℚ
inst✝¹ : Division ℚ
inst✝ : Sign ℚ
p q : ℚ
x✝ : p * q ≃ 0
this : sgn p * sgn q ≃ 0
⊢ p ≃ 0 ∨ q ≃ 0
Tactic:
have : sgn p ≃ 0 ∨ sgn q ≃ 0 := Integer.mul_split_zero.mp this
State after:
ℕ ℤ ℚ : Type
inst✝⁹ : Natural ℕ
inst✝⁸ : Integer ℤ
inst✝⁷ : Core ℚ
inst✝⁶ : Addition ℚ
inst✝⁵ : Multiplication ℚ
inst✝⁴ : Negation ℚ
inst✝³ : Subtraction ℚ
inst✝² : Reciprocation ℚ
inst✝¹ : Division ℚ
inst✝ : Sign ℚ
p q : ℚ
x✝ : p * q ≃ 0
this✝ : sgn p * sgn q ≃ 0
this : sgn p ≃ 0 ∨ sgn q ≃ 0
⊢ p ≃ 0 ∨ q ≃ 0

State before:
ℕ ℤ ℚ : Type
inst✝⁹ : Natural ℕ
inst✝⁸ : Integer ℤ
inst✝⁷ : Core ℚ
inst✝⁶ : Addition ℚ
inst✝⁵ : Multiplication ℚ
inst✝⁴ : Negation ℚ
inst✝³ : Subtraction ℚ
inst✝² : Reciprocation ℚ
inst✝¹ : Division ℚ
inst✝ : Sign ℚ
p q : ℚ
x✝ : p * q ≃ 0
this✝ : sgn p * sgn q ≃ 0
this : sgn p ≃ 0 ∨ sgn q ≃ 0
⊢ p ≃ 0 ∨ q ≃ 0
Tactic:
have : p ≃ 0 ∨ q ≃ 0 := match this with
| Or.inl (_ : sgn p ≃ 0) =>
  have : p ≃ 0 := sgn_zero.mpr ‹sgn p ≃ 0›
  Or.inl this
| Or.inr (_ : sgn q ≃ 0) =>
  have : q ≃ 0 := sgn_zero.mpr ‹sgn q ≃ 0›
  Or.inr this
State after:
ℕ ℤ ℚ : Type
inst✝⁹ : Natural ℕ
inst✝⁸ : Integer ℤ
inst✝⁷ : Core ℚ
inst✝⁶ : Addition ℚ
inst✝⁵ : Multiplication ℚ
inst✝⁴ : Negation ℚ
inst✝³ : Subtraction ℚ
inst✝² : Reciprocation ℚ
inst✝¹ : Division ℚ
inst✝ : Sign ℚ
p q : ℚ
x✝ : p * q ≃ 0
this✝¹ : sgn p * sgn q ≃ 0
this✝ : sgn p ≃ 0 ∨ sgn q ≃ 0
this : p ≃ 0 ∨ q ≃ 0
⊢ p ≃ 0 ∨ q ≃ 0

State before:
ℕ ℤ ℚ : Type
inst✝⁹ : Natural ℕ
inst✝⁸ : Integer ℤ
inst✝⁷ : Core ℚ
inst✝⁶ : Addition ℚ
inst✝⁵ : Multiplication ℚ
inst✝⁴ : Negation ℚ
inst✝³ : Subtraction ℚ
inst✝² : Reciprocation ℚ
inst✝¹ : Division ℚ
inst✝ : Sign ℚ
p q : ℚ
x✝ : p * q ≃ 0
this✝¹ : sgn p * sgn q ≃ 0
this✝ : sgn p ≃ 0 ∨ sgn q ≃ 0
this : p ≃ 0 ∨ q ≃ 0
⊢ p ≃ 0 ∨ q ≃ 0
Tactic:
exact this
State after:
no goals

State before:
ℕ ℤ ℚ : Type
inst✝⁹ : Natural ℕ
inst✝⁸ : Integer ℤ
inst✝⁷ : Core ℚ
inst✝⁶ : Addition ℚ
inst✝⁵ : Multiplication ℚ
inst✝⁴ : Negation ℚ
inst✝³ : Subtraction ℚ
inst✝² : Reciprocation ℚ
inst✝¹ : Division ℚ
inst✝ : Sign ℚ
p q : ℚ
⊢ p ≃ 0 ∨ q ≃ 0 → p * q ≃ 0
Tactic:
intro (_ : p ≃ 0 ∨ q ≃ 0)
State after:
ℕ ℤ ℚ : Type
inst✝⁹ : Natural ℕ
inst✝⁸ : Integer ℤ
inst✝⁷ : Core ℚ
inst✝⁶ : Addition ℚ
inst✝⁵ : Multiplication ℚ
inst✝⁴ : Negation ℚ
inst✝³ : Subtraction ℚ
inst✝² : Reciprocation ℚ
inst✝¹ : Division ℚ
inst✝ : Sign ℚ
p q : ℚ
x✝ : p ≃ 0 ∨ q ≃ 0
⊢ p * q ≃ 0

State before:
ℕ ℤ ℚ : Type
inst✝⁹ : Natural ℕ
inst✝⁸ : Integer ℤ
inst✝⁷ : Core ℚ
inst✝⁶ : Addition ℚ
inst✝⁵ : Multiplication ℚ
inst✝⁴ : Negation ℚ
inst✝³ : Subtraction ℚ
inst✝² : Reciprocation ℚ
inst✝¹ : Division ℚ
inst✝ : Sign ℚ
p q : ℚ
x✝ : p ≃ 0 ∨ q ≃ 0
⊢ p * q ≃ 0
Tactic:
match ‹p ≃ 0 ∨ q ≃ 0› with
| Or.inl (_ : p ≃ 0) => calc
  p * q ≃ _ := mul_substL ‹p ≃ 0›
  0 * q ≃ _ := mul_absorbL
  0     ≃ _ := eqv_refl
| Or.inr (_ : q ≃ 0) => calc
  p * q ≃ _ := mul_substR ‹q ≃ 0›
  p * 0 ≃ _ := mul_absorbR
  0     ≃ _ := eqv_refl
State after:
no goals

State before:
ℕ ℤ ℚ : Type
inst✝⁹ : Natural ℕ
inst✝⁸ : Integer ℤ
inst✝⁷ : Core ℚ
inst✝⁶ : Addition ℚ
inst✝⁵ : Multiplication ℚ
inst✝⁴ : Negation ℚ
inst✝³ : Subtraction ℚ
inst✝² : Reciprocation ℚ
inst✝¹ : Division ℚ
inst✝ : Sign ℚ
p q : ℚ
x✝ : p ≃ 0 ∨ q ≃ 0
h✝ : p ≃ 0
⊢ p * q ≃ 0
Tactic:
calc
p * q ≃ _ := mul_substL ‹p ≃ 0›
0 * q ≃ _ := mul_absorbL
0     ≃ _ := eqv_refl
State after:
no goals

State before:
ℕ ℤ ℚ : Type
inst✝⁹ : Natural ℕ
inst✝⁸ : Integer ℤ
inst✝⁷ : Core ℚ
inst✝⁶ : Addition ℚ
inst✝⁵ : Multiplication ℚ
inst✝⁴ : Negation ℚ
inst✝³ : Subtraction ℚ
inst✝² : Reciprocation ℚ
inst✝¹ : Division ℚ
inst✝ : Sign ℚ
p q : ℚ
x✝ : p ≃ 0 ∨ q ≃ 0
h✝ : q ≃ 0
⊢ p * q ≃ 0
Tactic:
calc
p * q ≃ _ := mul_substR ‹q ≃ 0›
p * 0 ≃ _ := mul_absorbR
0     ≃ _ := eqv_refl
State after:
no goals