bitterharvest’s diary

A Bitter Harvestは小説の題名。作者は豪州のPeter Yeldham。苦闘の末に勝ちえた偏見からの解放は命との引換になったという悲しい物語

プログラマのための圏論:上級編(上)

プログラマのための圏論:上級編(上)』はこれまで、プログラマのための圏論(上級編)で説明してきたことをまとめました。圏論での重要な概念である、極限、米田の補題、随伴関手についてまとめてあります。

レーズン入りパウンドケーキを作る

パウンドケーキは、小麦粉、バター、砂糖、卵を1ポンドずつ用いることから、その名がつけられたそうだ。1ポンドは454gだが、このまま作ると4本ぐらいのパウンドケーキができてしまうので、今日はそれぞれを100g用いることにする。卵は50gを少し上回るぐらいなので2個用いる。また、小麦粉は薄力粉にした。バターは品薄で入手しにくいので、
ケーキ用マーガリンを用いた。

材料と道具に登場してもらおう。料理よりも手間がかかるのが、型に入れるオーブンシート。型の内径に合わせて、四隅を切り抜き、ぴったりと入るように細工するのだが、神経を使う作業となる。
f:id:bitterharvest:20180531200309j:plain
最初にする作業は、2個の卵を泡立てない程度に溶く。
f:id:bitterharvest:20180531200327j:plain
次は、バターを電動ミキサーで練る。バターがミキサーにくっついてしまうが、気にする必要はなさそうだ。
f:id:bitterharvest:20180531200343j:plain
これに砂糖は3回に分けて加え、そのつど電動ミキサーで練りこむ。
f:id:bitterharvest:20180531200454j:plain
その次は、卵だ。これも3回に分けて行うが、電動ミキサーのスピードを速くして混ぜ合わせる。
f:id:bitterharvest:20180531200826j:plain
最後は、薄力粉だが、これは一度に全部入れ、へらを垂直に入れて大きくかき混ぜる操作を繰り返す。入念に行いふんわりと弾力が出てきたら終了。
f:id:bitterharvest:20180531200537j:plain
さらに、レーズンを加えて均等に混ぜる。

できた生地を型に入れる。真ん中を低めに、端の方が高めになるようにする。さらに、レーズンを上にものせた。
f:id:bitterharvest:20180531200943j:plain
180度で余熱したオーブンで40分焼く。途中、15分経過したときに、果物ナイフを用いて縦に切れ目を入れる。このとき火傷をしないように、耐熱用のグローブで手を保護して行う。
f:id:bitterharvest:20180531201026j:plain
また、表面が黒焦げになることを防ぐために、さらに10分ぐらい経過した時に、アルミホイルをかぶせる。

時間が来たら、竹串をケーキの真ん中あたりで刺し、抜いたときに生の生地がついてこないかを確認する。もし、そうであれば、もう少し焼く。

出来上がったら型をオーブンから取り出す。
f:id:bitterharvest:20180531201112j:plain
2-3分おいて、型からパウンドケーキを取り出す。
f:id:bitterharvest:20180531202047j:plain
夕飯の後、デザートとしておいしくいただいた。
f:id:bitterharvest:20180531201941j:plain

今回はレーズンを用いたが、別のドライフルーツを入れてもよい。ただ、悩みはこれらが均等にパウンドケーキの中に納まらないことだ。薄力粉をつけるとうまくいくというブログの記事もあったが、もう少し、研究が必要だ。

伊豆半島ジオパーク ー 城ケ崎を訪れる

28日(月曜日)に伊豆半島の城ケ崎を訪れた。この半島は今年4月18日にユネスコから「世界ジオパーク」に認定された。伊豆半島は、フィリピン海プレートにのって南の方からやってきた火山島が日本列島にくっついて生まれた。火山によって作り出された地形が地質学上の様々な知見を与えてくれる重要な資源を有している。

これまでに、世界ジオパークとしてユネスコから認定されている地域は、糸魚川山陰海岸など8ヶ所あって、伊豆半島は9番目となる。今回訪れた城ケ崎も、伊豆半島ジオパークに含まれるエリアの一つだ。

城ケ崎を訪れたきっかけはジオパークに指定されたからではない。前の日に夕食を取ったイタリアン・レストランで、たまたま読んだ地元の伊豆新聞に、「城ケ崎あじさい」がきれいに咲いているというニュースが載っていたことによる。実は、伊豆半島世界ジオパークに指定されたことを、城ケ崎でその掲示を見るまでは知らなかった。連休に訪れたときも、ジオパークの看板がやけに目立つぐらいにしか感じていなかった。

前日は抜けるような青空であったが、屋外を歩くには暑すぎた。城ケ崎を訪れたこの日は、薄曇りで暑くもなく寒くもなかったので、野外を楽しむには適していた。向かった先の「ニューヨークミュージアム&フラワーガーデン」は、昨年の暮れにリニューアルオープンした。それまでは、「伊豆四季の花公園」と呼ばれていた。

リニューアルに伴って新たに開館したのが、「ティファニーミュージアム」だ。ここには、ティファニーランプやステンドグラスが飾られている。
f:id:bitterharvest:20180531135336j:plain
f:id:bitterharvest:20180531135356j:plain

ミュージアムの外はカフェになっているので、コーヒーを飲みながら城ヶ崎海岸の景色を楽しむ。右側の海岸線の先には城ケ崎の灯台が見える。
f:id:bitterharvest:20180531135421j:plain

左側の海岸線は蓮着寺のほうだ。突端を越えた先には日蓮上人が置き去りにされたといわれる俎岩があるが、ここからは見ることができない。
f:id:bitterharvest:20180531135436j:plain

ミュージアムを後にして、今日の目的であるあじさいを見に行く。その途中にジオスポットがあった。口上書きは以下の通り。
f:id:bitterharvest:20180531135507j:plain

そして、ジオスポットは、
f:id:bitterharvest:20180531135536j:plain

あじさい苑に入ると、最初に出会うのが城ケ崎あじさい。
f:id:bitterharvest:20180531135552j:plain

そして、沢山のあじさいを楽しむことができる。
f:id:bitterharvest:20180531135615j:plain
f:id:bitterharvest:20180531135630j:plain

ニューヨークミュージアム&フラワーガーデンに別れを告げて、門脇吊橋へと向かう。
f:id:bitterharvest:20180531135647j:plain

いつもはここで戻るのだが、今回はさらにその先の「ぼら納屋」まで歩を進めた。途中には、黒船防備のための砲台の跡がある。こんなので防備は大丈夫だと思ったのだろうか。黒船とまともに交戦しなくてよかったといまさらながら感じる。
f:id:bitterharvest:20180531135712j:plain

海岸線に沿って上り下りしているうちに、ぼら納屋につく。この納屋は1627年に紀伊家によって建築され、徳川幕府からの保護を受けてぼら漁業がおこなわれた。ぼら漁業は昭和39年まで続けられていたが、後継者不足とぼらの減少によって絶えたそうである。この納屋は当時の様子を残すために復元され、食堂として利用されている。
f:id:bitterharvest:20180531135735j:plain

このあと戻って、日蓮上人ゆかりの蓮着寺を訪れた。この寺は、日蓮を開祖とする法華宗に属し、1508年に開山された。
f:id:bitterharvest:20180531135846j:plain

俎岩の日蓮上人。日蓮鎌倉幕府を批判したために、1261年に伊豆に流罪となり、1263年に放免となるまでこの地にとどまった。
f:id:bitterharvest:20180531135906j:plain

天然記念物ののヤマモモ。国内最大を誇っている。
f:id:bitterharvest:20180531135938j:plain

今回歩いたエリアは、城ケ崎ピクニカルコースと呼ばれている。城ケ崎の海岸線に沿って、複雑な海岸線を登ったり下ったりする。海に近づいたり離れたりするので、角度を変えて風景を楽しむことができる。溶岩が流れ出て形成されたごつごつした海岸線や、浸食によって削られた深い谷があったりして、楽しませてくれる散策路だ。ニューヨークミュージアム&フラワーガーデンは地図には示されていないが、海洋公園の右隣だ。
f:id:bitterharvest:20180531150254p:plain

散策路に沿って、地質学的な特徴も丁寧に説明されているので、勉強になる散策路でもある。城ケ崎ピクニカルコースは蓮着寺の先で、城ケ崎自然探求路へとつながっている。さらに、地質学を学びたいときは好都合だ。この学問に興味を持った時に改めて訪れようと思っている。

随伴関手 - 随伴関手をHaskellで表現する

7.8 随伴関手をHaskellで表現する

随分と時間がかかったが、随伴関手をHaskellで表現するための準備がほぼ出そろった。ほぼといったのは、もう一つだけ、頭の体操をしておかなければならないことがある。それは、右随伴関手が表現可能関手でもあるということだ。

1)右随伴関手は表現可能関手である

表現可能関手を復習しておこう。局所的に小さな圏\(\mathcal{C}\)と集合の圏\(\mathcal{Set}\)において、\({\rm Hom}\)関手\(\mathcal{C}(A,-)\)と関手\(F\)の自然変換が、自然同型である時、即ち、
\begin{eqnarray}
\mathcal{C}(A,-) \simeq F
\end{eqnarray}
ならば、\(F\)を表現可能関手という。

それでは、右随伴関手が表現可能関手であることを示そう。随伴の定義は次のようになっていた。

