case none
K : Type u_1
n : ℕ
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
s_succ_nth_eq : Stream'.Seq.get? s (n + 1) = none
⊢ convergents'Aux s (n + 2) = convergents'Aux (squashSeq s n) (n + 1)

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 : Stream'.Seq.get? s (n + 1) = some gp_succ_n
⊢ convergents'Aux s (n + 2) = convergents'Aux (squashSeq s n) (n + 1)
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)
cases' s_succ_nth_eq : s.get? <| n + 1 with gp_succ_n
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 : Stream'.Seq.get? s (n + 1) = some gp_succ_n
⊢ convergents'Aux s (n + 2) = convergents'Aux (squashSeq s n) (n + 1)
case none
K : Type u_1
n : ℕ
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
s_succ_nth_eq : Stream'.Seq.get? s (n + 1) = none
⊢ convergents'Aux s (n + 2) = convergents'Aux (squashSeq s n) (n + 1)

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 : Stream'.Seq.get? s (n + 1) = some gp_succ_n
⊢ convergents'Aux s (n + 2) = convergents'Aux (squashSeq s n) (n + 1)
case none =>
  rw [squashSeq_eq_self_of_terminated s_succ_nth_eq,
    convergents'Aux_stable_step_of_terminated s_succ_nth_eq]
no goals
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 : Stream'.Seq.get? s (n + 1) = some gp_succ_n
⊢ convergents'Aux s (n + 2) = convergents'Aux (squashSeq s n) (n + 1)
case some =>
  induction' n with m IH generalizing s gp_succ_n
  case zero =>
    obtain ⟨gp_head, s_head_eq⟩ : ∃ gp_head, s.head = some gp_head
    exact 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]
  case succ =>
    obtain ⟨gp_head, s_head_eq⟩ : ∃ gp_head, s.head = some gp_head
    exact 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]
no goals
K : Type u_1
n : ℕ
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
s_succ_nth_eq : Stream'.Seq.get? s (n + 1) = none
⊢ convergents'Aux s (n + 2) = convergents'Aux (squashSeq s n) (n + 1)
rw [squashSeq_eq_self_of_terminated s_succ_nth_eq,
  convergents'Aux_stable_step_of_terminated s_succ_nth_eq]
case zero
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : Stream'.Seq.get? s (Nat.zero + 1) = some gp_succ_n
⊢ convergents'Aux s (Nat.zero + 2) = convergents'Aux (squashSeq s Nat.zero) (Nat.zero + 1)

case succ
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    Stream'.Seq.get? s (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 : Stream'.Seq.get? s (Nat.succ m + 1) = some gp_succ_n
⊢ convergents'Aux s (Nat.succ m + 2) = convergents'Aux (squashSeq s (Nat.succ m)) (Nat.succ m + 1)
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 : Stream'.Seq.get? s (n + 1) = some gp_succ_n
⊢ convergents'Aux s (n + 2) = convergents'Aux (squashSeq s n) (n + 1)
induction' n with m IH generalizing s gp_succ_n
case succ
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    Stream'.Seq.get? s (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 : Stream'.Seq.get? s (Nat.succ m + 1) = some gp_succ_n
⊢ convergents'Aux s (Nat.succ m + 2) = convergents'Aux (squashSeq s (Nat.succ m)) (Nat.succ m + 1)
case zero
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : Stream'.Seq.get? s (Nat.zero + 1) = some gp_succ_n
⊢ convergents'Aux s (Nat.zero + 2) = convergents'Aux (squashSeq s Nat.zero) (Nat.zero + 1)

case succ
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    Stream'.Seq.get? s (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 : Stream'.Seq.get? s (Nat.succ m + 1) = some gp_succ_n
⊢ convergents'Aux s (Nat.succ m + 2) = convergents'Aux (squashSeq s (Nat.succ m)) (Nat.succ m + 1)
case zero =>
  obtain ⟨gp_head, s_head_eq⟩ : ∃ gp_head, s.head = some gp_head
  exact 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]
no goals
case succ
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    Stream'.Seq.get? s (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 : Stream'.Seq.get? s (Nat.succ m + 1) = some gp_succ_n
⊢ convergents'Aux s (Nat.succ m + 2) = convergents'Aux (squashSeq s (Nat.succ m)) (Nat.succ m + 1)
case succ =>
  obtain ⟨gp_head, s_head_eq⟩ : ∃ gp_head, s.head = some gp_head
  exact 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]
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : Stream'.Seq.get? s (Nat.zero + 1) = some gp_succ_n
⊢ ∃ gp_head, Stream'.Seq.head s = some gp_head

