ホーム » 一般 » 抽象化とメタ思考

抽象化とメタ思考

919

人と議論をしていると、ときどき抽象化という言葉について説明しなければならないときがある。しかし「抽象」という概念は非常に抽象的で、説明が難しい。「メタ」という言葉も説明が難しいという意味でよく似ている。自分は何気なく抽象化を使いこなし、メタな議論をしているのだが、それをどうして、どうやっているのかをうまく説明できない。これは本当に使いこなしていると言えるのだろうか、と当然ながら疑問が沸く。

辞書的な定義を引いてみても役には立たない。たとえば「抽象」を引いてみるとこんな感じだ。

ちゅう-しょう【抽象】

物事または表象の或る側面・性質を抽(ぬ)き離して把握する心的作用。その際おのずから他の側面・性質を排除する作用を伴うが、これを捨象という。一般概念は多数の事物・表象間の共通の側面・性質を抽象して構成される。<哲学字彙> ←→具象 ←→具体。

広辞苑第六販

意味がよく分からない。メタはどうか。一番近い語義はこれか。

メタ-にんち【メタ認知】

(meta-cognition)自分で自分の心の動きを監視し、制御すること。

広辞苑第六販

ううーむ。見ないほうがよかったかも。Wikipediaの方がまとまっているかもしれない。だが、言いたいのはこういうことではない。

プログラマが出会うメタ

プログラミングをやっていると、メタという概念には日常的に出くわす。たとえば文字リテラルだ。文字列には、普通ではない文字、「メタ文字」というものが登場する。たとえばこんな風に。

print "Hell, World\n";

バックスラッシュ「\」がメタ文字と呼ばれる。メタ文字は、文字とは違ってそのまま印字されない。直後に出てくる文字との組み合わせによって特別な意味を持つようになっている。「\n」は改行を表す、と決まっている。もしバックスラッシュ自身を表示したいと思ったら「\\」と記さなければならない。メタ文字のメタな意味を打ち消さないといけないのだ。

正規表現にもメタ文字はたくさん登場する。「.」は任意の1文字という意味。「*」は直前の文字の0回以上の繰り返しという意味。「[xyz]」はx、y、zのいずれか1文字という意味だ。 文字を示さないメタ文字もある。「^」は行の先頭を意味するし、「$」は行末を意味する。これは相当に抽象度の高いメタ文字だ。そしてこれらを使いこなすことは、かなり抽象的な思考能力を必要とする。 慣れれば、一見意味不明なREも瞬時に理解できるようになる。

^function +[a-zA-Z]*print[^(]*([^)]*int
# まあなんか適当に書いただけで意味はないけど

自分がいつのまにやら抽象的な概念に慣れ、メタ認知に慣れてしまっているのは、どうやらこの辺の事柄をプログラミングを通じて身に付けたのが理由のように思える。

たとえば関数の定義と呼び出しの関係もそうだ。プログラミングにおいて関数は、処理を抽象化したものだ。初歩のプログラミングでは、命令を順番に書き連ねるだけかもしれない。まあ、命令というのも結構抽象度が高いものだが…。これに加えて、再帰呼び出しや相互に呼びあう関数を使いこなすようになると、さらに抽象度が高くなっていく。高校生の頃に学んで好きになった再帰の定義はこんなものだった。

int fact(int n)
{
    if (n > 0)
        return fact (n - 1) * n;
    else
        return 1;
}

脱線だが、最初にこのコードを実装したときはForthで書いた。ForthをBasicで実装して、その上でWordを定義したのだ。だいたいこんな感じ。

: fact dup 0 > if dup 1 - fact * else drop 1 then ;  ok
5 fact . 120  ok

ちょっと調べてみたら、gForthとは互換性がなかった。そっかー。

議論をメタに捉える

課題や問題について議論をしていると、課題や問題の記述(あるいは口述)において、その課題や問題をメタに定義しないと対象を捉えきれないと感じることがある。いってみれば「\」はメタ文字なのでエスケープしなければならないのでは? と感じるようなものだ。だが、議論の相手とそういう認知が共有できていないと、なかなか同じレイヤ、あるいはメタなレイヤで議論できない。プログラマ同士だと割にすんなり受け入れられるのだが、そうでないとそうでないことが多いように思うのだ。これは、前述の抽象的な思考の経験の有無から来るのかもしれない、と最近思うようになった。

しかし、自分がこの思考法を確立するまでの経験を振り返ってみると、これを他人に押し付けるのは相当に無理があるなと言わざるを得ない。そしてこれを簡単に説明し納得してもらう方法もなさそうだ。というわけでメタに捉えた上で、簡素に伝える説明を考えたほうが早そうだ、ということになる。

抽象を具象に落とす

そこで抽象度の高い話を具体的な例に落としてみるのだが、ここで問題が発生することがある。不適切な例を挙げると誤解が生じてしまうのだ。そもそも対象を観察しているときに、特定の側面・性質を抽出しているわけだから、対象そのものを見ていればいいのだが、別の例を挙げて共通点を引いてこようとするときに間違ったものを引いてきたり、間違って例示してしまったりすると誤解が生まれてしまう。そういうことがない様に、注意深く具体化していかないと、せっかく抽象化していこうとしているのにうまくいかない、ということになってしまう。

最終的には抽象化して、一般化していくというのがゴールなのだから、具体的なままで置いておくこともできない。結局は抽象的な概念を分かりやすくまとめていかなければならないが、ここは必要に応じて相手に理解してもらわなければならないということにもなるかもしれない。そのときには、きちんと「抽象とは」という話を事前に片付けて、メタな話を終わらせておかなければならいのではないか、と思う。