命題論理応用:ド・モルガンと対偶でSQLの条件式をシンプルに、賢く書く!

第1章:導入|前回の復習と今回の目的

◆ 前回のおさらい:命題論理の基本

前回の記事では、命題論理の基本的な考え方を解説しました。具体的には、以下のような内容を扱いました:

  • 命題とは何か?
    👉 「真」か「偽」のいずれかの値が定まる文
  • 命題を記号で表す理由
    👉 自然言語のあいまいさを排除し、厳密な推論を行うため
  • 真理値という概念
    👉 各命題に「True(真)」または「False(偽)」という値を割り当てることで、論理的な演算が可能に
  • 命題の組み合わせと論理演算子(AND / OR / NOT)
    👉 たとえば「AかつB(A ∧ B)」や「AまたはB(A ∨ B)」などの表現と真理値の対応

これらは、命題論理の「素材」とも言える重要な要素であり、論理式を扱う上での土台となります。

◆ 今回のテーマ:論理法則とその応用

今回の記事では、前回の基礎をさらに発展させ、以下のような命題論理の「ルール」や「テクニック」を解説していきます。

  • 連言・選言(AND / OR)の詳細
  • ド・モルガンの法則(NOTとAND/ORの関係)
  • 逆・裏・対偶(命題を変形する3つの方法)
  • 複数の法則を組み合わせた応用的な推論
  • SQLで実際にどう使えるか?

論理学は抽象的な学問ですが、SQLのWHERE句や条件分岐など、実務の現場でも頻繁に登場する場面があります。今回扱う内容を理解することで、より柔軟かつ正確な論理的思考ができるようになるでしょう。

◆ 次なるステップへの布石

そして、命題論理をしっかり理解しておくことは、次回以降に扱う「述語論理」へ進むための重要なステップでもあります。

本記事では、命題論理の「道具」から「使い方」への転換点を扱っていきますので、ぜひ一緒に確認していきましょう!

第2章:連言・選言とは?

◆「かつ(AND)」と「または(OR)」の意味

命題論理では、複数の命題をつなぎ合わせて新たな命題を作ることができます。その際によく使われるのが、次の2つの論理演算子です:

  • 連言(AND):「かつ」
  • 選言(OR):「または」

たとえば、以下のような命題があるとします:

  • A:「プログラミング経験が3年以上ある」
  • B:「データベーススペシャリストを保持している」

このとき、

  • A ∧ B(AかつB) は「プログラミング経験が3年以上あり、かつ、データベーススペシャリストを保持している」
  • A ∨ B(AまたはB) は「プログラミング経験が3年以上ある、または、データベーススペシャリストを保持している(あるいは両方)」

このように、2つの命題の内容を組み合わせて、より複雑な条件を表すことができます。

◆ 真理値表で確認しよう

連言(AND)と選言(OR)は、以下のような真理値表でその意味を厳密に確認できます:

ABA ∧ B(AND)A ∨ B(OR)
TrueTrueTrueTrue
TrueFalseFalseTrue
FalseTrueFalseTrue
FalseFalseFalseFalse

この表からわかるように:

  • AND(連言)は、両方がTrueのときだけTrueになります。
  • OR(選言)は、どちらか一方でもTrueであればTrueになります。

◆ 日常とのギャップに注意

日常会話での「または」は、「AまたはBのどちらか一方」と排他的に使う場合もあります。しかし、命題論理における OR は「どちらか、または両方」を含む「包含的選言」です。

たとえば、

  • 「りんご または バナナを買ってきて」と言われた場合

日常では「両方買うのはNG」のように受け取られることがありますが、論理学では両方買ってきてもOKという扱いになります。


このように、連言と選言の意味と違いをしっかり理解することで、今後の論理法則やSQL応用への理解がスムーズになります。

3. ド・モルガンの法則

命題論理の多くの法則の中でも、ド・モルガンの法則は特に強力で、複雑な条件式をシンプルにしたり、SQLクエリの最適化を考える上で欠かせません。この法則は、否定と論理積(AND)または論理和(OR)が組み合わさったときに、式をどのように変形できるかを示しています。

簡単に言えば、「否定の分配法則」のようなものだと考えると、直感的に理解しやすいでしょう。

3.1 ド・モルガンの第1法則:連言の否定

「連言の否定」は「否定の選言」に等しい、というのが第1法則です。

  • 記号で表現: ¬(P ∧ Q) = ¬P ∨ ¬Q
  • 言葉で表現: 「PかつQではない」は、「Pではない、またはQではない」と同値である。

