Upgrade to Pro — share decks privately, control downloads, hide ads and more …

定理証明をやろう

 定理証明をやろう

24th Dev #3 ~好きな技術シェア会~ のLTのスライドです。

Avatar for Hiroki Tokunaga

Hiroki Tokunaga

July 22, 2025
Tweet

More Decks by Hiroki Tokunaga

Other Decks in Programming

Transcript

  1. Leanのコード例:2つのリストの結合の逆順 theorem reverse_app : ∀ (xs ys : List α),

    reverse (xs ++ ys) = reverse ys ++ reverse xs := by intro xs ys induction xs with | nil => rewrite [List.nil_append, reverse, List.append_nil] rfl | cons h t ih => rewrite [reverse, ← List.append_assoc, ← ih] rfl 8
  2. 証明の流れ (1/13) theorem reverse_app : ∀ (xs ys : List

    α), reverse (xs ++ ys) = reverse ys ++ reverse xs := by 9 α : Type u_1 ⊢ ∀ (xs ys : List α), reverse (xs ++ ys) = reverse ys ++ reverse xs
  3. 証明の流れ (2/13) intro xs ys 10 α : Type u_1

    xs ys : List α ⊢ reverse (xs ++ ys) = reverse ys ++ reverse xs
  4. 証明の流れ (3/13) induction xs with 11 α : Type u_1

    xs ys : List α ⊢ reverse (xs ++ ys) = reverse ys ++ reverse xs
  5. 証明の流れ (4/13) | nil => 12 α : Type u_1

    ys : List α ⊢ reverse ([] ++ ys) = reverse ys ++ reverse []
  6. 証明の流れ (5/13) rewrite [List.nil_append, reverse, List.append_nil] 13 case nil α

    : Type u_1 ys : List α ⊢ reverse ys = reverse ys ++ reverse [] List.nil_append : ∀ as, [] ++ as = as
  7. 証明の流れ (6/13) rewrite [List.nil_append, reverse, List.append_nil] 14 case nil α

    : Type u_1 ys : List α ⊢ reverse ys = reverse ys ++ []
  8. 証明の流れ (7/13) rewrite [List.nil_append, reverse, List.append_nil] 15 case nil α

    : Type u_1 ys : List α ⊢ reverse ys = reverse ys List.append_nil : ∀ as, as ++ [] = as
  9. 証明の流れ (9/13) | cons h t ih => 17 case

    cons α : Type u_1 ys : List α h : α t : List α ih : reverse (t ++ ys) = reverse ys ++ reverse t ⊢ reverse (h :: t ++ ys) = reverse ys ++ reverse (h :: t)
  10. 証明の流れ (10/13) rewrite [reverse, ← List.append_assoc, ← ih] 18 case

    cons α : Type u_1 ys : List α h : α t : List α ih : reverse (t ++ ys) = reverse ys ++ reverse t ⊢ reverse (h :: t ++ ys) = reverse ys ++ (reverse t ++ [h])
  11. 証明の流れ (11/13) rewrite [reverse, ← List.append_assoc, ← ih] 19 case

    cons α : Type u_1 ys : List α h : α t : List α ih : reverse (t ++ ys) = reverse ys ++ reverse t ⊢ reverse (h :: t ++ ys) = reverse ys ++ reverse t ++ [h] List.append_assoc : ∀ (as bs cs : List α), as ++ bs ++ cs = as ++ (bs ++ cs)
  12. 証明の流れ (12/13) rewrite [reverse, ← List.append_assoc, ← ih] 20 case

    cons α : Type u_1 ys : List α h : α t : List α ih : reverse (t ++ ys) = reverse ys ++ reverse t ⊢ reverse (h :: t ++ ys) = reverse (t ++ ys) ++ [h]
  13. 定理証明の活用例 22 🔒 HACL*[1] 🔨 seL4[3] - 暗号化ライブラリ - FirefoxのCurve25519実装で

    使用[2] - F*で実装[1] - OS - 自動車などで使用[4] - Isabelleで実装[5] [1] https://github.com/hacl-star/hacl-star [2] https://blog.mozilla.org/security/2020/07/06/performance-improvements-via-formally-verified-cryptography-in-firefox/ [3] https://sel4.systems/ [4] https://sel4.systems/use.html [5] https://sel4.systems/Verification/proofs.html