Declarative KnowledgeとImperative Knowledge

投稿者: | 9月 17, 2018

たまにMITの講義をedXで聞くのだがalgorithmに関する講義のなかで興味深い話があったのでまとめる。
前者のDeclarative Knowledgeが日本語で言えば「お題目」、後者のImperative Knowledgeは具体的な「手順」
前者が数式や定義そのもののことを指し、後者がステップ化された命令のこと。
前者は何も答えにたどり着く方法を教えてくれない。後者は逆に無機質に方法のみをしっかりと示す。

Imperative knowledgeの代表例がステップ実行のアルゴリズム
例えば y * y = xという正方形の面積を求める式(Declarative knowledge)があったとして これをどう解くかという課題があったとする
ある方法では例えば求めるものが25のルートだとして 25-1=24 24-3=21 21-5=16 16-7=9 9-9=0 と5回でゼロになると5が正解だとわかる。
https://www.wizforest.com/gear/tiger/sqrt/

なるほど、これは欲しい値が求まるが計算量としては面積が大きくなった時とか少数になった時とか無理だ。
アルゴリズムとは問題を効率よく解くためにある。
別の手法が紀元前2世紀に考え出された方法で「バビロニア人の開平法」と呼ばれる https://cpplover.blogspot.com/2010/11/blog-post_20.html
https://books.google.co.jp/books?id=mV2jDgAAQBAJ&pg=PT22&lpg=PT22&dq=#v=onepage&q&f=false

√Sに対して、

  1. 任意の正の整数を初期値X0と定める(できるだけ平方根に近い値が望ましい)
  2. Xn+1を、Xnと S / Xnの平均値とする(平均値は相加平均で求める)
  3. 必要な精度が得られるまで、ステップ2を繰り返す

とうことだ。
では、さっそく手動で計算してみよう。
今、√123を求めたいとする。上のアルゴリズムに当てはめると、S = 123である。x0は、とりあえず1とする。
すると
x1 = ( x0 + 123 / x0 ) / 2 = ( 1 + 123 / 1 ) / 2 = 62
x2 = ( 62 + 123 / 62 ) / 2 = 31.9919
x3 = 17.9183
x4 = 12.3914
x5 = 11.1588
x6 = 11.0905
たったの6回の計算で、それなりの精度の平方根を求められる。
これは別に古代人の知恵であって自分が得意げに語ることは何もないのだが、 要するにこれの

√Sに対して、

  1. 任意の正の整数を初期値X0と定める(できるだけ平方根に近い値が望ましい)
  2. Xn+1を、Xnと S / Xnの平均値とする(平均値は相加平均で求める)
  3. 必要な精度が得られるまで、ステップ2を繰り返す

だけを言われてピンと来る人はまずいない。 じゃあ証明してみるよ、と言われても
x1 = ( x0 + 123 / x0 ) / 2 = ( 1 + 123 / 1 ) / 2 = 62
x2 = ( 62 + 123 / 62 ) / 2 = 31.9919
x3 = 17.9183….くらいで大抵の人はもう話を聞いていない。
下手をすればまだ計算途中なのに「やっぱり精度に課題があるじゃないか」とか言われてしまう。
もっと言うと「やっぱあいつはDeclarativeなことしか言わない口ばっかのやつだ」とか言われる。

ここで得られる大きな学びは「アルゴリズムのこと=成功のプロセス」を言われても大抵のひとはわからないし、仮にそれを証明しようとしても途中から話を聞いていない。つまり徒労だということだ。
必要なのは結果であって、結果以外が効力を持つことはほとんどない そしてその結果もほとんどの場合で細かくは見られない。それが何か大きな目標の途上であればなおのことだ。

沈黙は金とはよく言ったもので、沈黙のままやることをやって完成まで行く。それでようやく言う。
もし対等なレベルでディスカッションできる人間が相手の場合はこれには当てはまらないが(証明なしでもぶつけてみれば良い。きっと受け止めてくれる)しかしほとんどのケースでそれは好ましい対応ではない。