🤙

Lean 4 でカントールの定理

2024/03/04に公開

Lean 4 を使ってカントールの定理(ある集合からそのベキ集合への全射は存在しない)を示します.

コード片をコメント付きで載せます.

import Mathlib.Tactic.Common

universe u

variable (X : Type u)
open Function

example (f : XSet X) : ¬ Surjective f := by
  -- f が全射だと仮定する
  intro (hsurj : Surjective f)

  -- X の部分集合 Y を, 以下のように取る
  -- Y = {x | x ∉ f(x)}
  let Y := {x | xf x}

  -- f は全射なので, f x = Y となる x が存在する
  obtainx, hx:= hsurj Y

  -- x について, x ∈ Y ↔ x ∉ Y が示せる
  have : xYxY := by
    constructor

    -- 左から右を示す
    case mp =>
      -- x ∈ Y だと仮定する
      intro hY

      -- Y の定義から, x ∉ f x
      replace hY : xf x := by aesop

      -- f x = Y だったから, x ∉ Y
      rwa [hx] at hY

    -- 右から左を示す
    case mpr =>
      -- x ∉ Y だと仮定する
      intro hY

      -- f x = Y だったから, x ∉ f x
      replace hY : xf x := by rwa [hx] at hY

      -- Y の定義から, x ∈ Y
      assumption

  -- これは矛盾である.
  tauto
GitHubで編集を提案

Discussion