Wednesday, December 18, 2013

ノルウェーの司法: 修復的司法と応報的司法の対比

ツイッターでノルウェーの監獄が快適すぎると写真付きで話題になっている。元ネタは TIME 誌のこの特集記事のようだ: Inside the World's Most Humane Prison
2011 年ウトヤとオスロで計 77 人を殺害したテロリスト、Anders Breivik が収監されると見られている刑務所を取材している。正直私の自宅よりよっぽど快適そうなので移り住みたい。TL でも「APLAS (という学会) に参加したらノルウェーの監獄並の施設に寝泊まりできますよ!」とか言われたい放題だ。

何でそんな事になってるのかと思って (TIME の記事では「社会復帰を促すため」の一言しか書いてない)、ノルウェーの司法制度について調べた所、the Atlantic のこんな記事を見つけた。A Different Justice: Why Anders Breivik Only Got 21 Years for Killing 77 People
ノルウェーは修復的司法なので応報的司法のアメリカ(日本も)とは根本的に考え方が違うという解説記事。結構衝撃的な意識の違いだ。記事の内容はここに要約しておくが、出来れば原文を読んだほうが良いと思う。

Breivik 裁判では被害者や遺族が、死んだ被害者の夢などを陳述した。Breivik の前で、死んだ77人全員分、一人一人(というか一家族ごと)に十分な時間が与えられて嘆きを遺族同士共有しあう機会が与えられたのだそうだ。裁判の一環として。これは証拠や、量刑を重くせよという情緒的圧力として行われたのではなく、感情を吐露する場を与えることによる被害者のケアのためであり、また加害者に己の罪を意識させるためでもあるという。(勿論裁判では証拠の精査なども行う。)刑務所の整った環境も修復的司法の一環で、受刑者が自分の罪と向き合う痛みへ向けた準備の手助けなのだそうだ。Atlantic の記事によれば、端的に言えば (日米などの) 応報的司法では「因果応報」という抽象的な正義を満たす事を目的にしており加害者は受動的に罰を受ける立場なのに対し、ノルウェーの修復的司法では加害者は積極的に罪と向き合い被害者や社会に対して可能な限りの償いを立場なのだと。また修復的司法では加害者は「罰せられるべき悪」ではなく「修復されるべき壊れた個人」であり、刑も「罰」ではなく「強制治療」なのだという事だそうだ。記事によればこのシステムは犯罪率を下げ、犯罪者収容のコストも下げ(!)、再犯率も下げるのだという。

※「こんな至れり尽くせりしといてコストが下がるわけないだろう!」とかいう人がいるかも知れないので念の為言っておくと、受刑者一人あたりのコストが上がってもその結果再犯率が下がり、重犯罪に走る前に軽犯罪だけで更生する人が増えるなら全体のコストは下がる。

いかにも北欧らしい進歩的で合理的なシステムだ。遺族感情が気になるところだけど、報道を見る限り割と判決に満足してるらしい。ただし遺族感情に関する統計的なデータは出ていない。死刑廃止とかもこういう修復的司法の潮流の一部なんだろう。

※ Breivik に言い渡された 21 年の刑期はノルウェーでは最長。ただし Breivik に限っては修復的司法の目指す積極的な修復行為を行わない (平たく言うと反省してないし、しない) ので事実上死ぬまで刑期が延長され続ける見込み。修復的行為に至るまで、いつまででも強制的に療養させるぞという事か。

この記事を見て、日本の司法制度についても色々言われている事についてちょっと見方が変わった。その最たるものは死刑存廃議論だ。日本の死刑廃止論ではどうも冤罪の可能性がどうだとか、死刑自体の犯罪抑止効果がどうだとか、遺族感情のためには殺すしかない、いやそれは野蛮で不毛だとか、死刑そのものしか見てない議論の声が非常に大きい。しかしノルウェーのシステムを見る限り、死刑廃止はむしろもっと大きく包括的な司法制度改革に根ざしているようだ。つまり
  •  罰するのではなく、罪と向き合わせる (苦しめるのではなく、後悔させる)
  •  因果応報ではなく、感情や関係の修復を目指す
という目的の転換を経て、その一環として「じゃあ死刑は要らないや」となっているのであって、単に死刑だけが何か特に野蛮だから止めとこうという話ではないという事だ。なるほど、これは確かに近現代の「次」の社会のあり方として良さそうではある。

しかし、修復的司法を今すぐ日本に導入しても (日本の重大犯罪の) 被害者や遺族は納得しないだろうと思う。私もきっといまいち納得できないだろう。目には目を、の正義観が意識の底まで刷り込まれているから。悪いことをした奴には損をしてもらわないと気がすまない。こうした処罰感情はきっと説得によって動かされることは殆ど無いだろうと思う。こういう根深い感情は、それを抱いている人達が世代交代で死に絶えることによって変革されるものだからだ。でも、被害者のケアとしての裁判中の陳述機会を与えたりとかいうのは割とすぐ受け入れられる可能性がある。そうした修復的司法の手法を少しづつ導入することを目指したら、次の世代ぐらいには意識が変わって死刑廃止論はもっと受け入れられやすくなってるのかも知れない。

