MathLabs

数学の基礎

述語論理

述語論理は命題論理を量化子 ∀x P(x)\forall x\, P(x)(「すべての xx について P(x)P(x)」)と ∃x P(x)\exists x\, P(x)(「ある xx が存在して P(x)P(x)」)で拡張し、ある領域のすべての元、またはある元についての言明を形式化し、タルスキの充足意味論で推論できるようにする。

直観「すべて」と「存在する」

「この部屋の全員の生徒が試験に合格した」と「この部屋のある生徒が試験に合格した」は、同じ部屋についての主張でありながら、まったく異なる主張である。述語論理はこの違いを明確にする。述語 P(x)P(x) とは、領域(言説の宇宙)MM から具体的な対象を xx に代入すると真偽が定まる命題になる性質である。全称量化子 ∀x P(x)\forall x\, P(x) は PP が MM のすべての対象について成り立つことを主張し、存在量化子 ∃x P(x)\exists x\, P(x) は PP が MM の少なくとも一つの対象について成り立つことを主張する。

量化された変数xとyの間の依存関係を示すインタラクティブなグラフ。
変数 xx と yy の間の依存グラフ:xx から yy への辺は、yy の証拠が選ばれた xx に依存しうることを示す。ハイライトを動かして「固定された証拠」∃y ∀x R(x,y)\exists y\, \forall x\, R(x,y) と「動く証拠」∀x ∃y R(x,y)\forall x\, \exists y\, R(x,y) を比較してみよう。

大学形式構文と量化子の否定

定義: 量化子と自由変数・束縛変数

領域 MM と述語 P(x)P(x) が与えられたとき、∀x P(x)\forall x\, P(x)(「すべての xx について P(x)P(x)」)は PP が MM のすべての元について成り立つとき MM で真である。∃x P(x)\exists x\, P(x)(「ある xx が存在して P(x)P(x)」)は PP が少なくとも一つの元について成り立つとき真である。量化子の作用域内にある変数はその量化子に束縛されているといい、そうでなければ自由である。自由変数を持たない論理式は文と呼ばれ、与えられた構造において確定した真理値を持つ。

¬(∀x P(x))≡∃x ¬P(x)\neg(\forall x\, P(x)) \equiv \exists x\, \neg P(x)

この法則は「全員が性質 PP を持つわけではない」が正確に「PP を持たない者がいる」を意味すると述べる。対をなす法則 ¬(∃x P(x))≡∀x ¬P(x)\neg(\exists x\, P(x)) \equiv \forall x\, \neg P(x) は「PP を持つ者はいない」が「全員が PP を持たない」と同じであると述べる。この2つの法則は ∧,∨\wedge, \vee に対するド・モルガンの法則の量化子版であり、すべての否定を内側へ押し込んで前提正規形(すべての量化子を前に出した論理式、例えば φ\varphi が量化子を含まない ∀x ∃y φ\forall x\, \exists y\, \varphi)に到達するための鍵となる手順である。

¬(∃x P(x))≡∀x ¬P(x)\neg(\exists x\, P(x)) \equiv \forall x\, \neg P(x)
前提正規形:否定と量化子を押し出す
論理式同値な前提形
¬∀x P(x)\neg \forall x\, P(x)∃x ¬P(x)\exists x\, \neg P(x)
¬∃x P(x)\neg \exists x\, P(x)∀x ¬P(x)\forall x\, \neg P(x)
∀x P(x)∧∀x Q(x)\forall x\, P(x) \wedge \forall x\, Q(x)∀x (P(x)∧Q(x))\forall x\, (P(x) \wedge Q(x))
∃x P(x)∨∃x Q(x)\exists x\, P(x) \vee \exists x\, Q(x)∃x (P(x)∨Q(x))\exists x\, (P(x) \vee Q(x))

大学主要な定理:例化と量化子の順序

