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

第15回 論理の数学の基本[前編]

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

論理の数学は,これまでとは雰囲気が異なりまるでパズルのようです。取り扱うのは数値ではなく論理値ですし,加算や減算などの代わりに「かつ」「または」といった一見すると計算とは思えないコトバを使います。

なぜプログラマが論理の数学を学ぶ必要があるのでしょう。それは,論理の数学がプログラムの構造・動作を決定したり改善するのに役立つからです。

さて,ひとつのたとえを紹介します。優れた大工さんは優れた芸術家でもあります。美しく,無駄のない骨組み作りから仕事が始まります。その仕事ぶりは見るものを感動さえさせます。骨組みは,やがてコンクリや壁材の下になって見えなくなり,住む人にすばらしい姿が見えなくなります。しかし無駄なく適切に組み立てられた骨組みを持つ家は,風雪に耐え,長く強く存在し続けるでしょう。プログラマの仕事もこれとよく似ています。美しいソースコードは,コンパイルされてしまえばユーザの目に触れることはありません。しかし,無駄なく適切に作られたプログラムは,長くユーザに利便を与えて愛されることでしょう。プログラムの骨組みとは論理構造です。論理の数学は,理にかなって無駄がなく,美しいプログラムの骨組みをつくるために役立つのです。

今回は,しっかりと論理の数学の基本である,記号とその意味を学びましょう。

図15.1 美しい骨組みは性能の証

図15.1 美しい骨組みは性能の証

論理の数学の基本

論理記号

論理の数学で用いる記号には,いくつかの流儀があります。この連載では表15.1に示す論理記号を用います。論理和・論理積・論理否定が最も基本となる論理演算です。排他的論理和は3つの演算を用いて組み立てることができますから,最も基本となる論理演算とはいえません。しかし,特別に記号を作られるほどによく使われます。これら4つの記号と意味をしっかり覚えてください。

表15.1 論理記号一覧

名称(記号,読み)論理記号と論理式Java言語式の意味
論理和(+,オア)Z=A+Bz=a|bAまたはBのどちらかが真ならZが真になる
論理積(・アンド)Z=A・Bz=a&bAとBのどちらも真のときZが真になる
論理否定( ̄,ノット)Z=Āz=!aAが偽のときZは真になる
排他的論理和(⊕,エクスクルーシブ・オア)Z=A⊕Bz=a^bAかB一方のみが真のときZが真になる

論理積の記号・は論理式中では省略することがあります。一般の数式で乗算を表す×を省略するのと同じです。例えばZ=A・Bという式は,Z=ABと書いても同じ意味です。式を誤解する余地がなければ積極的に省略します。ただし,Java言語のソースコード中で論理積演算子&を省略することはできません。

論理の数学では論理変数を大文字のアルファベット一文字で表すのが通例です。Java言語では変数は小文字で始めるのが通例です。表15.1はその通例に従っています。

ショートサーキット演算子

Java言語には効率のよい論理演算をするために表15.2に示すショートサーキット演算子があります。

表15.2 ショートサーキット演算子一覧

名称(読み)演算子の使用例使用例の意味
ショートサーキット論理和(コンディショナル・オア)z=a||baが真ならbの真偽は確認せずzに真を代入
ショートサーキット論理積(コンディショナル・アンド)z=a&&baが偽ならbの真偽は確認せずにzに偽を代入

表15.2のショートサーキット論理和の使用例と意味の欄を見てください。z=a||bというプログラムが実行されたときに,boolean型変数aが真ならば,boolean型の変数bが真でも偽でも必ずzには真が代入されます。ショートサーキット論理和を用いていればJava言語はbの値を確認しないのです。この場合は実行の効率に大差がありません。しかし,もしbが大変実行時間のかかる「関数」であったら,「関数b」の実行を省くことができるショートサーキット論理和は有効です。

著者プロフィール

平田敦(ひらたあつし)

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

コメント

コメントの記入