22.03.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><strong>い</strong><strong>た</strong><strong>ら</strong><strong>負</strong><strong>け</strong><strong>か</strong><strong>な</strong><strong>と</strong><strong>思</strong><strong>っ</strong><strong>て</strong><strong>い</strong><strong>る</strong><br />

uskz


自己紹介<br />

梶本裕介<br />

25歳


抽象度が低すぎ<strong>る</strong><br />

形式的<strong>な</strong>扱<strong>い</strong>が面倒くさ<strong>い</strong><br />

<strong>ループ</strong>嫌<strong>い</strong><br />

accumulate? transform?<br />

範囲<strong>と</strong><strong>か</strong><strong>い</strong>ち<strong>い</strong>ち気にし<strong>な</strong><strong>い</strong><strong>と</strong><strong>い</strong><strong>け</strong><strong>な</strong><strong>い</strong>のが嫌<br />

int f(int a, int b, int c)<br />

{<br />

return 3 * a + 3 * b + 3 * c;<br />

}<br />

bool p(bool a, bool b, bool c)<br />

{<br />

return (!a && b || a && !b) != c;<br />

}<br />

int f(int a, int b, int c)<br />

{<br />

return 3 * (a + b + c);<br />

}<br />

bool p(bool a, bool b, bool c)<br />

{<br />

return a == b == c;<br />

}


Hoare Triple<br />

{P}S {Q}<br />

ホーア論理<br />

Pは事前条件で,Qは事後条件.{P}S{Q}が正し<strong>い</strong>こ<strong>と</strong>はPが成り立つ全<strong>て</strong>の状態で<br />

Sを実行す<strong>る</strong><strong>と</strong>Qが成り立つ状態で終了す<strong>る</strong>こ<strong>と</strong>を主張し<strong>て</strong><strong>い</strong><strong>る</strong>.<br />

代入の公理図式 {P[ x/ E ]}x :=E {P}<br />

逐次規則<br />

条件規則<br />

結果規則<br />

{P}S {Q},{Q}T {R}<br />

{P}S ;T {R}<br />

{B∧P}S {Q},{¬B∧P}T {Q}<br />

{P}if B then S else T fi {Q}<br />

P ' ⇒ P ,{P}S {Q},Q ⇒Q'<br />

{P '}S {Q ' }


n≥0<br />

の時<br />

<strong>ループ</strong>の推論はめんど<strong>い</strong><br />

int r = 1;<br />

