冷たいNANDとド・モルガン博士たち

公開:2020/10/28
更新:2020/11/11
4 min読了の目安(約4200字TECH技術記事 1

MHRDわけわからん

ULX3SもTinyFPGA BXも指くわえて見てるだけ

もうVerilog HDL学べばいいんじゃね。もしくはSystemVerilogか。

でも、すべてがNANDになるのは、ちょっとキャッチーだったかも。

すべてがNANDになる。もしくは?

NOTもANDもNANDになりました。すべてがNANDになります。もしくは?

ということで、OR。

書くまでもない気がしますが、Pythonで念のため確認。

print(False or False) # False
print(True or False)  # True
print(False or True)  # True
print(True or True)   # True

これもNANDになりますか。

ところで、NOT二回つなげても変化なかったですよね。

当然ながらPythonでも変わらない。

print(not not (False or False)) # False
print(not not (True or False))  # True
print(not not (False or True))  # True
print(not not (True or True))   # True

そういえば。

さっきからずーっと気になってたんですが、タイトルに聞いたことがあるようなないような文字列が。

『冷たいNANDとド・モルガン博士たち』

そうそうド・モルガン ド・モルガン。Augustus de Morgan。

あれだ、あれあれ、ド・モルガンの法則。

ド・モルガンの法則、といきなり言われても困ります。

身近なものでおさらいしましょう。ハロウィンで。

https://www.reddit.com/r/funny/comments/jhzdp5/trick_xor_treat/

https://www.reddit.com/r/funny/comments/jhzdp5/trick_xor_treat/

わかりやすい。

ベン図ですね。ベンさんえらい。

この図のなかで、注目したいのは左下。Trick NOR Treat。

NORというのは(NANDがNOT ANDであるように)、NOT OR。

NOT ORといえば、ここ!

このNOT ORをド・モルガンの法則で入れ替えます。

PythonでNOT ORを書くと、このとおり

not (Trick or Treat)

先ほどのベン図からNOT ORを抜粋。

この色のついた部分「NOT OR」を、ド・モルガンの法則で別の何かに入れ替えるわけです。

先に答えを書いてしまうと、Pythonでは

(not Trick) and (not Treat)

ベン図ではこう。

ソフトウェアでもおなじみですよね。

!(Trick || Treat) == (!Trick && !Treat)

ベン図を分解して確認しなおします。(not Trick)

(not Treat)

この2つのAND。

ね。

# (not (Trick or Treat)) == ((not Trick) and (not Treat))

Trick = False
Treat = False
assert ((not (Trick or Treat)) == ((not Trick) and (not Treat)))  # True

Trick = True
Treat = False
assert ((not (Trick or Treat)) == ((not Trick) and (not Treat)))  # True

Trick = False
Treat = True
assert ((not (Trick or Treat)) == ((not Trick) and (not Treat)))  # True

Trick = True
Treat = True
assert ((not (Trick or Treat)) == ((not Trick) and (not Treat)))  # True

あってる! 記号で描き直すとこうなります。

さっそく、このNOT ORを入れ替えて見ましょう。

NOT 2つにANDですね。

あ、NOT ANDだ!

当然NOT ANDはNANDに入れ替えられます。

NOTも、すでに証明されたとおり、NANDに入れ替えられますよね。

完成!

Pythonでの追試も👍

print(False or False) # False
print(True or False)  # True
print(False or True)  # True
print(True or True)   # True


def nand(a, b):
    return not (a and b)


print(nand(not False, not False)) # False
print(nand(not True, not False))  # True
print(nand(not False, not True))  # True
print(nand(not True, not True))   # True

すべてがNANDになる

NOTもANDもORもNANDになりました。すべてがNANDになります。

そろそろVerilog HDL?

難関XORはこっち!