ブール式ソルバー

部分式の列を伴うステップごとの真理値表

インタラクティブシミュレーションを読み込んでいます...

最も多くを説明する変数を選ぶ 🖖

有用なハードウェアのコツ:TRUE/FALSEの動作を最もよく分離する入力を選択し、各ブランチを実装してその入力でマルチプレクスします。

すべての可能性に1行ずつ 🖖

真理値表とは、要するにすべてを尽くした一覧です。TRUE/FALSE の入力のあらゆる組み合わせを書き出し、それぞれで式がどうなるかを示します。変数が n 個なら行数は 2ⁿ となり、入力が1つ増えるたびに表はになります。変数3個なら8行、5個なら32行です。途中の列も大切で、各部分式を一段ずつ組み立てるので、最終結果を鵜呑みにせず、演算子ごとに論理を追えます。

32行、40億通りの関数 🖖

ここが意外な点です。5変数の表はわずか32行なのに、そこに定義できる異なる式の数は 2³² = 4,294,967,296 通りもあります。出力列を0と1で埋める埋め方の一つ一つが、それぞれ別のブール関数であり、全部で 2^(2ⁿ) 個存在します。つまりこの小さなツールは、40億を超える論理回路の空間を静かに動き回っているのです。最後の列が取りうるパターンごとに、1つずつ。

論理式 — どの法則がこれを簡単にするのか

あなたはどの簡略化のケースにいますか?

二つの式が同じ式であるのは、真理値表が一致するとき、ちょうどそのときだけです。決着をつける試験はそれひとつ。ブール代数の法則とは、見てすぐわかる価値のある一致にすぎません。否定を内側へ押し込む、括弧を展開する、何も変えない項を落とす、そしてほかの項がすでに覆っていた項を見抜く。表を作れば答えは疑いようがなくなります。

括弧の上に乗った否定 — ド・モルガンは結合子を入れ替える ¬(A ∧ B) = ¬A ∨ ¬B
展開すべき括弧 — 分配法則 A ∧ (B ∨ C) = (A∧B) ∨ (A∧C)
何も足さない項 — 吸収法則 A ∨ (A ∧ B) = A
ほかの項がすでに覆っている項 — 合意の定理 (A∧B) ∨ (¬A∧C) ∨ (B∧C) = (A∧B) ∨ (¬A∧C)
式が入力にまったく依存しなくなる A ∨ ¬A = 1

01

括弧の上に乗った否定 — ド・モルガンは結合子を入れ替える

わかっていること: 式全体にかかった否定。内側へ押し込むと AND は OR に、OR は AND になり、そのついでに各部分が否定されます。

法則: ¬(A ∧ B) = ¬A ∨ ¬B

計算例: !(A & B) は !A | !B と同じ式で、二つの出力の列は 4 行すべてで一致します

このケースを開く: ド・モルガン !(A & B)
括弧の上に乗った否定 — ド・モルガンは結合子を入れ替える. 否定を内側へ押し込むと AND は OR になり、二つの出力の列は同一になります。 式全体にかかった否定。内側へ押し込むと AND は OR に、OR は AND になり、そのついでに各部分が否定されます。
否定を内側へ押し込むと AND は OR になり、二つの出力の列は同一になります。

02

展開すべき括弧 — 分配法則

わかっていること: AND は OR に対して、掛け算が足し算に対してするのとまったく同じように分配します。展開すると積の和になり、これが式から回路を組むときの標準形です。

法則: A ∧ (B ∨ C) = (A∧B) ∨ (A∧C)

計算例: A & (B | C) は (B | C) を展開した (A & B) | (A & C) と同じで、3 変数 8 行すべてで一致します

このケースを開く: A & (B | C)
展開すべき括弧 — 分配法則. 括弧を展開すると二つの積の項が出て、その OR がもとの式と一致します。 AND は OR に対して、掛け算が足し算に対してするのとまったく同じように分配します。展開すると積の和になり、これが式から回路を組むときの標準形です。
括弧を展開すると二つの積の項が出て、その OR がもとの式と一致します。

03

何も足さない項 — 吸収法則

わかっていること: 一方の項がすでに他方を含んでいるなら、弱いほうは落とせます。A | (A & B) は B が何であれ、ただの A です。

法則: A ∨ (A ∧ B) = A

計算例: A | (A & B) = A。A が 1 の行では出力はどのみち 1 で、A が 0 の行では第 2 項も 0 です

このケースを開く: 吸収法則
何も足さない項 — 吸収法則. 第 2 項は第 1 項がすでに立っている場所でしか立たないので、出力に影響しません。 一方の項がすでに他方を含んでいるなら、弱いほうは落とせます。A | (A & B) は B が何であれ、ただの A です。
第 2 項は第 1 項がすでに立っている場所でしか立たないので、出力に影響しません。

04

ほかの項がすでに覆っている項 — 合意の定理

わかっていること: 3 つの項のうち 3 番目が前の 2 つの合意になっている場合。それが覆うのは前の 2 つが合わせて覆う場合だけで、取り除いても表のどの行も変わりません。

法則: (A∧B) ∨ (¬A∧C) ∨ (B∧C) = (A∧B) ∨ (¬A∧C)

計算例: (A & B) | (!A & C) | (B & C) は (A & B) | (!A & C) に等しく、第 3 項は 8 行すべてで余分です

