
こんにちは。iQeda [@iQeeeda] です。
前回、論理式 (命題の演算) について解説しました。
今回はより実際のプログラミングに近い真偽 (boolean) の考え方である、undefined を含んだ「3値論理」について解説します!
undefined (未定義) を含む論理「3値論理」
命題は必ず真偽どちらかの値をとります。 が、実際のプログラミングでは…
- エラーで強制終了する
 - 無限ループにはまる
 - 例外が発生する
 - 意図的に true も false も設定しない
 
といった理由で true にも false にもならない状況があります。
その場合、結果は undefined (未定義) という第三の値で表現されることがあります。
そして true ・ false ・ undefined という値を用いた論理のことを「3値論理」といいます。
条件付き論理積とは (&&)
- 3値論理での論理積の通称
- 条件付き論理積
 - conditional and
 - short-circuit logical and
 
 A && Bと表現できる- 3値論理じゃないときは 
A ∧ Bでしたね 
- 3値論理じゃないときは 
 
真理値表
| A | B | A && B | 説明 | 
|---|---|---|---|
| true | true | true | B の値と一致 | 
| true | false | false | B の値と一致 | 
| true | undefined | undefined | B の値と一致 | 
| false | true | false | A の値と一致 | 
| false | false | false | A の値と一致 | 
| false | undefined | false | A の値と一致 | 
| undefined | true | undefined | A の値と一致 | 
| undefined | false | undefined | A の値と一致 | 
| undefined | undefined | undefined | A の値と一致 | 
- A が true だったら B を調べるので、B の値が 
A && Bの値になる - A が false だったら B を調べるまでもないので、A の値が 
A && Bの値になる - A が undefined だったら B を調べるまでもないので、A の値が 
A && Bの値になる 
A && B は A の条件によって B を調べるかどうか判断しているのです。
 なので A && B と B && A では意味がまるで違います。(交換法則はない)
結果に影響する場合があるので、条件付き論理積では A と B の順番に注意してください。
プログラミングの if 文で書くと
if (A && B) { // 処理 } は以下と同じ意味です。
if (A) {
    if (B) {
        // 処理
    }
}
一般的に if 文の中に if 文が何個も入っていると読みにくいので、if (A && B) で if 文の数を減らせるならやっておいた方がいいです。
※ とはいえ && で複雑な条件をつなぎすぎると、かえって読みにくい場合があります。
条件付き論理和とは (||)
- 3値論理での論理和の通称
- 条件付き論理和
 
 A || Bと表現できる- 3値論理じゃないときは 
A ∨ Bでしたね 
- 3値論理じゃないときは 
 
真理値表
| A | B | A && B | 説明 | 
|---|---|---|---|
| true | true | true | A の値と一致 | 
| true | false | true | A の値と一致 | 
| true | undefined | true | A の値と一致 | 
| false | true | true | B の値と一致 | 
| false | false | false | B の値と一致 | 
| false | undefined | undefined | B の値と一致 | 
| undefined | true | undefined | A の値と一致 | 
| undefined | false | undefined | A の値と一致 | 
| undefined | undefined | undefined | A の値と一致 | 
- A が true だったら B を調べるまでもないので、A の値が 
A || Bの値になる - A が false だったら B を調べるので、B の値が 
A || Bの値になる - A が undefined だったら B を調べるまでもないので、A の値が 
A || Bの値になる 
プログラミングの if 文で書くと
if (A || B) { // 処理 } は以下と同じ意味です。
if (A) {
    // 処理
} else {
    if (B) {
        // 処理
    }
}
こちらも if 文の数が多いので if (A || B) でまとめておいた方が読みやすいですね。
否定とは (!)
- 3値論理での否定
 !Aと表現できる- 3値論理じゃないときは 
¬Aでしたね 
- 3値論理じゃないときは 
 
真理値表
| A | !A | 
|---|---|
| true | false | 
| false | true | 
| undefined | undefined | 
ド・モルガンの法則
前回の記事で「ド・モルガンの法則」というものを紹介しました。
- 「A ではない、 または B ではない」と「A かつ B ではない」は同じ意味
 - 「A ではない、 かつ B ではない」と「A または B ではない」は同じ意味
 
これは3値論理でも適用できます。
(!A) || (!B) = !(A && B)(!A) && (!B) = !(A || B)
もし if 文の条件の書き方が気持ち悪いな〜と感じる場合、
ド・モルガンの法則で条件をわかりやすく整理できるかもしれませんよ。
CS シリーズ
次回
前回
お仕事ください!
僕が代表を務める 株式会社 EeeeG では Web 制作・システム開発・マーケティング相談を行っています。 なにかお困りごとがあれば、Twitter DM や Web サイトからお気軽にご相談ください。
カテゴリ「CS」の最新記事

    
                  【ロードマップ】文系の元ラーメン屋が学んだコンピュータサイエンス                
                  【データ構造】「木とグラフ・探索アルゴリズム」をわかりやすく解説                
                  【データ構造】キューとスタックの使い方を解説!【実用例たっぷり】                
                  【データ構造】連結リスト・ランナーテクニックを解説!【頻出問題】                
                  【データ構造】面談対策!文字列・配列の問題解説【ハッシュテーブル】                
                  TerraformによるLinodeインスタンス新規作成サンプル                
                  【Fingerprint】CircleCIがSSHできない問題解決                
                  【Laravel】セッションタイムアウト後のログイン処理で前回URLに遷移するバグ修正                
                  M1 Mac(2021)でanyenv/phpenvの初期設定!                
    
    
    
    
    
    
    
    
    
    
    
コメント