回 1-4 道 1 数と論理と計算量
ド・モルガンの
読み終えたら否定の
この頁の流れ
否定の
「ログインしていて 権限が ある、ではない」を 書き直せますか
「A かつ B、ではない」は、
会員だけがnot (logged_in and has_perm) です。
この
この
論理の 演算と ド・モルガンの 法則は どう 決まっているのか
論理の
AND、 OR、 NOT、 XOR の真理値表
基本の
| 演算 | 読み方 | Python | 真になるとき |
|---|---|---|---|
| AND | かつ (論理積) | a and b | 両方が |
| OR | または | a or b | どちらか |
| NOT | でない | not a | a が偽のとき |
| XOR | どちらか一方だけ | a != b | 2 つが違うとき |
OR は
否定を 配る ときは AND と OR を 入れ替える
ド・モルガンの
ド・モルガンの法則の 2 本
not (A and B)
は (not A) or (not B)
not (A or B)
は (not A) and (not B)1 本目は
仕事の
書き直す前
if not (logged_in and has_perm):
deny()書き直した後
if (not logged_in
or not has_perm):
deny()どちらも
集合で 書くと、 補集合と 共通部分と和集合
ド・モルガンの
| 論理 | 集合 | 記号 |
|---|---|---|
| NOT (でない) | 補集合 | A の上に横線 |
| AND (かつ) | 共通部分 | A ∩ B |
| OR (または) | 和集合 | A ∪ B |
この
3 つ以上 でも、 全部を 入れ替えるだけ
条件が 3 つ以上
3 つのとき
not (A and B and C)
は not A or not B or not C
not (A or B or C)
は not A and not B and not C「3 つの集合の
「すべて」と 「ある」の否定
「すべての〜が
Python では、all、1 つでもany で
すべてとあるの否定
not all(xs)
any(not x for x in xs)日本語の
not は and より先に効く
Python では、not が and より先に、and が or より
ですから not a and not b は (not a) and (not b) で、not (a and b) とは
動かして確かめる
1 本目は、itertools.product に [False, True] と repeat=2 を渡すと、2 つの値の
動かす 真理値表を作る
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
A B and or notA xor
0 0 0 0 1 0
0 1 0 1 1 1
1 0 0 1 0 1
1 1 1 1 0 0AND の
2 本目は、
動かす ド・モルガンの確かめ
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
2 つ 4 4
3 つ 8 8条件が 2 つなら
3 本目は、
動かす すべてとあるの否定
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
並び 16 同じ 16
空の all True
空の any False16 通りall がany がall はall はany は
どこで 書き直しを 間違えるのか
ド・モルガンの
入れ替えを 忘れると 4 行の うち 2 行で割れる
not (login and perm) をand を or にnot login and not perm とlogin はperm は
動かす 入れ替え忘れ
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
True False True False
False True True False
割れた行 24 行のうち 2 行で答えが
両方とも
書き直しても、 呼ぶ順は 変わらない
and と or は、x and y は
条件の中で関数を呼ぶと、
動かす 呼ぶ順を比べる
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
True True True AB AB
True False True AB AB
False True True A A
False False True A A出力は
かっこを 外すと 別の式になる
not a and b は、(not a) and b とnot (a and b) の
書き直しは 仕事で どう 確かめるのか
論理の
書き直しを固める試験
from itertools import product
TF = [True, False]
def test_same_meaning():
for a, b in product(
TF, repeat=2):
old = not (a and b)
new = (not a) or (not b)
assert old == newnew の or を and に
仕事では
- 書き直す前の
式を 残し、 新しい 式と 並べて、 全部の 組み合わせで 同じ 答えに なる 試験を書く - 条件の中で関数を呼んでいるなら、
呼ぶ順と 呼ぶ回数も 変わっていないかを見る - 否定が
2 重に なった所 ( not not) や、!=とnotが重なった 所は、 言葉で 読み上げて 意味を確かめる - 権限の
判定のように 通すか 断るかを 決める 式は、 「通してはいけない 人」の 組み合わせを 試験に 必ず入れる
関わる実例
Linux の 開発の 倉庫に 紛れ込んだ 1 行の 条件 (2003年11月)
2003年11月6日、LWN.net は、Linux の
if ((options == (__WCLONE|__WALL)) && (current->uid = 0))
ふつうのcurrent->uid をwait4() を
崩れた&& も Python の and と
よくある問い
ド・モルガンの 法則の 覚え方は ありますか
「否定を
「A かつ B」の 反対は何ですか
「A でないか、
ド・モルガンの 法則は どう 証明するのですか
論理の
ド・モルガンの 法則は プログラミングで 何に 使うのですか
否定のnot (A and B) を not A or not B にif のwhile の
3 つの 場合の ド・モルガンの 法則は何ですか
not (A and B and C) は not A or not B or not C と同じ、not (A or B or C) は not A and not B and not C と
確認クイズ
答えだと
1 問目
if not (logged_in and has_perm): と
2 問目
「A または
3 問目
条件が 4 つある
4 問目
この
割れた行を数える
from itertools import product
bad = 0
TF = [True, False]
for a, b in product(
TF, repeat=2):
if (not (a or b)) != (
not a or not b):
bad += 1
print(bad)説明課題
if not (is_member or is_admin): を、
自分の
この回の 先の一歩
否定の
もっと深く
この
一次資料
どれも 2026年10月27日に開いて、
- Expressions、
6.11 Boolean operations と 。6.17 Operator precedence (Python 公式文書、英語) x and yはまず x を 調べ、 x が 偽なら その 値を 返し、 そうでなければ y を 調べること、 orも同じ形である こと、 優先順位の 表で Boolean NOT、 Boolean AND、 Boolean OR の 順に並ぶこと - Built-in Functions、
all と 。any (Python 公式文書、英語) allはすべてが 真か 空なら True を 返すこと、 anyはどれか 1 つが真ならTrue を 返し 空なら False を返すこと - itertools、
product (Python 公式文書、英語) 。repeatで同じ 並びを 何回掛け合わせるかを 決めること - An attempt to backdoor the kernel (LWN.net、英語)。2003年11月6日の記事である
こと、 CVS の 倉庫に 入れられた 1 行の条件、 current->uidを比べずに 0 を 代入していたこと、 wait4()をその印で 呼ぶと root の 権限で 動く こと、 本流には 入らなかったこと