領域 MM を持つ任意の構造 M\mathcal{M}、任意の付値 ss、P(x)P(x) の xx に代入可能な任意の項 tt について:M⊨s∀x P(x)\mathcal{M} \models_s \forall x\, P(x) ならば M⊨sP(t)\mathcal{M} \models_s P(t)。規則形式:∀x P(x)⊢P(t)\forall x\, P(x) \vdash P(t)。

なぜ正しいのか?

∀x P(x)\forall x\, P(x) は「xx に何を代入しても PP が成り立つ」ことを意味する——だから特定の項 tt を代入しても P(t)P(t) は成り立たなければならない。これは一般法則を具体的な事例に変える規則である。「∀x (Human(x)→Mortal(x))\forall x\, (\text{Human}(x) \to \text{Mortal}(x))」から t=Socratest = \text{Socrates} で例化すると「Human(Socrates)→Mortal(Socrates)\text{Human}(\text{Socrates}) \to \text{Mortal}(\text{Socrates})」が得られる。これは古典的三段論法の第一前提である。

証明

構造における真理性を論理式の構造に関する帰納で定義するタルスキの充足意味論から直接論じる。

∀\forall に対する意味論的節により:M⊨s∀x P(x)  ⟺  for every d∈M, M⊨s[x↦d]P(x)\mathcal{M} \models_s \forall x\, P(x) \iff \text{for every } d \in M,\ \mathcal{M} \models_{s[x \mapsto d]} P(x)。仮定 M⊨s∀x P(x)\mathcal{M} \models_s \forall x\, P(x) を仮定する。この節により、M⊨s[x↦d]P(x)\mathcal{M} \models_{s[x \mapsto d]} P(x) がすべての d∈Md \in M について例外なく成り立つ。

この主張はすべての d∈Md \in M について成り立つので、特に d=tM,sd = t^{\mathcal{M},s}(項 tt が ss のもとで M\mathcal{M} において表す元)についても成り立つ。この特定の dd を代入すると M⊨s[x↦tM,s]P(x)\mathcal{M} \models_{s[x \mapsto t^{\mathcal{M},s}]} P(x) が得られる。

代入補題(変数割り当てと項代入を結びつける標準的な結果で、PP の構造に関する帰納法で証明できる)により:M⊨s[x↦tM,s]P(x)  ⟺  M⊨sP(t)\mathcal{M} \models_{s[x \mapsto t^{\mathcal{M},s}]} P(x) \iff \mathcal{M} \models_s P(t)。これは tt が P(x)P(x) の xx に代入可能である(すなわち tt の自由変数が意図せず束縛されない)ときに正確に成り立つ。この補題を適用すると M⊨s[x↦tM,s]P(x)\mathcal{M} \models_{s[x \mapsto t^{\mathcal{M},s}]} P(x) は M⊨sP(t)\mathcal{M} \models_s P(t) になる。

M\mathcal{M}、ss、tt は任意だったので、∀x P(x)\forall x\, P(x) から P(t)P(t) への推論はすべての構造・すべての付値において真理性を保存する。すなわちこの規則は健全である。

任意の構造 M\mathcal{M} と論理式 R(x,y)R(x,y) について:∃y ∀x R(x,y)⇒∀x ∃y R(x,y)\exists y\, \forall x\, R(x,y) \Rightarrow \forall x\, \exists y\, R(x,y)。逆の含意は一般には成り立たない。

なぜ正しいのか?

∃y ∀x R(x,y)\exists y\, \forall x\, R(x,y) はすべての xx に対して通用する単一の証拠 yy(「固定された」証拠)を要求するのに対し、∀x ∃y R(x,y)\forall x\, \exists y\, R(x,y) は各 xx に対して何らかの証拠があればよく、xx ごとに異なっていてもよい(「動く」証拠)。固定された証拠は自動的に動く証拠にもなる(そのまま使い回せる)が、逆は成り立たない——これはまさに「みんなを愛する人がいる」(一人の普遍的な恋人)と「みんな誰かに愛されている」(相手は人によって違うかもしれない)の違いであり、述語論理が明確化する自然言語の古典的な曖昧さの一例である。

