「 [・ _ゝ・]日記を書くはやみずさん」終了のお知らせ

id:hargの中の人が、一身上の都合によりid:hayamizに変身したため、本日をもって「[・ _ゝ・]日記を書くはやみずさん」は終了させていただきます。ありがとうございました。

本日からは、id:hayamizの中の人が「日記を書く [・w・] はやみずさん」を心機一転スタートすることになります。基本的に何も変わりません。新コーナーもないです。よろしくおねがいします。

  • Q. 「日記を書く[・ _ゝ・]はやみずさん」って危ないんじゃないの?
    • A. なんで?危なくないよ
  • Q. だって釣りじゃないの?
    • A. もちろん釣りじゃないよ
  • Q. なんで?だって「日記を書く[・ _ゝ・]はやみずさん」ということは「[・ _ゝ・]日記を書くはやみずさん」なんでしょ?
    • A. 違うよ。全然違うよ。

実験のできる人、できない人

今日実験がおわってから、学生控室でだらだら作業しながら実験のできない人について話をしていた。

話の中で出てきた実験のできない人は二種類いる。

  • 理論を理解していないし、予習もしていないので何をしていいのかわからない
  • 理論を理解していて、予習もしてきているが何もできない

前者については「乙」としか言いようがないけれど、気になるのは後者。理論がわかってて何で実験ができないのか不思議なので、帰りの電車のなかで少し考えてみた。

理論を実験で確認する作業とは、つまるところ抽象と具象の橋渡しをすることに等しい。

現実(具象)はあまりに混沌と、雑然としている。その中から、本質となる部分だけに注目し、抽象の世界へとその本質を変換する。例えば、電気回路のような化学反応や様々な物質の動作によって構成されているものが、(電流や電圧などを)数学の世界にもっていくと単なる足し算や、微積分になってしまう。

一度抽象化されてしまった具象のエッセンスは、科学の場合は数学の世界で解決されて、何らかの解を与えてくれる。しかし、この解は抽象の世界の解であって、そのままでは意味をなさない。抽象の世界の解を、もとあった具象の世界へと変換して、それが現実の世界を正しく予測できていれば、初めて認められるものなのだから。

とまあ、科学においては当然のプロセスを延々と書いてみたけれど、つまりは

  1. 具象の問題を抽象の世界へ変換
  2. 抽象の世界で問題を解く
  3. 抽象の世界の解を具象の世界へと変換
  4. その解が具象の世界を正しく予測しているか検証

というステップが実験を行う上では必要になる思考及び実践の過程で、これのどれかが欠けても実験は遂行できない。上で述べた「実験のできない人」は、3., 4.に関する能力が欠けているのではないか、と思う。あくまで推測で語ることしかできないけど。

理論を理解したり実験の予習をする段階ではほとんど抽象の世界で考えていればいい。しかし、いざ実験を遂行する際には、その抽象の世界の解に関する要素と、現実世界の要素を対応付けていかなければいけない。ダブルブリッジの理論がわかっていても、実際にどういう"モノ"を使って何を構成してやるかがわかっていないと実験はできない。*1その対応付けができないことが、実験ができない理由になっているんじゃないか。

なーんてことを考えていた。

*1:むしろ、理論があまりわかっていなくてもブラックボックス化された計器を説明書通りに扱えばいい、ということも多い

Lisp脳の弊害

OCamlは関数に渡す引数をスペースで区切るので、関数の引数に関数の戻り値を渡すときは、そいつを括弧で囲んでやらなきゃいけない。 funa (funb "hogehoge");; みたいに。

括弧あったりなかったり考えるのがめんどい→全部括弧つければいいんじゃね?→それ何てLisp

 破壊的変更?ボコボコにあqswでfrgtyふじこlp
    ∧_∧    ∧_∧
