Skip to content

生きていくのは大変

Irma la Douce

あらゆるものがうさんくさくて荒唐無稽で直情的なんだけど、あらゆるひとびとが役割をきっちり果たしていて、あらゆる二者間の関係に定義がある。そんな中で、役割にはまりきれないのが主人公、でもみんなに愛されている。ずるいやっちゃ。

カフェのひげのおじちゃんがあらゆることに通じている。私はあのように便利で人のいい存在になりたい。

Gin Rummyってトランプのゲームしらなかった

The Apartment

主人公は、損得勘定できず、人に頼まれるとうんと言ってしまう人である。他人の非のために、ついついかぶらなくてもいい泥をかぶってしまう人である。それで重宝されて如才なく生きている。立ち居振る舞いは脱力系。

家族もこれといった楽しみも描かれず、終業後も時間をつぶすために働いているなんてところは、共感をもってしまう。(ついでに言うと、独りでニューヨークのアパートでテレビをみてるシーンは、独りでアムステルダムのアパートでDVDをみている自分と重なってちょっとたのしかった。)ただしこの人は、傷心バーに行って酒を飲む姿は決まっているので紙つぶてをぶつけられてナンパされたりする。九死に一生を得たヒロインが小康を得て寝付いたのを見届けてその人の服をハンガーにかけてやっと自分のネクタイを外す人である。こういうことをひっくるめて、わりと古風な意味で “nice” な人である。しかし、やけになってすべてを投げうってしまう。

それにしても、この人たちの仕事は、計算機のおかげで、もうすっかり無くなってしまったのではないか、と、全然かんけいないことを思ったりもする。

アムステルダム大学の本

アムステルダム大学には、やたらとかっこいい図書館もあるが、もっとおもしろいのはサイエンスパークのロジックの棚である。配列は、著者名のアルファベット順じゃなくて話ごとで、それもちゃんと分かった人が分類してる順番だ。なんかprovability logicの本が、様相論理周辺じゃなくて再帰理論周辺に置いてある、とか。その棚のまえでぼけーと背表紙を眺めたり中身を覗いたりしていると、まあなんというか眺めのようなものがつかめてくる。ついでに最近の博士論文もあるので、ぱらぱら見ていられる。

OmniGraffle

来週ベルギーである、FOX(Foundation of XML)というプロジェクトの集まりで話をすることになったので、スライドを作っている。計算量のややこしい話だ。この手のものをきったりはったりしなくてはいけない。

この手のことにはOmniGraffleを使っている。前に山本和彦さんと研究したときに教えてもらった。重宝している。並べるとかくっつけるとか揃えるとかが、いちいち簡単だし、手作業で同じ事を繰り返すときの操作数が少ない。

人間なので、疲れたり飽きたりという制約があって、ひとつひとつのことがちょっとでもめんどくさいと、出来上がりの質に響いてしまう。あとアラサーなので、人生の長さがなんとなくわかってしまった。楽な道具は大事。せっかくなので、たくさん使えるように、たくさん研究しよう。まずは博士論文なんだけど、その他にやりたいネタが多くて困っている。だれかにやってもらえばいいのかもしれない。

Film Socialisme

GodardのFilm Socialismeをみた。ネタバレ以前になにがネタなのかが謎なので、何も遠慮しないで書く。

前半は豪華客船で撮られてて、実はこのまえイタリアで沈んだConcordiaという船らしい。主催者のおじさんが上映前に演説してて、Concordiaというのはagreementとかunityとかいう意味だと教えてくれた。まるでユーロ通貨とヨーロッパみたいだって。そんなことを言われてから観ると、ヨーロッパってなんだろうという映画な気がしてきた。「フランス語では大統領職は女性名詞」とか「ロシア語ではこれは女性名詞」とかいうせりふが出てきたのがヨーロッパな感じがしたのは、僕が性がない日本語を母語にしているからかなと思うけど。でも、古代ギリシャの民主主義は内戦を産んだと言ってたし、アフリカ系の女性が「かわいそうなヨーロッパ」って言ってたし、黒背景に白地でヨーロッパどこへいくと問うてたし、ほとんどフランス語だったけどロシア語とかギリシャ語とかアラビア語も出てきたし、子どもたちが親に自由平等博愛についての質問をしまくっていたし、思想が我々を分かつとかいってたし、ヨーロッパってなんだろうという映画だと思ってよさそう。どこかの街のとある階段の戦時中の様子と現代の様子を対比しているところがあって、ヨーロッパの街の階段というのは、人よりも寿命が長いのだなあと感心した。日本だと、街にみえるものって、若いものがほとんどだから。

Beethovenの悲愴の使われ方が強く印象に残っている。

