命題は真偽が定まっていますが、数学で扱う文の多くは変数を含み、値を決めるまで真偽が定まりません。その扱い方を定めます。
定義 1 (条件). 変数(やなど)を含み、その変数の値が決まってはじめて真偽の定まる文や式を条件という1。
たとえば「」は条件です。を代入すれば真、を代入すれば偽になります。真偽が値に依存する点が、真偽の定まった命題との違いです。
最終更新
命題は真偽が定まっていますが、数学で扱う文の多くは変数を含み、値を決めるまで真偽が定まりません。その扱い方を定めます。
定義 1 (条件). 変数(やなど)を含み、その変数の値が決まってはじめて真偽の定まる文や式を条件という1。
たとえば「」は条件です。を代入すれば真、を代入すれば偽になります。真偽が値に依存する点が、真偽の定まった命題との違いです。
条件を、それを満たすものの集まりへ置き換えます。
定義 1.1 (真理集合). ある条件を真にする値をすべて集めた集合を、その条件の真理集合という2。条件の真理集合をと書くと、「が条件を満たす」ことと「」とは同じ意味である。
この対応を通すと、論理の演算がそのまま集合の演算に読み替わります。
| 条件の側 | 集合の側 |
|---|---|
| かつ | (共通部分) |
| または | (和集合) |
| でない | (補集合)3 |
| ならば | (包含) |
「かつ」「または」「でない」の計算は、共通部分、和集合、補集合の計算に対応します。「ならば」がすべての値について成り立つことは、のどの要素もの要素である、すなわちが成り立つことと同じです。
例 2.1 (倍数の条件を集合で読む). 全体集合を整数全体とし、二つの条件を次のように置く。
の倍数はすべての倍数なのでが成り立つ。これは条件の言葉では「ならば」がすべての整数について成り立つことにあたる。逆向きの包含は成り立たない。はに属してに属さないからである。
図は、二つの条件がこの包含関係にある場合を1枚描いたものです。包含が成り立つ根拠は、がの倍数であればと書くことができ、よりの倍数である、という議論のほうにあります。
同じ全体集合のもとで、共通部分と和集合も読み替えることができます。であり、これは「の倍数かつの倍数」が「の倍数」と同じ条件であることに対応します。であり、これは「の倍数またはの倍数」が「の倍数」と同じ条件であることに対応します。
条件の否定を補集合として読み替えるときは、全体集合が何であるかを先に決めておきます。同じ条件であっても、全体集合を変えると補集合が変わるからです。
例 3.1 (全体集合を変えると補集合が変わる). 条件:を考える。
三つの場合で、条件そのものは変わっていません。変わったのは、が動く範囲としてどの集合を取るかだけです。「この条件を満たさないもの」と言うときは、何の中で満たさないのかを指定しなければ、集合が定まりません。
閑話休題:論理の、もう一つの対応先 本記事では、論理を集合へ対応させました。「かつ」は共通部分、「または」は和集合、「ならば」は包含です。では、対応先は集合だけでしょうか。実は、もう一つの対応先があります。型です。
プログラミングでは、値に「整数型」「文字列型」といった型というラベルを付けます(型は、その型が取りうる値の集合のようなものだと考えてください)。驚くべきことに、論理と型のあいだにも、集合のときと同じ対応表を引くことができます。本記事の表に、右の1列を加えます。
| 論理 | 集合(本記事) | 型 |
|---|---|---|
| かつ | 直積型(ペア) | |
| または | 直和型 | |
| ならば | 関数型 |
決定的なのは、命題を証明することができることが、その型のプログラムを書くことができることに対応するという点です。証明とプログラムが同じものの別の姿であるというこの対応を、カリー・ハワード対応と呼びます。
ここから先が興味深いところです。私たちが論理と聞いて思い浮かべるのは、一度正しいと分かった事実を何度でも使い回すことができる論理です。ところが、事実は高々一度しか使うことができない(捨てるのは自由であるが、複製はできない)という、一見すると何の役に立つのか分からない論理を考えることができます。アフィン論理です。カリー・ハワード対応によってこの論理を型の世界へ移すと、値を高々一度しか使うことができない型システム、すなわち Affine 型が現れます。
この「一度きり」という制約が、現実の場面で決定的に効きます。メモリの一区画に持ち主が一人しかいなければ、解放済みのメモリを二度使う(use-after-free)という古典的なバグが原理的に起こりません。プログラミング言語 Rust は、この考え方をもとに所有権システムを設計し4、メモリ安全性をガベージコレクタではなく型のレベルで保証します。型検査が通れば、その時点でメモリ安全が確保されているということです5。
型のレベルでメモリ安全性を保証することがどれほどのことかを考えてみます。サイバー攻撃に悪用される脆弱性のうち約7割はメモリ安全性のバグが原因であると報告されています。コンパイル時にそれを根絶することができれば、従来は取り切ることができなかった脆弱性の大半を原理的に排除することができます。使い回すことのできない事実の論理という、役に立つのかどうかも怪しい抽象理論が、世界のソフトウェアの安全性を支える土台になっています。本記事で扱った論理と集合の対応から、一続きにたどることのできる話です。
条件と何を求めるかを確認してから、式と答えの対応を見比べてください。
次の2つの条件 p, q について、真理集合 P, Q を求めよ。さらに p q、p q、 q) の真理集合を求め、p q と q p の真偽を判定せよ(偽なら反例を1つ挙げよ)。x は実数とする。
実数 x についての次の2つの条件 p, q の真理集合 P, Q を求め、p q、p q、 q) の真理集合と、p q・q p の真偽を答えよ(偽なら反例を1つ挙げよ)。
解法の型条件を解いて真理集合(区間)にする。 は共通部分、 は和集合、 は補集合。含意 p q が真であることは包含 P Q と同じ
例題 1
例題 2
例題 3
例題 4
例題 5
例題 6
例題 7
例題 8
例題 9
例題 10
問題を解いてから「解答・解説」を開けます。
次の2つの条件 p, q について、真理集合 P, Q を求めよ。さらに p q、p q、 q) の真理集合を求め、p q と q p の真偽を判定せよ(偽なら反例を1つ挙げよ)。x は実数とする。
演習を読み込み中…