IT用語集

ド・モルガンの法則とは? 10分でわかりやすく解説

水色の背景に六角形が2つあるイラスト 水色の背景に六角形が2つあるイラスト
アイキャッチ
目次

ド・モルガンの法則は、論理演算において非常に重要な法則です。ITシステムの設計や開発では、条件分岐・アクセス制御・検索条件(SQL)・監視ルールなど、複雑な条件式を日常的に扱います。ここでド・モルガンの法則を理解しておくと、「否定(NOT)」を含む式を安全に変形でき、読み間違いによるバグや運用トラブルを減らせます。

本記事では、ド・モルガンの法則の基本、よくある変形パターン、実務での使いどころ、そして「どこまで一般化できるか/何に注意すべきか」までを整理します。式の意味を保ったまま、分かりやすい形へ変形できるようになることがゴールです。

ド・モルガンの法則とは?

ド・モルガンの法則とは、命題論理における「否定(NOT)」と「論理積(AND)・論理和(OR)」の関係を示す法則です。ポイントは、否定が括弧をまたぐときに、AND/ORが入れ替わり、各項に否定が分配されることです。

ド・モルガンの法則の定義

ド・モルガンの法則は、次の2つで表されます。

  1. ¬(P ∧ Q) ≡ (¬P) ∨ (¬Q)
  2. ¬(P ∨ Q) ≡ (¬P) ∧ (¬Q)

ここで、PとQは命題(真/偽をもつ条件)を表します。¬は否定、∧はAND、∨はORです。

言い換えると、次のように覚えると実務で使いやすくなります。

  • NOT (A AND B) は (NOT A) OR (NOT B)
  • NOT (A OR B) は (NOT A) AND (NOT B)

なぜ重要か(実務で起きる“読み間違い”を防ぐ)

実務では、否定が絡む条件式が読みづらくなりがちです。たとえば「この条件を満たさない場合」のように、仕様が“否定形”で与えられることは珍しくありません。

ド・モルガンの法則を使うと、否定を括弧の外から中へ移して、条件を平坦化できます。これにより、条件式が短くなることもありますが、それ以上に「人間が読みやすい形に整える」効果が大きく、バグの予防に直結します。

命題論理との関係

ド・モルガンの法則は、命題論理(真偽値と論理演算)における基本的な同値変形です。論理式を同値変形しても意味(真偽が成立する条件)は変わらないため、設計・レビュー・テストの場面で「仕様の意味を保ったまま表現を変える」ための共通言語になります。

ド・モルガンの法則の基本的な使い方

ここでは、ド・モルガンの法則を「どんなときに」「どう使うと読みやすくなるか」を、式の形を中心に整理します。

論理式の簡単化(NOTを内側へ分配する)

例として、次の式を考えます。

¬(P ∧ (Q ∨ R))

括弧の外のNOTを内側へ入れていきます。まず外側のANDに対してド・モルガンを適用します。

¬P ∨ ¬(Q ∨ R)

次に、残った ¬(Q ∨ R) に対して、ORのド・モルガンを適用します。

(¬P) ∨ ((¬Q) ∧ (¬R))

このように、NOTが括弧をまたぐたびにAND/ORが入れ替わることを意識すると、手続き的に変形できます。

プログラミングでの活用(否定を減らして読む)

たとえば次の条件式は、否定が括弧をまたいでいて読みにくくなりがちです。

if (!(a && (b || c))) { ... }

ド・モルガンの法則で変形すると、次の形になります。

if (!a || (!b && !c)) { ... }

どちらが良いかは状況次第ですが、実務では「否定が外側に大きくかかっている」よりも「各条件に局所的に否定が付いている」ほうが、レビューで読み解きやすいことがあります。

なお、変形は可読性や仕様理解のために行うのが基本で、実行速度が必ず上がるとは限りません(コンパイラ最適化や短絡評価の影響もあるため)。まずは読み間違いを減らすことを優先するのが安全です。

論理回路設計への応用(NAND/NORでの実装)

論理回路では、NAND(NOT-AND)やNOR(NOT-OR)が部品として使いやすいことがあります。ド・モルガンの法則は、AND/ORとNOTの構造を入れ替えられるため、同じ機能をNANDだけ/NORだけで実現するといった設計の基礎にもなります。

たとえば、¬(P ∧ Q) は、そのままNANDです。逆に、(P ∨ Q) をNORとNOTの組み合わせで表現する、といった変形が可能になります。

具体的な適用例(ありがちな“仕様の言い換え”)

  1. アクセス制御(権限チェック)
    • 「AとBの両方を満たすユーザーだけ許可」を否定すると、¬(A ∧ B) となります。
    • ド・モルガンを使えば、(¬A) ∨ (¬B) =「Aがない、またはBがない」に分解できます。
    • ログやエラー理由(どの条件が不足か)を出したい場合、この形のほうが扱いやすいことがあります。
  2. SQLの検索条件(NOTの押し出し/押し込み)
    • WHERE NOT (A AND B) は、WHERE (NOT A) OR (NOT B) に同値です。
    • ただしSQLはNULL(未知)を含む三値論理が絡むため、NOTの移動で「意図しない行が増減」することがあります。NULLを扱う列がある場合は、IS NULL/IS NOT NULLを明示して意味を固定するのが安全です。
  3. 監視・アラート条件(“異常ではない”を分解する)
    • 「CPUが高くない かつ エラーが出ていない」など、“正常条件”をまとめてNOTで囲みたくなる場面があります。
    • その逆(異常条件)を作るときにド・モルガンで分解すると、アラート理由が明確になり、運用が楽になることがあります。

