Theorem: Lean4Axiomatic.Rational.Impl.Fraction.Naive.eqv_trans_almost (Lean4Axiomatic/Rational/Impl/Fraction/Naive.lean)

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
p q r : Fraction ℤ
⊢ p ≃ q → q ≃ r → p ≃ r ∨ q.to_prod ≃ (0//0).to_prod
Tactic:
revert p
State after:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
q r : Fraction ℤ
⊢ ∀ {p : Fraction ℤ}, p ≃ q → q ≃ r → p ≃ r ∨ q.to_prod ≃ (0//0).to_prod

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
q r : Fraction ℤ
⊢ ∀ {p : Fraction ℤ}, p ≃ q → q ≃ r → p ≃ r ∨ q.to_prod ≃ (0//0).to_prod
Tactic:
intro (pn//pd)
State after:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
q r : Fraction ℤ
pn pd : ℤ
⊢ pn//pd ≃ q → q ≃ r → pn//pd ≃ r ∨ q.to_prod ≃ (0//0).to_prod

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
q r : Fraction ℤ
pn pd : ℤ
⊢ pn//pd ≃ q → q ≃ r → pn//pd ≃ r ∨ q.to_prod ≃ (0//0).to_prod
Tactic:
revert q
State after:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
r : Fraction ℤ
pn pd : ℤ
⊢ ∀ {q : Fraction ℤ}, pn//pd ≃ q → q ≃ r → pn//pd ≃ r ∨ q.to_prod ≃ (0//0).to_prod

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
r : Fraction ℤ
pn pd : ℤ
⊢ ∀ {q : Fraction ℤ}, pn//pd ≃ q → q ≃ r → pn//pd ≃ r ∨ q.to_prod ≃ (0//0).to_prod
Tactic:
intro (qn//qd)
State after:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
r : Fraction ℤ
pn pd qn qd : ℤ
⊢ pn//pd ≃ qn//qd → qn//qd ≃ r → pn//pd ≃ r ∨ (qn//qd).to_prod ≃ (0//0).to_prod

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
r : Fraction ℤ
pn pd qn qd : ℤ
⊢ pn//pd ≃ qn//qd → qn//qd ≃ r → pn//pd ≃ r ∨ (qn//qd).to_prod ≃ (0//0).to_prod
Tactic:
revert r
State after:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd : ℤ
⊢ ∀ {r : Fraction ℤ}, pn//pd ≃ qn//qd → qn//qd ≃ r → pn//pd ≃ r ∨ (qn//qd).to_prod ≃ (0//0).to_prod

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd : ℤ
⊢ ∀ {r : Fraction ℤ}, pn//pd ≃ qn//qd → qn//qd ≃ r → pn//pd ≃ r ∨ (qn//qd).to_prod ≃ (0//0).to_prod
Tactic:
intro (rn//rd)
State after:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
⊢ pn//pd ≃ qn//qd → qn//qd ≃ rn//rd → pn//pd ≃ rn//rd ∨ (qn//qd).to_prod ≃ (0//0).to_prod

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
⊢ pn//pd ≃ qn//qd → qn//qd ≃ rn//rd → pn//pd ≃ rn//rd ∨ (qn//qd).to_prod ≃ (0//0).to_prod
Tactic:
intro (_ : pn//pd ≃ qn//qd) (_ : qn//qd ≃ rn//rd)
State after:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
⊢ pn//pd ≃ rn//rd ∨ (qn//qd).to_prod ≃ (0//0).to_prod

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
⊢ pn//pd ≃ rn//rd ∨ (qn//qd).to_prod ≃ (0//0).to_prod
Tactic:
show pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)
State after:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)
Tactic:
have : Decidable (qd ≃ 0) := Integer.eqv? qd 0
State after:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this : Decidable (qd ≃ 0)
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this : Decidable (qd ≃ 0)
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)
Tactic:
match this with
| isTrue (_ : qd ≃ 0) =>
  have : pn * qd ≃ qn * pd := ‹pn//pd ≃ qn//qd›
  have : qn * rd ≃ rn * qd := ‹qn//qd ≃ rn//rd›
  have : qn * pd ≃ 0 := calc
    qn * pd ≃ _ := Rel.symm ‹pn * qd ≃ qn * pd›
    pn * qd ≃ _ := AA.substR ‹qd ≃ 0›
    pn * 0  ≃ _ := AA.absorbR
    0       ≃ _ := Rel.refl
  have : qn * rd ≃ 0 := calc
    qn * rd ≃ _ := ‹qn * rd ≃ rn * qd›
    rn * qd ≃ _ := AA.substR ‹qd ≃ 0›
    rn * 0  ≃ _ := AA.absorbR
    0       ≃ _ := Rel.refl
  have : qn ≃ 0 ∨ pd ≃ 0 := Integer.mul_split_zero.mp ‹qn * pd ≃ 0›
  have : qn ≃ 0 ∨ rd ≃ 0 := Integer.mul_split_zero.mp ‹qn * rd ≃ 0›
  have : (qn ≃ 0 ∨ pd ≃ 0) ∧ (qn ≃ 0 ∨ rd ≃ 0) :=
    And.intro ‹qn ≃ 0 ∨ pd ≃ 0› ‹qn ≃ 0 ∨ rd ≃ 0›
  have : qn ≃ 0 ∨ (pd ≃ 0 ∧ rd ≃ 0) :=
    Logic.or_distribL_and.mpr ‹(qn ≃ 0 ∨ pd ≃ 0) ∧ (qn ≃ 0 ∨ rd ≃ 0)›
  match ‹qn ≃ 0 ∨ (pd ≃ 0 ∧ rd ≃ 0)› with
  | Or.inl (_ : qn ≃ 0) =>
    have : qn ≃ 0 ∧ qd ≃ 0 := And.intro ‹qn ≃ 0› ‹qd ≃ 0›
    have : (qn, qd) ≃ (0, 0) :=
      Relation.Equivalence.Impl.Prod.eqv_defn.mpr ‹qn ≃ 0 ∧ qd ≃ 0›
    exact Or.inr ‹(qn, qd) ≃ (0, 0)›
  | Or.inr (And.intro (_ : pd ≃ 0) (_ : rd ≃ 0)) =>
    have : pn * rd ≃ rn * pd := calc
      pn * rd ≃ _ := AA.substR ‹rd ≃ 0›
      pn * 0  ≃ _ := AA.absorbR
      0       ≃ _ := Rel.symm AA.absorbR
      rn * 0  ≃ _ := AA.substR (Rel.symm ‹pd ≃ 0›)
      rn * pd ≃ _ := Rel.refl
    exact Or.inl ‹pn * rd ≃ rn * pd›
| isFalse (_ : qd ≄ 0) =>
  have : pn * rd ≃ rn * pd :=
    eqv_trans_nonzero_denom
      (q := qn//qd)
      ‹qd ≄ 0›
      ‹pn//pd ≃ qn//qd›
      ‹qn//qd ≃ rn//rd›
  exact Or.inl ‹pn * rd ≃ rn * pd›
State after:
no goals

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this : Decidable (qd ≃ 0)
h✝ : qd ≃ 0
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)
Tactic:
have : pn * qd ≃ qn * pd := ‹pn//pd ≃ qn//qd›
State after:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝ : Decidable (qd ≃ 0)
h✝ : qd ≃ 0
this : pn * qd ≃ qn * pd
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝ : Decidable (qd ≃ 0)
h✝ : qd ≃ 0
this : pn * qd ≃ qn * pd
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)
Tactic:
have : qn * rd ≃ rn * qd := ‹qn//qd ≃ rn//rd›
State after:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝¹ : Decidable (qd ≃ 0)
h✝ : qd ≃ 0
this✝ : pn * qd ≃ qn * pd
this : qn * rd ≃ rn * qd
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝¹ : Decidable (qd ≃ 0)
h✝ : qd ≃ 0
this✝ : pn * qd ≃ qn * pd
this : qn * rd ≃ rn * qd
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)
Tactic:
have : qn * pd ≃ 0 := calc
  qn * pd ≃ _ := Rel.symm ‹pn * qd ≃ qn * pd›
  pn * qd ≃ _ := AA.substR ‹qd ≃ 0›
  pn * 0  ≃ _ := AA.absorbR
  0       ≃ _ := Rel.refl
State after:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝² : Decidable (qd ≃ 0)
h✝ : qd ≃ 0
this✝¹ : pn * qd ≃ qn * pd
this✝ : qn * rd ≃ rn * qd
this : qn * pd ≃ 0
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝² : Decidable (qd ≃ 0)
h✝ : qd ≃ 0
this✝¹ : pn * qd ≃ qn * pd
this✝ : qn * rd ≃ rn * qd
this : qn * pd ≃ 0
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)
Tactic:
have : qn * rd ≃ 0 := calc
  qn * rd ≃ _ := ‹qn * rd ≃ rn * qd›
  rn * qd ≃ _ := AA.substR ‹qd ≃ 0›
  rn * 0  ≃ _ := AA.absorbR
  0       ≃ _ := Rel.refl
State after:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝³ : Decidable (qd ≃ 0)
h✝ : qd ≃ 0
this✝² : pn * qd ≃ qn * pd
this✝¹ : qn * rd ≃ rn * qd
this✝ : qn * pd ≃ 0
this : qn * rd ≃ 0
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝³ : Decidable (qd ≃ 0)
h✝ : qd ≃ 0
this✝² : pn * qd ≃ qn * pd
this✝¹ : qn * rd ≃ rn * qd
this✝ : qn * pd ≃ 0
this : qn * rd ≃ 0
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)
Tactic:
have : qn ≃ 0 ∨ pd ≃ 0 := Integer.mul_split_zero.mp ‹qn * pd ≃ 0›
State after:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝⁴ : Decidable (qd ≃ 0)
h✝ : qd ≃ 0
this✝³ : pn * qd ≃ qn * pd
this✝² : qn * rd ≃ rn * qd
this✝¹ : qn * pd ≃ 0
this✝ : qn * rd ≃ 0
this : qn ≃ 0 ∨ pd ≃ 0
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝⁴ : Decidable (qd ≃ 0)
h✝ : qd ≃ 0
this✝³ : pn * qd ≃ qn * pd
this✝² : qn * rd ≃ rn * qd
this✝¹ : qn * pd ≃ 0
this✝ : qn * rd ≃ 0
this : qn ≃ 0 ∨ pd ≃ 0
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)
Tactic:
have : qn ≃ 0 ∨ rd ≃ 0 := Integer.mul_split_zero.mp ‹qn * rd ≃ 0›
State after:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝⁵ : Decidable (qd ≃ 0)
h✝ : qd ≃ 0
this✝⁴ : pn * qd ≃ qn * pd
this✝³ : qn * rd ≃ rn * qd
this✝² : qn * pd ≃ 0
this✝¹ : qn * rd ≃ 0
this✝ : qn ≃ 0 ∨ pd ≃ 0
this : qn ≃ 0 ∨ rd ≃ 0
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝⁵ : Decidable (qd ≃ 0)
h✝ : qd ≃ 0
this✝⁴ : pn * qd ≃ qn * pd
this✝³ : qn * rd ≃ rn * qd
this✝² : qn * pd ≃ 0
this✝¹ : qn * rd ≃ 0
this✝ : qn ≃ 0 ∨ pd ≃ 0
this : qn ≃ 0 ∨ rd ≃ 0
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)
Tactic:
have : (qn ≃ 0 ∨ pd ≃ 0) ∧ (qn ≃ 0 ∨ rd ≃ 0) :=
  And.intro ‹qn ≃ 0 ∨ pd ≃ 0› ‹qn ≃ 0 ∨ rd ≃ 0›
