コンテンツにスキップ

距離空間での読み替え

距離空間や擬距離空間では,dist x y,開球 Metric.ball x ε,閉球 Metric.closedBall x ε などを使います. 距離空間は位相空間構造を誘導するため,距離の話から IsOpen や Continuous の話へ移れます. また ContinuousAt のフィルターによる定義は,距離空間では通常の ε-δ 条件と同値になります.

#check PseudoMetricSpace
#check Metric.ball
#check Metric.closedBall
#check dist
#check Metric.continuousAt_iff

section MetricSpaces

open Metric

variable {X : Type*} [PseudoMetricSpace X]

example (x : X) : dist x x = 0 := by
  simp

example (x y : X) : 0 ≤ dist x y := by
  exact dist_nonneg

example (x : X) (ε : ℝ) (hε : 0 < ε) : x ∈ Metric.ball x ε := by
  simpa [Metric.mem_ball] using hε

example (x : X) (ε : ℝ) : IsOpen (Metric.ball x ε) := by
  exact Metric.isOpen_ball

end MetricSpaces

section MetricContinuity

example {f : ℝ → ℝ} {a : ℝ} :
    ContinuousAt f a ↔ ∀ ε > 0, ∃ δ > 0, ∀ ⦃x : ℝ⦄,
      dist x a < δ → dist (f x) (f a) < ε := by
  exact Metric.continuousAt_iff

example : ∀ ε > 0, ∃ δ > 0, ∀ ⦃x : ℝ⦄,
    dist x 3 < δ → dist (x + 1) ((3 : ℝ) + 1) < ε := by
  have h : ContinuousAt (fun y : ℝ => y + 1) (3 : ℝ) := by
    exact (continuousAt_id : ContinuousAt (fun y : ℝ => y) 3).add continuousAt_const
  exact Metric.continuousAt_iff.mp h

end MetricContinuity

Metric.ball x ε は集合です. したがって x ∈ Metric.ball x ε や IsOpen (Metric.ball x ε) のように,集合に関する命題として扱えます.

Metric.continuousAt_iff を使うと,具体的な関数の連続性から ε-δ 条件を取り出せます. 上の例は \(x \mapsto x+1\) が \(x=3\) で連続であることを, 距離による条件として読み替えています.

ここに現れる ∀ ⦃x : ℝ⦄, ... の ⦃x : ℝ⦄ は strict implicit binder です. x 自体は普通の実数の点ですが,定理を使うときには明示的に渡さず, 後続の仮定 dist x a < δ などから Lean が推論します. たとえば h : ∀ ⦃x : ℝ⦄, dist x a < δ → ... があるとき, h hx のように書くと,hx の型から x が推論されます. 構文としては {{x : ℝ}} と入力でき,表示上は ⦃x : ℝ⦄ になります. 括弧の種類の一般的な説明は基礎編 Chapter 02 の variable と引数の節で扱いました.

演習問題

  1. 距離空間で,開球が開集合であることをもう一度証明してください.

    example {X : Type*} [PseudoMetricSpace X] (x : X) (r : ℝ) :
        IsOpen (Metric.ball x r) := by
      -- `Metric.isOpen_ball`.
      -- 解答例: exact Metric.isOpen_ball
      sorry
    
  2. 距離空間で,ContinuousAt が ε-δ 条件と同値であることを確認してください.

    example {f : ℝ → ℝ} {a : ℝ} :
        ContinuousAt f a ↔ ∀ ε > 0, ∃ δ > 0, ∀ ⦃x : ℝ⦄,
          dist x a < δ → dist (f x) (f a) < ε := by
      -- ヒント: `exact Metric.continuousAt_iff`
      -- 解答例: exact Metric.continuousAt_iff
      sorry