ギリシャ人とロシア人と一緒にみたのは興味深かった。古代ギリシャの民主主義に言及してたし、字幕にギリシャ語やロシア語が出てたし、戦艦ポチョムキンからの引用もあった。でも彼らは、この映画はわけがわからないと述べていた。あ、Spyros君はPatti Smithが登場してるのに気づいたらしい、僕なんか人の名前をほとんどしらないから、すごいなあって言うだけなんだけれど。

そういえば、アルパカが出てきて、アルパカみたいなことをしていて、まわりの観客がくくくっと笑っていた。やはりアルパカはオランダにいるひとたちにとってもfunnyなのだ。アルパカの映像に、宗教的にシリアスな音楽を重ねられるのは面白かった。こういうアルパカのおかしさの普遍性は希望だと思う。

モテ図

gohantabeyo.com で、だれがだれとなんかしたがっているのか、図にしてみた。Tulipというのを使った。

レイアウトとか色とかに改善の余地がありそう。入次数の分布が冪分布になってるかとか、人気者のtweetの特徴とか、そのうち調べてみよう。

浦島太郎への憧れ

おもしろいことをしていると、一息つく間に二時間くらい経ってしまう。ガスコンロを使っているときはおもしろいことをしないように気をつけている。浦島太郎は竜宮城から帰ったあとに、あけてはならないと言われた玉手箱を開けたとたんに年をとって周囲も時代がうつっているという話である。玉手箱にはおもしろい数学の本が入っていて、おもしろがっていたらあっというまに年をとってしまったのだと考えると、つじつまがあう。

個人的な信条――演繹の力

帰納ではなく演繹の力を信じる。演繹の力とは、経験を集めて知識を引き出すのではなく、いったん世界をほうって引きこもり、エディタなりノートなりにごにょごにょ書いてからこうなるはずだと言い切る力である。目的に関していえば、人が欲しいものを聞いてまわるのではなく、ひきこもって、これが欲しいはずだと考えることである。手段に関していえば、もうある道具を漸次改良するのではなく、原理に戻って根本を断つことである。

あ、たぶん人間は帰納するようにできているので、目の前で起きていることから直接学ぶのは、健康だし社会的だし成功への道だと思う。帰納への反感はない。

それでも演繹にこだわるのはなぜか。地球の歴史を通じて、生物の進化は、経験を糧として遺伝子を選別する帰納の過程であった。しかしつい最近になって人間が証明を書き始めた。もっと最近になって書いたものが動くようになった。これはおもしろい。なので、ソフトウェアに証明をつけたり証明を動かしたりしている。

追記: Knuthが喋っている

 

Coqでゲーム(1)

Theorem Proving Advent Calendar 18日目

このまえCoqで超現実数(1)を書いたときにMamameさんの研究をみてみたら、ゲームの比較の推移律の証明が構成的でないと書いてあって、たいへん不満をおぼえました。ゲームの比較の推移律は、Aを取ってBを返す関数と、Bを取ってCを返す関数とを合成してAを取ってCを返す関数を作る、ということをゲームでやる話なので、戦略と戦略から戦略を構成しないとおもしろくありません。というわけで、有限なゲームに限ってでもいいから、それをやろうということになりました。

ソースコードはgithubにあります。

ゲームは二人でやることにします。LとRです。

Inductive player := L | R.

で、ゲームというのは、空っぽの何もできないゲームemptyか、プレイヤーpがmというゲームに移れるaddMove p mというゲームかどちらかということにします。

Inductive game: Set :=
| empty: game
| addMove: player -> game -> game (* original *) -> game
.

次に、ゲームgでプレイヤーpが先手必勝なwinningStrategy g pというものと、先手必敗であるlosingFate g pというものを定義します。

Inductive winningStrategy: game -> player -> Set :=
| take: forall p m o, losingFate m (opponent p)
                      -> winningStrategy (addMove p m o) p
| pass: forall p m o q, winningStrategy o p
                        -> winningStrategy (addMove q m o) p
with losingFate: game -> player -> Set :=
| stuck: forall p, losingFate empty p
| whichever: forall m p o, winningStrategy m (opponent p) ->
                  losingFate o p -> losingFate (addMove p m o) p
| wait: forall p q o m, losingFate o p -> q = opponent p ->
                  losingFate (addMove q m o) p
.

この手のゲームでは、両者ゲームのことがぜんぶわかっててかしこければ先手必勝か先手必敗かどちらかになるので、それを示しました。

Definition decision (g: game) (p: player):
  winningStrategy g p + losingFate g p.
Proof with auto.
generalize p.
clear p.
induction g.
  intro p.
  right.
  apply stuck.

  rename p into mover.
  intro p.
  destruct IHg1 with (opponent p);
    destruct IHg2 with p;
    clear IHg1 IHg2;
    destruct mover; destruct p; simpl in *.

  left.
  apply pass...

  left.
  apply pass...

  left.
  apply pass...

  left.
  apply pass...

  right.
  apply whichever...

  right.
  apply wait...

  right.
  apply wait...

  right.
  apply whichever...

  left.
  apply pass...

  left.
  apply pass...

  left.
  apply pass...

  left.
  apply pass...

  left.
  apply take...

  right.
  apply wait...

  right.
  apply wait...

  left.
  apply take...