State after:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝⁶ : Decidable (qd ≃ 0)
h✝ : qd ≃ 0
this✝⁵ : pn * qd ≃ qn * pd
this✝⁴ : qn * rd ≃ rn * qd
this✝³ : qn * pd ≃ 0
this✝² : qn * rd ≃ 0
this✝¹ : qn ≃ 0 ∨ pd ≃ 0
this✝ : qn ≃ 0 ∨ rd ≃ 0
this : (qn ≃ 0 ∨ pd ≃ 0) ∧ (qn ≃ 0 ∨ rd ≃ 0)
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝⁶ : Decidable (qd ≃ 0)
h✝ : qd ≃ 0
this✝⁵ : pn * qd ≃ qn * pd
this✝⁴ : qn * rd ≃ rn * qd
this✝³ : qn * pd ≃ 0
this✝² : qn * rd ≃ 0
this✝¹ : qn ≃ 0 ∨ pd ≃ 0
this✝ : qn ≃ 0 ∨ rd ≃ 0
this : (qn ≃ 0 ∨ pd ≃ 0) ∧ (qn ≃ 0 ∨ rd ≃ 0)
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)
Tactic:
have : qn ≃ 0 ∨ (pd ≃ 0 ∧ rd ≃ 0) :=
  Logic.or_distribL_and.mpr ‹(qn ≃ 0 ∨ pd ≃ 0) ∧ (qn ≃ 0 ∨ rd ≃ 0)›
