書くかもしれないことのリスト

というよりも、ずいぶん昔に書こうと思ったことの断片。

  • いわゆる反変ベクトルと共変ベクトルのこと
  • デデキントの切断: ダックタイピングから見た実数
  • 有限と無限のその隙間
  • 集合の階層的構造の解説
  • 「ワンの絨毯」をめくって(あるいは、めくらないで)
  • 直観主義論理の「自然さ」
  • SQLで苦手な所

いわゆる反変ベクトルと共変ベクトルのこと

物理・工学系の本に出てくる反変ベクトルと共変ベクトルって何か気持ちが悪いという話。接ベクトルのこととか少しぐらい触れればいいのに。イーガンの2: From Special to General — Greg Eganを訳したものを消したのは失敗だったかも。それともどこかに残っているのか。

デデキントの切断: ダックタイピングから見た実数

when I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.

と同じように考えれば、「四則演算や大小比較や収束に関して実数のように振る舞うものって、それは実数だろ」ってことになり、デテキントの切断というのは実数の実装のひとつってことになるという話(実数の別の実装は、コーシー列の同値類)。

有限と無限のその隙間

数学的帰納法の解釈として3種類あるいは3段階があるとみなせるように思う。

  1. どんな自然数が与えられても、そこからだんだん簡単化していって最も単純な形に持っていくような手続きを与える証明法
  2. 小さい自然数から始めて、どの自然数まででも成り立つことを示す証明法
  3. 全ての自然数について一挙に証明する手法

下に行くほど、無限へのコミットメントが深くなっていく。っていうのをもう少し詳しく。

集合の階層的構造の解説

ブーロスの「反復的な集合観」は反復的集合観の説明として読むとわかりにくい文章なので、もっといいかげんで解説的なものを書く。

「ワンの絨毯」をめぐって(あるいは、めぐらないで)

グレッグ・イーガンの「ワンの絨毯」や『順列都市』を手引きにしてカントの超越論的観念論を解説する。あるいは超越論的観念論をネタに「ワンの絨毯」や『順列都市』を解説する。『純粋理性批判』は冒頭しか読んだことが無いから、たんなる思いつきの冗談みたいなものだけど。

だから私は地動説がはじめて提案されたときに持っていたのと同じくらいの衝撃を持っているような新しい可能性を探したい。

http://gregegan.customer.netspace.net.au/INTERVIEWS/Interviews.html#Piffle

この事情は、コペルニクスの最初の思想と同じものであって、[中略]観察者を回転させ、これに反して星を静止させたなら、もっとうまくゆかないかどうかを、こころみたのである。
(イマヌエル・カント(原佑訳)『純粋理性批判』)