case intro
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : Stream'.Seq.get? s (Nat.zero + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : Stream'.Seq.head s = some gp_head
⊢ convergents'Aux s (Nat.zero + 2) = convergents'Aux (squashSeq s Nat.zero) (Nat.zero + 1)
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : Stream'.Seq.get? s (Nat.zero + 1) = some gp_succ_n
⊢ convergents'Aux s (Nat.zero + 2) = convergents'Aux (squashSeq s Nat.zero) (Nat.zero + 1)
obtain ⟨gp_head, s_head_eq⟩ : ∃ gp_head, s.head = some gp_head
case intro
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : Stream'.Seq.get? s (Nat.zero + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : Stream'.Seq.head s = some gp_head
⊢ convergents'Aux s (Nat.zero + 2) = convergents'Aux (squashSeq s Nat.zero) (Nat.zero + 1)
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : Stream'.Seq.get? s (Nat.zero + 1) = some gp_succ_n
⊢ ∃ gp_head, Stream'.Seq.head s = some gp_head

case intro
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : Stream'.Seq.get? s (Nat.zero + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : Stream'.Seq.head s = some gp_head
⊢ convergents'Aux s (Nat.zero + 2) = convergents'Aux (squashSeq s Nat.zero) (Nat.zero + 1)
exact s.ge_stable zero_le_one s_succ_nth_eq
case intro
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : Stream'.Seq.get? s (Nat.zero + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : Stream'.Seq.head s = some gp_head
this : Stream'.Seq.head (squashSeq s 0) = some { a := gp_head.a, b := gp_head.b + gp_succ_n.a / gp_succ_n.b }
⊢ convergents'Aux s (Nat.zero + 2) = convergents'Aux (squashSeq s Nat.zero) (Nat.zero + 1)
case intro
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : Stream'.Seq.get? s (Nat.zero + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : Stream'.Seq.head s = some gp_head
⊢ convergents'Aux s (Nat.zero + 2) = convergents'Aux (squashSeq s Nat.zero) (Nat.zero + 1)
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
no goals
case intro
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
s : Stream'.Seq (Pair K)
gp_succ_n : Pair K
s_succ_nth_eq : Stream'.Seq.get? s (Nat.zero + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : Stream'.Seq.head s = some gp_head
this : Stream'.Seq.head (squashSeq s 0) = some { a := gp_head.a, b := gp_head.b + gp_succ_n.a / gp_succ_n.b }
⊢ convergents'Aux s (Nat.zero + 2) = convergents'Aux (squashSeq s Nat.zero) (Nat.zero + 1)
simp_all [convergents'Aux, Stream'.Seq.head, Stream'.Seq.get?_tail]
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    Stream'.Seq.get? s (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 : Stream'.Seq.get? s (Nat.succ m + 1) = some gp_succ_n
⊢ ∃ gp_head, Stream'.Seq.head s = some gp_head

case intro
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    Stream'.Seq.get? s (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 : Stream'.Seq.get? s (Nat.succ m + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : Stream'.Seq.head s = some gp_head
⊢ convergents'Aux s (Nat.succ m + 2) = convergents'Aux (squashSeq s (Nat.succ m)) (Nat.succ m + 1)
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    Stream'.Seq.get? s (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 : Stream'.Seq.get? s (Nat.succ m + 1) = some gp_succ_n
⊢ convergents'Aux s (Nat.succ m + 2) = convergents'Aux (squashSeq s (Nat.succ m)) (Nat.succ m + 1)
obtain ⟨gp_head, s_head_eq⟩ : ∃ gp_head, s.head = some gp_head
case intro
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    Stream'.Seq.get? s (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 : Stream'.Seq.get? s (Nat.succ m + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : Stream'.Seq.head s = some gp_head
⊢ convergents'Aux s (Nat.succ m + 2) = convergents'Aux (squashSeq s (Nat.succ m)) (Nat.succ m + 1)
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    Stream'.Seq.get? s (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 : Stream'.Seq.get? s (Nat.succ m + 1) = some gp_succ_n
⊢ ∃ gp_head, Stream'.Seq.head s = some gp_head

case intro
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    Stream'.Seq.get? s (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 : Stream'.Seq.get? s (Nat.succ m + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : Stream'.Seq.head s = some gp_head
⊢ convergents'Aux s (Nat.succ m + 2) = convergents'Aux (squashSeq s (Nat.succ m)) (Nat.succ m + 1)
exact s.ge_stable (m + 2).zero_le s_succ_nth_eq
case intro
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    Stream'.Seq.get? s (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 : Stream'.Seq.get? s (Nat.succ m + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : Stream'.Seq.head s = some gp_head
⊢ gp_head.a / (gp_head.b + convergents'Aux (Stream'.Seq.tail s) (m + 2)) = convergents'Aux (squashSeq s (m + 1)) (m + 2)
case intro
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    Stream'.Seq.get? s (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 : Stream'.Seq.get? s (Nat.succ m + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : Stream'.Seq.head s = some gp_head
⊢ convergents'Aux s (Nat.succ m + 2) = convergents'Aux (squashSeq s (Nat.succ m)) (Nat.succ m + 1)
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]
case intro
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    Stream'.Seq.get? s (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 : Stream'.Seq.get? s (Nat.succ m + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : Stream'.Seq.head s = some gp_head
this : convergents'Aux (Stream'.Seq.tail s) (m + 2) = convergents'Aux (squashSeq (Stream'.Seq.tail s) m) (m + 1)
⊢ gp_head.a / (gp_head.b + convergents'Aux (Stream'.Seq.tail s) (m + 2)) = convergents'Aux (squashSeq s (m + 1)) (m + 2)
case intro
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    Stream'.Seq.get? s (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 : Stream'.Seq.get? s (Nat.succ m + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : Stream'.Seq.head s = some gp_head
⊢ gp_head.a / (gp_head.b + convergents'Aux (Stream'.Seq.tail s) (m + 2)) = convergents'Aux (squashSeq s (m + 1)) (m + 2)
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
case intro
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    Stream'.Seq.get? s (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 : Stream'.Seq.get? s (Nat.succ m + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : Stream'.Seq.head s = some gp_head
this✝ : convergents'Aux (Stream'.Seq.tail s) (m + 2) = convergents'Aux (squashSeq (Stream'.Seq.tail s) m) (m + 1)
this : Stream'.Seq.head (squashSeq s (m + 1)) = some gp_head
⊢ gp_head.a / (gp_head.b + convergents'Aux (Stream'.Seq.tail s) (m + 2)) = convergents'Aux (squashSeq s (m + 1)) (m + 2)
case intro
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    Stream'.Seq.get? s (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 : Stream'.Seq.get? s (Nat.succ m + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : Stream'.Seq.head s = some gp_head
this : convergents'Aux (Stream'.Seq.tail s) (m + 2) = convergents'Aux (squashSeq (Stream'.Seq.tail s) m) (m + 1)
⊢ gp_head.a / (gp_head.b + convergents'Aux (Stream'.Seq.tail s) (m + 2)) = convergents'Aux (squashSeq s (m + 1)) (m + 2)
have : (squashSeq s (m + 1)).head = some gp_head :=
  (squashSeq_nth_of_lt m.succ_pos).trans s_head_eq