具体的な例で考えてみましょう。

  • P:「私はコーヒーが好きだ」
  • Q:「私は紅茶が好きだ」

元の式 ¬(P ∧ Q) は、「私がコーヒーも紅茶も両方好き。ということはない」ことを意味します。

ド・モルガンの法則を適用すると ¬P ∨ ¬Q となり、「私はコーヒーが好きではない、または私は紅茶が好きではない」となります。

後者のほうが、なんとなくスッキリと理解できますね!

3.2 ド・モルガンの第2法則:選言の否定

「選言の否定」は、「否定の連言」に等しい、というのが第2法則です。

  • 記号で表現: ¬(P ∨ Q) = ¬P ∧ ¬Q
  • 言葉で表現: 「PまたはQではない」は、「Pではない、かつQではない」と同値である。

具体的な例で考えてみましょう。

  • P:「今日のテストは合格点だった」
  • Q:「今日のレポートは提出した」

元の式 ¬(P ∨ Q) は、「今日のテストが合格点であるか、あるいは、今日のレポートを提出した。という訳ではない」ことを意味します。
つまり、「テスト合格」と「レポート提出」のどちらか一つでも当てはまればOK」という条件を否定しているわけです。

ド・モルガンの法則を適用すると ¬P ∧ ¬Q となり、「今日のテストは合格点ではなかった、かつ今日のレポートは提出していなかった」となります。

こちらもやはり、後者の方がなんとなくスッキリとして見えます。

3.3 真理値表による検証

ド・モルガンの法則がなぜ成り立つのかを、真理値表を使って視覚的に確認してみましょう。真理値表は、命題の全ての可能な真偽値の組み合わせに対して、論理式の真偽値を示すものです。

第1法則: ¬(P ∧ Q) = ¬P ∨ ¬Q の検証

PQP ∧ Q¬(P ∧ Q)¬P¬Q¬P ∨ ¬Q
真(T)真(T)真(T)偽(F)偽(F)偽(F)偽(F)
真(T)偽(F)偽(F)真(T)偽(F)真(T)真(T)
偽(F)真(T)偽(F)真(T)真(T)偽(F)真(T)
偽(F)偽(F)偽(F)真(T)真(T)真(T)真(T)

表を見ると、¬(P ∧ Q) の列と ¬P ∨ ¬Q の列の真偽値が全て一致していることがわかります。これにより、両方の論理式が同値であることが証明されます。

第2法則: ¬(P ∨ Q) = ¬P ∧ ¬Q の検証

PQP ∨ Q¬(P ∨ Q)¬P¬Q¬P ∧ ¬Q
真(T)真(T)真(T)偽(F)偽(F)偽(F)偽(F)
真(T)偽(F)真(T)偽(F)偽(F)真(T)偽(F)
偽(F)真(T)真(T)偽(F)真(T)偽(F)偽(F)
偽(F)偽(F)偽(F)真(T)真(T)真(T)真(T)

こちらも同様に、¬(P ∨ Q) の列と ¬P ∧ ¬Q の列の真偽値が全て一致していることが確認できます。

ド・モルガンの法則は、一見すると難しそうに見えますが、真理値表で確認するとその論理的な正しさが明確になります。この法則を理解することで、複雑な条件式も柔軟に、そして意図通りに組み立てられるようになるでしょう。

4. 逆・裏・対偶の関係:正しい推論の形を見抜く

前章で基本的な論理演算子とド・モルガンの法則を学びました。ここからは、特に「PならばQ」という含意(条件文)の形で表される命題に焦点を当て、その関連命題である「逆」「裏」「対偶」について掘り下げていきます。

これらの関係を正しく理解することは、論理的な議論の妥当性を見抜く上で非常に重要です。なぜなら、日常生活では、ある命題が正しければ、その「逆」も正しいかのように誤用され、騙されてしまうケースが少なくないからです。
※これはまた別の記事で説明します。

4.1 含意とその関連命題

まず、「PならばQ」という含意(元の命題)から派生する「逆」「裏」「対偶」の関係を見ていきましょう。

  • 元の命題(含意): P → Q (PならばQ)
    • 例: 「雨が降るならば、道路が濡れる」
  • : Q → P (QならばP)
    • 元の命題の前提と結論を入れ替えたものです。
    • 例: 「道路が濡れるならば、雨が降る」
  • : ¬P → ¬Q (Pではないならば、Qではない)
    • 元の命題の前提と結論をそれぞれ否定したものです。
    • 例: 「雨が降らないならば、道路は濡れない」
  • 対偶(たいぐう): ¬Q → ¬P (Qではないならば、Pではない)
    • 元の命題の前提と結論を入れ替え、かつそれぞれを否定したものです。
    • 例: 「道路が濡れていないならば、雨が降っていない」

