最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.06.23

17.22.プログラムに必要な予備知識1

[ Previous ] [ HOME ] [ Upper ] [ Next ]


このページでは、プログラムを作っているときに、知っておくと便利な知識をおさらいしていこうと思います。

集合にしようか命題にしようか、迷いましたが、命題を出すことにします。(うーん集合の方がわかりやすかなぁ...)

命題

命題

1つの判断又は主張を表す文章で、それが真であるか偽であるか判定できるものを命題という。命題は式や記号を用いてかけられてもよい。命題はp,q,r,...等の文字で表すことが多い。

命題の合成

いくつかの命題を組み合わせたり、有る命題を否定したりして出来る命題を、合成命題(複合命題)といい、元の個々の命題を単純命題という。

  1. pq (p または q p or q ) : p,q がともに偽である時に偽で、その他の場合には、真。

  2. pq  (p かつ q ; p and q ) : p,q がともに真である時に真で、その他の場合は偽。

  3. ltterp.gif (146 バイト)(〜pとも書く、pでない;not p) : pの否定でpが真のとき偽、偽のとき真。

合成命題の否定

  1. 2重否定 letterp2.gif (139 バイト) = p

  2. ド・モルガンの法則

letterporq.gif (681 バイト)= ltterp.gif (146 バイト)かつletterq.gif (145 バイト) 

letterpandq.gif (515 バイト)=ltterp.gif (146 バイト)またはletterq.gif (145 バイト)

命題の∨∧の計算法則

交換法則

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)

(以上、矢野健太郎監修:科学新興社「公式集」より)

※以下 ltterp.gif (146 バイト)を 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


[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送