Module: Mathlib.Data.Nat.Fib.Basic

Goal state before:
pp: n : ℕ
⊢ (if false = true then
      ((binaryRec (fib 0, fib 1)
                (fun b x p ↦
                  if b = true then (p.2 ^ 2 + p.1 ^ 2, p.2 * (2 * p.1 + p.2))
                  else (p.1 * (2 * p.2 - p.1), p.2 ^ 2 + p.1 ^ 2))
                n).2 ^
            2 +
          (binaryRec (fib 0, fib 1)
                (fun b x p ↦
                  if b = true then (p.2 ^ 2 + p.1 ^ 2, p.2 * (2 * p.1 + p.2))
                  else (p.1 * (2 * p.2 - p.1), p.2 ^ 2 + p.1 ^ 2))
                n).1 ^
            2,
        (binaryRec (fib 0, fib 1)
              (fun b x p ↦
                if b = true then (p.2 ^ 2 + p.1 ^ 2, p.2 * (2 * p.1 + p.2))
                else (p.1 * (2 * p.2 - p.1), p.2 ^ 2 + p.1 ^ 2))
              n).2 *
          (2 *
              (binaryRec (fib 0, fib 1)
                  (fun b x p ↦
                    if b = true then (p.2 ^ 2 + p.1 ^ 2, p.2 * (2 * p.1 + p.2))
                    else (p.1 * (2 * p.2 - p.1), p.2 ^ 2 + p.1 ^ 2))
                  n).1 +
            (binaryRec (fib 0, fib 1)
                (fun b x p ↦
                  if b = true then (p.2 ^ 2 + p.1 ^ 2, p.2 * (2 * p.1 + p.2))
                  else (p.1 * (2 * p.2 - p.1), p.2 ^ 2 + p.1 ^ 2))
                n).2))
    else
      ((binaryRec (fib 0, fib 1)
              (fun b x p ↦
                if b = true then (p.2 ^ 2 + p.1 ^ 2, p.2 * (2 * p.1 + p.2))
                else (p.1 * (2 * p.2 - p.1), p.2 ^ 2 + p.1 ^ 2))
              n).1 *
          (2 *
              (binaryRec (fib 0, fib 1)
                  (fun b x p ↦
                    if b = true then (p.2 ^ 2 + p.1 ^ 2, p.2 * (2 * p.1 + p.2))
                    else (p.1 * (2 * p.2 - p.1), p.2 ^ 2 + p.1 ^ 2))
                  n).2 -
            (binaryRec (fib 0, fib 1)
                (fun b x p ↦
                  if b = true then (p.2 ^ 2 + p.1 ^ 2, p.2 * (2 * p.1 + p.2))
                  else (p.1 * (2 * p.2 - p.1), p.2 ^ 2 + p.1 ^ 2))
                n).1),
        (binaryRec (fib 0, fib 1)
                (fun b x p ↦
                  if b = true then (p.2 ^ 2 + p.1 ^ 2, p.2 * (2 * p.1 + p.2))
                  else (p.1 * (2 * p.2 - p.1), p.2 ^ 2 + p.1 ^ 2))
                n).2 ^
            2 +
          (binaryRec (fib 0, fib 1)
                (fun b x p ↦
                  if b = true then (p.2 ^ 2 + p.1 ^ 2, p.2 * (2 * p.1 + p.2))
                  else (p.1 * (2 * p.2 - p.1), p.2 ^ 2 + p.1 ^ 2))
                n).1 ^
            2)) =
    let p := n.fastFibAux;
    (p.1 * (2 * p.2 - p.1), p.2 ^ 2 + p.1 ^ 2)

pp: case h
n : ℕ
⊢ (if false = true then
        ((fib 0, fib 1).2 ^ 2 + (fib 0, fib 1).1 ^ 2, (fib 0, fib 1).2 * (2 * (fib 0, fib 1).1 + (fib 0, fib 1).2))
      else
        ((fib 0, fib 1).1 * (2 * (fib 0, fib 1).2 - (fib 0, fib 1).1), (fib 0, fib 1).2 ^ 2 + (fib 0, fib 1).1 ^ 2)) =
      (fib 0, fib 1) ∨
    (n = 0 → false = true)