State after:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝⁷ : Decidable (qd ≃ 0)
h✝ : qd ≃ 0
this✝⁶ : pn * qd ≃ qn * pd
this✝⁵ : qn * rd ≃ rn * qd
this✝⁴ : qn * pd ≃ 0
this✝³ : qn * rd ≃ 0
this✝² : qn ≃ 0 ∨ pd ≃ 0
this✝¹ : qn ≃ 0 ∨ rd ≃ 0
this✝ : (qn ≃ 0 ∨ pd ≃ 0) ∧ (qn ≃ 0 ∨ rd ≃ 0)
this : qn ≃ 0 ∨ pd ≃ 0 ∧ rd ≃ 0
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝⁷ : Decidable (qd ≃ 0)
h✝ : qd ≃ 0
this✝⁶ : pn * qd ≃ qn * pd
this✝⁵ : qn * rd ≃ rn * qd
this✝⁴ : qn * pd ≃ 0
this✝³ : qn * rd ≃ 0
this✝² : qn ≃ 0 ∨ pd ≃ 0
this✝¹ : qn ≃ 0 ∨ rd ≃ 0
this✝ : (qn ≃ 0 ∨ pd ≃ 0) ∧ (qn ≃ 0 ∨ rd ≃ 0)
this : qn ≃ 0 ∨ pd ≃ 0 ∧ rd ≃ 0
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)
Tactic:
match ‹qn ≃ 0 ∨ (pd ≃ 0 ∧ rd ≃ 0)› with
| Or.inl (_ : qn ≃ 0) =>
  have : qn ≃ 0 ∧ qd ≃ 0 := And.intro ‹qn ≃ 0› ‹qd ≃ 0›
  have : (qn, qd) ≃ (0, 0) :=
    Relation.Equivalence.Impl.Prod.eqv_defn.mpr ‹qn ≃ 0 ∧ qd ≃ 0›
  exact Or.inr ‹(qn, qd) ≃ (0, 0)›
