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.