述語論理 全称量化子 存在量化子 命題 述語
命題論理から述語論理へ
命題論理(propositional logic)は、「真または偽」が定まる文(命題)を扱う。「今日は雨だ」「xは3より大きい」などである。しかし命題論理では、「すべてのxについて」「あるxが存在して」という表現ができない。
述語論理(predicate logic、一階述語論理とも)は、この制限を取り払う。変数と量化子を導入し、より表現力の高い論理体系を構築する。
基本概念
述語
述語(Predicate)
変数を含み、その変数に具体的な値を代入すると命題になるもの。
例:P(x) = 「xは偶数である」
P(2) は真、P(3) は偽となる。
全称量化子
全称量化子 ∀(for all)
「すべての〜について」を表す。
∀x P(x) は「すべてのxについてP(x)が真」の意味。
反例が1つでもあれば偽。
存在量化子
存在量化子 ∃(there exists)
「〜が存在する」を表す。
∃x P(x) は「P(x)を満たすxが少なくとも1つ存在する」の意味。
1つでも真になる例があれば真。
量化子の否定
量化子の否定には重要な規則がある。
| 元の式 | 否定 | 意味 |
|---|---|---|
| ¬(∀x P(x)) | ∃x ¬P(x) | 「すべてがPでない」=「Pでないものが存在する」 |
| ¬(∃x P(x)) | ∀x ¬P(x) | 「Pが存在しない」=「すべてがPでない」 |
これはド・モルガンの法則の拡張と見なせる。
実例
プログラミングでよく見る表現を述語論理で書いてみる。
| 日本語 | 述語論理 | プログラミング |
|---|---|---|
| すべてのユーザーは名前を持つ | ∀u (User(u) → HasName(u)) | users.every(u => u.name) |
| 在庫切れの商品がある | ∃p (Product(p) ∧ OutOfStock(p)) | products.some(p => p.stock === 0) |
| エラーがない | ¬∃e Error(e) または ∀e ¬Error(e) | errors.length === 0 |
実務での応用
WEB開発での応用
データベース制約:「すべての注文には顧客が存在する」は外部キー制約として実装される。
バリデーション:「すべての入力フィールドが有効である」をチェックする処理。
配列メソッド:every()は∀、some()は∃に対応する。
AI/MLでの応用
型システム:ジェネリクスの型制約は全称量化。
論理推論:知識グラフでの推論規則は述語論理で記述される。
形式検証:プログラムの正しさを証明する際の仕様記述言語。
深掘りリンク
- Wikipedia: 述語論理
- 書籍:「論理学をつくる」戸田山和久
- 関連:関係代数、Datalog、Prolog
- 次のステップ:高階論理、型理論