超越論的観念論というのは「一切はシミュレーションによるもとだと思ってみる」という考え方だといえる。それっていわゆる懐疑論だろうという疑問がわくけど、カントは自分より以前の考え方を経験的観念論といって区別する。
まず「超越論的」というのは、「議論の前提としてそう思おう」とかそういうことを表している、と理解しておく。
それで経験的観念論というのは、こんな考え方。
我々は多くの間違いをする。何かを別のものと見間違えたり、こうだと思っていたことが後になって全然誤りだったと判明したりする。だとすると、もしかすると一切が実は現実ではなくシミュレーションかもしれないじゃないか。
この考え方の筋道では、現実(実在)というものがあるということ自体は議論の前提にあり(超越論的実在論)、その上で、でも我々が経験しているのは実在ではなくシミュレーションだと考える(経験的観念論)。
一方カントの場合は逆で、まず議論の前提としてこれはシミュレーションだとみなす(超越論的観念論)。しかしそうであっても我々が経験するものは時間があって因果があって……といった形式やカテゴリーを持ったものでしかありえない。そして現実(実在)というのは、時間があって因果があって……というものである。つまり我々が経験するものは現実なんだよ(経験的実在論)と結論される。
たとえば「ワンの絨毯」に出てくる昆布(のようなもの)によるシミュレーションだろうが『順列都市』における塵によるシミュレーションだろうが、あるいはホフスタッター「アインシュタインの脳との会話」における本(とアキレスと亀)によるシミュレーションだろうが小林泰三「予め決定されている明日」でのソロバンでのシミュレーションだろうが、そのシミュレーションの内部において「認識の成立」が可能ならば、そのシミュレーションは「時間」の形式を持っていなければならない。
でも時間があるだけではまだダメ。時間があるだけなら、例えばタイムシェアリングで複数のシミュレーションが平行しておこなわれていることとか、一瞬ごとに全くデタラメに世界が変わっていくというのも可能である。しかし、「認識が成立しうる」のは、時間の進展を一繋がりのものとして捉えられる場合(「因果のカテゴリー」が成立する場合)だけである。複数のシミュレーションが平行している場合なら、そのうちのひとつだけを一繋がりの現実として把握することになる。
もちろんこのようなカントの考え方と『順列都市』における塵理論の発想に類似性を見ることができる。カントのいう統覚作用が、塵理論での塵からパターンを組み上げるという話にいくらか対応する。
ただし違いもある。というよりカントの考えで一番重要な部分をイーガンは全く受け継いでいないようにも見える(のだけどカントを読んでないので、その部分の説明ができない)。カントが「超越論的〜」というよくわからない用語をいろいろ使って言おうとしたこと(認識の成立のためには世界はこのような枠組みを持たなければならない、ということ)全部を、イーガンは物理的・化学的な構造物(=人間・その他)による認識・解釈が世界の枠組みを作り出す、という発想に置き換えているように見える。そのため、イーガンの小説世界では、世界の内部に存在する「認識・解釈するもの」(=人なり意識なり)が世界全体を構築する、という倒立した世界観が出現する(主観的宇宙論もの三作は全部この発想の変奏だと言えるかもしれない)。まぁカントの考え自体が「認識によって世界が構成される」という思想だと理解される傾向があるみたいだからしょうがないのか。

そしてカントのいう「物自体」というのは、シミュレートをおこなうハードウェアに対応する。

なぜなら、さもなければ、シミュレーションはそこでシミュレートする或るものなしで存在するという不合理な命題が、そこから生ずるであろうからである。
(イマヌエル・カント(原佑訳)『純粋理性批判 上』平凡社ライブラリー p.57を改変)

ただし物自体がどんなものなのかは一切わからないとされる。物自体は、我々が思っているとおり「色々な事物(とそれらを認識する脳とその他の器官)」かもしれないし、培養液の中の脳かもしれないし、コンピュータかもしれないし、欺く悪霊かもしれないし、ワンのタイルかもしれないし、塵かもしれない。もしかすると培養液の中の脳をシミュレートするワンのタイルをシミュレートするコンピュータをシミュレートする……何かかもしれない。でも実際のところはわかりようがない。イーガンは

実際、ひとつの0とひとつの1が、全宇宙を作り出すのに必要な全てのものかもしれない。

Counting Backwards From Infinity

といっている。この発言は、0と1が物自体である可能性を述べていると解釈できる。でも「時間も空間もなく0と1だけがある」(全宇宙が0と1から作られるということは、時間と空間も0と1から作られるということになる)というのが一体どういう状態なのか全く想像できない。
つまり物自体がどういうものなのか解らないというのは、ときおり解説されるような「我々が認識するのは現象としてのリンゴだけで、物自体としてのリンゴは認識できない」とかそういう話ではない。と思うのだが。

直観主義論理の「自然さ」

意味論から見ると、古典論理の方が自然であり直観主義論理はやたらと複雑で不自然に思える。でも演繹体系の方を見ると古典論理よりも直観主義論理の方が自然に見えなくもない。
NJ(直観主義論理の自然演繹)とLJ(直観主義論理のシーケント計算)にはわりと綺麗な対応関係があって、NJを元にしてそこからLJの体系を作り出すことも(NJとLJの両方をあらかじめ知っていれば)それほど難しくない。一方、古典論理に対するNKとLKの間には、そういう綺麗な対応関係はないように見える。