\(\fbox {随伴の定義2:}\)
二つの局所的に小さな圏\(\mathcal{C},\mathcal{D}\)において、関手の対\(R: \mathcal{C} \rightarrow \mathcal{D}, L: \mathcal{D} \rightarrow \mathcal{C}\)が次の条件を満たす時、随伴であるという。
\begin{eqnarray}
\mathcal{C} (L(Y),X) \simeq \mathcal{D} (Y,R(X)) \\
\end{eqnarray}

これを図で示すと以下のようになることも示した。
f:id:bitterharvest:20180526090958p:plain

そこで、\(\mathcal{D}\)は集合の圏でもあるので、これを\(\mathcal{Set}\)で、\(Y\)を単集合(singleton setに置き換えると下図を得る。
f:id:bitterharvest:20180526102225p:plain

従って、
\begin{eqnarray}
\mathcal{C} (L( ),X) \simeq \mathcal{D} ( ( ),R(X))
\end{eqnarray}
を得る。右側の\(\mathcal{D} ( ( ),R(X))\)は、単集合を\(R(X)\)に写すものである。関数の数は、その集合の要素の数と同じになる。従って、各\(x \in X\)に対して、一つの関数を与えるので、\(R\)は表現可能関手となる。即ち、
\begin{eqnarray}
\mathcal{C} (L( ),-) \simeq R
\end{eqnarray}
である。

2)Haskellで表現する

それではすべての材料がそろったので、Haskellで表すことにしよう。ここでは、最初に定義したものを実装することとしよう。定義は次のようになっていた。
\(\fbox {随伴の定義1:}\)
二つの局所的に小さな圏\(\mathcal{C},\mathcal{D}\)において、関手の対\(R: \mathcal{C} \rightarrow \mathcal{D}, L: \mathcal{D} \rightarrow \mathcal{C}\)が次の条件を満たす時、随伴であるという。

\begin{eqnarray}
\xi : L \circ R \rightarrow I_\mathcal{C} \\
\mu : I_\mathcal{D} \rightarrow R \circ L
\end{eqnarray}

そこで、\(L,R\)を\(f,u\)とし、\(\xi,\mu\)を\(counit,unit\)とすると、次のようになる。

{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}

class (Functor f, Representable u) => Adjunction f u where
  unit :: a -> u (f a)
  counit :: f (u a) -> a

class Representable f where
  type Rep f :: *
  tabulate :: (Rep f -> x) -> f x
  index :: f x -> Rep f -> x

随伴関手 - 随伴の別定義

7.7 随伴の別定義

1)別定義

随伴の定義にはこれまでと異なる方法がある。それは次のように定義される。

\(\fbox {随伴の定義2:}\)
二つの局所的に小さな圏\(\mathcal{C},\mathcal{D}\)において、関手の対\(R: \mathcal{C} \rightarrow \mathcal{D}, L: \mathcal{D} \rightarrow \mathcal{C}\)が次の条件を満たす時、随伴であるという。
\begin{eqnarray}
\mathcal{C} (L(Y),X) \simeq \mathcal{D} (Y,R(X)) \\
\end{eqnarray}

即ち、下図に示すように
f:id:bitterharvest:20180526090958p:plain

圏\(\mathcal{C}\)での関手\(L(Y)\)から関手\(X\)への自然変換の\({\rm Hom}\)集合である\(\mathcal{C}(L(Y),X)\)と、圏\(\mathcal{D}\)での関手\(Y\)から関手\(R(X)\)への自然変換の\({\rm Hom}\)集合である\(\mathcal{C}(Y,R(X))\)とが自然同型である時、二つの圏\(\mathcal{C},\mathcal{D}\)は、関手\(R: \mathcal{C} \rightarrow \mathcal{D}, L: \mathcal{D} \rightarrow \mathcal{C}\)に対して、随伴であるという。

この定義がこれまで説明してきた定義と同じであることを示そう。その時の定義は次のようになっていた。
\(\fbox {随伴の定義1:}\)
二つの局所的に小さな圏\(\mathcal{C},\mathcal{D}\)において、関手の対\(R: \mathcal{C} \rightarrow \mathcal{D}, L: \mathcal{D} \rightarrow \mathcal{C}\)が次の条件を満たす時、随伴であるという。

\begin{eqnarray}
\xi : L \circ R \rightarrow I_\mathcal{C} \\
\mu : I_\mathcal{D} \rightarrow R \circ L
\end{eqnarray}

2) 両定義が同一であることの証明

それでは、定義2から定義1が導かれることを示そう。定義2の条件は。
\begin{eqnarray}
\mathcal{C} (L(Y),X) \simeq \mathcal{D} (Y,R(X))
\end{eqnarray}
である。

\(\fbox {ステップ1:\(\mu\)を得る}\)
\(X\)と\(Y\)が任意であることに注目し、\(X\)を\(L(Y)\)とすると、
\begin{eqnarray}
\mathcal{C} (L(Y),L(Y)) \simeq \mathcal{D} (Y,R \circ L (Y))
\end{eqnarray}
を得る。

左辺は\(I_{L(Y)}\)となる。また、右辺で、自然変換の一つを\(\mu_Y\)とすれば、
\begin{eqnarray}
\mu_Y : Y \rightarrow R \circ L(Y)
\end{eqnarray}
となる。

任意の\(Y\)に対して成り立つので、これを\(I_\mathcal{D} \)で置き換え、自然変換を\(\mu\)とすれば、
\begin{eqnarray}
\mu : I_\mathcal{D} \rightarrow R \circ L \circ I_\mathcal{D}
\end{eqnarray}
となる。即ち、
\begin{eqnarray}
\mu : I_\mathcal{D} \rightarrow R \circ L
\end{eqnarray}
を得る。

\(\fbox {ステップ2:\(\xi\)を得る}\)
同様に、\(Y\)を\(R(X)\)とすると、
\begin{eqnarray}
\mathcal{C} (L \circ R(X),X) \simeq \mathcal{D} (R(X),R(X))
\end{eqnarray}
を得る。

左辺で、自然変換の一つを\(\xi_Y\)とすれば、
\begin{eqnarray}
\xi_X : L \circ R(X) \rightarrow X
\end{eqnarray}
となり、右辺は\(I_{ R(X)}\)となる。そして、\(X\)を\(I_\mathcal{C} \)とすれば、
\begin{eqnarray}
\xi : L \circ R \rightarrow I_\mathcal{C}
\end{eqnarray}

これによって、定義1での\(\xi,\mu\)を得ることができたが、証明はここで終了ではない。定義2での左辺あるいは右辺が与えられた時に、この\(\xi,\mu\)を用いて、右辺あるいは左辺が得られることを示さなければならない。

そこで、定義2での左側の自然変換を\(u\)、右側のそれを\(u’\)すると、
\begin{eqnarray}
u: L(Y) \rightarrow X \\
u’: Y \rightarrow R(X)
\end{eqnarray}
として、満たされることを示そう。

\(\fbox {ステップ3:\(u,\xi,\mu\)から\(u’\)を得る}\)
最初に、\(u,\xi,\mu\)が与えられた時、\(u’\)が得られることを示そう。\(u’\)は\(Y\)を入力としているので、最初に\(\mu_Y\)を用いる。
\begin{eqnarray}
\mu_Y : Y \rightarrow R \circ L(Y)
\end{eqnarray}
これは、\( R \circ L(Y)\)を出力しているので、これを入力とする関数を作ろう。これは\( R \circ u\)である。即ち、
\begin{eqnarray}
R \circ u : R \circ L(Y) \rightarrow R(X)
\end{eqnarray}
である。上記二つの関数をつなげると、
\begin{eqnarray}
R \circ u \circ \mu_Y: Y \rightarrow R(X)
\end{eqnarray}

これより、\(u,\xi,\mu\)から\(u’\)が得られることが分かった。