証明

順方向。 M⊨s∃y ∀x R(x,y)\mathcal{M} \models_s \exists y\, \forall x\, R(x,y) を仮定する。∃\exists に対する意味論的節により、M⊨s∃y φ  ⟺  there is d∈M with M⊨s[y↦d]φ\mathcal{M} \models_s \exists y\, \varphi \iff \text{there is } d \in M \text{ with } \mathcal{M} \models_{s[y \mapsto d]} \varphi。これをここに適用すると、ある d0∈Md_0 \in M が存在して M⊨s[y↦d0]∀x R(x,y)\mathcal{M} \models_{s[y \mapsto d_0]} \forall x\, R(x,y)。

これに ∀\forall に対する節を適用すると、M⊨s[y↦d0][x↦a]R(x,y)\mathcal{M} \models_{s[y \mapsto d_0][x \mapsto a]} R(x,y) がすべての a∈Ma \in M について成り立つ。なぜなら ∀x\forall x は後でどの aa を選ぼうと MM 全体にわたるからである。

ここで ∀x ∃y R(x,y)\forall x\, \exists y\, R(x,y) を確認するため任意の a∈Ma \in M を固定する。前段落から x↦ax \mapsto a を取ると M⊨s[y↦d0][x↦a]R(x,y)\mathcal{M} \models_{s[y \mapsto d_0][x \mapsto a]} R(x,y) が得られ、これは x↦ax \mapsto a のもとで ∃y R(x,y)\exists y\, R(x,y) に対する証拠として d0d_0 自身を示している。したがって M⊨s[x↦a]∃y R(x,y)\mathcal{M} \models_{s[x \mapsto a]} \exists y\, R(x,y)。

a∈Ma \in M は任意だったので、M⊨s[x↦a]∃y R(x,y)\mathcal{M} \models_{s[x \mapsto a]} \exists y\, R(x,y) はすべての aa について成り立ち、これはまさに M⊨s∀x ∃y R(x,y)\mathcal{M} \models_s \forall x\, \exists y\, R(x,y) の意味論的節である。これで ∃y ∀x R(x,y)⇒∀x ∃y R(x,y)\exists y\, \forall x\, R(x,y) \Rightarrow \forall x\, \exists y\, R(x,y) が証明された。

逆は成り立たない:反例。 M\mathcal{M} の領域を M=ZM = \mathbb{Z}(整数)とし、R(x,y)R(x,y) を「x<yx < y」と解釈する。このとき ∀x ∃y R(x,y)\forall x\, \exists y\, R(x,y) は真である:任意の整数 xx に対して y=x+1y = x+1 を取れば x<yx < y。しかし ∃y ∀x R(x,y)\exists y\, \forall x\, R(x,y) は偽である:これはすべての整数 xx より大きい単一の整数 yy を要求するが、そのような最大の整数は存在しない(どの候補 yy についても、整数 y+1y+1 は y+1<yy+1 < y に違反する)。よって ∀x ∃y R(x,y)\forall x\, \exists y\, R(x,y) は成り立つが ∃y ∀x R(x,y)\exists y\, \forall x\, R(x,y) は成り立たず、逆の含意が一般には偽であることが示された。

大学実世界での応用と具体例

SQLには「すべて」を表す組み込みキーワードがないため、リレーショナルデータベースは量化子否定の法則を使って ∀x P(x)\forall x\, P(x) を符号化する:「∀x P(x)\forall x\, P(x)」は `NOT EXISTS (... WHERE NOT P ...)` になる。つまりプログラマは、まさに ¬(∀x P(x))≡∃x ¬P(x)\neg(\forall x\, P(x)) \equiv \exists x\, \neg P(x) の通り ∃\exists の二重否定によって ∀\forall を実装する。形式仕様言語(Z記法、Hoare論理の事前・事後条件、TLA+)は ∀\forall と ∃\exists を直接使って「すべての配列添字は範囲内にある」や「有効な実行パスが存在する」といった正しさの性質を述べ、検証ツールが例化と量化子消去の技法でそれを検査する。

