クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

真理値表と論理式の同値

このレッスンのあとで: 真理値表を書いて、2つの論理式が同値かどうかを判断することができる。

55分のレッスンコマンド2件コンパイラとアーキテクチャのラボ:gcc、flex、bison、RISC-V を1台の VM で

正しいかどうかを表で確かめる

真理値表とは、文が「真」か「偽」かを、あらゆる場合について並べた表です。表を書けば、2つの条件が同じ意味かどうかを、ひらめきではなく手順で確かめられます。

学食の割引が「学生で、かつ午後なら50円引き」と書かれているとします。別の人が同じ割引をちがう言い方で書いたとき、本当に同じでしょうか。論理の表がその答えをくれます。

このレッスンのゴール

メモ

真理値表を書いて、2つの論理式が同値かどうかを判断することができる。

キーワード

ことばいみれい
命題真か偽のどちらかに決まる文3 は 5 より小さい
真理値表すべての場合の真と偽を並べた表
含意「p ならば q」の形の命題
同値どの場合でも真偽が同じであること
反例主張が成り立たないことを示す、1つの場合

学生が入力するセルは、このプレビューでは空白です。

「かつ」「または」「ではない」

命題は、真か偽のどちらかに決まる文です。「今日は月曜日です」は命題ですが、「早く来て」は命題ではありません。

命題 p と q から、新しい命題を作れます。かつは、両方が真のときだけ真です。またはは、少なくとも片方が真なら真です。ではないは、真と偽を入れかえます。コンピュータでは、真を1、偽を0で表します。

3つの演算の真理値表

pqp かつ qp または qp ではない
真真真真偽
真偽偽真偽
偽真偽真真
偽偽偽偽真

学生が入力するセルは、このプレビューでは空白です。

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 で「ならば」を作る

コード: 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 ではない)」は同値です。表で確かめましょう。

例: ド・モルガンの法則

pq(p かつ q) ではない(p ではない) または (q ではない)
真真偽偽
真偽真真
偽真真真
偽偽真真

学生が入力するセルは、このプレビューでは空白です。

場合分けで言葉でも示せる

表の代わりに、場合を分けて言葉で示すこともできます。まず p が偽の場合です。(p かつ q) は偽なので、その否定は真です。右の式も、(p ではない) が真なので真です。

p が真の場合は、q で分けます。q が真なら両方とも偽、q が偽なら両方とも真です。すべての場合で一致しました。

Python で全部の行を比べる

コード: 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つ重ねれば全部の行を調べられます。

このラボとソースについて: コンパイラとアーキテクチャのラボ:gcc、flex、bison、RISC-V を1台の VM で

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。