List Nat … 等の一般的な「型」は 1 階の型 ‣ 命題 ∀ a b : Nat, a + b = b + a の型は Prop 型 (これも 1 階) ‣ ∀ a b : Nat, a + b = b + a を 0 階の型として扱うと、その値は この命題の証明 • 依存型も扱える ‣ 𝑛 未満の自然数の型、長さ 𝑛 のリストの型などを扱える • 伝わらないと思うが、相当美しくて興奮すべきことを言ってる ‣ 興味が出た方は一緒に Lean に入門しましょう! λ Kansai in Summer 2026 10
→ Nat | [] => 0 | x :: xs => x + sum xs theorem replicate_sum : ∀ n x, sum (List.replicate n x) = n * x := by intro n x induction n with | zero => simp [List.replicate, sum] | succ n ih => simp [List.replicate, sum, ih] rw [Nat.add_mul, Nat.one_mul, Nat.add_comm] λ Kansai in Summer 2026 11
List (Nat × Nat)) (W : Nat) : Nat := Id.run do let mut dp := Array.replicate (W + 1) 0 for (w, v) in wvs do let mut ndp := dp for i in [0:W+1] do let nw := i + w let nv := dp[i]! + v if nw <= W && ndp[nw]! < nv then ndp := ndp.set! nw nv dp := ndp dp.toList.max?.getD 0 λ Kansai in Summer 2026 12
x := ⟨f x.value, x.cost⟩ instance : Applicative Costed where pure x := ⟨x, 0⟩ seq f x := let x' := x () ⟨f.value x'.value, f.cost + x'.cost⟩ instance : Monad Costed where bind x f := let y := f x.value ⟨y.value, x.cost + y.cost⟩ λ Kansai in Summer 2026 18
upper_bound_by (p : Nat → Bool) (ok ng : Nat) : Costed Nat := if h : ng - ok <= 1 then pure ok else let mid := (ok + ng) / 2 do let b ← Costed.step (p mid) if b then upper_bound_by p mid ng else upper_bound_by p ok mid λ Kansai in Summer 2026 20