4.2 正しさの保証:元の命題と同値なのは「対偶」だけ

ここで最も重要なポイントは、元の命題と常に同じ真理値を持つ(同値である)のは「対偶」だけだという点です。「逆」や「裏」は、元の命題が真であっても、必ずしも真であるとは限りません。

先ほどの例で考えてみましょう。

  • 元の命題: 「雨が降るならば、道路が濡れる」
    • これは一般的にです。
  • : 「道路が濡れるならば、雨が降る」
    • これはになる場合があります。例えば、水をまいた、洪水があった、など雨以外の理由で道路が濡れることもあるからです。
  • : 「雨が降らないならば、道路は濡れない」
    • これもになる場合があります。雨が降っていなくても、誰かが水をまけば道路は濡れます。
  • 対偶: 「道路が濡れていないならば、雨が降っていない」
    • これは元の命題と同値であり、常にになります。道路が濡れていないのに雨が降っていたら矛盾しますよね。

このように、元の命題が真であっても、逆や裏は偽になることがあるため、これらを混同しないよう注意が必要です。しかし、対偶は常に元の命題と同値であるため、ある命題の真偽を証明したいときに、その対偶の真偽を証明するというテクニックが数学や論理学で頻繁に用いられます。

4.3 ド・モルガンの法則と対偶の組み合わせ

ド・モルガンの法則は、論理積や論理和の否定を変形する際に強力なツールでしたが、この対偶の法則と組み合わせることで、さらに複雑な条件式の理解や変形に役立ちます。

対偶の法則 (P → Q) = (¬Q → ¬P) は、含意の否定と論理演算子を変形する際にも使われます。

例えば、「PでもQでもないならばRである」という条件 (¬P ∧ ¬Q) → R を考えてみましょう。 この対偶は ¬R → ¬(¬P ∧ ¬Q) です。

ここで、ド・モルガンの法則 ¬(A ∧ B) = ¬A ∨ ¬B¬(¬P ∧ ¬Q) に適用すると、¬(¬P) ∨ ¬(¬Q) となり、さらに二重否定の法則(¬(¬A) = A)を適用すると、P ∨ Q になります。

したがって、¬(¬P ∧ ¬Q)P ∨ Q と同値です。

つまり、「PでもQでもないならばRである」という命題は、「Rではないならば、PであるかQである」という命題と同値になります。

論理学の深い理解は、このように複数の法則を組み合わせて複雑な論理を分解し、よりシンプルで理解しやすい形に変換する能力に繋がります。これは、SQLの複雑なWHERE句の条件を整理したり、プログラムのバグを見つけたりする際に、強力な武器となるでしょう。

6. SQLにおける命題論理の具体例:クエリを最適化する

ここまで学んできた命題論理の知識は、SQLクエリの作成、特にWHERE句での複雑な条件式を扱う際に非常に役立ちます。論理法則を理解することで、クエリの意図をより明確にし、時にはパフォーマンスの向上にも繋がることがあります。

6.1 WHERE句は論理式の宝庫

SQLのWHERE句は、まさに命題論理の概念がそのまま適用される場所です。WHERE句に記述される条件は、行ごとに真(True)か偽(False)を返す命題(述語)であり、ANDORといった論理演算子で結合されます。

例えば、以下のようなシンプルなクエリも、命題論理の観点から見ることができます。

SELECT employee_name
FROM Employees
WHERE age >= 30 AND department = 'IT';

このクエリでは、

  • P: age >= 30 という命題
  • Q: department = 'IT' という命題

ANDで結合されており、P ∧ Qという論理式が真となる行のみが結果として返されます。

6.2 NOT句の扱いとド・モルガンの法則の応用

NOTは、SQLでも非常に頻繁に使われる論理演算子ですが、その使い方によってはクエリが読みにくくなったり、意図しない結果を招いたりすることがあります。ここでド・モルガンの法則が強力な武器となります。

6.2.1 NOT (A AND B) の変形

「条件Aと条件Bの両方を満たさないレコード」を抽出したい場合を考えます。

  • 元の論理式: ¬(A ∧ B)
  • ド・モルガンの第1法則を適用: ¬A ∨ ¬B

SQL例: 例えば、「ステータスが’完了’であり、かつ2024年より前の注文ではない注文」を抽出したいとします。

