dhrnameのブログ

プログラミング関連を語るよ

データ構造化における抽象化の定義 - 構造化プログラミングにおける覚え書きその5

データ構造化における抽象化の定義

前回

オブジェクトクラス同士でのダイクストラ連接 - 構造化プログラミングの覚え書きその4 - dhrnameのブログ

ホーアの「データ構造化序論」

 75年に翻訳され出版された『構造化プログラミング』*1の第二部で、ホーアは「データ構造化序論」を執筆した。ホーアによれば、ダイクストラとウィルトの助言に従って、この論を書いた。その論に従い、「抽象(abstraction)」、あるいは、「抽象化」について定義していこう。

抽象化の四段階

 一般に、抽象は、人間の思考の上で重要な役割をになう。それ以上に、プログラミングとは深い関係がある。「データ構造化序論」の中で、ホーアは抽象について次のように述べた。

複雑な現象を理解してゆく過程において、人間の理解力の助けとなる最も強力な道具は抽象(abstraction)である。(中略)抽象の過程は4つの段階に要約される。
 (1)抽象: 現実界の多くの対象物や状態が共通に持っている性質にもっぱら着目し、相互間の差異は無視することの決定
 (2)表現: 抽象された概念を表現する記号集合の選択。これらは情報交換の手段として用いられる
 (3)操作: 記号によって表現されたものの変換に関する規則で、現実界における類似操作の効果を予測する手段となる
 (4)公理化: 現実界から抽象された各種性質の厳密な記述。この性質は、現実界における操作と、それを表現する記号上での操作とが、共通に持っているものである。
(「構造化プログラミング」97,98ページより引用)

第一段階「抽象 (抽出)」

 まず、第一段階として、現実に起きている事がらについて、その共通点に着目する。共通点以外の違いを無視して考えることは、複雑な現象を理解する手助けとなる。これはけっして難しい作業ではなく、我々の日常作業でも見られるだろう。

 例としては、お金を数えるときに、その金額に着目すれば、お札や硬貨の重さや材質を気にする必要はないのである。ただし、先の引用では、「抽象」となっているが、「抽象の第一段階が抽象」と言うよりも、むしろ「抽象 (abstraction)の第一段階が抽出 (abstract)」と言ったほうがよい。先ほどの例で、我々は貨幣から金額という共通点を抽出したのである。そこで、今後、抽出と呼ぶことにする。

第二段階「表現」

 続けて、第二段階では、現実世界に起きている事がら、あるいは自分の考えを表現したいとき、その表現 (representation)によって指し示す情報を明らかにするのである。第一段階における共通する性質を表現するとき、その指し示したいものを「抽象概念(abstract concept)」と呼ぶ。

 人類が後世に記録を残すときに発明した手段は文字である。文字は発話、あるいは、書かかれた記号を通じて、情報を交換する。しかし、日常で使う文字は誤解を与えることがあるので、抽象概念の表現は、厳密な定義が求められるもの、例えば、数学や論理学で使われる記号がもっぱら選ばれるだろう。確かに、100円という金額の表現はアラビア数字の「1」、「0」、「0」の十進法が使われる。我々は、「いっぱい」や「少ない」というあいまいな表現を除くのである。

第三段階「操作」

 第三段階となると、表現を操作していく。ここで、操作そのものについて注意しなければならない。例えば、天気予報の図で、雨雲を動かしているのは現実の世界の雲ではなく、データ上のことである。雨ごいをしているわけではなく、データを変えさせて、雨雲の動きを再現していることから現実の動きを予測している。すなわち、データを変換した結果が現実に影響を与えるわけではないのである。

 こうしたデータから別のデータへの転換は、ある法則に従う。天気予報の例でいえば、物理法則によって、我々は現実の天候の移り変わりを予測することができる。その転換に使われる規則が操作なのである。

第四段階「公理化」

 最後に、第四段階においては、表現とその操作を実際に記述することになる。この公理化 (axiomatization)の目的について、ホーアは「(これらの公理が現実界を正確に記述しているという条件の下で)表現物の操作によって得られる結果が、現実界にもきちんと適用できると言うことを、厳密に証明する」(98ページ)ことであると述べている。

 あるいは、公理 (axiom)が「今日のプログラミング作業につきものの混同や誤りを減少させ、プログラムおよびプログラム手法の文書化と解説を容易ならしめることも可能」(100ページ)だと期待を寄せた。

 すなわち、ホーアによれば、表現と操作を記述した、第四段階目の公理化で、特定のプログラムが正しいのかどうかを調査できるというのである。

抽象の例

 理解を深めるために、抽象の例を挙げてみよう。まず、お金を数える例でいくと、1円玉を1枚数えるとき、
1(円玉)を1(枚)
とカッコの中に書かれた違いは無視して、1という共通の性質を取り出すことができる。

 さて、ホーアは抽象概念の例として「数 (number)」を挙げた。先ほどはお金であったが、現実において、昔の人が最初に数えたのは自然界にあるような石ころや、木の枝であったと考えられる。どのような木の種類であるかは無視して、枝が何本あるかを数えていくとき、それを記録する必要がある。

 第一段階で抽出された数を表現するために、人が使用したのは数字という記号の集まりであった。当初は木の棒を表現する簡単なものであったと言われる。ローマ数字では縦の棒を引いて、Ⅰ、Ⅱ、Ⅲと書いていく。漢数字では横の棒を引いて、一、二、三と書いていく。しかしながら、4、5、6...と数を多くしていくと、この二種類のやり方では不便である。時代が下り、ゼロが発明されると、1、2、3と、簡単な書き方ができるアラビア数字と、十進法の方式で数を表現するようになった。

 第三段階の操作において、数は和という演算をする。例えば、1 + 1のように計算をして、1を加えて別の数をはじき出そうと言うのである。この段階において、数の性質について厳密な定義が求められる。

 そこから、次の段階に移ると、peanoの公理が現れた。この公理は人工のお金であろうと、自然界の石や木の枝であろうと、現実における数を厳密に定義することができるのである。確かに、節の冒頭の「数える」という行為は、第三段階の和という操作と一致する。

結論

 このように、抽象化を4段階の「抽出 -> 表現 -> 操作 -> 公理化」に分けて考えていくと、現実の世界への理解が容易となる。ダイクストラ構造化原理において、この抽象化と型付けは等価である。この原理がデータ構造化の支柱となるだろう。

次回

ダイクストラ不変量とクラスの抽象化 - (構造化プログラミングの覚え書き その6) - dhrnameのブログ

*1:『構造化プログラミング』ダイクストラ/ホーア/ダール 共著、 野下/川合/武市 共訳、サイエンス社、1975年8月)