はじめMath! Javaでコンピュータ数学

第19回論理代数の公式[前編]

論理の数学にはいくつかの演算公式があります。ぜひ記憶しましょう。むやみに暗記するのではなく、公式集を片手にいくつかの練習問題を解けば自然と覚えてしまうことでしょう。

技術には頭で理解し覚える性質のものもあれば、体を動かしてみなければわからないものもあります。のこの挽き方、釘の打ち方、かんなの使い方をいくら口で教わっても、自分で出来るようにはなりません。およその方法を理解したら、あとは繰り返しやってみるしかありません。計算力をつける方法は、理屈を理解したら、あとはひたすら手を動かしてみることです。一通り今回の記事を読まれたら、出来るだけ数多くの問題で練習して下さい。

図19.1 練習こそ上達の道
図19.1 練習こそ上達の道

論理代数の定理・公式

論理の数式計算のことを論理代数といいます。論理代数には、論理を計算に見立てて式を変換・変形するための定理や公式があります。数式といっても、取り扱うのは整数や実数ではなく論理値です。取り扱う値が違いますから、おのずと定理・公式も数値を取り扱うときとはずいぶん異なります。慣れるしかありません。

長い論理式をシンプルな形に変換できるということは、複雑だったプログラムをシンプルに書き換えることが出来ることを意味しています。この効果は絶大です。是非とも身につけましょう。

全てを一度に覚える必要はありませんから、先ずは一通り眺めてみてください。

公理

式19.1、19.2はそれぞれ真の反対は偽、偽の反対は真だ、という論理代数の前提・原則です。公理といいます。

論理値は真か偽の2つしかなく、お互いに反対の関係にあるということを宣言しています。論理値は何かの条件式、命題を評価した結果です。真か偽、どちらかの値を取り、一方の反対、すなわち否定がもう一方の値なのです。

この公理を活かすシーンを紹介しましょう。整数変数iの値が0より大きい場合に何かの処理をしているとしましょう。その時の条件式はi>0です。この式の評価の結果が真ならばある処理を行っていたとします。この逆の場合の処理を加えたい場合は次のように書くことが考えられます。

int i = 1;
if (i > 0) {
  System.out.println("処理A");
} else {
  System.out.println("処理B");
}

さて、条件が真の場合の処理が必要なくなり、その逆の場合の処理Bのみが必要になったらどうしましょう。処理Aの行をコメントアウトする方法もありますが、最終的なコードをよりシンプルにしたいとします。

ひとつの方法は条件式を書き換えることです。そこで、次のように書きました。

int i = 1;
if (i < 0) {
  //if (i > 0) {
      // System.out.println("処理A");
  //} else {
  System.out.println("処理B");
}

コードがシンプルになり、一件落着、と思いたいところですが、落とし穴が潜んでいます。どこだかわかりますか?

条件式i>0でない場合とは、i<=0ですね。簡単なようで、実はよくやってしまいがちなケアレスミスです。

こんなミスを防ぐために、論理の数学が役に立ちます。条件式の評価結果は論理値です。⁠ある場合」ではない場合とは、ある条件式の評価結果が偽のときに真ととらえること、すなわち否定の演算をするのです。シンプルに、!(i>0)と書けば完成です。これならソースコードの修正がずいぶん簡単で、ミスの入り込む余地もありません。

int i = 1;
if ( !(i>0) ) {
  //if (i > 0) {
      // System.out.println("処理A");
  //} else {
  System.out.println("処理B");
}

論理演算子をつかうメリットは、Java言語の制御構文(else)を使うよりも短くシンプルに論理的に否定の場合を記述できることです。積極的に使いましょう。

公理その2、あるいは零元則

式19.3は論理演算の原則を表しています。すなわち、偽であることと論理積を取ったら必ずその結果は偽であると宣言しています。

具体的な例にあてはめてみましょう。論理値Aは「ある人が橋を渡ること」を示すとします。論理値Bは「そこに橋があること」を表すとします。ある人が橋を渡るためには、これら両方が成立しなければなりません(真でなければならない)から、AとBの間の演算子は「~かつ~」を表す論理積です。式はA・Bとなります。さて、今ここに橋がないとします。すると、論理値Bは常に偽です。常に値が変化しませんからBは定数0で置き換えましょう。式はA・0となります。橋を渡りたくても、渡りたくないとしても、橋がないのですから、常に橋を渡ることは起こりません。つまり、この場合「ある人が橋を渡る」という事柄は常に偽となります。よって、A・0=0です。

真理値表を作ってみましょう。

表19.1 式19.3の真理値表
A0A・0
000
100

論理式に対して、いつもいいたとえ話が見つかるとは限りません。論理式がすっきり納得できない場合には、真理値表を作るのが一番です。

式19.4も論理演算の原則です。すなわち、真であることと論理和を取ったら、必ずその結果は真であると宣言しています。

単位元則

式19.5、19.6も零元則に続いて論理代数の原則を示すものです。

式19.5は、常に真であるものと、真偽が定まらない論理値Aの論理積は、Aの真偽が決定すると決まることを表しています。夫婦で物事を決める際の理想ですね。

式19.6は、常に偽であるものと、真偽が定まらない論理値Aの論理和は、Aの真偽が決定すると決まることを表しています。まるで夫婦の一方相手にお構いなしの場合の意志決定ですね。

問題:今回学習した論理代数の公式を、真理値表を作って公式の左辺と右辺が等しいことを確認しましょう。

(1)式19.4 A+1=1を確認しましょう。

(2)式19.5 A・1=Aを確認しましょう。

(3)式19.6 A+0=Aを確認しましょう。

解説

それぞれの式の真理値表を作成して、左辺と右辺の一致することを確認しましょう。地道な作業ですが、今後どんな論理式を立てるにしても、これこそが最も確実な確認方法です。

(1)式19.4 A+1=1を確認しましょう。

表19.2 式19.4の真理値表
A1A+11
0111
1111

真理値表から、確かに左右の辺は一致します。

(2)式19.5 A・1=Aを確認しましょう。

表19.3 式19.5の真理値表
A1A・1A
0100
1111

真理値表から、確かに左右の辺は一致します。

(3)式19.6 A+0=Aを確認しましょう。

表19.4 式19.6の真理値表
A0A+0A
0000
1011

真理値表から、確かに左右の辺は一致します。

今回はここまで

いかがでしたか?真理値表をつくり、左辺と右辺が等しくなることを確かめると、不思議とすっきり納得できたのではありませんか?繰り返しになりますが、真理値表を作ることが最も確実な論理の確認方法です。論理式の確認を行うときは手間をいとわず真理値表を作るようにしましょう。次回、中編では残りの公式を紹介します。⁠しっくりこなければ真理値表」を合い言葉に取り組んでくださいね。

おすすめ記事

記事・ニュース一覧