Back To Main

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃ ◆Javaで珈琲ブレイク vol.014 ◆
┃……………………………………………………………………………………………
┃ [不定期] まぐまぐ ID=0000088576 Melma! ID=m00061296
┃……………………………………………………………………………………………
┃ 今回からご覧になる方は、バックナンバーご活用下さい
┃ http://javacafebreak.tripod.com
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


◆目次◆

■C#の参考書
■全事象と余事象
■ド・モルガンの法則(De Morgan's law)
■Question12にド・モルガンの法則を適用
■Question 13

皆さんこんにちは。


Mr.Hackです。やーっと長いようで短い、夏期講座が終わりました。終了直前にハードディスクが壊れたものの、クラスとしては、C#とASP.NETを扱い、とーーっても有意義なものでした。C#の基本から応用と、ASP.NETでのWeb Applicationの開発、いま話題のWeb Serviceといったものまで、Java陣営とはちょっと一線を画す内容でした。といっても、JavaでもWeb Serviceをサポートするなど、勉強する方向としては、間違ってないと思いました。さすがにM$と言うだけあって、Visual Studio.Netはお金をかけた自信作ですね。あーっという間に、簡単なWeb Applicationができてしまいます。

■C#の参考書
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

C#でWeb Applicaton等を勉強して見たい方は、Wrox社から出している、Professional C# 2nd Edition(http://www.amazon.co.jp等でProfessional C# (2nd Edition) として検索)はお勧めです。邦訳がでていれば買いですね(確認しましたら、上下巻という構成ででていました)。ASP.NETは深入りしていませんが、web serviceはもちろん、Visual Studio.Net全般を扱っていて、とてもためになります。XMLの章も面白いです。ただし、この参考書で勉強する場合は、Visual Studio.Netを何らかの方法で手に入れなければならないと思います。

機会があれば、授業で作った簡単なWeb ApplicationやVS.NETの設定の仕方や、Web Serviceの作り方などをお見せしようと思います。

さて、本題に戻りまして、前回の宿題から見ていきましょう。

■Question 12
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
以下の命題は正しいか否か答えよ。

1.

A:Mr.Hackは、まぐまぐとmelma!の両方のメールマガジンを購読している
訳ではない。
B:Mr.Hackは、まぐまぐを購読していないかmelma!を購読していないかの
どちらかである。

命題:AとBは同じことを言っている。

2.

C:Mr.Hackは、まぐまぐかmelma!のメールマガジンを購読している訳では
ない。
D:Mr.Hackは、まぐまぐを購読していないし、melma!も購読していない。

命題:CとDは同じことを言っている。

┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

1.と2.共に、命題は正しい(真)が正解です。僕のように、国語が苦手な方は、文章を読めば読むほど、訳が分からなくなってくるかもしれません。文字面を追ってはいけませんよ。うまく、ほかの記号等に置き換えて簡略化するのがポイントです。この解説をする前に、数学的な基礎知識を勉強しましょう。

■全事象と余事象
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

皆さんは、あるキャラクタ(char型の値)が数字であるか否かを確かめるためには、どうやって、Javaでチェックしますか?僕は、例えばこんな感じで数字である場合をチェックします。

┌──────────────────────────────────┐

char character = // あるキャラクタ
if (character >= '0' && character <= '9') {
//数字である場合のロジック
}
else {
//数字でない場合のロジック
}
└──────────────────────────────────┘

これは、キャラクタの'0'から'9'までは、ゼロから順番に1,2,3・・・と9までASCIIコードとして割り振られているのを利用したものです。つまり、

┌──────────────────────────────────┐

character >= '0' && character <= '9' <--->

character >= '0' かつ character <= '9' <--->

'0' <= character <= '9'

└──────────────────────────────────┘

ということですね。コンソール上から入力された『あるキャラクタ』が数字であるためには、その『あるキャラクタ』が、0以上9以下の範囲にあればいいことになりますね。


<------------------->
-----------+-------------------+-----------------------
0 9

は、

+---------------A------------------->
-----------!!!!!!!!!!!!!!!!!!!!!-----------------------
<---------------B-------------+
0 9

A: character >= '0'
B: character <= '9'
!!!!!!!!の領域は、AかつB

と同じことです。これは、数学的に言いますと、ASCIIコードを集合の全体(全事象、(U))と考えたとき、Aという領域は部分的な集合ですね。ですから、Aは部分集合といいます。Bも同じく部分集合です。そのAとBの共通な!!!!!!!!の領域を、部分集合(A)と部分集合(B)の『共通部分』("かつ”という言葉を使う)といいます。

『数字である場合』は上記のようにある程度簡単に、条件を見つけられました。それでは、下記のように、『数字ではない場合』をif節でチェックしたい場合はどうしましょう?

┌──────────────────────────────────┐

if (数字ではない場合) {
//数字ではない場合のロジック
}
else {
//数字である場合のロジック
}

└──────────────────────────────────┘

この場合、余事象という考え方を使います。

キャラクタは、必ずASCIIコードで表すことができますから、ASCIIコードを全事象としますと、

┌──────────────────────────────────┐
全てのキャラクタ = 『数字であるキャラクタ』+『数字ではないキャラクタ』
└──────────────────────────────────┘

となり、『数字ではない場合』は『数字であるキャラクタ』を除いたキャラクタということになります。これを、余事象といいます。ここでは、『数字ではない場合』が、『数字であるキャラクタ』の余事象です。視覚的に図で表しますと、『数字ではない場合』は

<----------> <----------------------->
-----------o-------------------o-----------------------
0 9

ということで、

o---------B------------>
|||||||||||+-------------------+||||||||||||||||||||||||
<----A----o
0 9

A: character < '0'
B: character > '9'
|||||||の領域は、AまたはB

と、|||||||で表すことができます。上記の視覚的な図を、式で表しますと、

┌──────────────────────────────────┐
|||||||の領域 = character < '0' または character > '9'
└──────────────────────────────────┘

と表せます。一方で、余事象を使って同じように|||||||の領域を表すと、

┌──────────────────────────────────┐

|||||||の領域 = 『数字でない場合
= NOT 『数字である場合』 ( !!!!!!!! ではない部分 )
= NOT (AかつB)
= NOT (character >= '0' かつ character <= '9')
= NOT (character >= '0' && character <= '9')

└──────────────────────────────────┘

と表現できます。つまり、

事実1
┌──────────────────────────────────┐

|||||||の領域 = character < '0' || character > '9'
= NOT (character >= '0' && character <= '9')

└──────────────────────────────────┘

となります。故に、数字ではない場合は、

┌──────────────────────────────────┐

if (character < '0' || character > '9') {
//数字ではない場合のロジック
}
else {
//数字である場合のロジック
}

└──────────────────────────────────┘

と表せます。

ここで、もっとわかりやすいように、character < '0'を部分集合(A)とおいてみましょう。そうするとAの余事象(character >= '0')は、NOT Aと表現できます。同じように、character > '9' を部分集合(B)と、Bの余事象(character <= '9')は、NOT Bと表現できます。

AとNOT Aの関係

<--- A ----o
-----------+-------------------+-----------------------
0 9
+-------------- NOT A ---------------------->

BとNOT Bの関係

<--------------- NOT B --------+
-----------+-------------------+-----------------------
0 9
o-------- B ----------->

そうしますと、事実1は

┌──────────────────────────────────┐
A || B = NOT (NOT A && NOT B)
└──────────────────────────────────┘

と書き直せます。A || B は、『数字でない場合』を意味し、(NOT A && NOT B)は、『数字である場合』を意味しますね。つまり、

┌──────────────────────────────────┐
『数字でない場合』= NOT 『数字である場合』
└──────────────────────────────────┘

となり、意味的にも一致しますね。『数字ではない場合』をelse節ではなく、if節に持ってくるために、図をずらずらと書いてやっと導き出しました。しかしながら、実はもっと簡単に導き出せる方法があるのです。ド・モルガンの法則です。


■ド・モルガンの法則(De Morgan's law)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

ド・モルガンの法則(De Morgan's law)によりますと、

┌──────────────────────────────────┐
NOT (A かつB) = (NOT A) または (NOT B)
└──────────────────────────────────┘

が成り立ちます。この法則をよーく見てください。今回のメルマガの最大のテーマです。()を否定(NOT)すると、()のなかの一つ一つの集合(A、B)をそれぞれ否定し、『かつ』も否定されます。『かつ』が否定されると、『または』になります。

このド・モルガンの法則をふまえた上で、上記の事実1、NOT (NOT A && NOT B)の部分を見てみましょう。()の否定はカッコ内のそれぞれの集合(NOT A、NOT B)をそれぞれ否定するので、NOT (NOT A)とNOT (NOT B)になります。そして『かつ』(&&)も否定されて『または』(||)になります。NOT NOT(二重否定)は肯定になりますので、

┌──────────────────────────────────┐

NOT (NOT A && NOT B) = ( NOT (NOT A)) || (NOT (NOT B))
= (A) || (B)
└──────────────────────────────────┘

となります。つまり、ド・モルガンの法則からも、

┌──────────────────────────────────┐
A || B = NOT (NOT A && NOT B)
└──────────────────────────────────┘

が正しいということが証明できました。

もう一度、数字の場合の条件文に戻りますと、

┌──────────────────────────────────┐

if (character >= '0' && character <= '9') {
//数字である場合のロジック
}
else {
//数字でない場合のロジック
}
└──────────────────────────────────┘

で、式評価の所を否定します(余事象をとる)と、ロジック部のif elseも逆になり、

┌──────────────────────────────────┐

if (NOT (character >= '0' && character <= '9')) {
//数字でない場合のロジック <-- ここも変化
}
else {
//数字である場合のロジック <-- ここも変化
}
└──────────────────────────────────┘

となりますね。NOT (character >= '0' && character <= '9')の部分は、ド・モルガンの法則により、

┌──────────────────────────────────┐
NOT (character >= '0') || NOT (character <= '9')
└──────────────────────────────────┘

となります。character >= '0'の否定は、余事象(character < '0')を意味しますので、

┌──────────────────────────────────┐
character < '0' || character > '9'
(両方とも >= ではなく > であるところに注意)
└──────────────────────────────────┘

となります。故に、

┌──────────────────────────────────┐

if (character < '0' || character > '9') {
//数字でない場合のロジック
}
else {
//数字である場合のロジック
}
└──────────────────────────────────┘

と書き直せます。ド・モルガンの法則をつかえば、else節にある『数字でない場合』のロジックをif節に簡単に書き直せますね。

このド・モルガンの法則を使えば、前回の宿題も容易に解くことができます。もう一度Question12に戻ってみましょう。

■Question12にド・モルガンの法則を適用
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓

A:Mr.Hackは、まぐまぐとmelma!の両方のメールマガジンを購読している
訳ではない。
B:Mr.Hackは、まぐまぐを購読していないかmelma!を購読していないかの
どちらかである。

命題:AとBは同じことを言っている。

┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

『Mr.Hackはまぐまぐを購読している』を a と置き、『Mr.Hackはmelma!を購読している』を b と置きましょう。

Aでは、『両方購読している』ことは、『a かつ b』ですね。また、上記のAでは、『ではない』と否定しているので、Aは

┌──────────────────────────────────┐
A:NOT (a かつ b)
└──────────────────────────────────┘

と表現できます。

Bはどうでしょう?まぐまぐを購読していないか、melmaを購読していないかなので、

┌──────────────────────────────────┐
(NOT a) または (NOT b)
└──────────────────────────────────┘

と表現できます。

Aで、ド・モルガンの法則を適用すると、

┌──────────────────────────────────┐
NOT (a かつ b) = (NOT a) または (NOT b)
└──────────────────────────────────┘

となり、BはAと同じことになります。

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓

C:Mr.Hackは、まぐまぐかmelma!のメールマガジンを購読している訳では
ない。
D:Mr.Hackは、まぐまぐを購読していないし、melma!も購読していない。

命題:CとDは同じことを言っている。

┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Cも同じように、

┌──────────────────────────────────┐
NOT (c または d)
└──────────────────────────────────┘

と表現でき、Dは、

┌──────────────────────────────────┐
(NOT c) かつ (NOT d)
└──────────────────────────────────┘

と表現できます。ここで、Cにド・モルガンの法則を適用し、

┌──────────────────────────────────┐
NOT (c または d) = (NOT c) かつ (NOT d)
└──────────────────────────────────┘

となり、CとDは同じことになります。

どうです?簡単に感じられましたか?そう感じられれば、あなたはもうド・モルガンの法則の虜です。

それでは、今週の宿題です。


■Question 13
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓

1.ある文字が、数字(0-9)、または大文字(A-Z)、または小文字(a-z)を含んでいれば、tureを返す(それ以外はfalseを返す)下記のメソッドを完成させよ。

boolean checkCharacter(char character) {
if (数字か大文字か小文字) {
return true;
}
else {
return false;
}
}

2.下記のメソッドが1.と同じ意味になるように、if文の条件conditionを設定せよ。

boolean checkCharacter(char character) {
if (condition) {
return false;
}
else {
return true;
}
}

┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

ヒント

ド・モルガンの法則を理解していれば、イージーだと思います。ド・モルガンの法則は、if文等の条件節を考える上で、とても便利かつ重要なので、数学的な背景は抜きにしても、その法則を使うと条件はどのように書き直せるのかを理解してくださいね。これを理解していると、次回のaccountIdのチェック、passwordのチェックはpiece of cakeです。

それでは、また会いましょう。

Mr.Hack


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
◆Javaで珈琲ブレイク◆
───────────────────────────────────
皆様からの激励・批判のメールをお待ちしております。
【発行者】 Mr.Hack - javacafebreak@hotmail.com
【掲示板】 https://javacafebreak.tripod.com/cafe_entrance.html
※質問は上記の掲示板からどうぞ。
【サイト】 http://javacafebreak.tripod.com
【発行数】 まぐまぐ[991] Melma[154]
【解除】http://javacafebreak.tripod.com
※解除は上記のサイトからいつでもできます。
────────────────────────────────────
(c)2002 MR.HACK ALL RIGHTS RESERVED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

© 2002 MR.HACK ALL RIGHTS RESERVED