対象を表す変数、対象の性質・関係を表す述語、そして「すべて」(∀)/「ある」(∃)を使って、対象についての命題を記述する論理。
Info
このノートでは、主に「どのような論理式を書けるか」という構文を扱う。
シグネチャ、対象領域、構造、モデルなど、論理式に意味を与える仕組みについては一階述語論理の意味論を参照。
命題論理では、文全体を1つの命題記号として扱う。
- P:太郎はプログラマーである
- Q:太郎はHaskellを使う
- P⇒Q
一階述語論理では、文を「対象」と「性質・関係」に分解できる。
- Programmer(x):x はプログラマー
- Uses(x,y):x は y を使う
- ∀x(Programmer(x)⇒Uses(x,Git))
なぜ「一階」なのか
量化できるのが、数や人などの対象そのものだから。
∀xEven(x)ここでは対象を表す変数 x を量化している。一方、
∀PP(x)のように述語 P 自体を量化するのは二階以上の論理になる。
プログラミング風の比較
- 命題論理:何も量化しない
- 一階述語論理:値について量化する
- 二階以上の論理:述語や関係などについても量化する
一階言語の構文
シグネチャ
一階述語論理では、最初に使用できる非論理記号と、その引数の個数を決める。この記号の構成をシグネチャという。
- 定数記号:特定の対象を指す
- 関数記号:対象から別の対象を作る
- 述語記号:対象の性質や関係を表す
例えば、
L={0,+,Even}では、0 が定数記号、+ が2引数の関数記号、Even が1引数の述語記号である。
Hint
シグネチャが決めるのは、その言語で何を表現できるかである。各記号が具体的に何を意味するかは、構造によって与えられる。
項
項は、対象を指すための式。
- 変数:x,y
- 定数記号:0
- 関数記号を項に適用したもの:x+0
述語や等号の引数には項を置く。
述語と原子論理式
述語は、対象の性質や対象同士の関係を表す。
- Even(x):「x は偶数」
- Loves(x,y):「x は y を愛している」
述語を項に適用した式や、2つの項を等号で結んだ式を原子論理式という。
Even(x),Loves(x,y),x+0=0
Hint
📝プログラマーのための圏論の「述語は Bool を返す関数」という見方をすれば、次のように書ける。
even :: Integer -> Bool
loves :: Person -> Person -> Bool
論理式
原子論理式を、論理演算子と量化子によって組み合わせたもの。
- ¬φ:「φ ではない」
- φ∧ψ:「φ かつ ψ」
- φ∨ψ:「φ または ψ」
- φ⇒ψ:「φ ならば ψ」
- ∀xφ:「すべての x について φ」
- ∃xφ:「φ を満たす x が存在する」
Example
∀x(Human(x)⇒Mortal(x))すべての人間は死ぬ。
∃x(Programmer(x)∧Uses(x,Haskell))Haskellを使うプログラマーが少なくとも一人いる。
自由変数と束縛変数
Even(x)の x は、量化子によって束縛されていない自由変数である。この式は x の値が決まらないと真偽が確定しない。
∃xEven(x)では、x は ∃x によって束縛されている。自由変数を持たない論理式を文といい、その構造において真偽が確定する。
等号
等号 = は、2つの項が対象領域内の同じ対象を指すことを表す。
等号つき一階述語論理では、次の3つの層に分けて考える。
- 構文
- = は特別な原始記号であり、ほかの論理記号から定義しない
- 意味論
- = は対象領域上の同一性として解釈される
- 対象領域を D とすれば、= が表す関係は {(d,d)∣d∈D}
- 証明体系
- 同一性の振る舞いを、反射律と代入原理などによって形式化する
Caution
通常の二項述語 E を「同値関係かつ、その言語で表現可能なすべての論理式について代入原理を満たす」と定めても、本当の同一性になるとは限らない。
それは「その言語では区別できない」という観察的同値性にすぎない可能性がある。
Note
= は対象領域が決まれば、非論理記号のシグネチャに依存せずに定まる。
そのため、任意のシグネチャから本当の同一性を一般的に定義することはできず、等号つき一階述語論理では = を特別な論理記号として扱う。