例: リレーショナル除算:「すべての商品を購入した」

データベースにテーブル `Purchases(customer, product)` と `Products(product)` がある。「顧客 cc がすべての商品を購入した」を述語論理で形式化し、`NOT EXISTS` のみを使ったSQLクエリに変換せよ。

解答

Bought(c,p)\text{Bought}(c,p) を「(c,p)(c,p) がPurchasesに存在する」、Product(p)\text{Product}(p) を「pp がProductsに存在する」とする。「顧客 cc がすべての商品を購入した」は ∀p (Product(p)→Bought(c,p))\forall p\, (\text{Product}(p) \to \text{Bought}(c,p))。

SQLには ∀\forall がないので、量化子否定の法則 ¬(∀x P(x))≡∃x ¬P(x)\neg(\forall x\, P(x)) \equiv \exists x\, \neg P(x) を ¬∃p ¬(Product(p)→Bought(c,p))\neg\exists p\,\neg(\text{Product}(p) \to \text{Bought}(c,p)) に適用する。つまり全称量化を「顧客 cc が購入しなかった商品は存在しない」と書き換える:¬∃p (Product(p)∧¬Bought(c,p))\neg \exists p\, (\text{Product}(p) \wedge \neg\text{Bought}(c,p))。

これは直接次のように変換される:`SELECT c FROM Customers c WHERE NOT EXISTS (SELECT FROM Products p WHERE NOT EXISTS (SELECT FROM Purchases WHERE customer = c.c AND product = p.product))`——リレーショナル除算を実装する古典的な「二重NOT EXISTS」パターンであり、全称量化子から存在量化子への否定法則の直接的な応用である。

例: 形式仕様:整列不変条件

ソートルーチンの事後条件は、長さ nn の配列 aa に対して ∀i (0≤i<n−1→a[i]≤a[i+1])\forall i\, (0 \le i < n-1 \to a[i] \le a[i+1]) と指定されている。検証者は i=0i=0 での具体的な事例を確認したい。事後条件から a[0]≤a[1]a[0] \le a[1] を取り出すことを正当化する推論規則は何か、また得られる論理式は何か。

解答

P(i)P(i) を 0≤i<n−1→a[i]≤a[i+1]0 \le i < n-1 \to a[i] \le a[i+1] とする。事後条件は ∀i P(i)\forall i\, P(i)。

上で証明した全称例化の健全性により、領域内の任意の項 tt について ∀x P(x)⊢P(t)\forall x\, P(x) \vdash P(t)——ここで t=0t = 0 を取ると、∀i P(i)\forall i\, P(i) から妥当に P(0)P(0) を推論できる。すなわち 0≤0<n−1→a[0]≤a[1]0 \le 0 < n-1 \to a[0] \le a[1]。

0≤0<n−10 \le 0 < n-1 は n≥2n \ge 2 であれば真である(配列の宣言された長さなどから検証者が別途確認する側条件)ので、モーダスポネンスにより求める a[0]≤a[1]a[0] \le a[1] が得られる——これはまさに検証者が確認したかった事例であり、全称例化とモーダスポネンスを連鎖させて得られる。

¬(∀x P(x))\neg(\forall x\, P(x)) と論理的に同値な論理式はどれか?

領域を Z\mathbb{Z}、R(x,y)R(x,y) を「x<yx < y」とするとき、次のうち真であるのはどれか?

SQLの `NOT EXISTS (... WHERE NOT P ...)` パターンは PP に対してどの量化子を実装しているか?

構造 M\mathcal{M} で ∀x P(x)\forall x\, P(x) が真であるとき、項 tt に対する全称例化により正当化される結論はどれか?

参考文献

  1. Herbert B. Enderton (2001). A Mathematical Introduction to Logic
  2. David Hilbert, Wilhelm Ackermann (1928). Grundzüge der theoretischen Logik