なんか考えてることとか

変な人が主にプログラミング関連で考えていることをまとめる。

代数的データ型を論理回路で理解する記事

前回をより理解しやすくするための補足記事的なもの。
opaupafz2.hatenablog.com

今回、「代数的データ型」について、自分なりの解釈を述べていこうと思う。これによって前回の記事で自分が何を言いたかったのかより理解を深めていただければ幸いである。
注意してほしいのが、自分が理解しやすいように、本来数学的に解説すべきところを、論理回路的に解説している邪道な記事なので、そこはご了承いただきたい。

列挙型

列挙型は「n個のうち1個だけ値があった場合に成り立つ論理回路」だと考えることができる。以下にその論理式を示す。

  • n個の値を持つ列挙型

T = (V1 ・ ¬V2 ・ ... ・ ¬Vn) + (¬V1 ・ V2 ・ ... ・ ¬Vn) + ... + (¬V1 ・ ¬V2 ・ ... ・ Vn)

  • 例) 3個の値を持つ列挙型

T = (V1 ・ ¬V2 ・ ¬V3) + (¬V1 ・ V2 ・ ¬V3) + (¬V1 ・ ¬V2 ・ V3)

たとえば3個の値を持つ列挙型の場合、以下のような論理回路となる。

f:id:opaupafz2:20211227135226p:plain
直和回路

2個の値を持つ場合のみ、どちらか一方であれば良いため、排他的論理和として考えることもできる

  • 2個の値を持つ列挙型

T = (V1 ・ ¬V2) + (¬V1 ・ V2) = V1 ⊕ V2

しかし、排他的論理和は入力が3つ以上になると直和と等価ではなくなるので、あくまで「n個のうち1個だけ真だった場合に成り立つ回路」、言うなれば「直和回路」として考えたほうが良いだろう。そのため、今後は簡単のために直和回路は1つのICとしてまとめることとする。

f:id:opaupafz2:20211227140745p:plain
直和回路(IC)

直積型

直積型は「n個の型がすべてあった場合のみ成り立つ論理回路」、すなわちn端子AND回路だと考えることができる。以下にその論理式を示す。

  • n個の型を持つ直積型

Tdp = T1 ・ T2 ・ ... ・ Tn

ただのn端子AND回路なので、n端子AND回路1つだけで構成することが可能である。

f:id:opaupafz2:20211227143410p:plain
直積回路

直和型

直和型は「n個のうち1個だけ型があった場合に成り立つ論理回路」、すなわち先ほどIC化したn端子の「直和回路」として考えることができる。列挙型との違いは、入力が値ではなく型であることである

  • n個の型を持つ直和型

Tds = (T1 ・ ¬T2 ・ ... ・ ¬Tn) + (¬T1 ・ T2 ・ ... ・ ¬Tn) + ... + (¬T1 ・ ¬T2 ・ ... ・ Tn)

  • 例) 3個の型を持つ直和型

Tds = (T1 ・ ¬T2 ・ ¬T3) + (¬T1 ・ T2 ・ ¬T3) + (¬T1 ・ ¬T2 ・ T3)

列挙型と同様に考えることができるため、入力以外は列挙型と同様である。

f:id:opaupafz2:20211227145958p:plain
直和回路(直和型)

おまけ: C共用体

Cの共用体は、実は直和型というよりも直積型と似ているのだが、直積型と異なるのは、n個の入力をすべてショートさせている、という点である
つまり、論理式としては以下のような特殊な形となる。

  • n個の型を持つ共用体

T1 = T2 = ... = Tnであるとき、
U = T1 ・ T2 ・ ... ・ Tn = 1

なぜならば、Cの共用体は、たとえば2つのフィールドT1, T2を持つ場合、「T1であり、T2でもある」ためである。そのため、T1 = T2という条件を与えたうえで考えると、U = T1 ・ T2 = 1となる。

論理回路は以下のようになる。

f:id:opaupafz2:20211227153005p:plain
共用体回路