正しいかどうかを表で確かめる
真理値表とは、文が「真」か「偽」かを、あらゆる場合について並べた表です。表を書けば、2つの条件が同じ意味かどうかを、ひらめきではなく手順で確かめられます。
学食の割引が「学生で、かつ午後なら50円引き」と書かれているとします。別の人が同じ割引をちがう言い方で書いたとき、本当に同じでしょうか。論理の表がその答えをくれます。
このレッスンのゴール
メモ
真理値表を書いて、2つの論理式が同値かどうかを判断することができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 命題 | 真か偽のどちらかに決まる文 | 3 は 5 より小さい |
| 真理値表 | すべての場合の真と偽を並べた表 | |
| 含意 | 「p ならば q」の形の命題 | |
| 同値 | どの場合でも真偽が同じであること | |
| 反例 | 主張が成り立たないことを示す、1つの場合 |
学生が入力するセルは、このプレビューでは空白です。
「かつ」「または」「ではない」
命題は、真か偽のどちらかに決まる文です。「今日は月曜日です」は命題ですが、「早く来て」は命題ではありません。
命題 p と q から、新しい命題を作れます。かつは、両方が真のときだけ真です。またはは、少なくとも片方が真なら真です。ではないは、真と偽を入れかえます。コンピュータでは、真を1、偽を0で表します。
3つの演算の真理値表
| p | q | p かつ q | p または q | p ではない |
|---|---|---|---|---|
| 真 | 真 | 真 | 真 | 偽 |
| 真 | 偽 | 偽 | 真 | 偽 |
| 偽 | 真 | 偽 | 真 | 真 |
| 偽 | 偽 | 偽 | 偽 | 真 |
学生が入力するセルは、このプレビューでは空白です。
Python の and と or で確かめる
python3 -c "print(True and False, True or False, not True)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ビットの AND と OR も同じ表
python3 -c "print(1 & 1, 1 & 0, 1 | 0, 0 | 0)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
「ならば」が偽になるのは1通り
含意は、「p ならば q」の形の命題です。たとえば「合格したら、ジュースをおごる」という約束です。
約束が破られるのは、合格したのにおごらなかったときだけです。不合格なら、おごってもおごらなくても、約束は破られていません。だから p が偽のとき、含意は真です。
真理値表: p ならば q
| p(合格した) | q(おごった) | p ならば q | 約束は |
|---|---|---|---|
| 真 | 真 | 真 | 守られた |
| 真 | 偽 | 偽 | 破られた |
| 偽 | 真 | 真 | 破られていない |
| 偽 | 偽 | 真 | 破られていない |
学生が入力するセルは、このプレビューでは空白です。
Python で「ならば」を作る
# 「p ならば q」は、「p ではない、または q」と同じ表になります。
for p in [True, False]:
for q in [True, False]:
print(p, q, (not p) or q)
よくある間違い
注意
「p が偽なら、p ならば q も偽だ」と考える人が多くいます。約束は、p が起きたときだけ守る必要があります。p が偽なら破りようがないので、含意は真です。偽になるのは、p が真で q が偽の1通りだけです。
同じ表なら、同値である
2つの論理式の真理値表の答えの列が、すべての行で同じなら、同値です。どんな場合でも、真偽がいつも一致するということです。
有名な例がド・モルガンの法則です。「(p かつ q) ではない」と「(p ではない) または (q ではない)」は同値です。表で確かめましょう。
例: ド・モルガンの法則
| p | q | (p かつ q) ではない | (p ではない) または (q ではない) |
|---|---|---|---|
| 真 | 真 | 偽 | 偽 |
| 真 | 偽 | 真 | 真 |
| 偽 | 真 | 真 | 真 |
| 偽 | 偽 | 真 | 真 |
学生が入力するセルは、このプレビューでは空白です。
場合分けで言葉でも示せる
表の代わりに、場合を分けて言葉で示すこともできます。まず p が偽の場合です。(p かつ q) は偽なので、その否定は真です。右の式も、(p ではない) が真なので真です。
p が真の場合は、q で分けます。q が真なら両方とも偽、q が偽なら両方とも真です。すべての場合で一致しました。
Python で全部の行を比べる
# 2つの式が、4つの行すべてで同じ答えか調べます。
same = True
for p in [True, False]:
for q in [True, False]:
left = not (p and q)
right = (not p) or (not q)
if left != right:
same = False
print("同値ですか:", same)
# right の or を and に変えて、もう一度実行してみましょう。
さらに挑戦
変数が p、q、r の3つなら、行は何通りでしょうか。表を書き、(p かつ q) または r と、(p または r) かつ (q または r) が同値か調べましょう。
Python では、for を3つ重ねれば全部の行を調べられます。