-- 元のクエリ (読みにくい場合がある)
SELECT order_id, status, order_date
FROM Orders
WHERE NOT (status = 'Completed' AND order_date < '2024-01-01');

-- ド・モルガンの法則適用後 (より分かりやすいことが多い)
SELECT order_id, status, order_date
FROM Orders
WHERE status != 'Completed' OR order_date >= '2024-01-01';

このように変形することで、NOTのネストが解消され、それぞれの条件が何を否定しているのかが明確になります。多くの場合、!=< の逆の記号(>= など)を使った方が直感的です。

6.2.2 NOT (A OR B) の変形

「条件Aも条件Bもどちらも満たさないレコード」を抽出したい場合を考えます。

  • 元の論理式: ¬(A ∨ B)
  • ド・モルガンの第2法則を適用: ¬A ∧ ¬B

SQL例: 例えば、「カテゴリが’書籍’でもなくかつ在庫が0の製品でもない製品」を抽出したいとします。

-- 元のクエリ (これも読みにくい場合がある)
SELECT product_name, category, stock_quantity
FROM Products
WHERE NOT (category = 'Books' OR stock_quantity = 0);

-- ド・モルガンの法則適用後 (意図が伝わりやすい)
SELECT product_name, category, stock_quantity
FROM Products
WHERE category != 'Books' AND stock_quantity != 0;

この例でも、NOT (A OR B)NOT A AND NOT B に変形することで、クエリの意図がより明確になり、結果的にバグの温床を減らすことができます。

6.3 なぜド・モルガンの法則がSQLで役立つのか

  1. 可読性の向上: NOT (...) の形で条件がネストすると、特に複雑な場合は解読に時間がかかります。法則を適用してNOTを分解することで、論理が平坦になり、直感的に理解しやすくなります。
  2. バグの削減: 複雑な論理式は、人間の思考エラーを誘発しやすいです。法則に基づいて式を変形することで、意図しない解釈や誤ったロジックを排除しやすくなります。
  3. パフォーマンスの可能性: データベースのオプティマイザは、クエリの実行計画を最適化しようとします。NOTが含まれる条件は、インデックスが効きにくかったり、全件スキャンに繋がりやすかったりする場合があります。ド・モルガンの法則で条件を変形し、NOTを個々の述語に適用したり、!=>=などの比較演算子に変換することで、オプティマイザがより効率的な実行計画を選択できるようになる可能性があります。(ただし、これはRDBMSの種類やインデックスの設計に依存するため、常にパフォーマンスが向上するとは限りません。重要なのは「論理的に同値な別の書き方がある」ことを知っている点です。)

ド・モルガンの法則は、単なる数学の知識ではありません。SQLを「書ける」レベルから「意図通りに、効率的に、そして間違いなく書ける」レベルへと引き上げるための、強力な論理的な道具なのです。

7. まとめ

今回の記事では、命題論理の応用編として、ド・モルガンの法則逆・裏・対偶の関係について掘り下げ、これらの論理法則がSQLクエリの作成や最適化にどう役立つのかを具体例を交えて解説しました。

複雑な条件式も、ド・モルガンの法則を使えばシンプルに、そして意図を明確にして記述できることがお分かりいただけたのではないでしょうか。また、「PならばQ」のような条件文に含まれる論理的な罠を見抜き、正しい推論の形である「対偶」を活用する重要性も理解できたはずです。

これらの論理法則は、単にデータベースやプログラミングのスキルアップだけでなく、私たちが日常的に直面する問題の解決、思考の整理にも役立つ強力なツールです。論理的な思考力を磨くことは、ITエンジニアとして、あるいは数学を学ぶ者として、あらゆる分野で役立つ普遍的な能力と言えるでしょう。

さて、命題論理は論理学の基礎であり、私たちが扱うことのできる世界は限られていました。変数を含む「x > 5」のような文を「述語」と呼び、これを命題論理では深く扱えませんでしたよね。

しかし、次回からは、より表現力豊かな「述語論理」の世界へと足を踏み入れます。 述語論理では、「すべての〜」や「存在する〜」といった量的な関係や、変数を含むより複雑な命題を論理的に扱う方法を学びます。これは、SQLのWHERE句でEXISTSALLANYといった高度な機能を使う際の理論的背景にも繋がっていきます。

今回の記事で身につけた命題論理の知識を土台として、さらに広がる論理学の世界を一緒に探求していきましょう!どうぞお楽しみに。

タイトルとURLをコピーしました