\(\fbox {ステップ4:\(u',\xi,\mu\)から\(u\)を得る}\)
逆に、\(u’,\xi,\mu\)が与えられた時、\(u\)が得られることを示そう。\(u\)は\(L(Y)\)を入力としているので、これを入力とする関数を作成する。
\begin{eqnarray}
L \circ \mu_Y: L(Y) \rightarrow L \circ R \circ L(Y)
\end{eqnarray}
これは、\( L \circ R \circ L(Y)\)を出力しているので、これを入力とする関数を作る。
\begin{eqnarray}
L \circ R \circ L \circ u’ : L \circ R \circ L(Y) \rightarrow L \circ R \circ L \circ R (X)
\end{eqnarray}
である。\( L \circ R \circ L \circ R (X)\)を出力しているので、これを入力とする関数を作る。
\begin{eqnarray}
L \circ R \circ \xi_X: L \circ R \circ L \circ R (X) \rightarrow L \circ R (X)
\end{eqnarray}
上記のを連続して適応すると、
\begin{eqnarray}
L \circ R \circ \xi_X \circ L \circ R \circ L \circ u’ \circ L \circ \mu_Y: L(Y) \rightarrow L \circ R (X)
\end{eqnarray}
これに、\(\xi\)を適用すると、
\begin{eqnarray}
\xi \circ L \circ R \circ \xi_X \circ L \circ R \circ L \circ u’ \circ L \circ \mu_Y: L(Y) \rightarrow X
\end{eqnarray}

これより、\(u',\xi,\mu\)から\(u\)が得られることが分かった。

随伴の理解が進んだと思うので、次回はHaskellで実装することを考えよう。

随伴関手 - 随伴から導き出される可換図

7.6 随伴から導き出される可換図

随伴の定義からどのような可換図が導きだされるかを考えてみよう。随伴の定義は次のようになっている。

二つの局所的に小さな圏\(\mathcal{C},\mathcal{D}\)において、関手の対\(R: \mathcal{C} \rightarrow \mathcal{D}, L: \mathcal{D} \rightarrow \mathcal{C}\)が次の条件を満たす時、随伴であるという。

\begin{eqnarray}
\xi : L \circ R \rightarrow I_\mathcal{C} \\
\mu : I_\mathcal{D} \rightarrow R \circ L
\end{eqnarray}

そこで、この式を用いて\(L\)を変形してみよう。

最初に、\(L\)は\(L \circ I_\mathcal{D}\)に変形できる。次に、\(\mu : I_\mathcal{D} \rightarrow R \circ L \)を用いて、\( L \circ R \circ L \)に変形できる。さらに、\(\xi : L \circ R \rightarrow I_\mathcal{C} \)を用いて、\( I_\mathcal{C} \circ L \)に変形できる。これは、\( L \)と同じである。

式の変形を可換図で表すと下図の左側を得る。
f:id:bitterharvest:20180523093928p:plain

同様に、\(R\)で始めると、
\begin{eqnarray}
&&R \\
&=& I_\mathcal{D} \circ R \\
&=& R \circ L \circ R \\
&=& R \circ I_\mathcal{C} \\
&=& R
\end{eqnarray}
をえる。これを可換図にしたのが、上図の右側である。

この二つの可換図は、英語ではTriangle Identitiesと呼ばれている。

上の可換図は、関手をベースに考えたが、圏をベースに可換図を描くと次のようになる。
f:id:bitterharvest:20180523094001p:plain

随伴の定義をウィキペディアで調べると、違う方法で定義されることが分かる。次回は、この話をしよう。

随伴関手 - 随伴の解釈

7.5 随伴の解釈

随伴の定義は次のようになっていた。

二つの局所的に小さな圏\(\mathcal{C},\mathcal{D}\)において、関手の対\(R: \mathcal{C} \rightarrow \mathcal{D}, L: \mathcal{D} \rightarrow \mathcal{C}\)が次の条件を満たす時、随伴であるという。

\begin{eqnarray}
\xi : L \circ R \rightarrow I_\mathcal{C} \\
\mu : I_\mathcal{D} \rightarrow R \circ L
\end{eqnarray}

この定義を理解することとしよう。随伴の趣旨は、二つの局所的に小さな圏があった時にそれが等しいということを定義することであった。そこで、一方の圏\(\mathcal{D}\)に、左随伴関手\(L\)を施した後で、右随伴関手\(R\)を施したときに、下図のように圏\(\mathcal{D}\)に戻ってくる。
f:id:bitterharvest:20180522103401p:plain

通常は等しいというときは、重なることが前提になっているが、圏論ではこれを緩めてある。関数\(\mu\)だけずれていても等しいということにしている。これを示すと下図のようになる。
f:id:bitterharvest:20180522103416p:plain

即ち、恒等射\(I_D\)の任意の要素を\(d\)とした時、これに\(R \circ L\)を施したとする。このとき、その移動後の場所は、同じところではなく、自然変換\(\mu: I_D \rightarrow R \circ L\)を行った先、即ち、\(R \circ L (d)\)となる。これが圏論での二つの圏が等しいと見なす定義の内容の一つだ。これまでの同型という言葉は使えないので、随伴という言葉を用いている。

この移動は、\(R \circ L \)というコンテナの中に\(d\)を納めるという気分だ。コンテナに入れただけなので同じと見なしてもよいだろうということだ。そして、モノイドでの\(return\)と同じだということも感覚的にわかると思う。
f:id:bitterharvest:20180522103519p:plain

逆に、圏\(\mathcal{C}\)に、右随伴関手\(R\)を施した後で、左随伴関手\(L\)を施したときに、下図のように圏\(\mathcal{C}\)に戻ってくる場合について考えてみよう。
f:id:bitterharvest:20180522103535p:plain

このときは、\(L \circ R \)というコンテナの中から前から入っていた\(c\)を取り出すという気分だ。コモノイドでの\(extract\)と同じだということがやはり感覚的にとらえることができ面白い。

随伴関手 - 随伴の定義

7.4 随伴の定義

数学で最も重要な概念はと問われた時、皆さんは何と答えるだろうか。私は、「等しい」だと思う。算数から数学へと教科の名前が変わり、少し大人になったと感じさせてくれた中学で、すぐに習ったのが三角形の合同であった。ある三角形を移動したり回転したりして、別の三角形にぴったりと重ね合わせることができるなら、二つの三角形は合同だというものだ。

大学になると「等しい」という概念をもう少し抽象的に学ぶようになる。それは「同型」だ。集合\(A,B\)が存在したときに、次の条件を満足する\(f: A \rightarrow B, g: B \rightarrow A\)が存在するとき、二つの集合は同型と言われる。その条件は、
\begin{eqnarray}
g \circ f=I_A \\
f \circ g=I_B
\end{eqnarray}
である。図で表すと次のようになる。なお、このような写像\(f,g\)を同型写像という。
f:id:bitterharvest:20180521112223p:plain

同型という概念は、合同という概念の上位概念となっているので、合同な二つの三角形はもちろん同型でもある。それでは、さらなる上位概念を圏においても定めたい。即ち、二つの圏が与えられた時に、これらが「等しい」といはどのようなことなのかを定めたい。

上の図は集合と関数から成り立っていたが、これらを対応する圏論の用語で置き換えると、集合のところは(局所的に小さな)圏\(\mathcal{C},\mathcal{D}\)となり、関数のところは関手\(R: \mathcal{C} \rightarrow \mathcal{D}, L: \mathcal{D} \rightarrow \mathcal{C}\)となる。
f:id:bitterharvest:20180521112303p:plain

条件は、そのまま置き換えると、
\begin{eqnarray}
L \circ R=I_\mathcal{C} \\
R \circ L=I_\mathcal{D}
\end{eqnarray}

ところで、上の条件は、左側の関手と右側の関手が等しいと言っている。圏論では、二つの関手が等しいという概念を別に用意している。自然同型(naturally isomorphic)だ。

下図を用いて自然変換(natural transoformation)を復習しておこう。
f:id:bitterharvest:20180521112327p:plain

\(\fbox {自然変換の定義:}\)
上の図で、関手\(F,G\)の自然変換\(\alpha\)とは、次の条件を満たすものである。
1) 自然変換\(\alpha\)は、全ての対象\(X \in \mathcal{C}\)に、\(\mathcal{D}\)の対象間での射\(\alpha_X:F(X) \rightarrow G(X)\)を対応させる。ここで、\(\alpha_X\)は自然変換\(\alpha\)の\(X\)での成分と呼ばれる。
2) 成分は全ての射\(f:X \rightarrow Y\)に対して、次を成り立たせる。
\begin{eqnarray}
\alpha_Y \circ F(f) = G(f) \circ \alpha_X
\end{eqnarray}
なお、ここでは、\(F,G\)が共に共変(covariant)である場合について定義したが、共に反変(contravariant)の時は、\(F(f),G(f)\)の矢印は反対になる。

次に、関手\(F,G\)が自然同型であるとは次のように定義される。なお、自然同型は、英語の方はいくつかの表現があり、先にあげたnaturally isomorphicのほかにnatural isomorphism, natural equivalence, isomorphism of functorsがある。

\(\fbox {自然同型の定義:}\)
全ての\(X \in \mathcal{C}\)の対象\(X\)に対して、射\(\alpha_X\)が\(\mathcal{D}\)において同型射(isomorphic)であるならば、\(\alpha\)は自然同型である。

ここで、同型射とは、同型写像と同じ意味である。即ち、\(\beta_X \circ \alpha_X = I_{F(X)}\), \(\alpha_X \circ \beta_X = I_{G(X)}\)となるような\(\beta_X: G(X) \rightarrow F(X)\)が存在することを言う。

そこで、等しいことの条件を緩めて、自然同型\(\simeq\)を用いると次のようになる。
\begin{eqnarray}
L \circ R \simeq I_\mathcal{C} \\
R \circ L \simeq I_\mathcal{D}
\end{eqnarray}

圏論の人々は、これでも条件がきつすぎると感じているので、さらに条件を次のように緩めている。そして、同型ではなく随伴(adjunction)と呼ぶ。定義は次のようになる。

\(\fbox {随伴の定義:}\)
二つの局所的に小さな圏\(\mathcal{C},\mathcal{D}\)において、関手の対\(R: \mathcal{C} \rightarrow \mathcal{D}, L: \mathcal{D} \rightarrow \mathcal{C}\)が次の条件を満たす時、随伴であるという。また、\(L,R\)のそれぞれを左随伴関手、右随伴関手という。また、\(L \circ R \)は圏\(\mathcal{C}\)での自己関手(endofunctor)、同様に\(R \circ L \)は圏\(\mathcal{D}\)での自己関手となっていることにも注意を払っておく必要がある。

\begin{eqnarray}
\xi : L \circ R \rightarrow I_\mathcal{C} \\
\mu : I_\mathcal{D} \rightarrow R \circ L
\end{eqnarray}

なお、\(\xi,\mu\)はそれぞれ\(counit,unit\)という関数名でも呼ばれる。Haskellではこれらの関数は別の名前で呼ばれている。即ち、\(counit\)はコモナド(comonad)での関数\(extract\)として、\(unit\)はモナド(monad)での関数\(return\)として使われる。

プロから教わった「鯵のソテー」を母の日に挑戦する

5月13日は母の日。実母も義母もすでに他界していて、感謝する対象は既にいないのだが、母として長いこと子供たちの養育に尽くしてくれた妻に感謝を込めて、特別な料理をプレゼントした。

「鯵のソテー」だが、プロの方から教わった特別な料理だ。この方のお店は、東京大神宮近くの隠れ家的なお店で、イタリアンレストランだ。大学に在職していた時の同僚たちや、気の置けない高校時代の友人たちと利用するお店だ。

母の日の前日に、高校3年生の時の同じクラスの親しかった仲間たちとこのレストランでランチを共にした。高校時代に戻って、遠慮することなく、好き勝手に話をするので、別のお客さんがいると迷惑をかけるが、それほど多くない人数なのに貸し切りにしてくれ、しかも、長い時間、居座り続けることを許してくれるので、とてもありがたいお店だ。

長い人生経験を経て、話している話題は今日的なのだが、それに対する意見の持ちようは高校時代と全く変わらないのにびっくりさせられる。高校の時が人格形成期だったのがその理由なのだろうが、タイムスリップしたような気分を味わう。

お店からは、美味しい料理とそれにぴったりのワインがタイムリーにサービスされるのだが、皆、話すことに夢中になっていて、料理を味わうゆとりがない。一生懸命に料理を作ってくださったシェフの方に申し訳ないなと思いながらも、それを忘れて、高校時代の思い出話に花を咲かせた。

帰り際に、宿題がありますとレシピを手渡された。かつての同僚が、一月ぐらい前に、お店の方に手ごろなレシピを教えてあげてくださいと依頼してくれていたのだ。そのレシピが、「鯵のソテー、フレッシュトマトと香草のソース」だ。

プロのレシピを手渡されたのは初めてなので、早速、母の日に挑戦することとした。

例によって食材に登場してもらおう。主役はもちろん鯵。今回は、いつもの安売り店ではなく、デパ地下の高級感のある魚屋さんで仕入れた。このため、ゼイゴと呼ばれる側面についている骨と内臓を魚屋さんの方で取り除いてくれた。ソテーのスープの主役になるのは、トマト。美味しそうなトマトがたくさん出回っているので、これも同じデパ地下で仕入れた。さらに、玉ねぎだが、友達が水俣から取り寄せてくれたサラダ玉葱を用いることにし、いつもより高級な食材で勝負だ。

しかし、白ワインだけは、自宅のワインセラーにあるものを使うことがためらわれたので、カルディで仕入れることとした。物色していると、隣のお客さんがお店の人に、料理用に白ワインを利用したいのですがどれがいいでしょうかと相談している。お店の人が、栓がスクリューになっているのがお薦めですと言っている。別の機会のために貯蔵しておくのに便利だし、飲んでも美味しいのでと理由を説明している。それではということで、1000円を少し超えているイタリア産のシャルドネを選んだ。ハーブの方は、家庭菜園にオレガノとパセリがあったので、スイートバジルとチャービルを購入した。母の日なので、少し、ぜいたくにという戦略で臨んだ。その他に利用したのはニンニク、オリーブオイル、塩、胡椒だ。
f:id:bitterharvest:20180513220129j:plain

食材がそろった後は、下ごしらえだ。ニンニクは、一片を細かく切った。
f:id:bitterharvest:20180513221831j:plain

玉ねぎは半分を利用してスライスした。
f:id:bitterharvest:20180513221946j:plain

トマトは1個を1㎝角に切った。
f:id:bitterharvest:20180513222045j:plain

ハーブは、パセリ、オレガノスイートバジル、チャービルの4種類を混ぜて細かく切り、大匙2杯ぐらいの量を利用した。
f:id:bitterharvest:20180513222306j:plain

鯵は、内臓の切り口の部分に塩、胡椒をし、表面にも同じように塩、胡椒をした後、薄力粉を均等にまぶした。なお、魚屋さんではえらの部分の骨は落としてくれなかったので、この時に、切断した。
f:id:bitterharvest:20180513222500j:plain

下ごしらえが済んだので、次は、鯵の表面に焦げ目をつける作業だ。
フライパンにオリーブオイルを多めに入れ、さらに、にんにくを入れてつぶした。その後、中火にしてぱちぱちという音が出るまで、ニンニクを炒めた。
f:id:bitterharvest:20180513222756j:plain

その後、頭が右側になるようにして、魚をフライパンに入れる。熱は中火である。表面に焦げ目がついたとき、ひっくり返し、反対側の表面にも焦げ目をつける。
f:id:bitterharvest:20180513222939j:plain

中まで火が通っていなくても構わないが、両面に焦げ目がついたら、鯵をいったんクッキングペーパーの上に取り除く。
f:id:bitterharvest:20180513223306j:plain

残っているオリーブオイルを利用して、中火で玉ねぎを透明感が出るまで炒める。
f:id:bitterharvest:20180513223433j:plain

強火にして白ワイン200CCをフライパンに加え、そして、アルコール分を飛ばす。
f:id:bitterharvest:20180513223852j:plain

今度は、左側を頭にして鯵をフライパンに再度入れる。
f:id:bitterharvest:20180513224010j:plain

さらに、トマトとハーブを加える。
f:id:bitterharvest:20180513224113j:plain

蓋をして、2分間中火で煮る。
f:id:bitterharvest:20180513224257j:plain

ソースがとろっとした感じになるので出来上がり。
f:id:bitterharvest:20180513224417j:plain

そして、食卓に並べる。
f:id:bitterharvest:20180513224503j:plain

妻もとても美味しいと言ってくれたので、思い出に残る母の日になりました。
プロのシェフに教えてもらったレシピの通りに本当に実現できたかどうかは疑わしいのだが、普段の料理とは一味も二味も違うので、すごいなと感じた。

随伴関手 - 米田の埋め込み

7.2 余米田の補題

米田の補題では、共変\(\rm{Hom}\)関手\(\mathcal{C}(A,-)\)を用いていたが、これを反変\(\rm{Hom}\)関手\(\mathcal{C}(-,A)\)に変えたのが、余米田の補題となる。

次のようになる。局所的に小さな圏\(\mathcal{C}\)と集合の圏\(\mathcal{Set}\)、これらによって作られる関手圏\([\mathcal{C},\mathcal{Set}]\)を考える。今、任意の対象\(A \in \mathcal{C}\)と任意の関手\(F: \mathcal{C} \rightarrow \mathcal{Set}\)に対して、
\begin{eqnarray}
[\mathcal{C},\mathcal{Set}](\mathcal{C}(-,A),F) \simeq F(A)
\end{eqnarray}
が成り立つ。ただし、\(\mathcal{C}(-,A): \mathcal{C} \rightarrow \mathcal{Set}\)は関手であり、\([\mathcal{C},\mathcal{Set}](\mathcal{C}(-,A),F)\)は\(\mathcal{C}(-,A)\)から\(F\)への自然変換である。

図で示すと次のようになる。
f:id:bitterharvest:20180508135536p:plain

証明は、米田の補題でのそれを利用すると、同じように行える。

7.3 米田の埋め込み

米田の補題は、米田の埋め込みを証明するために利用したものである。米田の補題で、関手\(F\)を反変関手にしたものを、前回の記事で紹介した。
\begin{eqnarray}
[\mathcal{C},\mathcal{Set}](\mathcal{C}(A,-), \mathcal{C}(B,-)) \simeq \mathcal{C}(B,A)
\end{eqnarray}

これが米田の埋め込みと呼ばれている。図で表すと次のようになる。
f:id:bitterharvest:20180508135600p:plain

米田の埋め込みは\(B\)から\(A\)への\({\rm Hom}\)集合と、\(\mathcal{C}(A,-)\)から\(\mathcal{C}(B,-)\)への\({\rm Hom}\)集合とは同型であるといっている。

これは、局所的に小さな圏\(\mathcal{C}\)の任意の二つの対象\(A\)と\(B\)を選び、また、その対象間の\({\rm Hom}\)集合を\(\mathcal{C}(A,B)\)とした時、関手圏\([\mathcal{C},\mathcal{Set}]\)にはこれと同型の構造が存在する。即ち、\(A\)に対して対象\(\mathcal{C}(B,-)\)が、また、\(B\)に対して対象\(\mathcal{C}(A,-)\)が対応し、\(\mathcal{C}(A,B)\)に対して、対象\(\mathcal{C}(B,-)\)から対象\(\mathcal{C}(A,-)\)への同型の\({\rm Hom}\)集合が存在する。

従って、米田の埋め込みは、局所的に小さな圏\(\mathcal{C}\)の構造が、関手圏\([\mathcal{C},\mathcal{Set}]\)に忠実に(faithful)しかも充満に(full)埋め込まれることを述べている。なお、忠実は単射であることを言い、充満は全射であることを言う。

米田の埋め込みを利用してみよう。

例1

今、\(f \in \mathcal{C}(B,A)\)と\(u \in \mathcal{C}(A,X)\)が図のように与えられたとしよう。この時、自然変換\(\alpha_X\)を求めよう。これには、\(u’ \in \mathcal{C}(B,X)\)を求めればよいが、\(u’ = u \circ f\)となることは自明である。
f:id:bitterharvest:20180508135632p:plain

参考のために、三つの対象の場合も図に挙げておく。対応関係を確認して欲しい。
f:id:bitterharvest:20180508135644p:plain

例2

関手圏\([\mathcal{C},\mathcal{Set}]\)において、\(\mathcal{C}(A,-)\)と \(\mathcal{C}(B,-)\)が同型の時、小さい圏\(\mathcal{C}\)において、\(A\)と\(B\)は同型である。また、逆も成り立つ。証明は試みて欲しい。

例3

前順序(preorder)集合を考えてみよう。これは、任意の二つの要素に対して、\(a \leq b\)であれば矢印があり、そうでなければ矢印はないという性質を有している。

それでは、前順序集合に対して余米田の埋め込みを利用してみよう。
\begin{eqnarray}
[\mathcal{C},\mathcal{Set}](\mathcal{C}(-,A), \mathcal{C}(-,B)) \simeq \mathcal{C}(A,B)
\end{eqnarray}

今、右辺が\(A \leq B\)であったとする。この時、\({\rm Hom}\)集合\(\mathcal{C}(A,B)\)での関数の数が1であることに注意して、これを満たす左辺を求めて見よう。

今、任意の\(X\)に対して\(X \leq A\)の時は、前順序の関数が一つ存在するので\({\rm Hom}\)集合としての\(\mathcal{C}(-,A)\)は関数の数は1になり、そうでないときは前順序の関数が存在しないので空\(\phi\)となる。\(X \leq B\)についても同じである。なお、ここでは、\(X\)は\(A\)でもなく\(B\)でもないとする。

左辺の\({\rm Hom}\)集合での関数の数が1なので、\({\rm Hom}\)集合としての自然変換\([\mathcal{C},\mathcal{Set}](\mathcal{C}(X,A), \mathcal{C}(X,B))\)も1になるはずである。自然変換は、\(\mathcal{C}(X,A) \rightarrow \mathcal{C}(X,B))\)での組み合わせとなる。従って、以下の四つの組合せのどれかということになるが、どれが該当するのであろうか。この中の、一つだといっている。
\begin{eqnarray}
id_\phi: \phi \rightarrow \phi \\
absurb: \phi \rightarrow 1 \\
id_1: 1 \rightarrow 1 \\
prohibit: 1 \rightarrow \phi
\end{eqnarray}

この中で、4番目は関数が値を持たないこととなり関数ではない。従って、最初の三つが候補となるが、正しいのは3遍目となる。これは、\(X \leq A\)ならば、\(X \leq B\)であるといっている。これを示したのが下図である。
f:id:bitterharvest:20180508135714p:plain

このように、米田の補題、あるいは、余米田の補題は証明の助けにもなる。

次回は、圏論の中心である随伴関手を説明しよう。

随伴関手 - 米田の補題:復習

7 随伴関手

7.1 米田の補題:復習

米田の補題は次のようになっていた。

局所的に小さな圏\(\mathcal{C}\)と集合の圏\(\mathcal{Set}\)、これらによって作られる関手圏\([\mathcal{C},\mathcal{Set}]\)を考えよう。今、任意の対象\(A \in \mathcal{C}\)と任意の関手\(F: \mathcal{C} \rightarrow \mathcal{Set}\)に対して、
\begin{eqnarray}
[\mathcal{C},\mathcal{Set}](\mathcal{C}(A,-),F) \simeq F(A)
\end{eqnarray}
が成り立つ。ただし、\(\mathcal{C}(A,-) : \mathcal{C} \rightarrow \mathcal{Set}\)である。すなわち、これは関手である。このため、\([\mathcal{C},\mathcal{Set}](\mathcal{C}(A,-),F)\)は、関手\(\mathcal{C}(A,-)\)から\(F\)への自然変換である。

米田の補題Haskellでは、どのようにあらわすことができるであろうか。自然変換は、多相関数(polymorphic function)で表すことができる。従って、型シグネチャで表すと

forall x. (a -> x) -> F x ~= F a

となる。Haskellでは、\(forall \ x\)を省略することができるが、ここでは、\(\mathcal{C}(A,-)\)の部分がどのように表されるかを正確に期するために、\(forall \ x\)をわざわざ付けた。

上の型シグネチャで、\( forall \ x. (a \rightarrow x) \rightarrow F \ x \)は高次の多相関数となっている。また、\(F \ a\)はデータ型である。

それでは少し、例を挙げてみよう。

例1)リスト

