圏 論 に よ る プログラミング と 論 理
圏 論 に よ る プログラミング と 論 理
圏 論 に よ る プログラミング と 論 理
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
いので, 有限時間で計算を終え<strong>る</strong>プログラムを書くこ<strong>と</strong>ができます.<br />
⼀一般<strong>に</strong>, 再帰は不動点<strong>と</strong>して表されます. List a は<br />
data L a x = Cons a x | Nil<br />
<strong>と</strong>いうデータ型があ<strong>る</strong><strong>と</strong>き L a の不動点<strong>と</strong>なります. つまり L a x = x <strong>と</strong>な<br />
<strong>る</strong><strong>よ</strong>うな x が List a <strong>に</strong>あた<strong>る</strong>のです. 再帰を不動点<strong>と</strong>して扱うこ<strong>と</strong>は<strong>理</strong><strong>論</strong><br />
的な扱いの上でかなり重要です.<br />
実際, Haskell でもうまくデータ型を定義す<strong>る</strong>こ<strong>と</strong>で不動点を再現す<strong>る</strong><br />
こ<strong>と</strong>ができます.<br />
newtype Fix f = Fix (f (Fix f))<br />
data L a x = Cons a x | Nil<br />
type List a = Fix (L a)<br />
多少扱いが⾯面倒<strong>に</strong>なりますが, これでもちゃん<strong>と</strong>扱え<strong>る</strong>データを定義でき<br />
ます. た<strong>と</strong>えば先ほどの zeroForever は以下の<strong>よ</strong>う<strong>に</strong>なります.<br />
zeroForever :: List Int<br />
zeroForever = Fix (Cons 0 zeroForever)<br />
なお, 再帰的なデータ型のうち, 単純な⽅方法で不動点を使うこ<strong>と</strong>では表<br />
せない<strong>よ</strong>うなものもあります.<br />
data CrazyList a<br />
= CrazyCons a (CrazyList (a,a))<br />
| CrazyNil<br />
CrazyList a の定義の中でデータ構築⼦子の定義<strong>に</strong>おいて CrazyList (a,a)<strong>と</strong><br />
いう形で登場しており, Fix で定義す<strong>る</strong>のが難しくなっています. この<strong>よ</strong><br />
うなデータ型を非正則なデータ型 (non-regular data type) <strong>と</strong>いいます.<br />
これ以降は, この記事では⾮非正則なデータ型は扱いません.<br />
最小不動点<strong>と</strong>最大不動点<br />
再帰的な型を不動点で表しましたが, 実は不動点は⼀一つ<strong>と</strong>は限りません.<br />
不動点の中で, 型の⼤大きさ (集合<strong>と</strong>しての濃度) が⼀一番⼩小さいものを最⼩小<br />
不動点<strong>と</strong>いい, ⼀一番⼤大きいものを最⼤大不動点<strong>と</strong>いいます.<br />
集合<strong>論</strong>上普通<strong>に</strong>解釈すれば, 最⼤大不動点は無限のデータ構造を含む型で,<br />
最⼩小不動点は有限のデータ構造しか持たない型です.<br />
しかしながら, Haskell <strong>に</strong>おいては事情が特殊で, 有限のみのリストか<br />
らな<strong>る</strong>型は実際<strong>に</strong>は定義できません. なので, 最⼩小不動点も無限のデータ<br />
構造を含むもの<strong>と</strong>なり, 最⼩小不動点<strong>と</strong>最⼤大不動点は同じ<strong>に</strong>な<strong>る</strong>のです.<br />
205