-- Library Import: Basic facts about real numbers and the root function
import Mathlib.Data.Real.Sqrt
open Real

-- In the following, x and y are real numbers
variable {x : ℝ} {y : ℝ}

-- Definition: Function (f : ℝ → ℝ) is continuous at (x₀ : ℝ)
def continuous (f : ℝ → ℝ) (x₀ : ℝ) :=
  ∀ ε > 0, ∃ δ > 0, ∀ x, |x - x₀| < δ → |f x - f x₀| < ε

-- Definition: The square function
def squareFct : ℝ → ℝ := fun x ↦ x ^ 2


-- Reminder: Three facts from the library that we will use.
example : 0 < x → 0 < √x := sqrt_pos.2

example : x ^ 2 < y  ↔  (-√y < x) ∧ (x < √y) := sq_lt

example : |x| < y  ↔  -y < x ∧ x < y := abs_lt


-- Theorem: The square function is continuous at x₀ = 0
theorem ContinuousAt_sq :
    continuous squareFct 0 := by

  unfold continuous

  intro ε hε
  use √ε

  constructor
  · apply sqrt_pos.2
    exact hε
  · intro x hx
    simp_all [squareFct]
    apply sq_lt.2
    exact abs_lt.1 hx