リストは関手なので、これを用いると、米田の補題は次のように書き換えられる。
\begin{eqnarray}
[\mathcal{C},\mathcal{Set}](\mathcal{C}(A,-),[- ]) \simeq [A]
\end{eqnarray}

また、Haskellで表すと

forall x. (a -> x) -> [x] ~= [a] 

となる。

そこで、左辺を自然変換\(\alpha\)とすると、

α :: forall x. (a -> x) -> [x]

となる。

これは、リストに対する関手と同じなので、

α f = fmap f

と考えることができる。これをクロージャと考えると、これに対する入力は\([a]\)と考えることができる。例えば、\([a1,a2,…,an]\)とすると、

fmap f [a1,a2,…,an] 
=[f(a1),f(a2),…,f(an)] 
=[x1,x2,…,xn] 

となる。

例2)\({\rm Hom}\)集合の関手

関手を\(\mathcal{C}(B,-)\)にしてみよう。この時、\(F(A)\)は\(\mathcal{C}(B,A)\)になることに注意すると、米田の補題から、
\begin{eqnarray}
[\mathcal{C},\mathcal{Set}](\mathcal{C}(A,-), \mathcal{C}(B,-)) \simeq \mathcal{C}(B,A)
\end{eqnarray}
となる。これをHaskellで表すと、