このケースを開く: 合意定理
ほかの項がすでに覆っている項 — 合意の定理. 第 3 項を落としても、出力の列はどの行でも変わりません。 3 つの項のうち 3 番目が前の 2 つの合意になっている場合。それが覆うのは前の 2 つが合わせて覆う場合だけで、取り除いても表のどの行も変わりません。
第 3 項を落としても、出力の列はどの行でも変わりません。

05

式が入力にまったく依存しなくなる

わかっていること: すべて 1 の列は恒真、すべて 0 の列は恒偽です。どちらの場合も変数はもう効いていません。

法則: A ∨ ¬A = 1

計算例: A | !A はどちらの行でも 1、その鏡像 A & !A はどちらの行でも 0 です

このケースを開く: トートロジー A | !A
式が入力にまったく依存しなくなる. どちらの行も同じ出力になるので、入力にはまったく影響力がありません。 すべて 1 の列は恒真、すべて 0 の列は恒偽です。どちらの場合も変数はもう効いていません。
どちらの行も同じ出力になるので、入力にはまったく影響力がありません。
参考文献 (2)

全プロセスの詳細解説

  1. 式!(A & B)の最小項の和 5 ステップ

    2つの変数AとBにおける式は!(A & B)です。結果が1になる行の数を数え、この関数を最小項の和として書き、この1つのゲートだけから何が構築できるかを解き明かしてください。

    1. 変数は2つあり、それぞれ0または1の値を自由にとるため、表にはペアごとに1つの行が割り当てられます。パーサーは何かを評価する前にその行数を報告します。なぜなら問題の規模は、その上に書かれた式ではなく変数によって定まるからです。

    2. まず内側の列を埋めます。A & Bは両方の入力が1のときのみ1になるため、3つの行は0、最後の行は1となります。表はこの部分式を結果の隣に独自の列として出力するため、答えだけでなく構文解析結果も確認できます。

    3. NOTはすべてのエントリを反転させ、それ以外の動作は行いません。3つの0は1になり、1つの1は0になるため、結果の列は上の列のちょうど反対となります。

    4. これにより、全4行のうち3行で結果が1となります。分数では0.75となり、パネルには入力の組み合わせに対する割合として表示されます。

    5. 真となる各行を、その行でのみ1となり他の行では1とならない連言(すなわち最小項)によって命名し、それら3つをORで結合します。これが主選言標準形であり、ツールが表の下に出力するリストです。

    解答

    NANDは4行中3行(75.0%)で1となり、その標準形はこれら3つの最小項となります。 ここからが成果です。両方の入力にAを入力すると、A NAND A!(A & A)となり、これは!Aに等しくなります——これでNOTが得られました。1つのNANDの出力を別のNANDの両方の入力にフィードバックすると、2つの否定が相殺されるため、(A NAND B) NAND (A NAND B)はANDになります。ORの場合は、まず両方の入力を否定します。(A NAND A) NAND (B NAND B)!(!A & !B)となり、!A & !Bは単一の行0,0でのみ1となるため、その否定は他の3つの行で1となります——これがA OR Bです。NOT、AND、ORはステップ5で関数を標準形として記述するために使用したまさにそのものであり、したがってこの1つの4行の列は、任意の変数個数のあらゆるブール関数を表現できます。

  2. !A | !Bのための列のゼロからの構築 6 ステップ

    次に!A | !Bを取り上げます。これは!(A & B)と演算子を全く共有していません——括弧の否定も、どこにもANDもありません。その列を一から構築し、どこに行き着くかを確認しましょう。

    1. 2つのNOTの列があり、どちらも結果の隣に出力されます。!AはAが0である2つの行で1となり、!BはBが0である2つの行で1となります。それらは1つの行で一致し、1つの行でともに不成立となります。

    2. ORは両方の入力が0である場合にのみ0となり、それはまさに1つの行、すなわちA=1、B=1の否定のどちらも残らない行で発生します。他のすべての行には、少なくとも1つの1が含まれています。

    3. したがって、4行中3行が1となります——同じ0.75であり、同じパーセンテージとして表されます。

    4. 最小項も一致し、最初の問題と項ごとに同じ順序となります。

    5. ここで、表を一切使わずに2つの式を比較してみましょう。A & Bはまさに1つの行で1となるため、!(A & B)はまさにその行で0となり、それは!A | !Bを不成立にしたのと同じ行です。同じ場所で0になり、他のすべての場所で1になる2つの列は、同じ1つの列です。

    6. これにはどれほど感銘を受けるべきでしょうか?4行の真理値表には4つの結果セルがあり、それぞれが0または1となるため、2つの変数が取り得る個別の関数は全体で16個しかありません。それほど小さな集合の中で一致することは容易です——だからこそステップ5が重要な意味を持ちます。それは1つの行を固定し、残りを数えることがなかったからです。

    解答

    両方の式は、同じ3つの最小項により75.0%という結果になります。なぜなら、それらは2つの名前を持つ1つの関数だからです。 主標準形は指紋のようなものです。2つの式が等価であるのは、最小項の集合が一致するときに限られます。したがって、2つの回路が同じように動作するかどうかという問題は、2つのリストが一致するかどうかという問題に帰着されます。帰着されないのは、リストを構築するコストです。2変数には4行が必要であり、それは頭の中で計算できました。20変数には1,048,576行が必要となり、100変数にはおよそ1.27×10³⁰行が必要となります。表が手法として成り立たなくなっても、指紋の考え方は依然として正しいアプローチです。ステップ5の行ごとの議論こそが、この飛躍を乗り越えて生き残るものです。なぜなら、そこでは行数が何行あるかに一度も言及しなかったからです。

例題