聞かれてもないのに NAND

誰に聞かれたわけでもありませんが、僕の Twitter アカウントの「現在地」の欄に書いてある NAND について説明するよ!
NAND っていうのは、日本語では否定論理積などと呼ばれるよ。
面倒なので Wikipedia の否定論理積のページを見てね!では説明にならないので概要だけ書くよ。

そもそも AND とは

まず NAND というのは NOT(AND) の省略系なので、 AND について知らないと理解できないね。
AND は日本語だと「かつ」というね。よく使うので記号もあって「∧」と書くよ。この記号はそのままアンドと読んだりキャップと読んだりするね。でも以下では記号は使わず AND と書くよ。
でもまぁこの辺を説明し出すと AND の説明というより日本語の説明になっちゃうので辞書を引いてね!っていうか知ってるよね!
理解のために真理値表を書いておくよ。

命題 P 命題 Q P AND Q
T T T
T F F
F T F
F F F

文章で説明するより良くわかるね!って論理学を勉強したことないと分からないよね。T は True の頭文字で、真という意味。 F は False の頭文字で、偽という意味。真と偽っていうのは大雑把に言うと「事実が正しい」と「事実と違う」って感じかな。
例えば、上の表の「 P = ガンダムの本体重量」、「 Q = ガンダムの頭頂高」とすると

  • P = 43.4t 、 Q = 18m の場合は P AND Q = True
    • つまり、 (P = True) AND (Q = True) はガンダムの説明として真。
  • P = 43.4t 、 Q = 18000m の場合は P AND Q = False
  • P = 40000t 、 Q = 18m の場合は P AND Q = False
    • どちらか片方の命題が偽の場合だね。どちらかが違えばガンダムの説明として偽。
  • P = 60kg 、 Q = 1700mm の場合は P AND Q = False
    • つまり、(P = False) AND (Q = False) はガンダムの説明として偽。

ということになるね。(命題論理は推論の正しさを保障するだけで、命題の意味の正しさは考慮しないんだよね。それは述語論理の仕事らしい。)
(だんだんこの説明が合ってるのか不安になってきたよ!詳しいことが知りたかったら野矢先生の本か戸田山先生の本を読んでね!)

で、 NAND とは

上でも書いたように NAND というのは、 NOT AND の省略系なので、上に書いた真理値表の「 P AND Q 」の値を否定、つまり反転させてやればいいんだよ。

命題 P 命題 Q P NAND Q
T T F
T F T
F T T
F F T

真理値表の意味は分かるよね。具体的に使う状況は思い浮かぶかな?
ここでは例として、僕の Twitter の現在地欄の文を使うよ。「小川町交差点付近 NAND 栃木県南部」って奴。ちなみに小川町交差点というのは千代田区神田にあるよ。

  • (P = True) NAND (Q = True) は False
    • 僕が二ヶ所に同時に存在することはありえないよね。意味的にも偽で正しい。
  • (P = True) NAND (Q = False) は True
  • (P = False) NAND (Q = True) は True
    • この二つの場合は直感的に分かるよね。どっちかにいるってこと。意味的にも真で正しい。
  • (P = False) NAND (Q = False) は True
    • どっちにもいないってことだよ。例えば、小川町でも栃木でもなくて有明にいる、とか。正しいね。

というわけで、僕 (tobira17) の居る可能性のある場所について「小川町交差点付近 NAND 栃木県南部」という文は正しく表していることが分かったね。(まぁ僕が日本に住んでいるという前提を知っていれば、あまり意味のない説明文なんだけど。)

なんでこんな分かりづらい説明を書いたのか?

いやほんと説明に自信がなくなってきた。主に例として書いた論理式の使い方。
最近、論理学の勉強をやり直そうかなーとか思ってるんだよね。特に述語論理。野矢先生の「論理学」も戸田山先生の「論理学をつくる」も手元に残ってることだしね。
個人的にはプログラムを書くなら論理学は必修科目だと思ってる。まぁ日常生活で困らない程度に論理的に考えられるなら、まったく勉強していなくても書けるんだけど。
でも少しでも知ってるのと全く知らないのとじゃ if 文一つ書くのも大違いだと思うんだよね。テスト書いたりデバッグしたりってときにも役立つし。
僕と一緒にプログラム書く人には、できれば論理学だけじゃなくて離散数学コンピュータサイエンスも少しは知っていてくれたほうが良いなとも思う。まぁ知らなくても仕事は出来るし、人に何か言えるほど勉強してないんだけどさ。


書き忘れてたんだけど、 NAND (と NOR )は万能論理関数なんだよね。 NAND か NOR だけあれば、他の論理演算が全て実現できるんだ。 詳しくはグーグル先生に聞いてね
その性質がとても好きなんだよね。(論理的には)全て NAND (か NOR )だけで構成されてるって素敵じゃない?
万能論理関数の性質の素敵さには及ばないけど、 OS を作るって作業も最低限の道具だけ(ソフトウェア的にはプログラミング言語だけ)で始められるのが素敵だと思うんだよね。 C で作るにしても、その環境では最初は標準ライブラリすら使えないんだよ?