forall x. (a -> x) -> (b -> x) ~= (b -> a)

となる。\((b \rightarrow x)\)はリーダーであることに注意しよう。これは、

α :: (a -> x) -> (b -> x)
g :: b -> a

とすると、

α f = f . g

となる。

例3)継続渡し

関手を\(Id\)にしてみよう。米田の補題から、
\begin{eqnarray}
[\mathcal{C},\mathcal{Set}](\mathcal{C}(A,-),Id) \simeq Id(A)
\end{eqnarray}
となる。これをHaskellで表すと、

forall x. (a -> x) -> x ~= a

となる。

これも同じように、自然変換を\(\alpha\)とすると、

α :: (a -> x) -> x
α f = f

これは、前に説明した継続渡しである。継続渡しは時間的な推移を表現できることに特徴がある。

横浜三渓園を訪ねる

少し肌寒く感じられる昨日(23日月曜日)、横浜市にある三渓園を訪ねた。肌寒いと言っても、実は、平年並みの気温だ。土曜、日曜と夏日だったので、相対的にそのように感じただけだ。気候変動がカオス的であるとすると、三つの状態がある。安定的、振動的、ランダム的だ。縄文時代以来、1万3千年以上にもわたって気候は穏やかな状態にある。地球の歴史を顧みると、このように長く続くのは珍しく、別の状態にいつ入ってもおかしくない状況にある。この異常さが、このことを示唆していないことを願っている。

三渓園を訪れたのは、実に50年ぶり。帰りのバスが混んでいて、終点まで立っていたことぐらいしか覚えていないので、初めてと言ってもよいくらいだ。

三渓園は原富太郎によって造られた。彼を含めて、高島嘉右衛門浅野総一郎などが明治期の横浜の発展に大きく貢献したとされている。原富太郎は慶応4年(1868年)に美濃国厚見郡佐波村(現在の岐阜市)に生まれている。青木久衛の長男で、明治25年(1892年)に横浜の豪商の原善三郎の孫娘の屋寿(やす)と結婚して、原家に入り、絹貿易により富を築いた。また、彼の号は三渓である。このため、原三渓とも呼ばれる。

三渓園の小史は以下のとおりである。富太郎の養祖父の原善三郎が明治初年(1968年)に土地を購入し、20年代に山上に別荘を建てた。善三郎が死去した35年ごろから、富太郎が三渓園の造園に着手し、この地を本宅とした。そして、明治39年(1906年)より、現在の外苑と呼ばれる地域を無料で開放した。彼は、当時の新進気鋭の画家たちの支援をし、前田青邨横山大観、下村観山などの作品が園内で生まれている。富太郎は昭和14年(1939年)に死去している。

三渓園は、関東大震災第二次世界大戦での横浜空襲により被害を受け、昭和28年(1953)年には横浜市に譲渡・寄贈され、復旧工事が施され、現在に至っている。

三渓園本牧にある。高速道路を利用してのアクセスは良いのだが、電車で利用する場合は不便だ。横浜や桜木町から本牧車庫前行のバス(8,148系統)に乗り、三渓園入口で下車する。その後、歩いて5分ぐらいで三渓園の入り口に到着する。

現在の三渓園の地図は次のようになっている。
f:id:bitterharvest:20180424120908p:plain

