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

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

この記事を読むのに必要な時間:およそ 2 分

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

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

図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です。

著者プロフィール

平田敦(ひらたあつし)

地方都市の公立工業高等学校教諭。趣味はプログラミングと日本の端っこ踏破旅行。2010年のLotYはRuby。結城浩氏のような仕事をしたいと妄想する30代後半♂。

コメント

コメントの記入