Tactic:
]

Goal state after:
n : ℕ
⊢ (if false = true then
      ((binaryRec (fib 0, fib 1)
                (fun b x p ↦
                  if b = true then (p.2 ^ 2 + p.1 ^ 2, p.2 * (2 * p.1 + p.2))
                  else (p.1 * (2 * p.2 - p.1), p.2 ^ 2 + p.1 ^ 2))
                n).2 ^
            2 +
          (binaryRec (fib 0, fib 1)
                (fun b x p ↦
                  if b = true then (p.2 ^ 2 + p.1 ^ 2, p.2 * (2 * p.1 + p.2))
                  else (p.1 * (2 * p.2 - p.1), p.2 ^ 2 + p.1 ^ 2))
                n).1 ^
            2,
        (binaryRec (fib 0, fib 1)
              (fun b x p ↦
                if b = true then (p.2 ^ 2 + p.1 ^ 2, p.2 * (2 * p.1 + p.2))
                else (p.1 * (2 * p.2 - p.1), p.2 ^ 2 + p.1 ^ 2))
              n).2 *
          (2 *
              (binaryRec (fib 0, fib 1)
                  (fun b x p ↦
                    if b = true then (p.2 ^ 2 + p.1 ^ 2, p.2 * (2 * p.1 + p.2))
                    else (p.1 * (2 * p.2 - p.1), p.2 ^ 2 + p.1 ^ 2))
                  n).1 +
            (binaryRec (fib 0, fib 1)
                (fun b x p ↦
                  if b = true then (p.2 ^ 2 + p.1 ^ 2, p.2 * (2 * p.1 + p.2))
                  else (p.1 * (2 * p.2 - p.1), p.2 ^ 2 + p.1 ^ 2))
                n).2))
    else
      ((binaryRec (fib 0, fib 1)
              (fun b x p ↦
                if b = true then (p.2 ^ 2 + p.1 ^ 2, p.2 * (2 * p.1 + p.2))
                else (p.1 * (2 * p.2 - p.1), p.2 ^ 2 + p.1 ^ 2))
              n).1 *
          (2 *
              (binaryRec (fib 0, fib 1)
                  (fun b x p ↦
                    if b = true then (p.2 ^ 2 + p.1 ^ 2, p.2 * (2 * p.1 + p.2))
                    else (p.1 * (2 * p.2 - p.1), p.2 ^ 2 + p.1 ^ 2))
                  n).2 -
            (binaryRec (fib 0, fib 1)
                (fun b x p ↦
                  if b = true then (p.2 ^ 2 + p.1 ^ 2, p.2 * (2 * p.1 + p.2))
                  else (p.1 * (2 * p.2 - p.1), p.2 ^ 2 + p.1 ^ 2))
                n).1),
        (binaryRec (fib 0, fib 1)
                (fun b x p ↦
                  if b = true then (p.2 ^ 2 + p.1 ^ 2, p.2 * (2 * p.1 + p.2))
                  else (p.1 * (2 * p.2 - p.1), p.2 ^ 2 + p.1 ^ 2))
                n).2 ^
            2 +
          (binaryRec (fib 0, fib 1)
                (fun b x p ↦
                  if b = true then (p.2 ^ 2 + p.1 ^ 2, p.2 * (2 * p.1 + p.2))
                  else (p.1 * (2 * p.2 - p.1), p.2 ^ 2 + p.1 ^ 2))
                n).1 ^
            2)) =
    let p := n.fastFibAux;
    (p.1 * (2 * p.2 - p.1), p.2 ^ 2 + p.1 ^ 2)

case h
n : ℕ
⊢ (if false = true then
        ((fib 0, fib 1).2 ^ 2 + (fib 0, fib 1).1 ^ 2, (fib 0, fib 1).2 * (2 * (fib 0, fib 1).1 + (fib 0, fib 1).2))
      else
        ((fib 0, fib 1).1 * (2 * (fib 0, fib 1).2 - (fib 0, fib 1).1), (fib 0, fib 1).2 ^ 2 + (fib 0, fib 1).1 ^ 2)) =
      (fib 0, fib 1) ∨
    (n = 0 → false = true)