このページでは、プログラムを作っているときに、知っておくと便利な知識をおさらいしていこうと思います。
集合にしようか命題にしようか、迷いましたが、命題を出すことにします。(うーん集合の方がわかりやすかなぁ...)
命題
命題
1つの判断又は主張を表す文章で、それが真であるか偽であるか判定できるものを命題という。命題は式や記号を用いてかけられてもよい。命題はp,q,r,...等の文字で表すことが多い。
命題の合成
いくつかの命題を組み合わせたり、有る命題を否定したりして出来る命題を、合成命題(複合命題)といい、元の個々の命題を単純命題という。
p∨q (p または q; p or q
) : p,q
がともに偽である時に偽で、その他の場合には、真。
p∧q (p かつ q ; p and
q ) : p,q
がともに真である時に真で、その他の場合は偽。
(〜pとも書く、pでない;not
p) : pの否定でpが真のとき偽、偽のとき真。
合成命題の否定
2重否定 = p
ド・モルガンの法則
=
かつ
=または
命題の∨∧の計算法則
交換法則
p ∨ q = q ∨ p ; p または q
= q または p
p ∧ q = q ∧ p ; p かつ q
= q かつ p
結合法則
(p ∨ q) ∨ r = p ∨ (q ∨ r) ; (p または q) または r
= p または (q または r)
(p ∧ q) ∧ r = p ∧ (q ∧ r) ; (p かつ q) かつ r
= p かつ (q かつ r)
分配法則
p ∧ (q ∨ r) = (p ∧ q) ∨ (p ∧ r) ; p かつ (q または r)
= (p かつ q) または (p かつ r)
p ∨ (q ∧ r) = (p ∨ q) ∧ (p ∨ r) ; p または (q かつ r)
= (p または q) かつ (p または r)
|
(以上、矢野健太郎監修:科学新興社「公式集」より)
※以下 を not p と書くことにします。
最も大事なのは、ド・モルガンの法則です。
p または q の全体の否定は、not
p かつ not q と同じ、と言うことです。
p かつ q の全体の否定は、not
p または not q と同じ、と言うことです。
ド・モルガンの法則を簡潔に表現すると、
ANDの全体否定はORの個別否定と同じ。
ORの全体否定はANDの個別否定と同じ。
そもそも、プログラムというのは、記号論理の一種なので、プログラム自体、命題の集まりみたいなものなのです。忙しいときにプログラムを作っていて条件分岐で、訳が分からなくなったことがある人もいるはずです。よく考えれば、大したことではないのです。
IF文
(i)
AFLD IFEQ 100 AFLD OREQ 150 (a) ELSE (b) ENDIF |
これは、AFLDが100 もしくは AFLDが150ならば、(a)をして、それ以外は(b)をする、ということですね。言い換えると、
(a)は、(AFLD=100) or (AFLD=150)
が真の場合に実行されます。
(b)は、(a)の成就条件を否定します(ELSE)ので、ド・モルガンの法則から、
not{(AFLD=100) or (AFLD=150)}
= not(AFLD=100) and
not(AFLD=150)
= (AFLD <>100) and
(AFLD <> 150) ;AFLDが100でなく、かつAFLDが150でもない。
が真の場合に実行される、ということになりますね。では、次の命題を見てみましょう。
(ii)
AFLD IFNE 100 AFLD ANDNE 150 (c) ELSE (d) ENDIF |
これは、AFLDが100でなく、かつ、AFLDが150でないならば、(c)をして、それ以外は(d)をするという命題です。言い換えると、
(c)は、{not(AFLD=100) and
not(AFLD=150)}
が真の場合に実行されます。これは、(b)が成就する場合と同じですね。
(d)は、 (c)の成就条件を否定しますので、
not[{not (AFLD=100) and not(AFLD=150)}]
= not[not
{(AFLD=100) or (AFLD=150)}]
= (AFLD=100) or (AFLD=150) (2重否定より)
が真の場合に実行される。つまり、(a)が成就する場合と同じですね。
結局、(i)も(ii)も同じ命題を裏返しに記述しているだけですね。
ELSEの見方
ELSEはRPGでは、必ずIF文とペアで使用されます。IFの命題が成就しない場合、つまりは、IFの否定命題です。集合で言えば、「補集合」のことですね。さて、このELSE人によっては、奇妙な指定をしている場合があります。
AFLD IFEQ 100 BFLD ANDEQ 150 ELSE (a) ENDIF |
なんてわざわざ、ELSE以下のみ記述している人もいますが、このELSE以下は、
not{(AFLD=100) and
(BFLD=150)}
なので、最初のnot(つまりELSE)をはずした形式では、
not(AFLD=100) or not(BFLD=150)
= (AFLD <> 100) or (BFLD<>100)
と同じですよね。つまり、
AFLD IFNE 100 BFLD ORNE 150 (a) ENDIF |
と同じ事はすぐに分かりますね。
その他
AFLD IFEQ 100 AFLD ANDEQ 150 .... ENDIF |
これは変ですね。AFLDが100 かつ AFLDが150なら...をする、という命題はありえません。なぜなら、AFLDが100でもあり150でもあり、なんて玉虫色の内容はあり得ないのです。永遠に成就しません。コンパイルで上記のようなミスは探してはくれません。結局これは、バグになります。
もし、ANDがORならば、正しいものになります。AFLDが100 もしくは AFLDが150なら..ならば、あり得ますね。
AFLD IFEQ 100 AFLD OREQ 150 .... ENDIF |
どうしても分からないとき
変数が含まれるIF分がネストし始めると、どこで、何が起きているのか、分からなくなるときがあります。このような場合は、もう、ドライに割り切って、デバッガーを使いましょう。
「60分悩むより、5分のデバッガー」
です。下手に悩み続けて、他の貴重なテスト時間を減らすくらいなら、すぐに、何も考えないで、STRDBGをして下さい。すぐに解決します。そのときの、おかしかったこと、は、必ず覚えて、同じミスをしないようにしましょう。
デバッガーの使い方に習熟するのも、プログラマーにとって、重要な事です。
1999/9/16 |