;;;;;、(;ω(:;(⊂=⊂(・ω・ )
    (っΣ⊂≡⊂=≡ ι)
   ./   )ババババ(   λ
   ( / ̄∪     ∪ ̄\)

クロージャと記号論理学と高校数学

今日大学で、C#の本を持ってる人がいたことからC#の話になり、最近のC#クロージャが使えるらしいよ*1、というところから長ば強引に「クロージャを知りたいならSchemeが一番」とSchemeの宣伝に持っていった。そこで説明するときにとっさに"自由変数"と"束縛変数"という言葉が出てきたんだけど、この2つの言葉が理解できていれば、クロージャの理解はわりと一瞬でできるんじゃないだろうか。

自由変数と束縛変数。この2つの概念を陽に初めて扱ったのは大学1年夏学期*2記号論理学だった。記号論理学の中でも、自然演繹のsyntaxだったので、意味を一切考えずに記号をルール通りに扱うだけでいろんな結論が得られるよね、というやつだった。そのルールを守る上で、*3自由変数と束縛変数を明確に区別する必要があった。

自由変数と束縛変数というと難しく聞こえるかもしれないが、この2つは実にありふれた概念で、高校数学をちょっとやってれば確実に無意識のうちに扱っている。例えば、次の2つの関数を考えてみる。
f(x)=x+1 \\ g(x)=ax+1
この2つの違いがわかるだろうか?大体の高校では、関数のイメージを掴むためにはグラフを描け、と言われていると思うので、この2つの関数をグラフに描いてみて比較してみよう。

何?g(x)のほうはaの値がないから具体的なものをプロットできない?じゃあ、自由に値を選んで、適当にいくつかプロットしてみたら?

このa、つまり実際に使おうと思ったときに値がわからない奴が"自由変数"ってやつだ。高校では"定数"なんて呼ばれていて、若き日のはやみずはずっとこの呼び方にモヤモヤを感じていた。実際に使うときに、状況によって"変化"するのはaとかbとかなのに、なんでやつらは常に一定であるような"定数"なんて名前なんだ、と。二次方程式の解だって、変数xの値を決めているのはx=(-b\pm\sqrt{b^2-4ac})/2aのa,b,cなのに。

高校時代に"変数"と呼んでいたものの99%は"束縛変数"、つまり使うときに値がわからないから困ることがないやつらだ(f(x)=x+1のプロットならxに定義域の値を次々に入れればいいし、x^2+1=2なら解くだけだから結果的にはわかる)。

そして、"定数"とか呼んでいた"変数"(束縛変数)以外の文字は99%が自由変数、つまり使うときに値がわからなくて困るやつら。

しかし、高校で数学をやっていて、「この定数の値がわからないから困った」なんてことがあっただろうか。おそらくほとんどの人はないはず*4。なぜなら、ある数式、例えば二次方程式の解だけを見たときには、a,b,cはわからないけど、テストの問題を解くときにはa,b,cが与えられているから。

この、「a,b,cが与えられる」というのは、まさに「a,b,cを束縛する」ことであり、そのテスト問題の中では「a,b,cもまた束縛変数」となっている。つまり、数式単体では自由変数が存在していたとしても、数式を仕様する状況がその自由変数の値を決めることが、自由変数を束縛して束縛変数にすることになる。

自由変数に値を与えることが、自由変数を束縛変数に変えること。

書いていて疲れてきたので突然だけどここで終了。いろいろ書きたいことは溢れているけど、収拾がつかなくなりそうなので。明日実験だし。箇条書きでメモ。

  • 自由変数が全てなくなった時点で、1つの具体的な答が出る*5
    • プログラムで言いかえると、自由変数がすべて無くなった時点で、そのプログラムは実行可能(コンパイル可能)になる
  • 自由変数が存在するからこそ、ほげほげの定理の数式は有用である
    • 自由変数が全く存在しないと、一般性がない
  • つまり、自由変数は力だ
  • プログラムで自由変数をどう扱うかの違いが、Dynamic bindingとLexical bindingの違い。
  • lambda式を評価した時点で、lambda式内の自由変数(大域的には束縛変数)がどの値を指しているか、というポインタのリストが環境(?)で、クロージャはその環境を保持しているのがただの関数と違うところ。
  • (無名)関数とクロージャの違いは、lambda式内に自由変数があるか否か

とまあ、こんなことを今日の数学の授業中に考えていたおかげで、離散フーリエ変換の授業聞いてなかった。

ちなみに、クロージャについてはhttp://capsctrl.que.jp/kdmsnr/wiki/bliki/?Closureがわかりやすくていい感じ。自分はここでクロージャのなんとなくの意味がわかって、あとはSchemeを愛でるうちに体得した。

ツッコミ歓迎。

*1:さっき調べてみたら、C#クロージャは使えないけど、匿名メソッドは使える、ということらしい。

*2:諸般の都合により単位取得は2年の夏だったけど

*3:日常では意味によってサポートされていたため、違いを意識しなくてもよかった

*4:二次方程式が解けないとかはナシね(´_`;)

*5:要検討