追記: 勿論、既にそういう方向性で死刑廃止論とかを含めた司法改革を求めている人はいるんだろうけど、それがもっと一般的になったほうが建設的なんじゃないかという話。

Saturday, December 14, 2013

ガチ勢になるための圏論勉強会 第二回 まとめ

ガチ勢になるための圏論勉強会第二回で読んだ、A.Pitts の Relational Properties of Domains の定理 3.3 の証明のまとめ。これが有名な "inverse limit construction" なのだろう。多分。定理の背景は論文か第一回のまとめ参照。


定理 3.3: 局所連続な関手 $F : \mathbf{Cpo}^\text{op}_\bot \times \mathbf{Cpo}_\bot \rightarrow \mathbf{Cpo}_\bot$ は常に最小不変性、つまり $i : F(D,D) \cong D$ で $\operatorname{fix}(\lambda f.\ i\circ F(f,f) \circ i^{-1}) = \operatorname{id}$ となるような $i$, $D$ を持つ。

証明:
まず\begin{align*}
f^\circ\circ f &= \operatorname{id} \\
f \circ f^\circ &\sqsubseteq \operatorname{id}
\end{align*}となるような $f^\circ$ が存在する時、$f$ は埋め込みであると言い、$f^\circ$ はそれに対応する射影と呼ぶ。$f$ が決まると、それに対応する $f^\circ$ は高々一つしか無い。論文では証明されていないが、勉強会では次のように証明した。仮に射影の条件を満たす別の関数 $g$があったとする。
\begin{align*}
g\circ f &= \operatorname{id} \\
f \circ g &\sqsubseteq \operatorname{id}
\end{align*}すると
\begin{align*}
f^\circ &= g \circ f \circ f^\circ & \ \ (\because g \circ f = \operatorname{id}) \\
&\sqsubseteq g & \ \ (\because f\circ f^\circ \sqsubseteq \operatorname{id})
\end{align*}で、
\begin{align*}
g &= f^\circ \circ f \circ g & \ \ (\because f^\circ \circ f = \operatorname{id}) \\
&\sqsubseteq f^\circ & \ \ (\because f\circ g \sqsubseteq \operatorname{id})
\end{align*}なので $g = f^\circ$ となり、$f$ に対応する射影は無二であることが分かる。関数合成が単調である事の証明は省く。[注1] 論文では書かれていないが、逆に射影が決まると埋め込みが (最大) 一つに決まる。証明は同様。

この埋め込み←→射影の対応を使って次のような双方向の鎖を作る。[注2]
\begin{equation}\label{eq:chain}
D_0 \underset{\underset{i_0^\circ}{\leftharpoondown}}{\overset{i_0}{\rightharpoonup}} D_1 \underset{\underset{i_1^\circ}{\leftharpoondown}}{\overset{i_1}{\rightharpoonup}} D_2 \underset{\underset{i_2^\circ}{\leftharpoondown}}{\overset{i_2}{\rightharpoonup}} \cdots
\end{equation}where
\begin{align*}
D_0 &= \varnothing_\bot \\
D_{n+1} &= F(D_n, D_n) \\
i_0 &= \bot_{\varnothing_\bot \rightarrow D_1} \\
i_{n+1} &= F(i_n^\circ, i_n)
\end{align*}この鎖の極限 (直観的に言えば鎖を無限に右に辿って行き着く対象) が、定理の主張している $D$ になる。この鎖の構成は (反変と共変、二種類の引数に対応する為 $-^\circ$ を駆使していることを除けば) 単純に $F$ を $\bot$ な対象と $\bot$ な射に繰り返し適用しているだけなので、その極限が不動点になるというのはそれほど不思議な事ではない。

この事を厳密に論証するには $D$ を天下り的に与えてそれが圏論的な極限になっていることを示す (Pitts は余極限としているが、どちらでも論証できる)。その上で元の鎖を $F$ で写した新たな鎖
\[
F\,(D_0,D_0) \underset{\underset{F\,(i_0, i_0^\circ)}{\leftharpoondown}}{\overset{F\,(i_0^\circ,i_0)}{\rightharpoonup}}
F\,(D_1,D_1) \underset{\underset{F\,(i_1, i_1^\circ)}{\leftharpoondown}}{\overset{F\,(i_1^\circ,i_1)}{\rightharpoonup}}
F\,(D_2,D_2) \underset{\underset{F\,(i_2, i_2^\circ)}{\leftharpoondown}}{\overset{F\,(i_2^\circ,i_2)}{\rightharpoonup}}
\cdots
\]を考える。これは、元の鎖の定義を見れば分かるように単に $\eqref{eq:chain}$ から $D_0$ を省いて得られる
\begin{equation}
D_1 \underset{\underset{i_1^\circ}{\leftharpoondown}}{\overset{i_1}{\rightharpoonup}} D_2 \underset{\underset{i_2^\circ}{\leftharpoondown}}{\overset{i_2}{\rightharpoonup}} \cdots \label{eq:chain2}
\end{equation}と同じなので、元の鎖と同じ極限を持つはずである (up to iso)。この同一性を立証する同型射が $i$ になる。

