前の記事では高校で習う「対偶」を知らないと論理的な問題を間違うということを示しました。対偶というのは決して難しい概念ではないので、覚えておかないのは損です。
同じように、簡単だから覚えておくと良い知識として、ド・モルガンの法則というのがあります。誰にとって良い知識なのかというと、ソフトウェアの開発に携わる人全般です。高校の数学で習うので理系の人は全員知っている筈ですが、文系の学部を出てSEになったような人には、忘れちゃっている(もしくは最初から知らない)人もいるかと思います。
ド・モルガンの法則というのは集合や論理についての有名な法則です。
例えば、プログラミング言語で、こういうif文があったとします。
if (!(a == b && c == d)) { ...
上の条件式は、下のように書くのと全く同じことです。
if ((a != b) || (c != d)) { ...
最初の例では、!記号によって、ANDでつながれた括弧のなか全体を否定しています。それと等価なのは、2番目の例のように、それぞれの項を否定したうえでORでつないだ条件式だということです。このような変形が可能だというのがド・モルガンの法則です。
本当かどうかを確かめるのに、式に具体的な値を入れて考えてみると良いでしょう。例えば、aとbが違うときは、最初の例は a == b が成り立たないので、&&でつながれている括弧のなか全体が即座にfalseになり、それが最初の ! で否定されて条件文全体はtrueになります。一方2番目の例では、最初の括弧の中がtrueになって、|| でつながれている一方が成立するから、この時点で条件文全体もtrueになります。両者の式が同じ意味を表すことはこうして分かります。
ありがちな間違いは、最初の例を変形するのに、下のようにしてしまうことです。
if ((a != b) && (c != d)) { ...
否定を括弧の中のそれぞれの項に適用したときに、項をつないでいるANDをORにしなければいけないのに、それを怠っている例です。これでは、意味するところが最初の条件式と違ってしまいます。ド・モルガンの法則を知らないとこういう誤ちを犯しがちです。(実際私は、ド・モルガンの法則を知らないSEがこのパターンの誤ちを犯したのを目撃したことがあります。それでこういうブログ記事を書こうと思ったのです)
この法則を知ることが重要なのは、業務システムで使われる条件判断の式を定義したりメンテナンスしたりするような場面においてです。自分でプログラミングをしない人でも、システムの開発に携わっていれば、条件判断を定義したりする機会はあるでしょう。そんなときこの法則を知らないと、ちょっと込み入った条件式を定義するときに、誤った式を作ってしまいます。
ところで、上ではプログラミング言語的な書き方をしましたが、数学的に論理記号を使って書くと下のようになります。上の例との対応を確認してみてください。¬は否定、∧はAND (論理積)、∨はOR (論理和)の記号です。
¬(P ∧ Q) = ¬P ∨ ¬Q
同様に、下の式も成り立ちます。これもド・モルガンの法則です。
¬(P ∨ Q) = ¬P ∧ ¬Q
コメントする