コンピューターサイエンス入門:理論編
ド・モルガンの法則
この回でやること
ド・モルガンの法則による条件の言い換えを読み解き、AND・ORと比較の境界を確かめます。
- 読む 約 7 分
- 最後にクイズ 1 問
条件全体の否定は、読み取りにくい
ログイン済みで、かつ権限がある人だけ通したいとします。許可条件をまとめて否定すると、拒否条件になります。
ANDのままではいけません。「両方そろう」の否定は、少なくとも片方が欠けることです。「両方とも欠ける」だけにすると、ログイン済みでも権限がない人を拒否できません。
Python
logged_in = True
has_permission = False
print(not (logged_in and has_permission)) # True
print((not logged_in) or (not has_permission)) # True2つの式は同じ拒否条件です。このように、全体の否定を個々の条件へ移す規則をド・モルガンの法則と呼びます。
否定を内側へ移すと、ANDとORが入れ替わる
法則には2つの形があります。
プレーンテキスト
NOT (a AND b) = (NOT a) OR (NOT b)
NOT (a OR b) = (NOT a) AND (NOT b)1つ目は「全部そろってはいない」を「どれかが欠けている」と読み替えます。2つ目は「少なくとも片方がある、が成り立たない」を「どちらもない」と読み替えます。各項を否定するだけでなく、間の演算子も入れ替えます。
| a | b | NOT (a AND b) | (NOT a) OR (NOT b) |
|---|---|---|---|
| 偽 | 偽 | 真 | 真 |
| 偽 | 真 | 真 | 真 |
| 真 | 偽 | 真 | 真 |
| 真 | 真 | 偽 | 偽 |
4行とも右の2列が一致します。片方だけが欠ける行を見ると、ANDの入れ替え忘れに気づけます。
現場の話 アクセス権の確認でORをANDに取り違えると、権限のない人を通すことがあります。片方だけが欠ける場合も確認します。
比較式の否定は、境界で間違える
数の x について、not (x > 0) は x <= 0 です。x < 0 では0が抜けます。同じように、< の否定は >=、>= の否定は < です。等しい値が元の条件に入るなら、否定側には入りません。
条件を言い換えるときは、外のNOTを消し、各項を否定して、ANDとORを入れ替えます。比較式の否定は反対の比較へ直します。演算子が混ざる場合は、括弧のまとまりごとに読みます。
例題で確かめる
送料無料の条件を「注文額が3000円以上、かつ、重さが2kg以下」とします。その否定は「注文額が3000円未満、または、重さが2kgより大きい」です。注文額3000円、重さ2kgなら両条件を満たし、否定は偽です。重さが3kgなら片方を満たさず、否定は真になります。境界とORへの変更も確かめられました。