| Or.inr (And.intro (_ : pd ≃ 0) (_ : rd ≃ 0)) =>
  have : pn * rd ≃ rn * pd := calc
    pn * rd ≃ _ := AA.substR ‹rd ≃ 0›
    pn * 0  ≃ _ := AA.absorbR
    0       ≃ _ := Rel.symm AA.absorbR
    rn * 0  ≃ _ := AA.substR (Rel.symm ‹pd ≃ 0›)
    rn * pd ≃ _ := Rel.refl
  exact Or.inl ‹pn * rd ≃ rn * pd›
State after:
no goals

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝⁷ : Decidable (qd ≃ 0)
h✝¹ : qd ≃ 0
this✝⁶ : pn * qd ≃ qn * pd
this✝⁵ : qn * rd ≃ rn * qd
this✝⁴ : qn * pd ≃ 0
this✝³ : qn * rd ≃ 0
this✝² : qn ≃ 0 ∨ pd ≃ 0
this✝¹ : qn ≃ 0 ∨ rd ≃ 0
this✝ : (qn ≃ 0 ∨ pd ≃ 0) ∧ (qn ≃ 0 ∨ rd ≃ 0)
this : qn ≃ 0 ∨ pd ≃ 0 ∧ rd ≃ 0
h✝ : qn ≃ 0
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)
Tactic:
have : qn ≃ 0 ∧ qd ≃ 0 := And.intro ‹qn ≃ 0› ‹qd ≃ 0›
State after:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝⁸ : Decidable (qd ≃ 0)
h✝¹ : qd ≃ 0
this✝⁷ : pn * qd ≃ qn * pd
this✝⁶ : qn * rd ≃ rn * qd
this✝⁵ : qn * pd ≃ 0
this✝⁴ : qn * rd ≃ 0
this✝³ : qn ≃ 0 ∨ pd ≃ 0
this✝² : qn ≃ 0 ∨ rd ≃ 0
this✝¹ : (qn ≃ 0 ∨ pd ≃ 0) ∧ (qn ≃ 0 ∨ rd ≃ 0)
this✝ : qn ≃ 0 ∨ pd ≃ 0 ∧ rd ≃ 0
h✝ : qn ≃ 0
this : qn ≃ 0 ∧ qd ≃ 0
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝⁸ : Decidable (qd ≃ 0)
h✝¹ : qd ≃ 0
this✝⁷ : pn * qd ≃ qn * pd
this✝⁶ : qn * rd ≃ rn * qd
this✝⁵ : qn * pd ≃ 0
this✝⁴ : qn * rd ≃ 0
this✝³ : qn ≃ 0 ∨ pd ≃ 0
this✝² : qn ≃ 0 ∨ rd ≃ 0
this✝¹ : (qn ≃ 0 ∨ pd ≃ 0) ∧ (qn ≃ 0 ∨ rd ≃ 0)
this✝ : qn ≃ 0 ∨ pd ≃ 0 ∧ rd ≃ 0
h✝ : qn ≃ 0
this : qn ≃ 0 ∧ qd ≃ 0
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)
Tactic:
have : (qn, qd) ≃ (0, 0) :=
  Relation.Equivalence.Impl.Prod.eqv_defn.mpr ‹qn ≃ 0 ∧ qd ≃ 0›