三渓園の南側は高速道路が走っている。ボランティアの方が50年前は海に面していたと教えてくれたので調べてみた。昭和39年(1974年)の地図では次のようになっている。
f:id:bitterharvest:20180424121044p:plain

この地図には高速道路はない。地図を重ねてみると、現在の地図には高速道路に沿うように北側に長細い池があり、そこが50年前には海岸線であったことが分かる。のちに、左側にある埋立地が延長され、海岸線が外になり、新たな土地に工場が造られ、そして、高速道路が開通されたようだ。埋め立てられる前の三渓園は、崖の上に立地し、眺望は今以上に素晴らしかったことだろう。

入場券を買って門の中に入ると、ボランティアの方が出迎えてくれる。お願いして、園内を紹介してもらうこととした。最初に連れて行ってくれたのが鶴翔閣だ。明治35年(1902年)に建立され、住いとして使われた。広さは290坪だそうだ。
f:id:bitterharvest:20180424121149j:plain

さらに進むと御門がある。
f:id:bitterharvest:20180424121222j:plain

外側のひさしが長くなるように、アンバランスに造られているのが特徴だ。

門を抜けて少し進むと立派な庭園が見えてくる。その奥に佇んでいるのが数寄屋風書院の臨春閣だ。紀州徳川家初代の徳川順宣によって慶安2年(1649年)に夏の別荘として紀ノ川沿いに建てられた。なお、順宣は家康の十男である。
f:id:bitterharvest:20180424121355j:plain
f:id:bitterharvest:20180424121442j:plain

臨春閣の2階に上る階段が面白い。釣鐘上の入り口の中に階段がある。この階段は一直線に2階に上るのではなく、途中に踊り場があって、回りながら上がっていくのだそうだ。
f:id:bitterharvest:20180424121555j:plain

さらに進むと、とても古そうな堂にいたる。これは旧天瑞寺寿塔覆堂だ。天正19年(1591年)に、豊臣秀吉が母の長寿祈願のために京都大徳寺に造った寿塔(生前墓)を納めるために建立した建物だ。
f:id:bitterharvest:20180424121710j:plain

また、近くには聴秋閣がある。これは三代将軍家光が上洛に際して二条城内に造ったものを春日局に下賜され、江戸稲葉候邸に移築されたものだそうだ。大正11年三渓園に移された。
f:id:bitterharvest:20180424121759j:plain

ここより少し高いところに、天寿院がある。これは鎌倉・建長寺近くにあった地蔵堂の建物を移したものである。
f:id:bitterharvest:20180424121847j:plain

ここまでは、内苑と呼ばれる。この後、外苑へと向かう。小高い丘に登ると、旧燈明寺の三重塔がある。室町時代の康生3年(1457年)の建立だ。移築したのは大正3年である。
f:id:bitterharvest:20180424121938j:plain

鎌倉の旧東慶寺仏殿もある。江戸時代の寛永11年(1634年)の建立である。
f:id:bitterharvest:20180424122043j:plain

また、白川郷の合掌造りの建物もあった。ここでは、この地域の家族形態についてボランティアの方から伺うことができた。大家族で生活を営んでおり、長男は嫁入婚だが、次男・三男は妻問婚だったそうだ。主人夫婦は1階を寝室にしていて、その他の家族は中2階に寝ていたそうだ。外部との接触を遮断したときの生き残るための知恵なのだろうが、古代の習慣に似ていることにも驚かされた。

ボランティアの方が、原富太郎が考案した料理を教えてくれた。汁のないそばだ。通常のそばだと、食べているときに汁が飛んで衣服を汚す可能性があるので、そのようなことが起こらないようにとおもてなしを第一に考えてのことだそうだ。

三渓園を訪問した記念にと食べてみることにした。三渓そばという名前だが、実際は、そばではなくうどんだ。タケノコ、ハム、薄焼き卵などがトッピングされている。昆布茶が一緒についてくるが、間違ってこれをかけてはいけない。珍しい料理で、思い出としてはよかったと思った。
f:id:bitterharvest:20180424122114j:plain

今回は、複数のボランティアの人のお世話になった。最初の方は、1時間かけて園内を案内してくれた。合掌造りの建物では、複数人の方からとっておきの話を伺うことができた。また、新しいボランティアの方が入ったのであろう。研修されている方からも、新鮮な話を聞くことができた。ボランティアのすばらしさを体験する一日でもあった。

米田の補題 ー 集合値関手を積として表す

6.6 集合値関手を積として表す

米田の補題は次のようになっていた。局所的に小さな圏\(\mathcal{C}\)と集合の圏\(\mathcal{Set}\)、これらによって作られる関手圏\([\mathcal{C},\mathcal{Set}]\)を考える。任意の対象\(A \in \mathcal{C}\)と任意の関手\(F: \mathcal{C} \rightarrow\mathcal{Set}\)に対して、
\begin{eqnarray}
[\mathcal{C},\mathcal{Set}](\mathcal{C} (A, -),F) \simeq F(A)
\end{eqnarray}
が成り立つのが米田の補題である(\(\simeq\)は左辺と右辺が同型である、即ち、全単射であることを示す)。また、\(\mathcal{C}(A,-): \mathcal{C} \rightarrow \mathcal{Set}\)は関手であり、\([\mathcal{C},\mathcal{Set}](\mathcal{C}(A,-),F) \)は、\(\mathcal{C}(A,-)\)から\(F\)への自然変換である。
f:id:bitterharvest:20180414091504p:plain

そこで、\(F(A)\)の性質について考えることとしよう。\(F(A)\)は、\(A\)に\(F\)というコンテナで覆ったものと考えることが可能である。従って、馴染み深い積\((F,A)\)と考えてみてはどうだろうか。

\(F\)は圏\([\mathcal{C},\mathcal{Set}]\)の対象であり、\(A\)は\(\mathcal{C}\)の対象である。また、\(F(A)\)は\(\mathcal{Set}\)の対象である。従って、\(F\)と\(A\)の積から\(F(A)\)への射は
\begin{eqnarray}
[\mathcal{C},\mathcal{Set}] \times \mathcal{C} \rightarrow \mathcal{Set}
\end{eqnarray}
となる。

これを利用して、\((F,A)\)を\(F(A)\)へ移す関手を考えよう。また、\((F,A)\)から、\([\mathcal{C},\mathcal{Set}](\mathcal{C} (A, -),F)\)へ移す関手も考えてみよう。

圏\(([\mathcal{C},\mathcal{Set}] \times \mathcal{C})\)は下図のようになる。
f:id:bitterharvest:20180414092758p:plain

図には二つの対象\((F,A)\)と\((G,B)\)を設けた。そして、その間の射を\((\mu,u)\)とした。即ち、
\begin{eqnarray}
\forall X.\mu_X &:& F(X) \rightarrow G(X) \\
u&:& A \rightarrow B
\end{eqnarray}

1)関手:\((F,A),(F,B)\)から\(F(A),F(B)\)へ

それでは、圏\(([\mathcal{C},\mathcal{Set}] \times \mathcal{C})\)の対象\((F,A)\),\((G,B)\)から圏\(\mathcal{Set}\)の対象\(F(A)\),\(G(B)\)へ下図のように射を設けてみよう。
f:id:bitterharvest:20180414100141p:plain

このとき、これは関手であると考えることにしよう。このとき、\(F(A)\)から\(G(B)\)への射は、\(G(A)\)を経由しての結合射と同一になる。従って、
\begin{eqnarray}
&& F(A) \rightarrow G(B) \\
&=& F(A) \rightarrow G(A) \rightarrow G(B) \\
\mu_A &:& F(A) \rightarrow G(A) \\
G(u) &:& G(A) \rightarrow G(B)
\end{eqnarray}
より
\begin{eqnarray}
G(u) \circ \mu_A : F(A) \rightarrow G(B)
\end{eqnarray}
を得る。

また、\(F(B)\)を経由しての結合射とも同一であるので、
\begin{eqnarray}
&& F(A) \rightarrow G(B) \\
&=& F(A) \rightarrow F(B) \rightarrow G(B) \\
\mu_B &:& F(B) \rightarrow G(B) \\
F(u) &:& F(A) \rightarrow F(B)
\end{eqnarray}
より
\begin{eqnarray}
\mu_B \circ F(u) : F(A) \rightarrow G(B)
\end{eqnarray}
を得る。

これより、関手であれば、
\begin{eqnarray}
G(u) \circ \mu_A=\mu_B \circ F(u)
\end{eqnarray}
であることが分かる。可換図で示すと次のようになる。
f:id:bitterharvest:20180415113110p:plain

逆は言えるのであろうか。即ち、上の式が成り立つとき、関手となるだろうか。この証明は読者に任せる。

2)関手:\((F,A),(F,B)\)から\(( (A, -),F),((B, -),G)\)へ

それでは次に、\((F,A)\)から、\( [\mathcal{C},\mathcal{Set}](\mathcal{C} (A, -),F) \)への射を関手と考えてみよう。それには、下図を用いる。
f:id:bitterharvest:20180416095133p:plain

ところで、\([\mathcal{C},\mathcal{Set}](\mathcal{C} (A, -),F)\)と\([\mathcal{C},\mathcal{Set}](\mathcal{C} (B, -),G)\)の間の射は、上から下へだろうか、それとも下から上へであろうか。射の向きは、\({\rm Hom}\)関手が共変であるか反変であるに依存する。

