02.05.2013 Views

圏 論 に よ る プログラミング と 論 理

圏 論 に よ る プログラミング と 論 理

圏 論 に よ る プログラミング と 論 理

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!