まず天下り的に
\[
D = \left\{x \in D_n : \forall n.\ x_n = i_n^\circ\,x_{n+1}  \right\}
\]とする。直観的には例えば無限リスト [1..] の表示はそれの有限な近似の列 $(\bot, (1:\bot), (1:1:\bot), \ldots) \in D$ と同一視するという事らしい。コーシー列で実数を構成するのに似ている。$D_n$ の鎖では右に行くほど $F$ の適用回数が増える (= より深いデータ構造が定義される) ので、より深くまで定義された近似値が拾ってこれる。$x_n = i_n^\circ\,x_{n+1}$ という制約は例えば $(\bot, (1:\bot), (2:3:\bot), (1:5:3\bot))$ のように互いに近似関係にないデータをそれぞれの $D_n$ から拾ってくるのを禁止している。

\begin{gather*}\pi_n  : D \rightarrow D_n \\
\pi_n\,(x_0, x_1, \ldots, x_n, \ldots) = x_n
\end{gather*}という射影は次のような埋め込みと対応する (i.e. $j_n^\circ = \pi_n$)。
\begin{gather*}
j_n : D_n \rightarrow D \\
j_n\,x_n =  (\ldots, i^\circ_{n-2}\,(i^\circ_{n-1}\,x_n), i^\circ_{n-1}\,x_n, x_n, i_n\,x_n, i_{n+1}\,(i_n\,x_n), \ldots)
\end{gather*} $j_n$ は $(x_0,x_1, \ldots, x_n, \ldots)$ から $x_n$ だけ与えられたら、「$x_n$ より左は $i_k^\circ$ で要素を復元し、$x_n$ 右は $i_k$ で復元する」という手法でできるだけ元の列を復元する。$D$ の定義より左に行く時の復元は完璧な復元だが、右に行く時の復元は元のデータより ($\sqsubseteq$ で) 小さい。つまり $j_n$ は元の列を $n$ 個目まで完璧に復元するので、上限を取ると完全な逆関数になることが予想される。この予想は、下の補題の後に実際に証明する。

$D$ が $\eqref{eq:chain2}$ の鎖の極限であるとは、任意の $D'$ と $\pi_n' : D' \rightarrow D_n$ に対して、$\forall n.\ \pi_n' = i_n^\circ \circ \pi_{n+1}'$ が成り立つならば $\forall n.\ \pi_n \circ k = \pi_n'$ となる $k : D' \rightarrow D$ がただ一つ存在することである。これを示すために一つ補題を証明しておく。

補題:
$\forall n.\ \pi_n' = i_n^\circ \circ \pi_{n+1}'$ となるような $D'$ と $\pi_n'$ が与えられた時、$j_n \circ \pi_n'$ は上昇列であって
\[
\pi_m \circ \bigsqcup_n j_n \circ \pi_n' = \pi_m'
\]となる。これは $D' = D, \pi_n' = \pi_n$ の場合でも成り立つ。