for (int i = 1; i 0が成り立つ.<br />

P∧B⇒ T 0


まず,<strong>ループ</strong>不変条件Pは,<br />

r=i−1!∧1≤i≤n1<br />

であり,これを示すには,<br />

{P∧i≤n}r :=ir ;i :=i1{P}<br />

<strong>ループ</strong>の推論はめんど<strong>い</strong><br />

を証明すれば良<strong>い</strong>.<br />

代入列r :=ir ;i :=i1 を真に定め<strong>る</strong>最弱事前条件は P [i/i1][r/ir] <strong>な</strong>ので,<br />

P∧i≤n⇒ P [i/i1][r/ir]<br />

を示す.<br />

P[i /i1][ r/ir]<br />

⇔r=i−1!∧1≤i≤n1[i/i1][r/ir]<br />

⇔r=i !∧1≤i1≤n1[r/ir]<br />

⇔ir=i !∧1≤i1≤n1<br />

⇔ir=i !∧0≤i≤n<br />

⇐ r=i−1!∧0≤i≤n<br />

⇐ r=i−1!∧1≤i≤n1∧i≤n<br />

⇔ P∧i≤n


<strong>ループ</strong>の推論はめんど<strong>い</strong><br />

次に,<strong>ループ</strong>が停止す<strong>る</strong>こ<strong>と</strong>を示す為の整数式Tを探す.これは, n1−i であ<strong>る</strong>.<br />

<strong>な</strong>ぜ<strong>な</strong><strong>ら</strong>,新し<strong>い</strong>変数vに対し,<br />

n1−i[i /i1][r /ri][ v/n1−i]<br />

⇔ n−i≤n1−i<br />

⇔True<br />

だ<strong>か</strong><strong>ら</strong>,<br />

{P∧i≤n}v :=n1−i r:=ir ;i :=i1{n1−iv}<br />

であり,<br />

より,<br />

n1−i<br />

P∧i≤n⇒0n1−i<br />

n1−i<br />

は繰り返しの<strong>た</strong>びに減少し,ま<strong>た</strong>,<br />

P∧i≤n<br />

⇔ r=i−1!∧1≤i≤n1∧i≤n<br />

⇒i≤n1<br />

⇔0≤n1−i<br />

だ<strong>か</strong><strong>ら</strong>, は繰り返しが残<strong>っ</strong><strong>て</strong><strong>い</strong><strong>る</strong>間は0より大き<strong>い</strong>.<br />

以上より,次のこ<strong>と</strong>が言え<strong>た</strong>.<br />

{P}whilei≤ndo r :=ir ;i :=i1done{P∧ni}


<strong>ループ</strong>の推論はめんど<strong>い</strong><br />

次に, n≥0 <strong>な</strong><strong>ら</strong>,<strong>ループ</strong>開始前にPが成り立つこ<strong>と</strong>,す<strong>な</strong>わち次を示す.<br />

{n≥0}r:=1 ;i :=1{P}<br />

を示す.<br />

P [i /1][ r/1]<br />

⇔r=i−1!∧1≤i≤n1[i /1][r/1]<br />

⇔1=0!∧1≤1≤n1<br />

⇔n≥0<br />

最後に, r=n! が P∧ni<br />

P∧ni ⇒r=n!<br />

を示す.<br />

P∧ni<br />

⇔ r=i−1!∧1≤i≤n1∧ni<br />

⇒r=i−1!∧i=n1<br />

⇒r=n!<br />

以上で階乗が計算でき<strong>る</strong>こ<strong>と</strong>が示され<strong>た</strong>.<br />

より弱<strong>い</strong>こ<strong>と</strong>,す<strong>な</strong>わち,


STLのalgorithm<br />

transform(v.begin(), v.end(), back_inserter(u), _1 * _1)<br />

int n = accumulate(v.begin(), v.end(), 1, _1 * _2);<br />

int m = inner_product(v.begin(), v.end(), u.begin(), 0);<br />

<strong>い</strong>ち<strong>い</strong>ちiteratorのpairを扱うのが面倒くさ<strong>い</strong>.<br />

containerに連続し<strong>て</strong>適用し<strong>た</strong><strong>い</strong>.


Range<br />

Nを1<strong>か</strong><strong>ら</strong>初め<strong>て</strong>その2乗を足し<strong>て</strong><strong>い</strong>き,<br />

和が2000を初め<strong>て</strong>超え<strong>た</strong><strong>と</strong>き和は<strong>い</strong>くつに<strong>な</strong><strong>る</strong><strong>か</strong><br />

http://www.cworld2000.com/blog/archives/2008/05/post_19.html<br />

http://d.hatena.ne.jp/NyaRuRu/20080527/p1<br />

using namespace pstade::oven;<br />

using namespace boost::lambda;<br />

int v = counting(1, max_count)<br />

|transformed(regular(_1 * _1))<br />

|scanned(regular(_1 + _2))<br />

|dropped_while(regular(_1


Listr A=ε ∣ A : r Listr A<br />

Listl A=ε ∣Listl A : l A<br />

[1, 2,3]=1:2:3: ε=1: 2: 3: ε<br />

リスト<br />

Rangeの推論にリスト(列)の理論が使え<strong>る</strong>.気がす<strong>る</strong>.


[1, 2]++[3, 4,5]=[1, 2,3, 4,5]<br />

++:Listr A×Listr AListr A<br />

ε ++ ys= ys<br />

x : xs++ ts=x :xs ++ ys<br />

++上のconcatの分配律<br />

リストの連結<br />

結合律 xs ++ ys++ zs=xs ++ ys ++ zs<br />

単位元 xs ++ε=ε ++ xs=xs<br />

concat[[1, 2] ,[ ] ,[3, 4,5]]=[1,2, 3, 4,5]<br />

concat:ListrListr AListr A<br />

concat ε=ε<br />

concat xs : xss=xs ++concat xss<br />

concat xs ++ ys=concat xs++concat ys


everse[1, 2,3, 4,5]=[5, 4,3, 2,1]<br />

reverse:Listr AListr A<br />

reverse ε=ε<br />

reverse x : xs=reverse xs[ x]<br />

reversereverse xs=xs<br />

length[1, 2,3, 4,5]=5<br />

length :Listr A ℕ<br />

length ε=0<br />

length x : xs=1length xs<br />

++上の#の分配律<br />

リストの反転<br />

リストの長さ<br />

length xs ++ ys=length xslength ys


take3[1, 2,3, 4,5]=[1,2, 3]<br />

drop3[1, 2,3, 4,5]=[4,5]<br />

take:ℕListr AListr A<br />

take0 xs=ε<br />

taken1ε=ε<br />

taken1x : xs=x : take n xs<br />

drop:ℕListr A Listr A<br />

drop0 xs=xs<br />

dropn1ε=ε<br />

dropn1x : xs=drop n xs<br />

take, drop<br />

take n xs ++dropn xs=xs<br />

take m°take n=takem n<br />

drop m°drop n=dropmn<br />

take m°drop n=drop n°takemn<br />

splitAt n xs=take n xs ,drop n xs


Listr: A BListr AListr B<br />

Listr f ε=ε<br />

Listr f x : xs= f x : Listr f xs<br />

Listr<br />

Listrλ x. x 2 [1, 2,3, 4,5]=[1,4, 9,16,25]<br />

Listr id=id<br />

Listr f °g=Listr f °Listr g<br />

f °head=head °Listr f<br />

Listr f °tail=tail°Listr f<br />

Listr f °reverse=reverse°Listr f<br />

Listr f °concat=concat°ListrListr f <br />

特に, concat[ xs , ys]=xs ++ ys <strong>な</strong>ので,<br />

Listr f xs ++ ys=Listr f xs ++Listr f ys


filter odd[1, 2,3, 4,5]=[1,3,5]<br />

filter<br />

filter : ABoolListr A Listr A<br />

filter p=concat°Listr p wrap ,const ε<br />

p f , ga<br />

| p a = f x<br />

|otherwise=g x<br />

wrap x=x : ε<br />

const x a=x<br />

filter p°filter q=filter ∧°〈 p ,q〉<br />

〈 f , g〉 x= f x , g x<br />

filter p°concat=concat°Listrfilter f


zip, unzip<br />

zip[1, 2,3] ,[a ,b ,c]=[1, a ,2, b ,3, c]<br />

zip:Listr A×Listr AListr A×B<br />

zipε , ε=ε<br />

zip x : xs , y : ys=x , y:zipxs , ys<br />

unzip:Listr A×B Listr A×Listr A<br />

unzip=〈Listr π 0 ,Listr π 1〉<br />

zip°unzip=id<br />

zip°Listr f ×Listr g=Listr f ×g°zip<br />

Listr f ×Listr g°unzip=unzip°Listr f ×g<br />

f ×g=〈 f °π 0 , g °π 1〉


fold<br />

foldrc ,☆ x 1: x 2: x 3:x 4: ε=x 1☆x 2☆ x 3☆x 4☆c<br />

foldr: A× B× A A Listr B A<br />

foldrc , hε=c<br />

foldrc , hx : xs=h x , foldrc , h xs<br />

concat=foldrε , ++<br />

sum=foldr0, +<br />

product=foldr1,×<br />

and=foldrTrue ,∧<br />

Listr f =foldrε , h where h x , xs= f x : xs<br />

length=sum°Listr const1<br />

filter p=foldrε , p°π 0: ,π 1


Listl上のfold<br />

foldl: A× B× A A Listl B A<br />

foldlc , hε=c<br />

foldlc , h xs : x=hfoldlc , h xs , x<br />

実際にはListr上で定義され<strong>て</strong><strong>い</strong><strong>る</strong>こ<strong>と</strong>が多<strong>い</strong>.<br />

foldl: A× B× A A Listr B A<br />

foldlc , hε=c<br />

foldlc , h x : xs=foldlhc , x , h xs<br />

reverse=foldlε , cons wherecons xs x=x : xs


☆が結合的で単位元eを持つ<strong>な</strong><strong>ら</strong>,<br />

foldre ,☆ xs=foldle ,☆ xs<br />

任意のx,y,zに対し,☆<strong>と</strong>★<strong>と</strong>eにつ<strong>い</strong><strong>て</strong>,<br />

x ☆ y ★ z= x ☆ y★ z<br />

x ☆ e=e ★ x<br />

<strong>な</strong><strong>ら</strong>ば,<br />

foldre ,☆ xs=foldle ,★ xs<br />

第一双対性定理<br />

第ニ双対性定理<br />

第三双対性定理<br />

foldre , f xs=foldle , flip f reverse xs


f °foldra , g=foldrb , h<br />

foldrの融合律<br />

f a=b∧∀ x , y [ f g x , y=h x , f y] <strong>な</strong><strong>ら</strong>ば,<br />

foldra , f °Listr g=foldra , f ° g<br />

foldlの融合律<br />

f a=b∧∀ x , y [ f g x , y=h f x , y] <strong>な</strong><strong>ら</strong>ば,<br />

f °foldla , g=foldlb ,h<br />

fold<strong>と</strong>Listrの融合律


Listr + A=wrap A ∣ A : r Listr + A<br />

Listl + A=wrap A ∣Listl + A : l A<br />

head=foldr + id , π 0<br />

非空リスト<br />

foldr + f , g wrap x= f x<br />

foldr + f , g x : xs=g x ,foldr + f , g xs<br />

foldr1 f =foldr + id , f <br />

maximum=foldr1


圏 C<br />

C<br />

C<br />

圏<br />

は対象(object)の集まり<strong>と</strong>射(morphism)の集まり<strong>か</strong><strong>ら</strong><strong>な</strong><strong>る</strong>.<br />

の任意の射fには始域<strong>と</strong>呼ばれ<strong>る</strong>対象<strong>と</strong>終域<strong>と</strong>呼ばれ<strong>る</strong>対象が備わ<strong>っ</strong><strong>て</strong><strong>い</strong><strong>る</strong>.<br />

dom f =A∧cod f =B f : A B A f<br />

の任意の射f, gに対し<strong>て</strong>,dom g = cod fの<strong>と</strong>き射の合成 g ° f が存在す<strong>る</strong>.<br />

g ° f<br />

A B<br />

f g<br />

C<br />

射の合成に対し<strong>て</strong>結合律が成り立つ.<br />

∀ f : A B , g : BC ,h:C D[h°g ° f =h° g° f ]<br />

C<br />

の任意の対象Aに対し<strong>て</strong>次を満<strong>た</strong>す恒等射 id A: A A が存在す<strong>る</strong>.<br />

∀ f : A B[id B° f = f = f °id A]<br />

B


圏 Setの対象は集合<br />

射は型付の全域写像<br />

集合<strong>と</strong>全域関数の圏<br />

恒等射 id A: A A はA上の恒等写像<br />

f , A , Bwhere Dom f =A , Ran f ⊂B<br />

射 f , A , B <strong>と</strong>射 g ,C , D の合成射はB=Cの<strong>と</strong>き,ま<strong>た</strong>その<strong>と</strong>きにのみ<br />

定義され,g ,C , D° f , A , B= g ° f , A , D


恒等射 id A×B は<br />

id A , id B<br />

f , g°h , k = f °h , g °k <br />

積圏<br />

圏A× Bの対象は Aの対象 A <strong>と</strong> Bの対象 B の対 A , B<br />

射は Aの射 f <strong>と</strong> Bの射 g の対 f , g


モノ射<br />

∀ f , g : C A[ f =g ⇔m° f =m° g ]<br />

が成り立つ時,m: A B をモノ射<strong>と</strong>言う.<br />

Set では単射.<br />

エピ射<br />

∀ f , g : BC [ f =g ⇔ f °e=g °e]<br />

が成り立つ時,e : A B をエピ射<strong>と</strong>言う.<br />

Set では全射.


同型射<br />

i : A B に対し<strong>て</strong> j : B A が存在し, j °i=id A∧i ° j=id B<br />

が成り立つ時,i : A B を同型射<strong>と</strong>言う.<br />

このよう<strong>な</strong> j は存在す<strong>る</strong><strong>な</strong><strong>ら</strong>多く<strong>と</strong>も1つ<strong>な</strong>ので,これをi −1 <strong>と</strong><strong>書</strong>く.<br />

Set では全単射.<br />

同型射はモノ射<strong>か</strong>つエピ射であ<strong>る</strong>が,その逆は必ずしも成り立<strong>た</strong><strong>な</strong><strong>い</strong>.<br />

i : A B が同型射の<strong>と</strong>きA<strong>と</strong>Bは同型<strong>と</strong>言う.


f : A B ⇒ F f : F A F B<br />

関手<br />

A,Bを圏<strong>と</strong>す<strong>る</strong>.この<strong>と</strong>き関手 F : A B は対象<strong>か</strong><strong>ら</strong>対象への写像<strong>と</strong><br />

射<strong>か</strong><strong>ら</strong>射への写像<strong>か</strong><strong>ら</strong><strong>な</strong><strong>る</strong>.<br />

F id A=id F A<br />

F g ° f =F g ° F f<br />

A<br />

F<br />

B<br />

g ° f<br />

A<br />

C<br />

f<br />

g<br />

B<br />

F B<br />

F f<br />

F g<br />

射の合成同様関手の合成が定義され<strong>る</strong>. G ° F f =G F f <br />

関手は(小さ<strong>な</strong>)圏の圏の射<strong>と</strong><strong>な</strong><strong>る</strong>.<br />

F A<br />

F C<br />

F g ° f


Id :C C<br />

Id A= A<br />

Id f = f<br />

K B : A B<br />

K B A=B<br />

K B f =id B<br />

恒等関手<br />

定関手<br />

二項関手<br />

始域が積圏の関手.<br />

F id A , id B=id F A , B<br />

F f ° g ,h°k =F f , h° F g , k <br />

Listr: Set Set<br />

Listr f ° g=Listr f °Listr g<br />

Listr id=id<br />

リスト関手


始対象<strong>と</strong>終対象<br />

C の任意の対象 A に対し,0 A <strong>な</strong><strong>る</strong>射が唯一存在す<strong>る</strong><strong>と</strong>き,0 を始対象<strong>と</strong>言う.<br />

C の任意の対象 A に対し, A1 <strong>な</strong><strong>る</strong>射が唯一存在す<strong>る</strong><strong>と</strong>き,1 を終対象<strong>と</strong>言う.<br />

Set では空集合が始対象で,singleton setが終対象.


積<br />

A B<br />

C <strong>と</strong>射の組 f :C A <strong>と</strong> g :C B<br />

〈 f , g〉:C A×B<br />

π 0: A×B A π1: A×B B<br />

A×B<br />

A<br />

π 0<br />

A×B<br />

π1 B<br />

対象 <strong>と</strong>対象 の積<strong>と</strong>は,任意の対象<br />

に対し,次の図式を可換にす<strong>る</strong>よう<strong>な</strong>射 が唯一存在す<strong>る</strong>,<br />

2つの射 <strong>と</strong> を伴<strong>っ</strong><strong>た</strong>対象 のこ<strong>と</strong>.<br />

π 0°〈 f , g〉= f ∧π 1°〈 f , g 〉=g<br />

id=〈π 0, π 1〉<br />

〈 f , g〉°m=〈 f °m , g °m〉<br />

f g<br />

C<br />

〈 f , g〉<br />

h=〈 f , g 〉⇔ π 0°h= f ∧π 1°h=g<br />

圏の任意の対象の対が積を持つ時,その圏は積を持つ<strong>と</strong>言う.


余積<br />

A B<br />

C <strong>と</strong>射の組 f :C A <strong>と</strong> g :C B<br />

ι0: A AB<br />

[ f , g]: AB C<br />

ι1: AB B<br />

AB<br />

対象 <strong>と</strong>対象 の余積<strong>と</strong>は,任意の対象<br />

に対し,次の図式を可換にす<strong>る</strong>よう<strong>な</strong>射 が唯一存在す<strong>る</strong>,<br />

2つの射 <strong>と</strong> を伴<strong>っ</strong><strong>た</strong>対象 のこ<strong>と</strong>.<br />

A<br />

ι 0<br />

[ f , g]°ι 0= f ∧[ f , g ]°ι 1=g<br />

id=[ι 0, ι 1]<br />

m°[ f , g ]=[m° f , m° g]<br />

AB<br />

C<br />

[ f , g]<br />

ι 1<br />

f g<br />

h=[ f , g ]⇔ h°ι 0= f ∧h°ι 1=g<br />

B


積関手<br />

C が積を持つ時,射に対し f ×g=〈 f °π 0, g °π 1〉<br />

×: C×C C が考え<strong>ら</strong>れ<strong>る</strong>.<br />

id×id=〈id°π 0,id°π 1〉=id<br />

f ×g °〈h , k 〉=〈 f °h , g °k 〉<br />

f ×g °h×k = f °h×g °k <br />

<strong>と</strong>定義す<strong>る</strong>こ<strong>と</strong>で2項関手


f g=[ι 0° f ,ι 1° g]<br />

idid=[ι 0°id ,ι 1°id]=id<br />

[ f , g]°hk =[ f °h , g °k ]<br />

f g °hk = f °hg °k <br />

余積関手<br />

<strong>と</strong>定義す<strong>る</strong>こ<strong>と</strong>で2項関手<br />

〈[ f , g ] ,[h , k ]〉=[〈 f , h〉 , 〈 g , k 〉]<br />

交換律<br />

+:C×C C が考え<strong>ら</strong>れ<strong>る</strong>.


恒等関手<strong>と</strong>定関手は多項式関手<br />

多項式関手<br />

F<strong>と</strong>Gが多項式関手の<strong>と</strong>き,FG, F+G, F×Gは多項式関手<br />

FGh=F hG h<br />

F ×Gh=F h×G h<br />

例えば F X =AK ×A <strong>と</strong>F f =idA f ×id A によ<strong>っ</strong><strong>て</strong>定ま<strong>る</strong>関手Fは,<br />

F =K AId×K A<br />

<strong>な</strong>ので多項式関手


自然変換<br />

関手 F ,G : A B に対し<strong>て</strong>,自然変換τ : F G <strong>と</strong>は,A A の各対象 A に,<br />

B の射 τ A: F AG A を割り当<strong>て</strong><strong>る</strong>写像で,A の任意の射 f : A A'<br />

につ<strong>い</strong><strong>て</strong>次の図式を可換にす<strong>る</strong>もの.<br />

F A<br />

F A'<br />

τ A<br />

G A<br />

F f G f<br />

τ A'<br />

G f °τ A=τ A' ° F f<br />

G A'


f °head=head °Listr + f<br />

Listr f °tail=tail°Listr + f<br />

自然変換の例<br />

Listr f °reverse=reverse°Listr f<br />

Listr°Listr f °inits=inits°Listr f<br />

Listr f °concat=concat°Listr°Listr f<br />

zip°Listr f ×Listr g=Listr f ×g°zip<br />

Listr f ×Listr g°unzip=unzip°Listr f ×g


恒等変換<br />

任意の関手 F に対し<strong>て</strong>,恒等変換 id F : F F は,id FA=id FA<br />

F A<br />

F A'<br />

自然変換の合成<br />

φ: G H <strong>と</strong>ψ : F G に対し, φ°ψ A=φ A°ψ A<br />

ψ A<br />

G A<br />

F f G f<br />

φ A<br />

G A'<br />

ψ A' τ A'<br />

自然変換はその対象が関手であ<strong>る</strong>圏の射<strong>と</strong><strong>な</strong><strong>る</strong><br />

H A<br />

H A'<br />

各componentが全単射の時,自然変換は自然同系射<strong>と</strong>呼ばれ<strong>る</strong><br />

H f


代数<br />

関手 F :C C に対し<strong>て</strong>,F-代数<strong>と</strong>は,型 A F Aを持つ射のこ<strong>と</strong>.<br />

f : A A F A g : A' F A'<br />

<strong>か</strong><strong>ら</strong><br />

す<strong>る</strong>射 h: A A'<br />

へのF-準同型射<strong>と</strong>は,次の図式を可換に<br />

F A<br />

f<br />

A<br />

F h h<br />

F A'<br />

g<br />

h° f =g ° F h<br />

恒等射は準同型射であり,準同型射の合成は準同型射<strong>な</strong>ので<br />

F-代数は射が準同型射<strong>な</strong>圏 Alg F の対象<strong>と</strong><strong>な</strong><strong>る</strong>.<br />

A'


始代数<br />

Set の多項式関手を初め,多くの関手に対し<strong>て</strong><br />

これを<br />

α : F T T で表す.<br />

F-始代数が存在す<strong>る</strong><strong>と</strong>言うこ<strong>と</strong>は,任意のF-代数f : A F A<br />

α <strong>か</strong><strong>ら</strong> f への準同型射が唯一存在す<strong>る</strong><strong>と</strong>言うこ<strong>と</strong>.この準同型射を<br />

[ f ]:T A で表す.<br />

F T<br />

α<br />

T<br />

F [ f ] [ f ]<br />

F A A<br />

f<br />

h=[ f ]⇔h°α= f ° F h<br />

[ f ] の形の射をcatamorphism<strong>と</strong>言う.<br />

Alg F は始対象を持ち,<br />

に対し,


[ f ]°α= f ° F [ f ]<br />

[α]=id<br />

id=[ f ]<br />

⇔id°α= f ° F id<br />

⇔ f =α<br />

h°[ f ]=[ g]⇐ h° f =g ° F h<br />

評価規則<br />

反射律<br />

融合律<br />

h°[ f ]=[ g ]<br />

⇔ h°[ f ]°α=g ° F h°[ f ]<br />

⇔ h°[ f ]°α=g ° F h° F [ f ]<br />

⇔ h° f ° F [ f ]=g ° F h° F [ f ]<br />

⇐h° f =g ° F h


型関手<br />

Listr A=ε ∣ A : r Listr A [ε ,: r]: F AListr AListr A<br />

は を<br />

F A B=1 A×B <strong>か</strong>つ F A f =id 1id A× f で定義され<strong>る</strong>関手 F A<br />

の始代数<strong>と</strong>し<strong>て</strong>宣言す<strong>る</strong>.<br />

F A は二項関手 F の第一引数を<br />

は二項関手<br />

A で固定し<strong>た</strong>もの<strong>と</strong>見<strong>な</strong>す.<br />

F を始代数のコレクション α A: F A ,T AT A を伴う二項関手<strong>と</strong>す<strong>る</strong><strong>と</strong>,<br />

T f =[α° F f ,id]<br />

<strong>と</strong>定義す<strong>る</strong>こ<strong>と</strong>によ<strong>っ</strong><strong>て</strong>Tを関手にす<strong>る</strong>こ<strong>と</strong>が出来<strong>る</strong>.<br />

例えばリスト関手は,<br />

Listr f =[[ε ,: r]°id f ×id]<br />

により定義され<strong>る</strong>.変形す<strong>る</strong><strong>と</strong>,<br />

Listr f =[ε ,: r° f ×id]


型<br />

Listr A に対し,<br />

h=[c , f ]<br />

⇔h°α=[c , f ]° Fh<br />

⇔h°α=[c , f ]°idid×h<br />

⇔h°α=[c , f °id×h]<br />

⇔h°[ε ,: r]=[c , f °id×h]<br />

⇔[h°ε , h°: r]=[c , f °id×h]<br />

⇔h°ε=c∧h°: r= f °id×h<br />

これは,<br />

h ε=c<br />

h x , xs= f x , h xs<br />

<strong>と</strong><strong>い</strong>うこ<strong>と</strong>であり,す<strong>な</strong>わち,<br />

[c , f ]=foldrc , f <br />

<strong>と</strong><strong>い</strong>うこ<strong>と</strong>.<br />

catamorphismはfold


[h]°T g=[h° F g ,id]<br />

例えば<br />

sum°Listr f =[0,+° f ×id]<br />

型関手の融合律<br />

[h]°T g=[h° F g ,id]<br />

⇔[h]°[α °F g ,id]=[h° F g , id]<br />

⇐[h]°α° F g , id=h° F g ,id°F id ,[h]<br />

⇔ h° F id ,[h]° F g , id=h° F g , id° F id ,[h]<br />

⇔True<br />

sum=[0,+]<br />

<strong>と</strong>す<strong>る</strong><strong>と</strong>,


分配圏<br />

積<strong>と</strong>余積を持つ圏にお<strong>い</strong><strong>て</strong>,対象 A× BC <strong>と</strong>対象 A×B A×C<br />

が同型の時,その圏を分配圏<strong>と</strong>言う.<br />

積<strong>と</strong>余積を持つ圏では,<br />

undistl: A×B A×C A× BC<br />

は常に存在す<strong>る</strong>.(例えば undistl=[id×ι 0, id×ι 1] <strong>と</strong>すれば良<strong>い</strong>)<br />

し<strong>か</strong>し,逆射<br />

distl: A× BC A×B A×C<br />

が存在す<strong>る</strong><strong>と</strong>は限<strong>ら</strong><strong>な</strong><strong>い</strong>.<br />

例えば Set が分配圏.


論理値<br />

分配圏では論理値をBool=11, True=ι 0, False=ι 1 <strong>と</strong>す<strong>る</strong>こ<strong>と</strong>により扱え<strong>る</strong>.<br />

¬=[False ,True]<br />

quad を Bool 2 quad 1111 <strong>な</strong>同型射<strong>と</strong>し<strong>て</strong>,<br />

∧=[True ,False ,False ,False]°quad<br />

条件式<br />

p f , g=[ f , g ]°π 0π 0°distl°〈id , p〉<br />

h° p f , g= p h° f , h°g<br />

p f , g°h= p°h f °h , g °h<br />

p f , f = f<br />

filter p=[ε , p°π 0: r , π 1]<br />

filter


Banana-splitの法則<br />

〈[h] ,[k ]〉=[〈h° F π 0, k ° F π 1〉]<br />

catamorphismの普遍性より,<br />

〈[h] ,[k ]〉°α=〈h° F π 0, k ° F π 1〉° F 〈[h] ,[k ]〉<br />

を示せばよ<strong>い</strong>.<br />

〈[h] ,[k ]〉°α<br />

= 〈[h°α] ,[k °α]〉<br />

= 〈h° F [h] , k ° F [k ]〉<br />

= 〈h° F π 0°〈[h] ,[k ]〉 ,k ° F π 1°〈[h] ,[k ]〉〉<br />

= 〈h° F π 0° F 〈[h] ,[k ]〉 , k °F π 1° F 〈[h] ,[k ]〉〉<br />

= 〈h° F π 0, k ° F π 1〉° F 〈[h] ,[k ]〉


average=/°〈sum , length〉<br />

リストの横断を纏め<strong>る</strong><br />

このaverageの定義はリストを2度横断す<strong>る</strong>.<br />

〈sum ,length〉<br />

= 〈[0,+] ,[0,1°π 1]〉<br />

=[〈[0,+]° F π 0 ,[0,1°π 1]°F π 1〉]<br />

=[〈[0,+]°idid×π 0 ,[0,1°π 1]°idid×π 1〉]<br />

=[〈[0,+°id×π 0] ,[0,1°π 1°id×π 1]〉]<br />

=[〈0,0〉 ,〈+°id×π 0 ,1°π 1°id×π 1〉]<br />

=[〈0,0〉 ,〈+°id×π 0 ,1°π 1°π 1〉]<br />

λ式を用<strong>い</strong><strong>る</strong><strong>と</strong>,<br />

[〈0,0〉 , λa ,b , n.ab , n1]


curryingの圏論的扱<strong>い</strong><br />

Curry–Howard–Lambek同型対応<br />

やり残し<strong>と</strong>これ<strong>か</strong><strong>ら</strong><br />

F-代数<strong>と</strong>catamorphismの双対概念<strong>と</strong>し<strong>て</strong>のF-余代数<strong>と</strong>anamorphism<br />

モナド<strong>と</strong>コモナド<br />

集合<strong>と</strong>全域関数の圏では<strong>な</strong>くpointed CPO<strong>と</strong>連続関数の圏<br />

関数<strong>と</strong>categoryでは<strong>な</strong>く関係<strong>と</strong>allegory<br />

<strong>な</strong>ど<strong>な</strong>ど


参考文献<br />

Antony J. T. Davie. An Introduction to Functional Programming Systems Using<br />

Haskell. Cambridge University Press, 1992.<br />

Benjamin C. Pierce. Basic Category Theory for Computer Scientists.<br />

MIT Press, 1991.<br />

David Gries, and Fred B. Schneider. A Logical Approach to Discrete Math.<br />

Springer-Verlag, 1993.<br />

Jeremy Gibbons and Oege De Moor (Eds). The Fun of Programming.<br />

Palgrave Macmillan, 2003.<br />

Mac Lane, S. Categories for the Working Mathematician. Springer, 1998.<br />

Richrd Bird. Introduction to Functional Programming using Haskell.<br />

Prentice Hall, 1998.<br />

Richrd Bird and Oege De Moor. Algebra of Programming. Prentice Hall, 1997.<br />

Roland Backhouse, Roy Crole and Jeremy Gibbons (Eds).<br />

Algebraic and Coalgebraic Methods in the Mathematics of Program Construction.<br />

Springer-Verlag, 2002.<br />

Steve Awodey. Category Theory. Oxford University Press, 2006.

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

Saved successfully!

Ooh no, something went wrong!