Hatena::ブログ(Diary)

[・ _ゝ・]日記を書くはやみずさん このページをアンテナに追加

インフォメーション

公開書架

読み終わったり、近いうちに読む予定がない本をいくつか。読みたい人には貸します。
神は沈黙せず〈上〉 神は沈黙せず〈下〉 Binary Hacks ―ハッカー秘伝のテクニック100選 Ruby on Rails入門―優しいRailsの育て方 The Art of Computer Programming Volume1 Fundamental Algorithms Third Edition 日本語版 プログラミングRuby 第2版 言語編 ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門 はじめて読む486―32ビットコンピュータをやさしく語る Subversion実践入門〓達人プログラマに学ぶバージョン管理 ハッカーと画家 コンピュータ時代の創造者たち

計算論の展開をSchemeで → インデックスページ
いっぱい本を読みたい→ 読書マラソン
ついったー → Twitter / hayamizu

2007-06-13

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

今日大学で、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式内に自由変数があるか否か

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

ちなみに、クロージャについてはno titleがわかりやすくていい感じ。自分はここでクロージャのなんとなくの意味がわかって、あとはSchemeを愛でるうちに体得した。

ツッコミ歓迎。

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

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

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

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

*5:要検討

みずしまみずしま 2007/06/15 21:35 機能的にはC#の匿名メソッド≒クロージャなので、C#にはクロージャがあります。以下のようなプログラムで、C#の匿名メソッドがクロージャであることを確かめることができます。 >C#でクロージャは使えないけど、匿名メソッドは使える

using System;
class ClosureExample {
static Converter<int, int> Counter(int start) {
return delegate(int up) { return start += up; };
}
static void Main(string[] args) {
Converter<int, int> counter = Counter(0);
Console.WriteLine(counter(1)); //=> 1
Console.WriteLine(counter(2)); //=> 3
counter = Counter(1);
Console.WriteLine(counter(1)); //=> 2
Console.WriteLine(counter(2)); //=> 4
}
}

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/harg/20070613/1181757060