SQLで苦手な所

SQLどころかプログラム自体を書く機会がほとんどないにも関わらず、SQLに対してはとにかく苦手だという感覚がある。以前はシンタックスの問題だろうと思っていたけど、どうやらカラム名の扱いがポイントだったらしいと気づく。
二つのテーブルに同じカラム名があったときに

where a.name > b.name;

のように「テーブル名.」で修飾するというところも好きではないけど、それよりも、複数のテーブルに同じカラム名があってもそのまま結合操作がおこなえてしまうところが嫌だ。これが認められてしまうので、結合演算や積演算で新しく作られたテーブルにはカラム名が付いていない場合が生じる。例えば

select a.name_1, b.name_1, a.name_2, b.name_2

では、テーブル名による修飾によってカラムの区別はできているけど、結果として出来るテーブルのカラムには名前が付いていない。SQLでは、カラム名も含めて関係(テーブル)のはずだから、これはつまりSQLは関係演算について閉じていないということになる。ホームページ移転のお知らせ - Yahoo!ジオシティーズという文章にSQLの良いところその3として「閉包性」=「ある演算子の入力と出力が共に関係である」ことをあげているけど、逆で閉包性を持たないことがSQLの悪いところのひとつだと思う。
ついでに、これに関連してクリス・デイトは「A Sweet Disorder」でカラムに順番をつけるべきではないと言っているけど、一意なカラム名を付けなければいけないという問題とカラムに順番を持たせるべきかどうかということは別問題のはず。カラム名を一切なくして順番でカラム指定をおこなうことにしても、それが一貫してさえいれば「A Sweet Disorder」でおこなっている批判は当たらないはず。カラムを順番で区別することの問題は、名前による区別よりもわかりにくいということに尽きると思う。
もうひとつ

where a.name_1 > b.name_2;

のような書き方には嫌な点がある。この表記だとテーブルaのカラムname_1とテーブルbのカラムname_2を比較しているように見えてしまう。これはテーブル名による修飾がなくて

where name_1 > name_2;

とあっても何となくそう見えてしまう。でも本当にやっているのは、カラム全体の比較ではなく、行の中の一要素と別の行の一要素についての比較である。比較の対象がカラム全体ではなくひとつの要素であることがはっきりするような表記の方が(たとえ冗長になっても)うれしい。例えばSQLの構文からは全くはずれてしまうけど、

a.join(b) do |row1, row2|
  row1.name_1 > row_2.name_2
end

とか。
これに関連するものとしてGaucheのリレーション・フレームワーク(Gauche Users’ Reference: Top)があるけど、行そのものはカラム名の情報を持っていないのでちょっと冗長になる。たぶんこんな感じになる。

a_acsr = relation-accessor(a)
b_acsr = relation-accessor(b)
join(a, b) do |a_row, b_row|
  a_acsr(a_row, "name_1") > b_acsr(b_row, "name_2")
end

こういう書き方だと、aとbを結合して射影を取ってからさらにcと結合する、みたいなのを書くのが面倒になる。できれば

a.join(b) do |a_row, b_row|
 a_row.name_1 > b_row.name_2
end.
  select(name_1, name_2, name_3).
  join(c.rename(name_3, name_4)) do |ab_row, c_row|
    ab_row.name_3 > c_row.name_4
  end

みたいに書きたいのに、いちいちアクセッサを取り出すのはうれしくない。まあjoin関数がdo ... endの部分を呼び出すときに、素の(カラム名情報を持たない)行を引数にせずに、カラム名の情報を付加して渡すことにすれば、

join(a, b) do |a_row_with_cnames, b_row_with_cnames|
  a_row_with_cnames("name_1") > b_row_with_cnames("name_2")
end

みたいに書けるかも。あるいは

join(a, b) do |a_row_acsr, b_row_acsr, a_row, b_row|
  a_row_acsr(a_row, "name_1") > b_row_acsr(b_row, "name_2")
end

とか。