一般に、合成射\(g \circ f\)を関手\(F\)によって写した時、\(F(g \circ f)= F(g) \circ F(f)\)の時、関手\(F\)を共変関手という。また、\(F(g \circ f)= F(f) \circ F(g)\)の時、関手\(F\)を反変関手という。

下図においては、関手\(\mathcal{C}(A,-)\)は、\(Sheet \ A\)のところで、
\begin{eqnarray}
f: X \rightarrow Y \\
id_A : A \rightarrow A \\
u : A \rightarrow X \\
v : A \rightarrow Y
\end{eqnarray}
とすると、
\begin{eqnarray}
v= f \circ u \\
\end{eqnarray}
となるので、共変関手である。
f:id:bitterharvest:20180416094846p:plain

これに対して、関手\(\mathcal{C}(-,A)\)は、下図のようになるので反変関手である。
f:id:bitterharvest:20180416095314p:plain

それでは、今考えている\([\mathcal{C},\mathcal{Set}](\mathcal{C} (A, -),F)\)は、\( (A, -)\)の\(A\)の部分が変わるので、反変である。さらに、\((\mathcal{C} (A, -),F)\)で、\( (A, -)\)の部分が変化するので、また、反変である。反変の反変となっているので、全体では共変となる。

従って、\([\mathcal{C},\mathcal{Set}](\mathcal{C} (A, -),F)\)と\([\mathcal{C},\mathcal{Set}](\mathcal{C} (B, -),G)\)の間の射は、下図に示すように、上から下へとなる。そこで、この射を求めることを考えよう。
f:id:bitterharvest:20180416095350p:plain

いま、圏\([\mathcal{C},\mathcal{Set}] \times \mathcal{C}\)で、対象\((F,A)\)と 対象\((G,B)\)が与えられ、その間の射は\((\mu,u)\)であったとする。即ち、
\begin{eqnarray}
\mu_X : F(X) \rightarrow G(X) \\
u: A \rightarrow B
\end{eqnarray}
である。

さらに、\(A\),\(B\)が属している圏\(C\)での任意の対象を\(X\)としよう。そして、
\begin{eqnarray}
w’: B \rightarrow X
\end{eqnarray}
であったとする。

このとき、\(w: A \rightarrow X\)とすると\(w=w’ \circ u\)となる。

次に、圏\(\mathcal{Set}\)を考えよう。\((F,A)\)が写された先は、\([\mathcal{C},\mathcal{Set}](\mathcal{C} (A, -),F)\)である。この射は自然変換なので、\(\alpha\)で表すと、次のようになる。
\begin{eqnarray}
\alpha_X: \mathcal{C}[A,X] \rightarrow F(X)
\end{eqnarray}

同様に、\([\mathcal{C},\mathcal{Set}](\mathcal{C} (B, -),G)\)を\(\beta\)とすると、
\begin{eqnarray}
\beta_X: \mathcal{C}[B,X] \rightarrow G(X)
\end{eqnarray}

それでは、この間での変換を求めてみよう。下図を参考にする。
f:id:bitterharvest:20180416095414p:plain