Defined.

ただ、同時に先手必勝と先手必敗になることはありえない、ということを証明していないので、それはこんどにしましょう。



				

Coqで超現実数(1)

Theorem Proving Advent Calendar 6日目

超現実数というものがあります。それをネタにKnuthが小説を書きました(日本語訳)。ConwayのOn Numbers and Gamesという本もむかし読みました。これをCoqで実装して修論を書いたMamameさんという人がいる(TYPESのMamameさん論文)のは知っていたけれども、中身はまだ見てなくて、で、見ないまま自分でやってみると、少し違うものができました(github)。

まずゲームを定義してから、数は特殊なゲームだと言います。

ここでいうゲームは二人ゲームです。左の人と右の人が勝負します。なにもできなくなったほうがまけ。ゲームを決めるには、左の人が先手で何かした結果どういうゲームにできるかと、右の人が先手で何かした結果どういうゲームにできるかとが決まればよいです。ここで問題はゲームを定義するためにゲームを使っていることですが、なんとかなります。残り何手以内のゲームかでもって話を切れば、残り0手のゲームを定義するためにゲームを使う必要がないので、めでたくゲームを定義していくことができる(ちなみにMamameさんはもっとエレガントなことをしています)。

それで残りn+1手以内のゲームとは何か。まず、残りn手以内のゲームは、残りn+1手以内のゲームでもありますね。めでたい。それから、左の人が移れる行けるゲームと右の人が移れるゲームを決めてもいいですね。この、nからn+1にうつるところを、ゲームどもからゲームどもを決めるしかけとして実装してみましょう。

Inductive step (orig: Type): Type :=
 | inherit: orig -> step orig (* もともとゲームだったものはゲームのまま *)
 | compose: (orig -> Prop) -> (orig -> Prop) -> step orig
   (* 左が動ける先のゲームを定義する述語と、右が動ける先のゲームを定義する述語があればよい *)
.

あとは、空の型から始めて、順々につくっていけばいいです。証明をCoqに通したい人はgithubから持っていってください。

Fixpoint game (m: nat): Type :=
 match m with
 | O => empty
 | S m' => step (game m')
 end.

game 0という型のものはないはずなので、game 0という型のものについての述語は簡単に定義できます。どんなgame 0のものを持ってこられても「にゃー」とか言っておけばいいのです。どうせ何も持ってこられないはずなので。

Definition charm: game 0 -> Prop.
intro.
destruct X.
Defined.

ひとたび「にゃー」と言えればゲームを作るのは簡単です。

Definition zero: game 1 := compose _ charm charm.
Definition one : game 2 := compose _ (fun _ => True) (fun _ => False).
Definition half: game 3 := compose _ (fun x => x = inherit _ zero) (fun y => y = one).

ついでにゲーム同士を比べるgleという関係を定義してみます。どっちのほうが左に有利、というのを比べます。擬順序になるつもりです。

 

Inductive gle: forall m n, game m -> game n -> bool -> Prop (* 定義は略 *)

これを使うと、さっき定義した3つのゲーム同士を比較できます。

Lemma zero_one: gle _ _ zero one true.
Lemma one_zero: gle _ _ one zero false.
Lemma zero_half: gle _ _ zero half true.

擬順序のつもりですから、たとえばreflexivityが成り立ちます。

refl : forall (m : nat) (g : game m), gle m m g g true (* 証明は略 *)

推移律も成り立つはずです、えーと、まだ証明していません。次回以降にやります。反射律と推移律があるなら、すくなくともpreorderとして圏になりますね。でも、ゲームがゲーム以下というのは、あっちのゲームの勝ち方がわかればこっちのゲームの勝ち方もわかるということで、戦略から戦略を計算する仕掛けと捉えることもできますから、もっと豊かな構造を持っていてもいいはずです…ということを考えている先人はたくさんいます。Joyal (1997)の英訳

いまのところ、m手以下のゲームというのを考えてきました。しかし、一手進めると、残り何手なのか決まるゲームというのを考えてもいいでしょう。どうせ終わるのですから。残りω手のゲームと言えるでしょう。残りn手のnのところに、自然数に限らず順序数を許しておけば、最初からこの手のゲームも扱えて幸せになれそうですね。いまは、ωのところだけ、書いておきましょう。

Inductive ogame : Type :=
| o_inherit: forall m, game m -> ogame
| o_compose: (forall m, game m -> Prop) -> (forall m, game m -> Prop) -> ogame
.