Theorem: GeneralizedContinuedFraction.succ_succ_nth_convergent'_aux_eq_succ_nth_convergent'_aux_squashSeq
File: Mathlib/Algebra/ContinuedFractions/ConvergentsEquiv.lean

tactic: cases s_succ_nth_eq : s.get? <| n + 1 with
| none =>
  rw [squashSeq_eq_self_of_terminated s_succ_nth_eq,
    convergents'Aux_stable_step_of_terminated s_succ_nth_eq]
| some gp_succ_n =>
  induction n generalizing s gp_succ_n with
  | zero =>
    obtain ⟨gp_head, s_head_eq⟩ : ∃ gp_head, s.head = some gp_head :=
      s.ge_stable zero_le_one s_succ_nth_eq
    have : (squashSeq s 0).head = some ⟨gp_head.a, gp_head.b + gp_succ_n.a / gp_succ_n.b⟩ :=
      squashSeq_nth_of_not_terminated s_head_eq s_succ_nth_eq
    simp_all [convergents'Aux, Stream'.Seq.head, Stream'.Seq.get?_tail]
  | succ m IH =>
    obtain ⟨gp_head, s_head_eq⟩ : ∃ gp_head, s.head = some gp_head :=
      s.ge_stable (m + 2).zero_le s_succ_nth_eq
    suffices
      gp_head.a / (gp_head.b + convergents'Aux s.tail (m + 2)) =
        convergents'Aux (squashSeq s (m + 1)) (m + 2)
      by simpa only [convergents'Aux, s_head_eq]
    have : convergents'Aux s.tail (m + 2) = convergents'Aux (squashSeq s.tail m) (m + 1) := by
      refine IH gp_succ_n ?_
      simpa [Stream'.Seq.get?_tail] using s_succ_nth_eq
    have : (squashSeq s (m + 1)).head = some gp_head :=
      (squashSeq_nth_of_lt m.succ_pos).trans s_head_eq
    simp_all [convergents'Aux, squashSeq_succ_n_tail_eq_squashSeq_tail_n]
state_before: K : Type u_1
n : ℕ
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
⊢ convergents'Aux s (n + 2) = convergents'Aux (squashSeq s n) (n + 1)
state_after: no goals

tactic: rw [squashSeq_eq_self_of_terminated s_succ_nth_eq,
  convergents'Aux_stable_step_of_terminated s_succ_nth_eq]
state_before: case none
K : Type u_1
n : ℕ
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
s_succ_nth_eq : s.get? (n + 1) = none
⊢ convergents'Aux s (n + 2) = convergents'Aux (squashSeq s n) (n + 1)
state_after: no goals

tactic: induction n generalizing s gp_succ_n with
| zero =>
  obtain ⟨gp_head, s_head_eq⟩ : ∃ gp_head, s.head = some gp_head :=
    s.ge_stable zero_le_one s_succ_nth_eq
  have : (squashSeq s 0).head = some ⟨gp_head.a, gp_head.b + gp_succ_n.a / gp_succ_n.b⟩ :=
    squashSeq_nth_of_not_terminated s_head_eq s_succ_nth_eq
  simp_all [convergents'Aux, Stream'.Seq.head, Stream'.Seq.get?_tail]
| succ m IH =>
  obtain ⟨gp_head, s_head_eq⟩ : ∃ gp_head, s.head = some gp_head :=
    s.ge_stable (m + 2).zero_le s_succ_nth_eq
  suffices
    gp_head.a / (gp_head.b + convergents'Aux s.tail (m + 2)) =
      convergents'Aux (squashSeq s (m + 1)) (m + 2)
    by simpa only [convergents'Aux, s_head_eq]
  have : convergents'Aux s.tail (m + 2) = convergents'Aux (squashSeq s.tail m) (m + 1) := by
    refine IH gp_succ_n ?_
    simpa [Stream'.Seq.get?_tail] using s_succ_nth_eq
  have : (squashSeq s (m + 1)).head = some gp_head :=
    (squashSeq_nth_of_lt m.succ_pos).trans s_head_eq
  simp_all [convergents'Aux, squashSeq_succ_n_tail_eq_squashSeq_tail_n]
state_before: case some
K : Type u_1
n : ℕ
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
gp_succ_n : Pair K
s_succ_nth_eq : s.get? (n + 1) = some gp_succ_n
⊢ convergents'Aux s (n + 2) = convergents'Aux (squashSeq s n) (n + 1)
state_after: no goals

tactic: obtain ⟨gp_head, s_head_eq⟩ : ∃ gp_head, s.head = some gp_head :=
  s.ge_stable zero_le_one s_succ_nth_eq
state_before: case some.zero
K : Type u_1
g : GeneralizedContinuedFraction K
inst✝ : DivisionRing K
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : s.get? (0 + 1) = some gp_succ_n
⊢ convergents'Aux s (0 + 2) = convergents'Aux (squashSeq s 0) (0 + 1)
state_after: case some.zero.intro
K : Type u_1
g : GeneralizedContinuedFraction K
inst✝ : DivisionRing K
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : s.get? (0 + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : s.head = some gp_head
⊢ convergents'Aux s (0 + 2) = convergents'Aux (squashSeq s 0) (0 + 1)

tactic: have : (squashSeq s 0).head = some ⟨gp_head.a, gp_head.b + gp_succ_n.a / gp_succ_n.b⟩ :=
  squashSeq_nth_of_not_terminated s_head_eq s_succ_nth_eq
state_before: case some.zero.intro
K : Type u_1
g : GeneralizedContinuedFraction K
inst✝ : DivisionRing K
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : s.get? (0 + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : s.head = some gp_head
⊢ convergents'Aux s (0 + 2) = convergents'Aux (squashSeq s 0) (0 + 1)
state_after: case some.zero.intro
K : Type u_1
g : GeneralizedContinuedFraction K
inst✝ : DivisionRing K
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : s.get? (0 + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : s.head = some gp_head
this : (squashSeq s 0).head = some { a := gp_head.a, b := gp_head.b + gp_succ_n.a / gp_succ_n.b }
⊢ convergents'Aux s (0 + 2) = convergents'Aux (squashSeq s 0) (0 + 1)

tactic: simp_all [convergents'Aux, Stream'.Seq.head, Stream'.Seq.get?_tail]
state_before: case some.zero.intro
K : Type u_1
g : GeneralizedContinuedFraction K
inst✝ : DivisionRing K
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : s.get? (0 + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : s.head = some gp_head
this : (squashSeq s 0).head = some { a := gp_head.a, b := gp_head.b + gp_succ_n.a / gp_succ_n.b }
⊢ convergents'Aux s (0 + 2) = convergents'Aux (squashSeq s 0) (0 + 1)
state_after: no goals

tactic: obtain ⟨gp_head, s_head_eq⟩ : ∃ gp_head, s.head = some gp_head :=
  s.ge_stable (m + 2).zero_le s_succ_nth_eq
state_before: case some.succ
K : Type u_1
g : GeneralizedContinuedFraction K
inst✝ : DivisionRing K
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    s.get? (m + 1) = some gp_succ_n → convergents'Aux s (m + 2) = convergents'Aux (squashSeq s m) (m + 1)
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : s.get? (m + 1 + 1) = some gp_succ_n
⊢ convergents'Aux s (m + 1 + 2) = convergents'Aux (squashSeq s (m + 1)) (m + 1 + 1)
state_after: case some.succ.intro
K : Type u_1
g : GeneralizedContinuedFraction K
inst✝ : DivisionRing K
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    s.get? (m + 1) = some gp_succ_n → convergents'Aux s (m + 2) = convergents'Aux (squashSeq s m) (m + 1)
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : s.get? (m + 1 + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : s.head = some gp_head
⊢ convergents'Aux s (m + 1 + 2) = convergents'Aux (squashSeq s (m + 1)) (m + 1 + 1)

tactic: suffices
  gp_head.a / (gp_head.b + convergents'Aux s.tail (m + 2)) =
    convergents'Aux (squashSeq s (m + 1)) (m + 2)
  by simpa only [convergents'Aux, s_head_eq]
state_before: case some.succ.intro
K : Type u_1
g : GeneralizedContinuedFraction K
inst✝ : DivisionRing K
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    s.get? (m + 1) = some gp_succ_n → convergents'Aux s (m + 2) = convergents'Aux (squashSeq s m) (m + 1)
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : s.get? (m + 1 + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : s.head = some gp_head
⊢ convergents'Aux s (m + 1 + 2) = convergents'Aux (squashSeq s (m + 1)) (m + 1 + 1)
state_after: case some.succ.intro
K : Type u_1
g : GeneralizedContinuedFraction K
inst✝ : DivisionRing K
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    s.get? (m + 1) = some gp_succ_n → convergents'Aux s (m + 2) = convergents'Aux (squashSeq s m) (m + 1)
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : s.get? (m + 1 + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : s.head = some gp_head
⊢ gp_head.a / (gp_head.b + convergents'Aux s.tail (m + 2)) = convergents'Aux (squashSeq s (m + 1)) (m + 2)

tactic: have : convergents'Aux s.tail (m + 2) = convergents'Aux (squashSeq s.tail m) (m + 1) := by
  refine IH gp_succ_n ?_
  simpa [Stream'.Seq.get?_tail] using s_succ_nth_eq
state_before: case some.succ.intro
K : Type u_1
g : GeneralizedContinuedFraction K
inst✝ : DivisionRing K
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    s.get? (m + 1) = some gp_succ_n → convergents'Aux s (m + 2) = convergents'Aux (squashSeq s m) (m + 1)
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : s.get? (m + 1 + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : s.head = some gp_head
⊢ gp_head.a / (gp_head.b + convergents'Aux s.tail (m + 2)) = convergents'Aux (squashSeq s (m + 1)) (m + 2)
state_after: case some.succ.intro
K : Type u_1
g : GeneralizedContinuedFraction K
inst✝ : DivisionRing K
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    s.get? (m + 1) = some gp_succ_n → convergents'Aux s (m + 2) = convergents'Aux (squashSeq s m) (m + 1)
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : s.get? (m + 1 + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : s.head = some gp_head
this : convergents'Aux s.tail (m + 2) = convergents'Aux (squashSeq s.tail m) (m + 1)
⊢ gp_head.a / (gp_head.b + convergents'Aux s.tail (m + 2)) = convergents'Aux (squashSeq s (m + 1)) (m + 2)

tactic: have : (squashSeq s (m + 1)).head = some gp_head :=
  (squashSeq_nth_of_lt m.succ_pos).trans s_head_eq
state_before: case some.succ.intro
K : Type u_1
g : GeneralizedContinuedFraction K
inst✝ : DivisionRing K
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    s.get? (m + 1) = some gp_succ_n → convergents'Aux s (m + 2) = convergents'Aux (squashSeq s m) (m + 1)
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : s.get? (m + 1 + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : s.head = some gp_head
this : convergents'Aux s.tail (m + 2) = convergents'Aux (squashSeq s.tail m) (m + 1)
⊢ gp_head.a / (gp_head.b + convergents'Aux s.tail (m + 2)) = convergents'Aux (squashSeq s (m + 1)) (m + 2)
state_after: case some.succ.intro
K : Type u_1
g : GeneralizedContinuedFraction K
inst✝ : DivisionRing K
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    s.get? (m + 1) = some gp_succ_n → convergents'Aux s (m + 2) = convergents'Aux (squashSeq s m) (m + 1)
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : s.get? (m + 1 + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : s.head = some gp_head
this✝ : convergents'Aux s.tail (m + 2) = convergents'Aux (squashSeq s.tail m) (m + 1)
this : (squashSeq s (m + 1)).head = some gp_head
⊢ gp_head.a / (gp_head.b + convergents'Aux s.tail (m + 2)) = convergents'Aux (squashSeq s (m + 1)) (m + 2)

tactic: simp_all [convergents'Aux, squashSeq_succ_n_tail_eq_squashSeq_tail_n]
state_before: case some.succ.intro
K : Type u_1
g : GeneralizedContinuedFraction K
inst✝ : DivisionRing K
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    s.get? (m + 1) = some gp_succ_n → convergents'Aux s (m + 2) = convergents'Aux (squashSeq s m) (m + 1)
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : s.get? (m + 1 + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : s.head = some gp_head
this✝ : convergents'Aux s.tail (m + 2) = convergents'Aux (squashSeq s.tail m) (m + 1)
this : (squashSeq s (m + 1)).head = some gp_head
⊢ gp_head.a / (gp_head.b + convergents'Aux s.tail (m + 2)) = convergents'Aux (squashSeq s (m + 1)) (m + 2)
state_after: no goals

tactic: simpa only [convergents'Aux, s_head_eq]
state_before: K : Type u_1
g : GeneralizedContinuedFraction K
inst✝ : DivisionRing K
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    s.get? (m + 1) = some gp_succ_n → convergents'Aux s (m + 2) = convergents'Aux (squashSeq s m) (m + 1)
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : s.get? (m + 1 + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : s.head = some gp_head
this : gp_head.a / (gp_head.b + convergents'Aux s.tail (m + 2)) = convergents'Aux (squashSeq s (m + 1)) (m + 2)
⊢ convergents'Aux s (m + 1 + 2) = convergents'Aux (squashSeq s (m + 1)) (m + 1 + 1)
state_after: no goals

tactic: refine IH gp_succ_n ?_
state_before: K : Type u_1
g : GeneralizedContinuedFraction K
inst✝ : DivisionRing K
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    s.get? (m + 1) = some gp_succ_n → convergents'Aux s (m + 2) = convergents'Aux (squashSeq s m) (m + 1)
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : s.get? (m + 1 + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : s.head = some gp_head
⊢ convergents'Aux s.tail (m + 2) = convergents'Aux (squashSeq s.tail m) (m + 1)
state_after: K : Type u_1
g : GeneralizedContinuedFraction K
inst✝ : DivisionRing K
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    s.get? (m + 1) = some gp_succ_n → convergents'Aux s (m + 2) = convergents'Aux (squashSeq s m) (m + 1)
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : s.get? (m + 1 + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : s.head = some gp_head
⊢ s.tail.get? (m + 1) = some gp_succ_n

tactic: simpa [Stream'.Seq.get?_tail] using s_succ_nth_eq
state_before: K : Type u_1
g : GeneralizedContinuedFraction K
inst✝ : DivisionRing K
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    s.get? (m + 1) = some gp_succ_n → convergents'Aux s (m + 2) = convergents'Aux (squashSeq s m) (m + 1)
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : s.get? (m + 1 + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : s.head = some gp_head
⊢ s.tail.get? (m + 1) = some gp_succ_n
state_after: no goals