Leanにおける述語論理

2026年6月26日金曜日

Lean 技術記事 数学

t f B! P L

今回は述語論理(predicate logic)を取り上げ、全称記号・存在記号を使った命題を Lean 4 で証明する方法を見ていきます。教材には引き続き「ゼロから始めるLean言語入門 手を動かして学ぶ形式数学ライブラリ開発」です。

述語論理とは

述語論理とは、述語を取り扱う論理学のことです。述語とは変数を含んだ命題のことで、変数に具体的な値を代入することで真偽が定まります。

述語を用いて論理式を組み立てる際には、次の二つの記号が導入されます。

  • 全称記号(∀):「任意の値が与えられたとき」という仮定を示します。「すべての x について P(x) が成り立つ」という命題を ∀ x, P x と書きます。
  • 存在記号(∃):命題を満たす値が少なくとも一つ存在することを示します。「P(x) を満たす x が存在する」という命題を ∃ x, P x と書きます。

全称記号 ∀ を使った証明

以下の例では、述語 P に対して全称記号を用いた命題を証明しています。

def P (n : Nat) : Prop := n = n

example : ∀ a : Nat, P a := by
  intro x
  dsimp [P]

intro タクティクは全称記号を仮定するために使います。「a が任意に与えられたとする」と宣言するようなイメージです。このステップの後、証明のゴールは ⊢ P x に変わります。

次に dsimp [P] を適用します。dsimp は Definitional Simplification(定義による単純化)というタクティクで、指定した定義を展開してゴールを簡略化します。P の定義 n = n を展開すると、ゴールは x = x という自明な等式になり、Lean が自動的に証明を閉じます。

存在記号 ∃ を使った証明

次に、存在記号を用いた命題の例です。

def even (n : Nat) : Prop := ∃ m : Nat, n = m + m

example : even 4 := by
  exists 2

even は偶数であることを示す述語です。n に対して n = m + m となる自然数 m が少なくとも一つ存在するという命題を表しています。

存在記号を含む命題の証明には exists タクティクを使います。存在が主張されている値を具体的に与えれば証明が完了します。ここでは exists 2 と書くことで、m = 2 のとき 4 = 2 + 2 が成り立つことを示しています。

仮定に存在記号が含まれる場合

仮定に存在記号が使われている場合は、obtain タクティクを使って、存在が仮定されている値を取り出すことができます。

example (α : Type) (P Q : α → Prop) (h : ∃ x : α, P x ∧ Q x)
  : ∃ x : α, Q x := by
  obtain ⟨y, hy⟩ := h
  exists y
  exact hy.right

仮定 h には「P x ∧ Q x を満たす x が存在する」という情報が含まれています。obtain ⟨y, hy⟩ := h と書くことで、その値を y : α として、y が満たす命題の証明を hy として取り出せます。

続いて exists y でゴールを ⊢ Q y に変更します。これは「y こそが Q x を満たす値である」と主張する段階に移ることを意味します。hy は P y ∧ Q y の証明を持っているので、hy.right で論理積の右側、すなわち Q y を取り出せば証明が完成します。

本記事で紹介したコードは以下のリポジトリで公開しています。

https://github.com/ringring-creator/LearnLean

学習途中のコードですので、誤りが含まれる可能性があります。参考程度にご覧いただければ幸いです。

このブログを検索

Smart Hide Launcher の名称を Hitoma Launcher に変更しました

Smart Hide Launcher の名称を、Hitoma Launcher に変更しました。アプリアイコンも新しくなります。 コンセプトは「必要なアプリだけ」です。 これまでの名前は、アプリを「隠す」という機能を中心に表していました。今回の名称変更では、必要なアプリを選...

QooQ