no goals
case intro
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    Stream'.Seq.get? s (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 : Stream'.Seq.get? s (Nat.succ m + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : Stream'.Seq.head s = some gp_head
this✝ : convergents'Aux (Stream'.Seq.tail s) (m + 2) = convergents'Aux (squashSeq (Stream'.Seq.tail s) m) (m + 1)
this : Stream'.Seq.head (squashSeq s (m + 1)) = some gp_head
⊢ gp_head.a / (gp_head.b + convergents'Aux (Stream'.Seq.tail s) (m + 2)) = convergents'Aux (squashSeq s (m + 1)) (m + 2)
simp_all [convergents'Aux, squashSeq_succ_n_tail_eq_squashSeq_tail_n]
no goals
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    Stream'.Seq.get? s (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 : Stream'.Seq.get? s (Nat.succ m + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : Stream'.Seq.head s = some gp_head
this :
  gp_head.a / (gp_head.b + convergents'Aux (Stream'.Seq.tail s) (m + 2)) = convergents'Aux (squashSeq s (m + 1)) (m + 2)
⊢ convergents'Aux s (Nat.succ m + 2) = convergents'Aux (squashSeq s (Nat.succ m)) (Nat.succ m + 1)
simpa only [convergents'Aux, s_head_eq]
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    Stream'.Seq.get? s (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 : Stream'.Seq.get? s (Nat.succ m + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : Stream'.Seq.head s = some gp_head
⊢ Stream'.Seq.get? (Stream'.Seq.tail s) (m + 1) = some gp_succ_n
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    Stream'.Seq.get? s (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 : Stream'.Seq.get? s (Nat.succ m + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : Stream'.Seq.head s = some gp_head
⊢ convergents'Aux (Stream'.Seq.tail s) (m + 2) = convergents'Aux (squashSeq (Stream'.Seq.tail s) m) (m + 1)
refine' IH gp_succ_n _
no goals
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✝ : Stream'.Seq.get? s✝ (n + 1) = some gp_succ_n✝
m : ℕ
IH :
  ∀ {s : Stream'.Seq (Pair K)} (gp_succ_n : Pair K),
    Stream'.Seq.get? s (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 : Stream'.Seq.get? s (Nat.succ m + 1) = some gp_succ_n
gp_head : Pair K
s_head_eq : Stream'.Seq.head s = some gp_head
⊢ Stream'.Seq.get? (Stream'.Seq.tail s) (m + 1) = some gp_succ_n
simpa [Stream'.Seq.get?_tail] using s_succ_nth_eq