証明:
この証明の概要は輪講担当者の奥村がこのカンペから拾ってきた。まず
\begin{equation}\label{eq:pi_expand}
\pi_n =  i_n^\circ \circ \pi_{n+1} \hspace{4ex}
\pi_n' =  i_n^\circ \circ \pi_{n+1}' \hspace{4ex}
j_n = j_{n+1} \circ i_n\end{equation}である。これらを利用すると
\begin{align*}
j_n \circ \pi_n' &=  j_{n+1}\circ i_n \circ i_n^\circ \circ \pi_{n+1} \\
&\sqsubseteq j_{n+1} \circ \pi_{n+1} & (\because i_n \circ i_n^\circ \sqsubseteq \operatorname{id})
\end{align*}つまり $j_n \circ \pi_n'$ が上昇列であることが分かり、さらに、$m \le n$ ならば
\begin{align}
\pi_m \circ j_n \circ \pi_n' &= i_m \circ i_{m+1} \circ \cdots \circ i_{n-1} \circ \pi_{n} \circ j_n \circ \pi_n' & \notag \\
&= i_m \circ i_{m+1} \circ \cdots \circ i_{n-1} \circ \pi_n' \notag \\
&= \pi_m' \label{eq:pi_j_pi}
\end{align}となる事も分かる。従って、任意の $m$ について
\begin{align*}
\pi_m \circ \bigsqcup \{j_n \circ \pi_n' : n \ge 0\} &= \pi_m \circ \bigsqcup \{j_n \circ \pi_n' : n \ge m\}  & (j_n \circ \pi_n' \text{は上昇列だから}) \\
&= \bigsqcup \{\pi_m \circ j_n \circ \pi_n' : n \ge m \} \\
&= \bigsqcup \{\pi_m' : n \ge m\} & \text{\eqref{eq:pi_j_pi} より} \\
&= \bigsqcup \{\pi_m'\} = \pi_m'
\end{align*}となる。
(補題終わり)

ここで $k = \bigsqcup_n j_n \circ \pi_n'$ とする。補題によりこれは well-defined であり、しかも全ての $n$ について
\[
\pi_n \circ k =  \pi_n \circ \bigsqcup_m j_m \circ \pi_m' = \pi_n'
\]である。従って、条件を満たす $k$ が最低一つは存在する。逆に $\forall n.\ \pi_n \circ k =  \pi_n'$ が成り立つならば、
\begin{equation}\label{eq:pi_k_j_pi}
j_n\circ \pi_n \circ k = j_n \circ \pi_n'
\end{equation}である。補題により右辺が上昇列なので両辺が上昇列となり、上限を取ることが出来る。補題で $D' = D$ とするとどの $n$ についても $\forall n.\ \pi_n \circ \bigsqcup_m j_m \circ \pi_m = \pi_n$ つまり
\[
\pi_n \left(\left(\bigsqcup_m j_m \circ \pi_m\right)\,(x_0,x_1,\ldots)\right) = \pi_n (x_0,x_1,\ldots) = x_n
\]
なので、$\bigsqcup_m j_m \circ \pi_m = \operatorname{id}$。従って、$\eqref{eq:pi_k_j_pi}$ の両辺の上限を取ると
\[
k = \operatorname{id} \circ k = \bigsqcup_n j_n \circ \pi_n \circ k = \bigsqcup_n j_n \circ \pi_n'
\]となり、条件を満たす $k$ は一意であることが示せた。よって $D$ は $\eqref{eq:chain2}$ の極限である。

論文にもある通り、上記の論証は $i_n$ や $j_n$ の性質の内、$F$ が保存するものしか使っていないので $F(D,D)$ は
\[
F\,(D_0,D_0) \underset{\underset{F\,(i_0, i_0^\circ)}{\leftharpoondown}}{\overset{F\,(i_0^\circ,i_0)}{\rightharpoonup}}
F\,(D_1,D_1) \underset{\underset{F\,(i_1, i_1^\circ)}{\leftharpoondown}}{\overset{F\,(i_1^\circ,i_1)}{\rightharpoonup}}
F\,(D_2,D_2) \underset{\underset{F\,(i_2, i_2^\circ)}{\leftharpoondown}}{\overset{F\,(i_2^\circ,i_2)}{\rightharpoonup}}
\cdots
\]の極限である。しかしこの鎖はそのまま $\eqref{eq:chain2}$ の鎖なので、$D$ も $F(D,D)$ も同じ鎖 $\eqref{eq:chain2}$ の極限である。極限は一意なので $i : F(D,D) \cong D$ が存在し、この同型射は $D' = F(D,D)$ と置いた時の $k$ と一致する。[注3]

したがって、
\[
F(j_n, \pi_n)\circ i^{-1} = F(j_n, \pi_n) \circ k = \pi_n
\] (論文は極限ではなく余極限を使っているので $F$ の引数と $i$ の位置が左右逆になっている。今更直すのは面倒なのでこのままにする。)となり、簡単な記号操作で
\[
\forall n.\ j_{n+1} \circ \pi_{n+1} = i\circ F(j_n \circ \pi_n, j_n\circ \pi_n)\circ i^{-1}
\] が示せる。ここで $j_0 \circ \pi_0 = \bot$ なので
\[
\operatorname{id} = \bigsqcup_n j_n \pi_n = \bigsqcup_n \delta^n\,\bot = \operatorname{fix}\,\delta
\](ただし $\delta\,  f = \ i\circ F(f, f)\circ i^{-1}$) となり $i, D$ は最小であることが示せた。

三行まとめ

  • 最小不動点 $i,D$ は $F$ を⊥な対象と⊥な関数に繰り返し適用した領域 $D_n$ の極限として得る。
  • $F$ を繰り返して適用して出てきた射は $D_n \rightarrow D_{n+1}$ の埋め込みになるため、逆向きの射を射影という形で求められるので profunctor の $F$ を繰り返し適用できる。
  • 極限 $D$ は $D_n$ から一つずつ近似値を選んで出来た列全ての集合。
次回は 定理 3.4 から。

[注1] 因みに $f^\circ$ を陽に与えることも出来る。
\[
f^\circ\,x = \max\{y : f\,y \sqsubseteq x\}
\]$\max$ は当然存在すれば一意であり、存在しないならば $f$ は埋め込みではない。これが射影になることの証明は読者への課d(ry
この事を利用すると、埋め込みではない関数の例が簡単に見つけられる。例えば
\begin{align*}
f : &\text{Bool}_\bot \rightarrow \text{()} \times \text{()} \\
f\,\text{True} &= (\text{()}, \bot) \\
f\,\text{False} &= (\bot, \text{()}) \\
f\,\bot &= (\bot, \bot)
\end{align*}は $\max\{ y: f\,y \sqsubseteq (\text{()}, \text{()})\}$ が存在しないので射影を持たない。

[注2] この鎖が well-defined であるには、全ての $n$ について $i_n^\circ$ が定義されている、つまり $i_n$ が埋め込みである必要がある。まず $\bot : \varnothing_\bot \rightarrow F\,(\varnothing_\bot, \varnothing_\bot)$ が埋め込みである事は容易に分かる。また、任意の埋め込み $f$ について $F(f^\circ, f)$ も埋め込みであり、$(F\,(f^\circ, f))^\circ = F\,(f, f^\circ)$ となる:
\begin{align*}
F\,(f^\circ, f)\circ F\,(f,f^\circ) &= F\,((f^\circ, f) \circ (f, f^\circ)) & (\text{関手は合成を保存}) \\
&= F\,(f\circ f^\circ, f \circ f^\circ) & (\text{積圏での合成の定義}) \\
&\sqsubseteq F\,(\operatorname{id}, \operatorname{id}) & (F\text{は単調}) \\
&= \operatorname{id} & (\text{関手はidを保存})
\end{align*}二行目では、左成分は反変なので合成した関数の左右が逆になる事に注意。逆の合成も同様にして $\operatorname{id}$ になることが示せる。したがって、$n$ についての帰納法で $i_n$ も埋め込みであることが分かる。

[注3]$k$ は $D$ と $D'$ によって変化するので、それぞれ区別をつけるため $k_{D' \Rightarrow D} : D' \rightarrow D$ と表記することにする。$D$ も $F(D,D)$ も極限なので $k_{D \Rightarrow F(D,D)}$ と $k_{F(D,D) \Rightarrow D}$ が存在する。これらの合成、例えば $k_{D \Rightarrow F(D,D)} \circ k_{F(D,D) \Rightarrow D}$ は $k_{D \Rightarrow D}$ の条件を満たすので $k_{D \Rightarrow D}$ と一致しなくてはならない。しかし $\operatorname{id}$ もまた $k_{D \Rightarrow D}$ の条件を満たすので $k_{D \Rightarrow F(D,D)} \circ k_{F(D,D) \Rightarrow D} = \operatorname{id}$ となる。逆の合成も同様。

Sunday, December 8, 2013

ガチ勢になるための圏論勉強会 第一回 まとめ

Partake で発表したガチ勢になるための圏論勉強会 第一回では A.Pitts の Relational Properties of Domains の第一節と第三節を読んだ (第二節は本文を読んでからのほうが意味が分かりそうなので後回しした) ので、それのまとめ。というか分量的に言えばでっかい注釈。

ところで blogger で脚注を書いてそこに本文からリンクを貼るの自動化する方法知ってる人が居たら教えて下さい。この記事では全部手打ちしてるので…


第一節: この論文の目的と範囲

この論文の本題は再帰的に定義されたデータ型に機械的に表示 (denotation) を与える方法を確立すること、それからその表示を元にして、そのデータ型を扱うプログラムについて帰納法や余帰納法と言った証明テクニックを使うことを正当化する事。 具体例は論文では与えられていないが、こういう話だと考えられる。例えば OCaml で
type int_list = Nil | Cons of int * int_list
という定義があった時、これは有限の整数のリスト全てを含む集合 (型) であって、この型を使った関数
let rec map f = function
  | Nil -> Nil
  | Cons (x,xs) -> Cons (f x, map f xs)
let id x = x 
などについてmap id xsが常にxsと等価であるとかそういう事実を示すには普通に帰納法を使えば良い[注1]int_listNil に有限回 Cons をつけて作ったデータ全ての集合で、かつそれ以外のデータを含まないのだから、map id Nil = Nilmap id xs = xs ならば map id (Cons (x,xs)) = Cons (x,xs) を示すという具合だ。(以下、必要に応じて(::), [] などの糖衣構文を使う。)

しかしこのやり方は遅延データ構造には使えない。Haskell で
type IntList = Nil | Cons Int IntList
と書けばこれは無限リストも含むので、上記のような Nil から始めてうんたらかんたらという帰納法は Nil を含まないリストを取りこぼしてしまう。そもそもこういう型にはどういうデータが含まれていてどういうデータが含まれていないのだろう? [1,2,3,...] ++ [42]のように無限に続いたリストの後に、おまけのように[42]がくっついているようなデータは含まれていると考えたほうがいいのだろうか?[注2] 同様の問題は OCaml で関数や lazy を使って遅延リストをエンコードした場合にも起きる。

この Pitts の論文では、こうした再帰的に定義された型に対して、遅延が含まれていてもいなくてもその型に含まれるデータ全体の集合と、そのデータ型についてあれこれ証明する時に使えるテクニックを systematic に導出する方法を与える。このテクニックにより computational adequacy の証明なども簡単に行えるようになる。

第三節: 領域方程式の最小解

今回カバーした部分はセットアップ部分なのでそれほど難解な内容は無い。再帰的なデータ型は $\alpha \cong \Phi\,\alpha$ という領域方程式の最小解と解釈する。例えば整数のリストは $\alpha \cong 1 + (\text{Int} \times \alpha)$ を満たす集合 $\alpha$ [注3]。$\Phi$ は $(+),(\times),(\rightarrow)$ を組み合わせて作るが、これらの領域構築子は次のように正格・非正格のバリエーションがある。以下、$\mathbf{Cpo}_\bot$ は⊥を含む完備部分順序 (= pointed cpo = cppo) とそれらの間の正格連続関数からなる圏。全ての射 $f$ について $f\,\bot =\bot$ が要請されることに注意。また、これらの関手は全て局所連続と言って、射への作用を $\operatorname{Hom}(A,B)$ に制限した物がどの $A,B$ についても連続関数になる。

Lifting 関手 $-_{\bot} : \mathbf{Cpo}_\bot \rightarrow \mathbf{Cpo}_\bot$

新たな最小限 $\bot$ を付け足す。この関手を射 $f$ に適用してできる射 $f_\bot$ は
\begin{align*}
f_\bot\,\bot &= \bot \\
f_\bot\,x &= f\,x & \text{($\bot$ 以外)}
\end{align*}

積関手 $(\times), (\otimes) : \mathbf{Cpo}_\bot \times \mathbf{Cpo}_\bot \rightarrow \mathbf{Cpo}_\bot$

普通の集合論的なデカルト積 $A\times B = \{ (a,b) : a \in A, b \in B \}$ に $(a,b) \sqsubseteq (x,y) \Longleftrightarrow a \sqsubseteq x \land b \sqsubseteq y$ という順序を入れると $(\bot_A,\bot_B)$ を最小元に持つ cppo になる。$(a, \bot_B)$ や $(\bot_A, b)$ が $(\bot_A,\bot_B)$ と別物の扱いで、$(,)$ が非正格な構築子になる。ただし Haskell の (A,B) 型はデカルト積ではなくその lift $(A\times B)_\bot$ と一致する。この関手を射 $(f,g)$ に適用してできる射 $f\times g$ は
\[
(f\times g)\,(x,y) = (f\, x, f\, y) \] 非正格性により引数が $(x,y)$ の形をしていると仮定している事に注意。
一方潰れた積 (smash product) の $(\otimes)$ は $(,)$ 構築子を正格にとるため、$(a, \bot_B)$, $(\bot_A, b)$, $(\bot_A, \bot_B)$ を全部一つの $\bot$ に潰す。それ以外はデカルト積と一緒。OCaml の a * b は $A\otimes B$ になる。$f\otimes g$ は
\begin{align*}
(f \otimes g)\,(x,y) &= (f\,x, g\,y) \\
(f \otimes g)\,\bot &= \bot \end{align*}

和関手 $(+), (\oplus) : \mathbf{Cpo}_\bot \times \mathbf{Cpo}_\bot \rightarrow \mathbf{Cpo}_\bot$

集合論的な非交和 $A\uplus B = \{\operatorname{inl}\,a : a \in A\} \cup \{\operatorname{inr}\,b : b \in B\}$ は $\operatorname{inl}\,a$ と $\operatorname{inr}\,b$ を一切比較不可能にするような順序で完備部分順序になるが、それだと⊥を持たないので新たに付け足す: \[ A+B = (A\uplus B)_\bot \]これは $\operatorname{inl}\,\bot$ や $\operatorname{inr}\,\bot$ が $\bot$ とは別になるので $\operatorname{inl}, \operatorname{inr}$ が非正格になり、Haskell の Either A B と一致する。射への作用は \begin{align*}
(f + g )\,(\operatorname{inl}a) &= \operatorname{inl}(f\,a) \\
(f + g )\,(\operatorname{inr}b) &= \operatorname{inr}(g\,b) \\
(f + g)\,\bot &= \bot \end{align*} 一方予め $A$ と $B$ からそれぞれの⊥を消した集合 $A_\downarrow = A - \{\bot_A\}$ と $B_\downarrow$ を作り、それの非交和に改めて最小元を付け足すと構築子 $\operatorname{inl}$, $\operatorname{inr}$ を正格にとる潰れた和 (coalesced sum) ができる。
\[ A\oplus B = (A_\downarrow \uplus B_\downarrow)_\bot
\] OCaml の variant は $A \oplus B$。射への作用は
\begin{align*}
(f \oplus g )\,(\operatorname{inl}a) &= \left\{\begin{array}{ll}\operatorname{inl}\,(f\,a) & (f\,a \neq \bot) \\ \bot & (f\,a = \bot)\end{array}\right\} = \operatorname{inl}_\bot(f\,a) \\
(f \oplus g )\,(\operatorname{inr}b) &= \left\{\begin{array}{ll}\operatorname{inl}\,(g\,a) & (g\,a \neq \bot) \\ \bot & (g\,a = \bot)\end{array}\right\} = \operatorname{inr}_\bot(g\,b) \\
(f \oplus g)\,\bot &= \bot \end{align*} 注意: Pitts はなぜか $(+)$ の方だけ避けている。ひょっとしたら今後出てくる定理が当てはまらない場合があるのかも知れない。$(+)$ の射への作用は局所連続性は持つが、非正格である。

関数空間関手 $(\rightarrow), (\mathrel{-\kern{-1ex}\circ}) : \mathbf{Cpo}_\bot^\text{op} \times \mathbf{Cpo}_\bot \rightarrow \mathbf{Cpo}_\bot$

$A \rightarrow B$ は $A$ から $B$ への正格とは限らない連続関数全体の集合で、順序は $f \sqsubseteq g \Leftrightarrow \forall x.\ f\,x \sqsubseteq g\,x$ (point-wise ordering) で $\lambda \_.\,\bot$ を最小元に持つ。$\bot$ と $\lambda \_.\bot$ を同一視することに注意。Haskell では関数型をパターンマッチで分析できないため $\bot$ と $\lambda \_.\bot$ を区別する手段が無いので、A -> B の表示はそのまま $A \rightarrow B$ になる。
関数空間関手の射 $(f,g) : (A,B) \rightarrow (C,D)$ への作用は \begin{align*} (f \rightarrow g) &: (A \rightarrow B) \rightarrow (C \rightarrow D)\\ (f \rightarrow g) &= g \circ - \circ f \end{align*} となる。正格関数空間 $A \mathrel{-\kern{-1ex}\circ} B$ は $A \rightarrow B$ を正格関数だけに制限したもの。それ以外は $(\rightarrow)$ と一緒。


さて、上記の関手を組み合わせてできた $\Phi$ が与えられた時 $\alpha \cong \Phi\,\alpha$ なる cppo $\alpha$ は大抵複数あるが、データ型の解釈では特に「最小」の解が求められる。直観的には [1,2,3,...] ++ [42] のように計算に携わらない「ゴミ」が混じったデータを排除するという事だ。最小性により解が一意に定まるし、また計算結果について証明する時に意味のない区別を排除する事にもなる。[注4]
Pitts は「最小性の定義はいくつかある」と書いているが、単に集合として最小 (i.e. $(\subseteq)$ について最小) でいいのかどうかは書いていない。それでもいいのだけど射以外の概念を持ちだした定義なので圏論的に筋が悪いという事かも知れない。
ともかく射のみによる圏論的な最小性の定義を模索するのだが、ここで一つ問題がある。例えば $\Phi\,\alpha = \alpha \rightarrow \alpha$ の場合、$\Phi$ は引数 $\alpha$ を反変にも共変にも使うので $\mathbf{Cpo}_\bot$ からの関手にならない。そこで $\Phi$ の引数を共変位置と反変位置で別の引数に分けて、profunctor (この用語の和訳を誰かプリーズ) $\hat{\Phi}$ にする。例えば \[ \Phi\,\alpha = \alpha \oplus (\alpha \rightarrow \alpha \otimes \text{Int}) \] なら別々の引数 $\alpha^-$, $\alpha^+$ を用意して \[ \hat{\Phi}\,(\alpha^-, \alpha^+) = \alpha^+ \oplus (\alpha^- \rightarrow \alpha^+ \otimes \text{Int}) \] とする。こうして作った $\hat{\Phi} : \mathbf{Cpo}_\bot^\text{op} \times \mathbf{Cpo}_\bot \rightarrow \mathbf{Cpo}_\bot$ に対して $i : \hat{\Phi}\,(D,D) \cong D$ となるような $D$ が存在すればそれは当然、元の領域方程式 $\Phi\,\alpha \cong \alpha$ の解になる。こういう $i,D$ の対を不変性 (invariant)、特に $D$ を不変対象 (invariant object) と呼ぶ。この $\hat{\Phi}$ に対して最小性は次のように定義できる。
定義3.2 $\hat{\Phi} : \mathbf{Cpo}_\bot^\text{op} \times \mathbf{Cpo}_\bot \rightarrow \mathbf{Cpo}_\bot$ を、射に対する作用が連続な関手とする。不変性 $i : F\,(D,D) \cong D$ について $\operatorname{fix}\,(\lambda f.\ i\circ \hat{\Phi}\,(f,f)\circ i^{-1})$ が恒等関数である時、$i,D$ は最小であるという。但し $\operatorname{fix}$ は (上記の関数空間のところで定義された) 関数同士の順序に対して最小であるような不動点を求める関数。

この定義は $\hat{\Phi}$ を(遅延)リスト型を生成する関手 $\hat{\Phi}\,(\alpha^-, \alpha^+) = 1 + (\text{Int} \times \alpha^+)_\bot$ に置き換えて考えると分かりやすい。$\delta := (\lambda f.\ i\circ \hat{\Phi}\,(f,f)\circ i^{-1})$ とすると、 \begin{align*} \delta\,f\,[] &= [] \\ \delta\,f\,(x:y) &= i(f\,(\operatorname{inr}(x,y))) \end{align*} つまりリスト型の引数の中からリスト型のフィールドを探してそこに $f$ を適用するという関数になる。詳細には $i^{-1}$ でリスト型を $(+), (\uplus), -_\bot$ を使った表現にバラし、その結果に $f$ を fmap しているという事になる。この調子で $\delta^n\,\bot$ を展開すると \[ \begin{array}{lclll} \delta\,\bot\,[] &=& [] \\ \delta\,\bot\,(x:y) &=& i\,\bot &=& \bot \\ \delta^2\,\bot\,(x:y) &=& i(\operatorname{inr}(x,\delta\,\bot\,y)) &=& x:\bot \\ \delta^2\,\bot\,(x:y:z) &=& i(\operatorname{inr}(x,\delta\,\bot\,(y:z))) &=& x:y:\bot \\ \delta^3\,\bot\,(x:y:z) &=& i(\operatorname{inr}(x,\delta\,\bot\,y:z)) &=& x:y:\bot \\ \delta^3\,\bot\,(x:y:z:w) &=& i(\operatorname{inr}(x,\delta^2\,\bot\,(y:z:w))) &=& x:y:z:\bot \\ &\vdots& \end{array} \] という具合で、$\delta^n\,\bot$ は長さ $n$ の prefix を取り、それ以降は⊥で置き換える関数になる[注5]。$\operatorname{fix}\delta$ はそれの極限だから、 \begin{align*} \operatorname{fix}\delta\,\bot\,(x_1:x_2:x_3:\cdots) &= \bigsqcup\{\bot, (x_1:\bot), (x_1:x_2:\bot), \ldots \} \\ &= x1:x_2:x_3:\cdots \end{align*} となる。つまり、入力リストに終端があるならそこまでコピーし、終端がないなら先頭から有限ステップで到達できる全要素をコピーするのでこれらの入力に対し恒等関数になる。一方、前出の [1,2,3...] ++ [42] という、無限遠に続きを持つリストは有限 prefix 全ての最小上限ではないので、このデータを含む集合は $\alpha \cong 1 + (\text{Int} \times \alpha)_\bot$ の最小解にならない。同様の理由で [1..] ++ [42] というプログラムが生成するデータは[1..]と同じ物にならざるを得ない。これは両者を区別するような関数が Haskell 内で実装不可能であるという直観に合致する。
ここでは非正格な $(+),(\times)$ を使ったが、正格な $(\oplus),(\otimes)$ を使うと 有限リストが出来る。具体的には $\delta^n$ の返り値を構築するときの $\operatorname{inr}$ が正格なので、入力リストの長さが $n$ 未満でない限り戻り値全体が⊥になる。
定理3.3はこうした最小性を満たす解が常に存在すると主張している。

三行まとめ

  • 再帰データの領域は $(+),(\times),(\rightarrow)$ からなる関手 $\Phi$ に対して $i : D \cong \Phi\,D$ なる最小の $i,D$ の $D$
  • ただし $(+),(\times),(\rightarrow)$ にはそれぞれ正格版と非正格版があり、しかも一般には $\Phi(\alpha^-, \alpha^+)$ と反変位置・共変位置を分けないと関手にならない
  • $\operatorname{fix}(\lambda f.\ i\circ \operatorname{fmap}f \circ i^{-1}) = \operatorname{id}$ なら最小
多分次は定理 3.3 の証明から。

注1: OCaml でも let rec x = Cons (0, x) とかすれば無限リストが作れるがここでは無視する。

注2: 混乱のないように書いておくと、そういうリストは存在しないと考えるべき。Haskell で [1..] ++ [42]と書いた時に生成されるデータは[1..]とだけ書いた時にできるデータと同じだ。[1..]の部分は有限時間で辿り終える事ができないので、++[42]の部分はプログラムの実行に一切影響を与えない。したがって表示意味論的には++[42]は消える(無視される)。

注3: ここで 1 というのは値が一種類しか無い型 (OCaml でいう unit、Haskell では ()) で、variant は和、複数引数のコンストラクタは積とみなしている。こうした $\alpha$ に関する方程式を領域方程式と呼ぶ。

注4: 例えば [1,2,3,...] ++ [42] というデータを含まない解を採用しておけば [1..] ++ [42] というコードと [1..] というコードの意味 (表示; 返り値) が一致するので、f [1..] が何かの仕様を満たすことが分かった時、それをわざわざ f ([1..] ++ [42]) について証明し直さなくて良い。

注5: 一般には入力を深さ $n$ まで探索してそれより深い位置に出現する $\alpha$ を $\bot$ しか含まない型に置き換える。