State after:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝⁹ : Decidable (qd ≃ 0)
h✝¹ : qd ≃ 0
this✝⁸ : pn * qd ≃ qn * pd
this✝⁷ : qn * rd ≃ rn * qd
this✝⁶ : qn * pd ≃ 0
this✝⁵ : qn * rd ≃ 0
this✝⁴ : qn ≃ 0 ∨ pd ≃ 0
this✝³ : qn ≃ 0 ∨ rd ≃ 0
this✝² : (qn ≃ 0 ∨ pd ≃ 0) ∧ (qn ≃ 0 ∨ rd ≃ 0)
this✝¹ : qn ≃ 0 ∨ pd ≃ 0 ∧ rd ≃ 0
h✝ : qn ≃ 0
this✝ : qn ≃ 0 ∧ qd ≃ 0
this : (qn, qd) ≃ (0, 0)
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝⁹ : Decidable (qd ≃ 0)
h✝¹ : qd ≃ 0
this✝⁸ : pn * qd ≃ qn * pd
this✝⁷ : qn * rd ≃ rn * qd
this✝⁶ : qn * pd ≃ 0
this✝⁵ : qn * rd ≃ 0
this✝⁴ : qn ≃ 0 ∨ pd ≃ 0
this✝³ : qn ≃ 0 ∨ rd ≃ 0
this✝² : (qn ≃ 0 ∨ pd ≃ 0) ∧ (qn ≃ 0 ∨ rd ≃ 0)
this✝¹ : qn ≃ 0 ∨ pd ≃ 0 ∧ rd ≃ 0
h✝ : qn ≃ 0
this✝ : qn ≃ 0 ∧ qd ≃ 0
this : (qn, qd) ≃ (0, 0)
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)
Tactic:
exact Or.inr ‹(qn, qd) ≃ (0, 0)›
State after:
no goals

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝⁷ : Decidable (qd ≃ 0)
h✝ : qd ≃ 0
this✝⁶ : pn * qd ≃ qn * pd
this✝⁵ : qn * rd ≃ rn * qd
this✝⁴ : qn * pd ≃ 0
this✝³ : qn * rd ≃ 0
this✝² : qn ≃ 0 ∨ pd ≃ 0
this✝¹ : qn ≃ 0 ∨ rd ≃ 0
this✝ : (qn ≃ 0 ∨ pd ≃ 0) ∧ (qn ≃ 0 ∨ rd ≃ 0)
this : qn ≃ 0 ∨ pd ≃ 0 ∧ rd ≃ 0
left✝ : pd ≃ 0
right✝ : rd ≃ 0
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)
Tactic:
have : pn * rd ≃ rn * pd := calc
  pn * rd ≃ _ := AA.substR ‹rd ≃ 0›
  pn * 0  ≃ _ := AA.absorbR
  0       ≃ _ := Rel.symm AA.absorbR
  rn * 0  ≃ _ := AA.substR (Rel.symm ‹pd ≃ 0›)
  rn * pd ≃ _ := Rel.refl
