人気ブログランキング | 話題のタグを見る

抽象概念の習得法

抽象的な概念は、定義を覚えるだけでは活用できずその定義を満たすモデルを頭の中に作らなくてはならない。その手続きは、単純化すると、定義を満たす実例をいろいろと発見するということになる。

たとえば、プログラミング言語の scheme には「継続」という考え方がある。「継続」の定義は、

式を評価している途中のある時点で,『いま得られた値を使って,この後は何を計算するのか』を表すもの。


である。この定義だけでは、雲をつかむようで何のことか分からないので実例を考えなければならない。次の計算について考えてみよう。

(+ 2 (* 3 4))

これは、3と4を掛けてその値に2を足すという演算を実行する。この場合の「継続」とは何だろうか。継続の定義は「式を評価している途中のある時点で、『今得られた値を使って、この後は何を計算するのか』を表すもの」ということだった、したがって、上の計算でこの定義のスキーマにあてはまる部分を探してみる。いま、コンピュータの中で(* 3 4) が計算されその値が内部的に12と計算されたとする、これは、計算の途中なので上のスキーマの今得られた値を使ってという部分に当たる。したがってもとめる継続は「この後は何を計算するのか」であるから、

(+ 2 12)

2 と (* 3 4) で得られた12を加えるという操作になるはずだ。しかし、「継続」というのは2と12を足すという具体的な計算を表すのではなく、(* 3 4) で得られた12を使ってその後に何を計算するのかという「操作」をさすので、f(x) = 2 + x という関数がこの場合、(* 3 4) の次に行われる処理だ。「継続」とはこの関数 f(x) のことだ。f(x) を scheme で書くときはラムダ記法で記述するので、

(lambda (x) (+ 2 x))

となる。そうすると、(+ 2 (* 3 4)) という計算は

((lambda (x) (+ 2 x)) (* 3 4))

で表される。この計算は、(* 3 4) で計算された12を引数にして、引数に2を足す関数という「継続」に渡していることになる。途中までの計算をいちいちラムダ関数で定義するのは煩わしいので、scheme では call/cc という関数が定義されている。上の例の場合、

(+ 2 (call/cc (lambda (c) (*3 4))))

と書く。これは (* 3 4) の値を引数の値に2をたすという関数 c (f(x) = 2 + x と同じ働きの関数)に引き渡していることになる。したがって上の式の 4 の代わりに(c 4) を代入すると、このプログラムは3をかけるという処理をスキップして4+2を計算して終了してしまう。つまり、call/cc で定義された処理はその後の処理のどの深さからでも実行されてしまうのだ。このため、call/cc は scheme で例外処理などの広域脱出のために使われる。

(+2 (call/cc (lambda (c) (*3 4)))) => 14
(+2 (call/cc (lambda (c) (* 3 (c 4)))))=> 6

コンピュータのプログラム言語は理解したかどうかをプログラムを実行することによって確認することができるので、抽象的な概念を攻略するときのモデルとして便利だ。

このように、抽象的な概念は、定義のスキーマを満たす具体例をたくさん持っていることでその意味を知ることができる。抽象的な概念の意味とは何かを定義するのは難しいが、スキーマとしての概念の定義と、それにパターンマッチする具体例を豊富に持っており、いろいろな状況でそれを活用できることということができるのではないだろうか。
by tnomura9 | 2009-05-03 17:45 | 考えるということ | Comments(0)
<< 抽象概念の3要素 2009年前半の記事 >>