\( w=w’ \circ u \in \mathcal{C}(A,X)\)なので、\(\alpha_X \circ w’ \circ u \in (F(X)\)である。また、\(\mu_X:F(X) \rightarrow G(X)\)なので、\(\mu_X \circ \alpha_X \circ w’ \circ u \in (G(X)\)となる。

同様に、\( (w’:B \rightarrow X) \in \mathcal{C}(B,X)\)なので、\(\beta_X \circ w’ \in G(X)\)である。

これから
\begin{eqnarray}
\beta_X \circ w’ = \mu_X \circ \alpha_X \circ w’ \circ u
\end{eqnarray}

を得る。即ち、関手であれば、上記の式が満たされることが分かる。上記の式が満たされるとき、関手になるかどうかは、読者の方で調べて欲しい。

今回は、米田の補題と積との関連について考えたが、このように、他との関連を考えることにより、米田の補題の利用の範囲を広げることができる。永かった米田の補題の説明はこれで終了である。次回は、米田の埋め込みを説明する。

鎌倉に足利氏ゆかりの寺を訪ねる

鎌倉の春はきれいだ。特に桜の咲くころは素晴らしいのだが、観光客の多いのにはうんざりさせられる。鎌倉時代室町時代に関する歴史の書物を読み漁ったので、久しぶりに訪ねてみたいと思っていた。桜がすでに散ってしまった昨日(9日)、ゆっくりと見学できるだろうと思い、足利氏にかかわりのある寺院を訪ねた。

鎌倉の北東部、六浦に抜ける滑川沿いの街道に沿って、これらの寺が点在している。この街道は六浦道と呼ばれるが、鎌倉時代においては港町の六浦に物資を運ぶための重要な街道であった。六浦は現在では「むつうら」だが、当時は「むつら」と呼ばれていた。

滑川に沿って狭い平野部が開けているが、街道の両側は山が迫っていて、山に分け入るように所々が谷になっている。谷戸(やと)と呼ばれている。御家人の一族が住んでいたと思われる谷戸には、その氏族名がついているところもある。

六浦道は鎌倉駅からはほぼ東の方に向かって山の中へと入っていく道だ。今回訪れた寺院を下図に示す。
f:id:bitterharvest:20180410141925p:plain

地図で、左下が鎌倉駅、左の緑の部分が鶴岡八幡宮だ。若宮大路の東側に平行している小町大路を北東の方に上がってゆく。東勝寺跡という案内が出てくるので、滑川の方に向かって歩く。ほどなくすると東勝寺橋に着く。橋から滑川を見て、鎌倉時代も同じような風景であったのだろうかと思いをめぐらした。小さな渓谷の趣がある。鎌倉末期の14代執権、北条高時(ほうじょうたかとき)が新田義貞(にったよしさだ)に追われて、最後の地に向かうべくこの橋を渡ったことだろう。
f:id:bitterharvest:20180410142021j:plain

しばらく進むと北条家の菩提寺であった東勝寺跡が見えてくる。寺跡には、タンポポが咲きそろい、奥には鎌倉の一つの特徴である「やぐら」が見える。やぐらは横穴式の供養堂であり、三方を山に囲まれた鎌倉の地勢を活かしの特異な墓様式だ。

f:id:bitterharvest:20180410145628j:plain
東勝寺跡の隣には、高時の腹切りやぐらがある。写真の真ん中に穴が見えるが、ここで、1333年に一族や家臣870名とともに自刃したと伝えられている。鎌倉時代が終わった瞬間だ。『太平記』には、「相模守高時禅門、元弘年5月22日、葛西谷におひて自害しける」と記されている。
f:id:bitterharvest:20180410143333j:plain

東勝寺跡の周辺は葛西谷(かさいがやつ)と呼ばれている。『鎌倉攬勝考(らんしょうこう)』によれば、「治承以来、葛西三郎清重に給ひし地ゆへ葛西ヶ谷とは号せりとぞ」と土地の由来を伝えている。清重(きよしげ)は、武蔵国豊島郡を領有した秩父平氏豊島清元(としまきよもと)の子で、下総国葛西御厨を相続して葛西三郎(かさいさぶろう)と称した。東国の御家人である。

なお、この谷の一つ南に位置する谷、妙本寺の周辺は、比企谷(ひきがやつ)と呼ばれている。これは鎌倉初期の有力な御家人であった比企能員(ひきよしかず)の旧跡に因んだとされている。

小町大路に戻り、宝戒寺に立ち寄る。北条高時の慰霊のため、その屋敷跡に後醍醐天皇が建立したと伝えられているが、実際は、天皇没後に足利尊氏(あしかがたかうじ)の寄進によって造営されたと推定されている。
f:id:bitterharvest:20180410143601j:plain

小町大路をさらに進むと岐れ路(わかれみち)につく。滑川に沿った六浦道を選ぶ。しばらく進むと大御堂橋という案内が出てくる。釈迦堂谷へと進む道だ。ここで右折して、川を越えたところで左折し川沿いの狭い道へと歩を進める。

少し進むと犬懸谷(いぬかけがやつ)へと向かう道に出会う。この谷戸には、室町幕府関東管領であった上杉朝宗(うえすぎともむね)・氏憲(うじのり)の屋敷があったとされている。室町時代は、鎌倉に鎌倉公方が置かれ、それを補佐する役として関東管領が置かれていた。上杉朝宗・氏憲の頃、関東管領山内上杉家犬懸上杉家が独占していたが、氏憲が反乱(1416年の上杉弾秀の乱)をおこし敗れてしまい、犬懸上杉家は滅亡する。
f:id:bitterharvest:20180410144828j:plain

さらに、川沿いに進むと報国寺に至る。この寺は、足利尊氏の祖父の足利家時(あしかがいえとき)あるいは上杉重兼(うえすぎしげかね)の創建とされている。享永の乱(1438年に鎌倉公方足利持氏(あしかがもちうじ)と関東管領の上杉憲実(うえすぎのりざね)の対立で勃発)で敗れた持氏の子義久(よしひさ)がこの寺で自刃した。
f:id:bitterharvest:20180410143735j:plain

竹林で有名なこの寺には、外国人観光客が多数見受けられ、他の寺の静けさとは異質であった。
f:id:bitterharvest:20180410143812j:plain

また、報国寺にもやぐらがあった。また、報国寺周辺は宅間谷(たくまがやつ)と呼ばれている。
f:id:bitterharvest:20180410143853j:plain

この後、今回の主目的である浄妙寺へと向かう。この寺は鎌倉時代の初めの1188年に足利義兼(よしかね)により創建された。かつて、鎌倉時代征夷大将軍に就任した1192年に始まると教えられていたが、最近では、関東支配権の承認を得た1183年、あるいは、守護・地頭設置権が認められた1185年が有力になっている。もちろん、足利義兼は鎌倉幕府の有力御家人で、北条政子の妹を妻に迎えるなど、源頼朝に厚遇された。

この寺は当初極楽寺と呼ばれ密教(真言宗)であった。その後、建長寺を開山した蘭渓道隆(らんけいどうりゅう)の弟子の月峯了然(げっぽうりょうねん)が住職になった時に、禅刹に改められた。また、寺の名前は、足利貞氏(あしかがさだうじ)の法名をとって浄妙寺とされた。鎌倉五山第五位の格式を誇る寺でもある。
f:id:bitterharvest:20180410143932j:plain

足利貞氏の墓もある。また、『新編鎌倉志』に掲載されている浄妙寺境内絵図によれば、総門に向かって右隣に東公方屋敷の記載がある。これは、室町時代の東国支配機関であった鎌倉公方(関東公方ともいわれる)の屋敷跡と見られている。鎌倉公方足利尊氏の子孫によって世襲される。
f:id:bitterharvest:20180410144009j:plain

この隣には杉本寺がある。鎌倉最古の寺である。奈良時代の734年に行基が十一面観音を安置して創建したのが始まりと伝えられている。行基は、聖武天皇の時代に奈良の大仏造立の実質上の責任者として招かれた僧だ。

杉本寺の近くの高台から、滑川沿いの街並みを見ることができた。
f:id:bitterharvest:20180410144112j:plain

この後、瑞泉寺へと向かうのだが、腹ごしらえをするために、民家を改造したレストランで昼食を取った。

瑞泉寺へ向かう途中で出会ったのが、永福寺(ようふくじ)跡。かつてテニスをしたコートの横にある。何もなかったように記憶しているのだが、立派な遺跡になっていることにびっくりした。源頼朝が、源義経藤原泰衡(ふじわらやすひら)を始めとする奥州合戦での戦没者を慰霊するために、中尊寺の二階大堂、大長寿院を模して建立したそうである。かつての寺院の模型写真もあった。
f:id:bitterharvest:20180410144146j:plain

池が印象に残った。荘厳で静寂な寺院だったのだろう。この周辺は永福寺谷(ゆうふくじがやつ)と呼ばれる。
f:id:bitterharvest:20180410144235j:plain

ここからだいぶ歩いて瑞泉寺に到着した。庭園がきれいな寺で、周辺は紅葉谷(もみじがやつ)と呼ばれている。1327年に夢窓疎石(むそうそせき)が創建した。夢窓疎石は京都の西芳寺竜安寺などの庭園を設計している。
f:id:bitterharvest:20180410145754j:plain
f:id:bitterharvest:20180410145848j:plain

最後に訪れたのが、鎌倉宮である。この宮には、護良(もりなが)親王が幽閉された土牢がある。護良親王は父の後醍醐天皇とともに建武の新政(1333年)を成し遂げたが、その後、足利尊氏と対立し、北条高時の遺児の時行(ときゆき)が起こした中先代の乱の混乱の中で、尊氏の弟の足利直義(あしかがただよし)の命で1335年に殺害された。
f:id:bitterharvest:20180410145050j:plain

16,000歩をかけての足利氏にゆかりのある寺院の旅は、10時半ごろに始め、15時ごろに終了した。武家同士の権力闘争が激しかった時代の寺院であるが、現在は、どの寺も谷戸の中で鎮魂のための静寂を保っている。

米田の補題 ー 継続渡しのプログラム

6.5 継続渡しのプログラム

1980年代後半に情報科学を学んだ人々にとって、アベルソンとサスマン夫妻が書かれた『計算機プログラムの構造と解釈』は思い出に残る本だったと思う。私も、情報科学の中でどれが最も良い本であったかと問われればこの本をあげる。
f:id:bitterharvest:20180405100542j:plain

この本が出版された当時、ゼミで学生たちに講読させた。しかも、まだ翻訳されていなかったので、原書で読んだ。C言語ぐらいの知識しかない学生たちが、いきなり、Schemeでプログラミングの原理を理解しようと取り組んだため、色々な事件が起きた。ある女子学生は、毎日、クラスとオブジェクトのお化けが夢に出てくると悩まされていた。徹也に次ぐ徹夜で輪講の準備をしてきた学生は、発表の後、トイレで倒れるという事件もあった。英文科を出たお母さんが息子のために翻訳をした文章を大学に行く前に渡してくれる、という麗しい家庭の話もあった。

この本の中で、最も理解しにくかったのは、継続渡しだと思う。米田の補題と結びついていることを知ると、理解しにくかったことに納得できるが、当時のゼミ生の苦労は並大抵ではなかった。この当時の卒業生に会うと、懐かしそうにオブジェクト指向の話をするので、彼らにとっては今では楽しい思い出になっているのであろう。

そこで、継続渡しのプログラムの例をHaskellで少しだけ説明しよう。

米田の補題は、Haskellでは次のように書くことができた。

forall x. (a -> x) -> F x ~= F a

であった。

そこで、\(F\)を恒等射とし、\(x\)を\(r\)で置き換えると、

forall r. (a -> r) -> r ~= a

となる。これと可換図との対応を示すと下図のようになる。
f:id:bitterharvest:20180407090542p:plain

これは次のように解釈することができる。この式の右側は任意のデータ型\(a\)を取ることを意味する。そして、左側は\(a\)のためのハンドラー\(a \rightarrow r\)を利用する関数であることを示す。さらに、右側は左側で置き換えてもよいことを示している。

この解釈はさらに次のように変えることもできる。ハンドラーは、\(a\)を入力として残りの計算をする関数と見なすことができる。これは次のように考えることが可能になる。

a -> (a -> r) -> r

可換図との対応を示すと以下のようになる。
f:id:bitterharvest:20180407090600p:plain

それでは、簡単な例から示そう。与えられた数\(a\)に対して、関数\((+3)\)を施し、そして、ハンドラー\(k\)を行うことを考えよう。この関数を\(add3CSP\)としよう。

add3CSP :: (Num a) => a -> (a -> r) -> r
add3CSP a k = k $ (+3) a

可換図との対応を下図に示す。
f:id:bitterharvest:20180407090624p:plain

いくつか実験してみよう。

Prelude> add3CSP 4 (+5)
12
Prelude> add3CSP 3 (*4)
24
Prelude> add3CSP 6 sqrt
3.0
Prelude> add3CSP (-6) abs
3

それでは、\(+3\)の代わりに階乗としたらどうであろうか。これは少し面倒くさい。

通常、階乗は次のように実装される。

fac :: (Num a, Eq a) => a -> a
fac 0 = 1
fac n = n * fac (n -1)

実行結果も示しておこう。

fac 4
24

継続渡しスタイルでは、実行すべき関数を返す。従って、次のように考える。\(n\)の階乗の計算の後にハンドラー\(k\)を実行する関数は、\(n-1\)の階乗の計算の後に、これに\(n\)を掛けるという計算を行い、その後にハンドラー\(k\)を実行することと同じである。そこで、\((n-1)\)までの階乗の計算結果を\(ret\)で返してもらうことにすると、次のようにプログラムを実装することができる。

facCSP :: (Num a, Eq a) => a -> (a -> r) -> r
facCSP 0 k = k 1
facCSP n k = facCSP (n-1) $ \ret -> k (n * ret)

可換図との対応を示すと下図になる。
f:id:bitterharvest:20180407090639p:plain

分かりにくいかもしれないが、少し、実行してみよう。

*Main> facCSP 4 (+2)
26
*Main> facCSP 4 (*3)
72
*Main> facCSP 4 sqrt
4.898979485566356

それでは、どのように実行されているのかを見に行くこととしよう。

facCSP 3 k 
= facCSP 2 $ \ret2 -> k (3 * ret2)
= facCSP 1 $ \ret1 -> (\ret2 -> k (3 * ret2)) (2 * ret1)
= facCSP 0 $ \ret0 -> (\ret1 -> (\ret2 -> k (3 * ret2)) (2 * ret1)) (1 * ret0)
= (\ret0 -> (\ret1 -> (\ret2 -> k (3 * ret2)) (2 * ret1)) (1 * ret0)) 1
= (\ret1 -> (\ret2 -> k (3 * ret2)) (2 * ret1)) (1 * 1) 
= (\ret2 -> k (3 * ret2)) (2 * 1)
= k (3 * 2)

上記の式の展開で、それぞれの式は計算をするのに十分な情報を持ち合わせていることに気がつく。そこで、計算を中断したとしても、計算は途中で中断しても、継続して計算ができることが分かる。ユーザインターフェースのプログラムは、センターとユーザとの通信で行われ、中断を伴う。従って、ユーザインターフェースのプログラムでは、継続渡しスタイルのプログラムが使われる。

また、今回は説明を簡単にするために、自然変換に恒等射\(Id = \{Id_A,Id_R\}\)を用いたが、別な射も用いることができる。