ド・モルガンの法則の発展的な話題

「発展」といっても、まずは安全に使える範囲を押さえるのが重要です。ここでは、一般化と、実務上の注意点(特に“二値ではない世界”)を中心に整理します。

ド・モルガンの法則の一般化(n個への拡張)

ド・モルガンの法則は2項だけでなく、複数項にも自然に拡張できます。

  • ¬(P1 ∧ P2 ∧ ... ∧ Pn) ≡ (¬P1) ∨ (¬P2) ∨ ... ∨ (¬Pn)
  • ¬(P1 ∨ P2 ∨ ... ∨ Pn) ≡ (¬P1) ∧ (¬P2) ∧ ... ∧ (¬Pn)

実務では、長いAND条件をまとめてNOTで囲った仕様(「全部満たさないなら…」)を、読みやすいOR条件へ分解する、といった形で登場します。

三値論理(NULLなど)では注意が必要

プログラミング言語の多くは二値(true/false)ですが、SQLのNULLや、一部の仕様(未知・未判定)を扱う世界では、論理が三値になることがあります。

この場合、ド・モルガン“そのもの”を機械的に当てはめると、意図とズレることがあります。特にSQLでは、NULLが混ざる条件で NOT を移動させると結果集合が変わることがあり得ます。

実務上は、次のような対策が現実的です。

  • NULLを取り得る列には、IS NULL / IS NOT NULL を明示する
  • 「未知」を許容するのか、排除するのかを仕様として先に決める
  • 変形後は、境界ケース(NULL/空/未設定)を含むテストデータで結果を比較する

ファジィ論理・量子・AIへの言及は“前提”を切り分ける

ド・モルガンの法則は古典的な二値論理の基本法則です。ファジィ論理や量子計算、AIなどの分野で“類似の関係”が議論されることはありますが、そこでのAND/OR/NOTは古典論理と同じ定義ではない場合が多く、前提を揃えずに一般論として語ると誤解が生まれやすい領域です。

実務記事としては、「古典論理の範囲(true/false)で確実に使える」ことを主軸にし、発展話題は前提が違うため単純には同一視できない、という整理に留めるほうが安全です。

まとめ

ド・モルガンの法則は、否定(NOT)が括弧をまたぐときにAND/ORが入れ替わり、各項に否定が分配されることを示す、論理演算の基本法則です。条件式を読みやすくしたり、仕様の否定形を分解して扱いやすくしたりする場面で、実務上の価値が大きい法則です。

一方で、SQLのNULLのように三値論理が絡む世界では、機械的な変形が意図とズレる可能性があります。変形は「同値」を保つための手段ですが、前提(真偽の定義)が変わると同値も揺らぐため、境界ケースの明示とテストが重要です。ド・モルガンの法則を“安全に使える道具”として身に付けることで、論理式の設計・レビュー・運用をより確実に進められるようになります。

FAQ

Q.ド・モルガンの法則は一言でいうと何ですか?

NOTが括弧をまたぐとき、AND/ORが入れ替わり、各項にNOTが分配されるという同値変形の法則です。

Q.NOT(A AND B) はどう変形できますか?

(NOT A) OR (NOT B) に同値です。

Q.NOT(A OR B) はどう変形できますか?

(NOT A) AND (NOT B) に同値です。

Q.実務ではどんなときに役立ちますか?

否定を含む条件式を読みやすくしたいとき、アクセス制御や監視ルールの“否定形仕様”を分解したいとき、複雑な条件をレビューしやすくしたいときに役立ちます。

Q.ド・モルガンで変形すると処理速度は上がりますか?

必ず上がるとは限りません。主目的は可読性と誤読防止です。性能は評価環境や最適化、短絡評価などに依存します。

Q.n個の条件にも使えますか?

使えます。NOT(全部AND)は「各NOTのOR」、NOT(全部OR)は「各NOTのAND」に一般化できます。

Q.SQLでも同じように使えますか?

基本は同値ですが、NULLが絡むと結果が直感とズレることがあります。IS NULL/IS NOT NULLの明示やテストで意味を固定するのが安全です。

Q.括弧の外のNOTを内側へ入れるコツはありますか?

NOTが括弧をまたぐたびにAND/ORを入れ替え、括弧の中の各項にNOTを付ける、と手順化すると迷いにくくなります。

Q.回路設計(NAND/NOR)との関係は何ですか?

AND/ORとNOTの配置を同値のまま組み替えられるため、NANDやNOR中心の実装へ変換する基礎になります。

Q.誤りを防ぐために注意すべき点は?

括弧の単位で変形すること、AND/ORの入れ替えを忘れないこと、三値論理(NULL等)が混ざる場合は結果比較テストを行うことが重要です。

記事を書いた人

ソリトンシステムズ・マーケティングチーム