State after:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝⁸ : Decidable (qd ≃ 0)
h✝ : qd ≃ 0
this✝⁷ : pn * qd ≃ qn * pd
this✝⁶ : qn * rd ≃ rn * qd
this✝⁵ : qn * pd ≃ 0
this✝⁴ : qn * rd ≃ 0
this✝³ : qn ≃ 0 ∨ pd ≃ 0
this✝² : qn ≃ 0 ∨ rd ≃ 0
this✝¹ : (qn ≃ 0 ∨ pd ≃ 0) ∧ (qn ≃ 0 ∨ rd ≃ 0)
this✝ : qn ≃ 0 ∨ pd ≃ 0 ∧ rd ≃ 0
left✝ : pd ≃ 0
right✝ : rd ≃ 0
this : pn * rd ≃ rn * pd
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝⁸ : Decidable (qd ≃ 0)
h✝ : qd ≃ 0
this✝⁷ : pn * qd ≃ qn * pd
this✝⁶ : qn * rd ≃ rn * qd
this✝⁵ : qn * pd ≃ 0
this✝⁴ : qn * rd ≃ 0
this✝³ : qn ≃ 0 ∨ pd ≃ 0
this✝² : qn ≃ 0 ∨ rd ≃ 0
this✝¹ : (qn ≃ 0 ∨ pd ≃ 0) ∧ (qn ≃ 0 ∨ rd ≃ 0)
this✝ : qn ≃ 0 ∨ pd ≃ 0 ∧ rd ≃ 0
left✝ : pd ≃ 0
right✝ : rd ≃ 0
this : pn * rd ≃ rn * pd
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)
Tactic:
exact Or.inl ‹pn * rd ≃ rn * pd›
State after:
no goals

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this : Decidable (qd ≃ 0)
h✝ : qd ≄ 0
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)
Tactic:
have : pn * rd ≃ rn * pd :=
  eqv_trans_nonzero_denom
    (q := qn//qd)
    ‹qd ≄ 0›
    ‹pn//pd ≃ qn//qd›
    ‹qn//qd ≃ rn//rd›
State after:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝ : Decidable (qd ≃ 0)
h✝ : qd ≄ 0
this : pn * rd ≃ rn * pd
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)

State before:
ℕ : Type
inst✝¹ : Natural ℕ
ℤ : Type
inst✝ : Integer ℤ
pn pd qn qd rn rd : ℤ
x✝¹ : pn//pd ≃ qn//qd
x✝ : qn//qd ≃ rn//rd
this✝ : Decidable (qd ≃ 0)
h✝ : qd ≄ 0
this : pn * rd ≃ rn * pd
⊢ pn * rd ≃ rn * pd ∨ (qn, qd) ≃ (0, 0)
Tactic:
exact Or.inl ‹pn * rd ≃ rn * pd›
State after:
no goals