bitterharvest’s diary

A Bitter Harvestは小説の題名。作者は豪州のPeter Yeldham。苦闘の末に勝ちえた偏見からの解放は命との引換になったという悲しい物語

南信州の飯田市に人形美術館を観に行く

豊川に用事があったので、ちょっと足を延ばして南信州の飯田を訪ねた。豊川から飯田までは、秘境駅で知られている飯田線を利用した。豊川駅の出発は午後6時半。豊川駅には売店もないということなので、豊川稲荷にお参りがてら、近くのお土産屋で、今夜の夕食にするための稲荷ずしを入手した。
f:id:bitterharvest:20190717094655p:plain
f:id:bitterharvest:20190717103920p:plain
今回の旅行に先立って、新幹線はスマートEXを利用して座席を確保したが、飯田線はどうせ混みはしないだろうとたかをくくったいた。しかし他方では、もしかすると三連休の初日なので、座席がいっぱいになっているかもしれないという不安を抱きながら、豊川駅の切符売り場で、「飯田まで、特急券も込みで」と注文した。優しそうな駅員の人が、「指定席にしますか」と尋ねてきたので、「はい」と答えると、しばらく機械を操った後で、「ガラガラのようなので、自由席にして、もし混んでいるようでしたら、指定席に移られたらどうでしょう」と示唆してくれたので、言われるとおりに切符を購入した。二人分で、特急券も含めて、8,200円だった。

ホームで待っていると、特急ワイドビュー伊那路は定刻に入ってきた。乗り込むと列車は教えられた通りガラガラで、指定席券を買わなくてよかったと得した気分になった。観光列車なのだろうが、観光客には都合が良いとは思えない夕刻の列車だ。乗車したときは明るかった空も、古戦場で有名な長篠を過ぎるころには、周囲は闇に包まれ、景色を楽しむことはできなかった。少数の乗客も、一人二人と降りていき、平岡駅で最後の乗客が降りてしまうと、3両編成の列車には、我々夫婦だけが残された。真っ暗闇の原始的な自然の中に、列車の室内だけが明るい人工的な空間に、置き去りにされたというような心細さが襲ってきた。平岡駅の周囲の駅は秘境駅で知られており、行楽シーズンにはこれらの駅の訪問を目的にした秘境号が走っている。このような人気の全く感じられないところで、激しく雨が降っている夜中に、取り残されるような事態になったらと想像したりしていたら滅入ってきたが、銀河鉄道に乗っていると思うことにして気を紛らわせた。
f:id:bitterharvest:20190716102852p:plain

そうこうするうちに、飯田市の市内に入ったのだろう。車窓に少しづつ街のあかりが灯るようになり、ほっとした。列車は定刻9時に飯田駅に滑り込んだ。外は激しい雨だった。今夜の宿は駅からそれほど離れていないホテルニューシルクだが、ずぶぬれになりそうなので、タクシーに乗り込んだ。近い距離だということを知らずに乗り込んだ客だと、運転手さんは思ったのだろう。とても恐縮して、「雨が激しいですね。すぐそこなので、すぐにつきますから、道一本越えたところですから」としきりに弁明しているのが、おかしかった。走っている時間よりも信号機での待ち時間の方が長かっただろう。タクシーは、数分後、ホテルの玄関前に滑り込んだ。

フロントで素泊まりでの料金12,560円を支払い、部屋へと向かった。ビジネスホテルなのであまり期待はしていなかったのだが、ドアを開けてみると期待を超えて大きく、ベッドのそれぞれの横にはサイドテーブルがついており、灯かりが相手の迷惑にならないように配慮されていたので一安心した。同じ階の大浴場でこの日の疲れをとって、明日に備えた。

次の日、朝食をとろうと駅前に向かった。飯田駅は平成4年に現在の駅舎になったとのこと、赤い屋根が特徴だ。信州特産のリンゴの色だそうだ。
f:id:bitterharvest:20190717100356p:plain
駅舎のステンドグラスも綺麗だ。人形劇の一場面のようで、手前はそれを鑑賞している観客だ。
f:id:bitterharvest:20190718164440p:plain

改札口でお迎えしてくれたのが、ナミキちゃん。ここ飯田も御多分に漏れず町興しに力を入れているのだろう。
f:id:bitterharvest:20190717100516p:plain

ナミキちゃんから、実際の改札口の方に目を転じると、ホームへの通り口なのにそれをふさぐように看板が置かれていた。一瞬嫌な予感が走り、掲示の「お知らせ」を読んでみた。なんとそこには、早朝に東栄駅(中部天竜駅本長篠駅の間)で通信ケーブルが破損し、豊川方面は不通になっており、復旧には相当の時間を要すると記されていた。飯田までやってきた今回の目的の一つは、飯田線からの車窓を楽しむことであった。そのため昼過ぎの特急列車に乗車することを予定し、豊橋から東京までの新幹線ひかり号の切符は既に購入済みだった。戦略を誤ると今日は帰れないかもしれないという嫌な予測さえ浮かんできた。朝食をとれそうなお店もなかったので、コンビニでおにぎりを購入し、ホテルに戻って今日の予定を考えることにした。

駅前はこのような感じだった。朝が早かったので、まだシャッターはどこもしまっていた。飯田市は10万人には少し届かない(ただし外国人を含めると超える)が、長野県では長野市松本市上田市に次いで人口が多く、南信州の中心的な市だ。もう少し活気があってもよさそうだが、どこの街も駅前は寂しくなっているようだ。
f:id:bitterharvest:20190717103121p:plain

朝食を済ませたあと、再び飯田駅を訪れた。状況は変わっていない。開通するような気もしたが、リスクをとることはやめて、改札の窓口にいき、「今日の新幹線利用は難しそうなので、払い戻しをしてもらえませんか」と依頼。駅員の人はとても恐縮して「列車が不通でご迷惑をおかけして申し訳ありません。払い戻しの方は承りました」と言って、手数料なしで払い戻しをしてくれた。そのあと駅前の案内所に行って、午後2時の新宿行高速バスを予約した。

飯田線からの車窓を楽しむ機会をなくしてしまったが、帰るための方策は立ったので、市内の観光に出かけた。飯田駅から中心部の市役所までの地域は「丘の上」と呼ばれている。下図は飯田市の市街地だ。中央左上に飯田駅がある。中央の少し下はこれから訪れる「川本喜八郎人形美術館」だ。その右下が市の官庁街で、図書館や美術館などがある。市街地は、天竜川の二つの支流、地図の右上の「野底川」と下の「松川」に挟まれた合流扇状地だ。
f:id:bitterharvest:20190717110205p:plain

段丘と川に恵まれた飯田市は、太古から人々が居住し、縄文・弥生・古墳時代の遺跡が点在している(520基にも及ぶ古墳があったそうで、現在残っている18基の前方後円墳と4基の帆立貝形古墳のまとまりは「飯田古墳群」と呼ばれている)。また奈良・平安時代には、伊那郡を治めるための伊那郡衙が設けられた(郡衙は下図の右上の恒川(ごんが)官衙遺跡のところにあった)。今回は残念ながら車での移動ではなかったため、訪れることはできなかった。
f:id:bitterharvest:20190718083239p:plain

飯田市は昭和22年(1947年)に大火があり、街の中心地は殆ど焼き尽くされた。その後の復興事業で、市中心街には二本の直交する緑地帯つきの防火帯道路が設けられ、南北に走る道路には地元の中学生によってリンゴの木が植えられた。「リンゴ並木」と名付けられ、復興のシンボルとして知られるようになった。
f:id:bitterharvest:20190718090220p:plain
f:id:bitterharvest:20190718090316p:plain

リンゴ並木の近くに、川本喜八郎人形美術館がある。
f:id:bitterharvest:20190718090540p:plain

川本喜八郎は、1982~84年にNHKからテレビ放送された人形劇「三国志」で人形美術を担当した人形作家だ。美術館のエントランスには、三国志に登場する諸葛亮(孔明)の木目込み人形が置かれていた。
f:id:bitterharvest:20190718091535p:plain

ギャラリーには、「三国志」、1993~95年にNHKから放送された「人形歴史スペクタクル 平家物語」、遺作となった人形アニメーション死者の書」で使われた人形が並べられていた。人形の着物は、全て帯を使って製作されたとのこと。その中で、曹操の着物は赤色だが、赤に染めた帯はまれだったため、入手にはとても苦労したとのことだった。全ての人形がとてもリアルに造られていることにビックリさせられた。また美術館の方から、人形の動かし方を教えて頂いた。人形を貸してくれたので試みたが、なかなか思うようにはいかなかった。

死者の書は、民俗学者で国文学者の折口信夫が著したものだ。あらすじは次のようになっている。藤原南家の郎女(姫)は、大和と河内の境のそして女人禁制の二上山に入り込み、そこで非業の死を遂げた大津皇子(天智天皇の皇子)の亡霊にまみえる。郎女はおもかげと重なる彼の姿を曼荼羅(まんだら)に織り上げ、さまよう魂を鎮め、浄土へと一緒に誘うという物語だ。郎女は、当時権力を極めた藤原仲麻呂の姪である。藤原仲麻呂大伴家持とで郎女が二上山に行ってしまったことを話している場面もある。また大津皇子が一目ぼれした耳面刀自(みみものとじ)が出てくるが、郎女は刀自の化身でもある。この作品は、古代人の心情をうまく描き出していると言われているので、機会があれば観たいと思っている。

ベトナムからの中高校生の団体見学もあってにぎわっていた人形美術館を後にして、日本画菱田春草の作品を鑑賞するために、飯田市美術博物館へと向かった。途中昭和4年(1929年)に新築落成した追手町小学校を通り過ぎた。時代を感じさせる校舎だが、鉄筋コンクリート3階建てでがっちりしている。長野県内では、使用中の校舎としては、松本深志高校に次いで古いそうだ。
f:id:bitterharvest:20190718102357p:plain

赤門もあった。飯田城桜丸御門だが、通称でこのように呼ばれている。
f:id:bitterharvest:20190718102938p:plain

そして目的地の飯田市美術博物館だ。
f:id:bitterharvest:20190718103035p:plain

しかし残念なことにリニューアル中だった。窓口の方が申し訳なさそうに見学できないことを伝えてくれた後で、柳田國男館を勧めてくれた。東京都世田谷区成城にあった書屋を飯田市に移築したものだ。柳田國男は、飯田市在住の柳田家に養子に入った。兵庫県の生まれで、父は儒者の松岡操、母はたけ。生家はとても狭く、「私の家は日本一小さい家だった」と言っていたそうだ。
f:id:bitterharvest:20190718103647p:plain

少し歩き疲れたので、駅までは電気小型バス「プッチー」に乗って戻った。
f:id:bitterharvest:20190718103951p:plain

近くの中華料理屋で昼食をすまし、お土産などを買って、やはりガラ空きの高速バスに乗って帰途についた。
f:id:bitterharvest:20190718104154p:plain

時間があれば、日本のチロルと呼ばれる「下栗の里」にも行ってみたかったが、公共の交通機関を利用してここを訪れるのはとても難しい。土日は早朝と夕方にそれぞれ1本走っているだけだ。タクシーでは随分と高い料金になるだろう。ところで、8年後にはリニア新幹線が飯田に停車することになっている。歓迎の看板を見かけることが普通だと思うのだが、それらしきものを見かけなかった。不思議な現象だ。もしかしたら街はそれほど期待していないのではとも感じた。

今年の梅雨は例年になく長いが、市内見学をしているときは、雨も降られず暑さも感じられず、快適に歩き回ることができた。街も綺麗で、良い旅行であった。

トーハクで『三国志』展を観る

早々とトーハクの「三国志」を観に行った。前回の「東寺」は余りにも閉会日に近い時に訪れたために、会場の入り口に入る人であふれかえっていたので、断念せざるをえなかった。今回はその反省もあって、開催日の週に、しかも小雨の降る中を、朝のラッシュが過ぎた電車を乗り継いで、勇んで訪れた。昨年から今年にかけて、WOWOWで全86回の三国志の「司馬懿」を毎週欠かすことなく観たため、曹操司馬懿諸葛亮などとても身近に感じられるようになっていた矢先だったため、少なからず興味を覚え、今日(12日)訪ねた。

実は2日後に長野県飯田市にある竹本人形美術館を訪問する予定にしている。この美術館には35年前にNHKの人形劇「三国志」で用いられた人形が展示されている。しかしその一部はここトーハクに出張中のようだ。
左が蜀漢の初代皇帝の劉備、右が後漢末期の武将・政治家で、後漢の丞相・魏王の曹操
f:id:bitterharvest:20190712154940p:plain
左が呉の初代皇帝の孫権
f:id:bitterharvest:20190712155103p:plain
左が後漢王朝最後の皇帝の景帝、右が魏の初代皇帝の曽丕、
f:id:bitterharvest:20190712155159p:plain
左が諸葛亮の南征で7回捕らえられ7回釈放されたという逸話のある孟獲、右が蜀漢の政治家で軍師の諸葛亮
f:id:bitterharvest:20190712161821p:plain
後漢末期の武将で孫権に仕えた甘寧
f:id:bitterharvest:20190712161144p:plain
魏の皇族で文学者の曹植だ。
f:id:bitterharvest:20190712161639p:plain

入口表面に座しているのが蜀漢劉備に仕えた関羽
f:id:bitterharvest:20190712165540p:plain

近くには趙雲像。劉備夫人を救い出した武者、
f:id:bitterharvest:20190712170110p:plain

前漢時代に貴族が好んだとされる工芸品の豹、
f:id:bitterharvest:20190712170357p:plain

漢時代から三国時代に広東・広西で用いられた貨客船、
f:id:bitterharvest:20190712170422p:plain

漢王朝時代の栄華を伝えてくれる石像、
f:id:bitterharvest:20190712165745p:plain

後漢時代の死後の世界を照らしてくれる多層棟、
f:id:bitterharvest:20190712170831p:plain

後漢時代の墓に副葬された四層穀倉楼、
f:id:bitterharvest:20190712171146p:plain

三国時代の武器の弩、
f:id:bitterharvest:20190712171709p:plain

三国時代の軍船模型、
f:id:bitterharvest:20190712171955p:plain

後漢から三国時代にかけての方格規矩鳥文鏡だ。倭国との関係を思いめぐらさせてくれる。
f:id:bitterharvest:20190712172517p:plain

ひょうきんな魏の秦琴俑と説唱俑、
f:id:bitterharvest:20190712172816p:plain

豊かさを感じさせてくれる呉の扁壷・羊尊・神亭壺、
f:id:bitterharvest:20190712173234p:plain

曹操高陵から出土した白磁の罐、
f:id:bitterharvest:20190712173612p:plain

これも曹操高陵から出土した鼎、
f:id:bitterharvest:20190712173822p:plain

後漢時代の金製獣文帯金具だ。これは、漢王朝が周辺部の有力者を手なずけるために贈ったとみられている。
f:id:bitterharvest:20190712173901p:plain

神仙の世界を反映したと思える後漢時代の揺銭樹だ。
f:id:bitterharvest:20190712174236p:plain

この他にも興味の引かれるものがたくさんあり、後漢から三国志の時代の遺産を目のあたりに見ることができ、この時代に対する知識を深めることができた。
また会場には中国人も多かった。本国でもめったに見ることができないのだろう。我々が戦国時代が好きなように、三国志が大好きな彼らにとっても心惹かれる展示だったようだ。

新鮮なビーツでボルシチを饗する

散歩のコースを少し外れたところにJA横浜があることは知っていたが、地元の農家の方々が丹精込めて作った野菜を販売していることを知ったのは、春先だった。それ以来ときどき立ち寄っては、珍しい野菜を手に入れて、サラダや炒め物などを作って楽しんだ。一昨日も、少し暑い中を散歩していたので、涼を取ることを目的に、あまり期待しないで立ち寄ってみた。

今の時期は、実はトマトがおいしい。特に「桃太郎ファイト」という品種が優れている。何人かの生産者が出品し、味を競っているのも気に入っている要因の一つだ。この日もいくつかは試食できるようになっていた。何人もの人が口に運んでいたが、割り込んで仲間に入ることには気後れを感じた。このため前回購入し美味であった生産者のトマトを選び、買い物かごに一袋入れた。梅雨時の鬱陶しさを忘れさせてくれる、清々しい生の味を楽しむためにだ。

精算所に向かおうと思って、他のテーブルに目を移したとき、隅の方に珍しい根野菜を発見した。見慣れない濃紅色の丸い根が目に飛び込んできた。ずっと前から入手したいと思っていたビーツではないかと期待を込めて近づいたところ、まぎれもなくそうであった。二袋しか出品されていないが、このような機会が訪れることはないかもしれないという心配が先に立って、大きい球の方を購入した。

20年近くも前になる。同僚のロシア人の家に招かれたとき、奥さん手作りのボルシチをご馳走になった。とても美味しい味だったので、そのときから是非一度作ってみたいと思っていたのだが、ビーツを見つける機会がなく、希望を果たせないまま今日に至ってしまった。とても長いこと待ち望んでいたので、是非もない買い物だった。
f:id:bitterharvest:20190628210317p:plain

買い物かごに入れたあとで、周囲を見渡すと、すぐ近くにスイスチャードがあった。柄の部分がきれいな色の野菜で、今回は濃いピンク色のものはなかったが、黄と薄ピンクと白のものがあったので、サラダや炒め物にしようと思い一緒に入手した。
f:id:bitterharvest:20190628210213p:plain

昨日(28日)は、早速ビーツを用いて長年の希望であったボルシチを作った。

材料の主役はもちろんビーツ。少し多めかなと思ったが、買ってきたビーツをすべて使った。大きな球と小さな球だ。その他の野菜は根野菜を中心に好きなものを加えればよいが、今回は、玉ねぎ(1個)、じゃがいもぎ(1個)、にんじん(1個)、キャベツ(8分の1玉程度、使っている最中のキャベツがあったので、写真のキャベツの4分の1程度を使った)を使った。

肉は、和牛だと煮たときに固くなってしまうので、オーストラリア産のブロック肉(300g)を用いた。こちらの肉の方が経済的なのももう一つの理由だ(同じ量だと和牛は1000円も高かった)。さらに味付け用だが、ホールトマト(半缶)、パセリ少々、ローリエ(1枚)、サワークリームだ。その他に、オリーブオイル(大匙2杯)、バター(20g)、マギーブイヨン(3個)、ニンニク(練ったもの小匙1杯)、塩(小匙1杯)、黒コショウだ。
f:id:bitterharvest:20190628211356p:plain

最初は野菜の処理だ。にんじんの頭と尻を落として、3等分に分割した。さらに頭の方は8等分に、尻の方は3等分、真ん中は6等分と、大きさがそろうようにシャトー切りにした。ただしお客さんに出すわけではないので、合理性を加味して、皮をむくのも角を取るのも省略。
f:id:bitterharvest:20190628211834p:plain

ニンジンの大きさが定まったので、他の野菜はこれと同じような大きさになるようにする。玉ねぎをくし切りにする。そして皮をむいてジャガイモを用意する。但し、ジャガイモは量があった方が好きなので、少し大きめに乱切りにした。
f:id:bitterharvest:20190628212329p:plain

キャベツはニンジンの長さと同じ長さになるように切った。何切りというのだろう。形に合わせて切ったとしか言いようがない。
f:id:bitterharvest:20190628212402p:plain

ビーツは、カブと同じ要領で、少し厚めに薄切りにした。
f:id:bitterharvest:20190628212426p:plain

肉は、カレー用に切られているものと同じ大きさになるように切断した。
f:id:bitterharvest:20190628212447p:plain

鍋に、オリーブオイル(大さじ1杯)とバター(20g)を入れ、
f:id:bitterharvest:20190628212520p:plain
肉を加え、
f:id:bitterharvest:20190628212540p:plain
色が変化するまで、炒めた。
f:id:bitterharvest:20190628212601p:plain

さらにオリーブオイル(大匙1杯)と練ったニンニク(小匙1杯)を加え、そして野菜を加え、
f:id:bitterharvest:20190628212622p:plain
オリーブオイルが野菜に回るように炒めた。
f:id:bitterharvest:20190628212642p:plain

次に、水(700cc)、ホールトマト(半缶)、マギーブイヨン(3個)を加え、
f:id:bitterharvest:20190628212703p:plain
沸騰させ、
f:id:bitterharvest:20190628212733p:plain
その後、弱火で30分程ごとごと煮て、塩と黒コショウで味を調えた。

待ち望んだ、赤いスープの出来上がりだ。お皿に盛って、パセリとサワークリームを加えて、供した。
f:id:bitterharvest:20190628212759p:plain

ビーツはカブの一種なので、味もカブに似ているが、少し土っぽいという感じを受けた。今回作ったボルシチは、荒涼とした大地のなかで、寒い中を生き抜いてきた力強さを持ち、ロシアという異郷を感じさせてくれる、庶民的な料理だった。
手元には、近頃、店頭で目立っている安価なチリ産の赤ワインしかなかったので、期待しないで一緒に飲食したのだが、幸いな方向に期待が外れて、粗削りな味ともマッチして、美味しかった。

小石川後楽園で花菖蒲を愛でる

梅雨の中休み(11日)を利用して、小石川後楽園で花菖蒲を鑑賞した。浮世絵では、小雨の中、番傘を指して、花菖蒲を愛でるのが定番だ。もともとの予定日は前日だったのだが、朝から小雨が降り、天気予報では本降りになる可能性もあるということで、雨の中の鬱陶しさを避けたいという感情がまさり、浮世絵の主役になることを断念して、ときどき晴れ間の覗くこの日に訪れた。

小石川後楽園のホームページには、6月9日まで「花菖蒲を楽しむ」というイベントを開催しますという掲示があったので、時機を逸したかもしれないという不安を抱いての訪問であったが、なんと最盛期で、見事に咲いた花菖蒲を愛でることができた。例年訪れていた伊豆の虹の郷の7000株に対して、ここはその10分の1の660株と少ないが、それでも一株一株が精一杯頑張ってくれ、大都会の真ん中で、清涼なオアシスを感じさせてくれた。
f:id:bitterharvest:20190613100300j:plain
f:id:bitterharvest:20190613100403j:plain
f:id:bitterharvest:20190613100447j:plain
小石川後楽園は東京ドームの西隣にあるのだが、しばしばこの付近を訪れていたにもかかわらず、数週間前に小島敦さんの『朱子学陽明学』を読むまでは、その存在を知らなかった。

小石川後楽園水戸藩上屋敷(最初は中屋敷だった)の中にある庭園で、江戸時代の初めごろ、二代目の藩主徳川光圀によって築造された。

後楽園という名前は、中国北宋時代(藤原道長が活躍していたころ)の范仲淹(はんちゅうえん)が記した『岳陽楼記』のなかの「天下を以て己が任をなし、天下の憂いに先んじて憂え、天下の楽しみに後れて楽しむ」(先憂後楽)に因んでつけられた。

命名者は中国明王朝の遺臣である朱舜水(しゅしゅんすい)だ。彼は光圀に招聘され、後の水戸学に思想的影響を与えた儒学者だ。

水戸藩上屋敷は、現在の小石川後楽園、東京ドーム、中央大学後楽園キャンパスを含む広い敷地を有していた。

江戸時代と現在の地図を載せておこう。これらを比較することで、大きな道がそれほど変わらずに現在に残されていることが分かる。また水戸藩上屋敷に隣接して、小笠原佐渡守や松平丹後守(それぞれ1万石の大名)の上屋敷があるが、水戸藩がいかに大きな敷地を有していたかが分かる。
f:id:bitterharvest:20190613100530p:plain
f:id:bitterharvest:20190613100546p:plain
園内には、朱舜水の意見をいれて中国の風物が一部取り入れられているが、それらは円月橋と西湖の堤がある。円月橋は、石橋で、水面に映る影と合わせると満月のように見える。
f:id:bitterharvest:20190613100626j:plain

西湖(せいこ)の堤は、中国杭州の西湖の堤に見立てたものだ。
f:id:bitterharvest:20190613100653j:plain

その他にも中国に因んだものがいくつかある。小廬山は中国の名勝地「廬山」に因んで、林羅山によって名付けられた。
f:id:bitterharvest:20190613100731j:plain

徳仁堂は、光圀が18歳の時に史記「伯夷列伝」を読んで感銘を受け、伯夷・叔斉(古代中国殷代末期の孤竹国の賢人兄弟)の木造を安置した堂だ。
f:id:bitterharvest:20190613100802j:plain

中國の風物だけでなく、京都の風物を模したものもある。
京都東山東福寺の「通天橋」に習い、朱塗りの橋がかけられている。名前はもちろん通天橋だ。
f:id:bitterharvest:20190613100828j:plain
橋の下を流れる川は、京都嵐山を流れる「大堰川」に因んだ大堰川だ。
f:id:bitterharvest:20190613100904j:plain

同じく嵐山の「渡月橋」に因んだ橋。
f:id:bitterharvest:20190613100935j:plain
そのそばには屏風のように林立する屏風岩
f:id:bitterharvest:20190613101002j:plain

全体を上から見るとこのように箱庭のようだ。
f:id:bitterharvest:20190613101030j:plain

水戸藩書院のあったところは内庭になっていて、水連がきれいに咲いていた。
f:id:bitterharvest:20190613103838j:plain

庭園の中央は大泉水と呼ばれ、「琵琶湖」を見立てた池で、池の中央部には蓬莱島が造られている。
f:id:bitterharvest:20190613101118j:plain

小石川後楽園は、四季折々の花に恵まれており、特に梅や桜と紅葉の季節は良さそうだ。折々に訪れて、それぞれの趣を味わうのが楽しそうだと思って、ここを後にした。

数学的帰納法によるプログラミングを修得するためにF-代数を攻略する

4. F-代数

今回はあまり聞きなれてはいないと思われるF-代数( F-algebra )について学んでみよう。代数という名が示すとおり、これは、半群、モノイド、群、環などの代数を表現するための重要な役割を担っているが、それにもまして、数学的帰納法による再帰的表現において重要な役割を果たしてくれる。一般に、再帰的表現は、記述を平易化し、読みやすくしてくれ、さらには証明をしやすくしてくれるが、F-代数はその道具を与えてくれる。

それでは累計、フィボナッチ数(Fibonacci number)、素数などを例にあげながら、F-代数と数学的帰納法を活かしたプログラミングについて見ていこう。

4.1 F-代数の定義

F-代数とは、圏\(\mathcal{C}\)とその上での自己関手\(F: \mathcal{C} \rightarrow \mathcal{C}\)に対して、\(\mathcal{C}\)の対象\(A\)とその射
\begin{eqnarray}
α: F(A) \rightarrow A
\end{eqnarray}
の組\( (A,α) \)のことを言う。そして、\(A\)を台集合(carrier)、\( α \)を評価射(evaluation function, structure map )と呼ぶ。図で表すと次のようになる。

f:id:bitterharvest:20190608112644p:plain
図1:F-代数の定義

例1 自然数

定義はいたって簡単だ。例を挙げて理解を深めることにしよう。最初に自然数を考える。自然数は、\(0\)から始まる無限な整数の集まりだ(中学・高校では\(1\)からと学んだと思うが、\( 1 \)を別の意味で使うので、紛らわしさを避けるために、ここでは\(0\)からにする)。

そこで集合の圏\( \mathbf{Set}\)を考えることにしよう。この集合において、\( 1 \)を終対象とし、\( + \)を\( \mathbf{Set} \)上での直和とする。そして\(F: \mathbf{Set} \rightarrow \mathbf{Set}\)を自己関手とし、これは集合\(X\)を「\( 1 \)あるいは\(X\)」に移すものとしよう。ここで「\( 1 \)あるいは\(X\)」は直和\( + \)を用いて、\( 1 + X\)と表すことにしよう。

つぎに\(X\)から\(1+X\)に移すための二つの射を用意しよう。そしてここでは台集合を自然数とするので、その集合を\(\mathbb{N} \)で表す。二つの射は\( 0\)と\(succ \)で、次に示すように、\( 0\)は終対象\( 1 \)を自然数の始まりに移し、また\(succ \)は次の自然数を得る。
\begin{eqnarray}
0 &:& 1 \rightarrow \mathbb{N}; * \mapsto 0, \\
succ &:& \mathbb{N} \rightarrow \mathbb{N}; n \mapsto n+1
\end{eqnarray}

これにより、\([0,succ]:1+ \mathbb{N} \rightarrow \mathbb{N} \)となる。

したがって自然数は、\(F: X \rightarrow 1+X\)を自己関手とし、\( ( \mathbb{N}, [0,succ] ) \)を組みとするF-代数となる。

Haskellで実装してみよう。

まずF-代数の定義で出てきた評価射\( α \)にたいして、次のようなデータ型\(Algebra\)を用意しよう(ちなみにHaskellではControl.Functor.Algebraというパッケージがある)。

type Algebra f a = f a -> a

つぎは関手\(F\)をデータ型を用いて表現することだ。これは、\(F:X \rightarrow 1+X\)で、\( [0,succ] \)という二つの射で表わした。すなわち\(0:1 \rightarrow \mathbb{N} \)と\(succ:\mathbb{N} \rightarrow \mathbb{N} \)だ。ここでは\(F\)を\(NatF\)とし、次のように代数的データ型を用いて定義する(ここでは、任意のデータ型\(a\)で定義しておき、評価射のところで台集合を自然数\(\mathbb{N} \)とする)。

data NatF a = Zero | Succ a

さて\(F\)が定まったので、評価射を具体的に定義しよう。\(F\)の台集合を自然数の代わりに便宜的に整数¥(I nt ¥)とし、評価射\(algN\)を次のように定めよう。

algN :: Algebra NatF Int
algN Zero = 0
algN (Succ n) = n + 1

これを用いて実行してみよう。

f:id:bitterharvest:20190606082232p:plain
図2:F-代数で表現された自然数を確認する

例2 モノイド(足し算と掛け算)

次の例はモノイドだ。モノイドの定義はいくつかあるが、古典的な定義は、集合\(M\)の上に次の二つの射をもち、結合律と単位律を満たすことだ。なお\(1\)は自然数のときに用いた終対象だ。
\begin{eqnarray}
μ &:& M \times M \rightarrow M; x + y \mapsto z \ (if \ addition), \\
η &:&1 \rightarrow M; * \mapsto 0 \ (if \ addition)
\end{eqnarray}

これより\( [η, μ]:1 + M \times M \rightarrow M\)となり、\(F: X \rightarrow 1 + X \times X \)である。なお\(+\)は自然数のときと同様に直和だ。

Haskellでこれを実現しよう。\(η\)を\(MEmpty\)とし、\( μ\)を\(MAppend\)とする。そして\(F\)を新たなデータ型\(MonF\)で表すことにしよう。

data MonF a = MEmpty | MAppend a a

整数の足し算は、評価射\(algP\)を用意し、次のように定義すればよい。

algP :: Algebra MonF Int
algP MEmpty = 0
algP (MAppend m n) = m + n

図で示すと次のようになる。

f:id:bitterharvest:20190608112714p:plain
図3:F-代数で整数の足し算を定義する

同様に整数の掛け算は次のように用意できる。

algM :: Algebra MonF Int
algM MEmpty = 1
algM (MAppend m n) = m * n

\(MonF\)でのデータコンストラクタ\(MEmpty, MAppend\)が射となっていることを確認しておこう。

f:id:bitterharvest:20190606135321p:plain
図4:データコンストラクタの確認

例3 環(加算と乗算)

加算と乗算が成り立つ世界を環と呼ぶ。もう少し詳しく説明すると、集合\(R\)の上に二つの演算\(+\)と\( \times\)が用意されていて、\(+\)がアーベル群、\(\times\)が半群(またはモノイド)のとき、\( (R,+,\times) \)の組を環という。

モノイドは、演算を\(\circ\)としたとき、次を満たすものである(半群単位元がなくてもよい)。
1) 任意の\(a,b\)に対して、\(a \circ b \in R\)
2) 結合律( \( (a \circ b) \circ c = a \circ (b \circ c)\) )を満たし、
3) 単位元( \(i \in R \))を有し、単位律( \( i \circ a = a = a \circ i \))を満たす。

アーベル群とは上記の性質に加えて、次を満たすものである。
4) 任意の\(a\)に対して逆元 \( (a^{-1}) \)を有する。なお、逆元とは\( a \circ a^{-1} = i \)を満たすものである。
5) 可換律(\( a \circ b = b \circ a \))を満たす。

従ってアーベル群は
\begin{eqnarray}
μ &:& M \times M \rightarrow M; x + y \mapsto z \ (if \ addition), \\
η &:&1 \rightarrow M; * \mapsto 0 \ (if \ addition) \\
ι &:& M \rightarrow M; x \mapsto (-x) \ (if \ addition)
\end{eqnarray}
に加えて、単位律、結合律、可換律を満たすものである。

このためアーベル群では自己関手\(F\)は\(F: 1 + X + X \times X\)となる。またモノイドでは\(F: 1 + X \times X\)であったので、環では\(F: 1 + 1 + X + X \times X + X \times X\)となる。

整数の上での加算\(+\)と乗算\(\times\)を有するF-代数を、新しいデータ型\(RingF\)を用いて次のように定義しよう。

data RingF a = RZero | ROne | RNeg a | RAdd a a | RMul a a

評価射を\(algR\)で表すことにすると、次のようになる。

algR :: Algebra RingF Int
algR RZero = 0
algR ROne = 1
algR (RNeg m) = - m
algR (RAdd m n) = m + n
algR (RMul m n) = m * n

例4 多項式の環

多項式も環となる。演算(\(+, \times\))は次のように定義できる。
\begin{eqnarray}
\sum^{n}_{i=0} a_i x^i + \sum^{n}_{i=0} b_i x^i = \sum^{n}_{i=0} (a_i + b_i) x^i \\
\sum^{n}_{i=0} a_i x^i \times \sum^{m}_{j=0} b_j x^j = \sum^{n+m}_{k=0} (\sum_{i+j=k}a_i b_j) x^k
\end{eqnarray}
これに対するデータ型は、次のようになる。

data Expr = RZero | ROne | RNeg Expr | RAdd Expr Expr | RMul Expr Expr

4.2 不動点

F-代数において、自己関手\(F\)を適応し続け、その前後で変化がなくなったとき、これを不動点\(Fix(F)\)と呼ぶ。

f:id:bitterharvest:20190606082432p:plain
図5:自己関手\(F\)の不動点

厳密に定義すると、自己関手\(F\)の不動点(fixed point)とは、
\begin{eqnarray}
F(Fix(F)) = Fix(F)
\end{eqnarray}
となるような\( Fix(F)\)である。

Haskellでは次のように定義できる。

newtype Fix f = Fix (f (Fix f))

ところで等号の左側の\(Fix\)は型コンストラクタだが、右側の最初の\(Fix\)はデータコンストラクタである。これは、下図に示すように、射として\(f (Fix \ f) \)を\(Fix \ f \)に写像する。

f:id:bitterharvest:20190606082539p:plain
図6:Haskellでの不動点の定義
すなわちデータ型\(Fix \ f \)は、射\(Fix : F (Fix (F)) \rightarrow Fix (F) \)を与える。

\(Fix\)とは逆の射、すなわち\(Fix \ f \)を\(f (Fix \ f) \)に写像する射\(unFix\)も用意しておこう。

unFix :: Fix f -> f (Fix f)
unFix (Fix x) = x

ここで\(unFix : Fix (F) \rightarrow F(Fix (F)); Fix(x) \mapsto x \)である。

不動点の定義より、
\begin{eqnarray}
Fix \circ unFix = id \\
unFix \circ Fix = id
\end{eqnarray}
であることに注意しておこう。

4.3 Lambekの定理

台集合\(A\)と評価射\(α:F(A) \rightarrow A\)の対( \( (A, F(A) \rightarrow A \) )をF-代数と定めた。それでは、二つの代数が存在したときに、片方の代数の構造が他方の代数の構造の中で保持されているという性質をどのように記述したらよいのかについて考えよう。構造が保たれるということは、圏論の世界では大切な性質で、たとえば関手はこの役割を担っている。

F-代数の圏

いま二つのF-代数( \( A, α:F(A) \rightarrow A \) )と( \( B, β:F(B) \rightarrow B \) )があったし、前者の代数の構造が、後者の代数の構造の中で保持される条件を考えることにしよう。

f:id:bitterharvest:20190608083249p:plain
図7:F-代数( \( A, F(A) \rightarrow A \) )と( \( B, F(B) \rightarrow B \) )が準同型のとき、\(m\)は関手となり、上図は可換図式となる

対象\(A\)から対象\(B\)への射を\(m\)とする。上の図で\( F(A) \)から\(B\)を得ることを考える。経路は二つある。上側の経路を辿ると\(β \circ F(m) \)となる。これは後者の代数の方に移って計算するというものである。下側の経路を辿ると\(m \circ α\)である。これは前者の代数で計算した後で、その値を後者の値に変えるというものである。これが一致することが、構造を保持するための約束なので、次の式を得る。
\begin{eqnarray}
β \circ F(m) = m \circ α
\end{eqnarray}
ある代数の構造が別のある代数の構造の中で保たれるとき、準同型(homomorphism)であると言い、その条件は上に示した式である。これより\(F\)代数\( (A, α:F(A) \rightarrow A) \)と\( (B, β:F(B) \rightarrow B) \) を圏とした時に、\(m\)が関手であれば二つの圏は準同型となる。そして上図は可換図式となる。

そして準同型を射として構成した圏をF-代数の圏と呼ぶ。上図であれば\(m\)が射、( \( A, α:F(A) \rightarrow A \) )と( \( B, β:F(B) \rightarrow B \) )が対象となる。

始代数

F-代数の圏が始対象を有するならば、その始対象をF-始代数と呼ぶ。これまで例で挙げてきた自然数、足し算や掛け算のモノイド、加算と乗算からなる環などはF-始代数の例である。

それではLambekの定理を示そう。これはF-始代数に関するものだ。

Lambekの定理

F-代数の圏において、台集合が始対象\(I\)のとき、\(F(I)\)と\(I\)は同型(isomorphic)である。

証明
\(I\)が始対象であることから、\(I\)の中に複数の要素が含まれていたとしても、それらは同型であることに注意して証明を行う。\(I\)が始対象であることから、\(I\)から\(F(I)\)に対してただ一つの射が存在する。これを\(m\)としよう。また評価射を\( j : F(I) \rightarrow I \)とすると、\(F(I)\)と\(I\)が同型であることを示すには、
\begin{eqnarray}
j \circ m = id_I \\
m \circ j = id_{F(I)}
\end{eqnarray}
であることを示せばよい。それでは次の可換図式を用いて証明しよう(この可換図式はF-代数の圏である)。

f:id:bitterharvest:20190606082713p:plain
図8:Lambekの定理の証明

下側の横方向の射の合成\( j \circ m \)は\(I\)から\(I\)への射であり、\(I\)の任意の要素はお互いに同型なので、これは恒等射となる。すなわち\(j \circ m = id_I \)である。


上側の横方向の射の合成\( F(j) \circ F(m) \)は\(F(I)\)から\(F(I)\)への射であり、\( f(j) \circ F(m) = F (j \circ m) = F(id_I) = id_{F(I)} \)より、これは恒等射となる。(証明おわり)

これより、\( I \)と\( F(I) \)が同型であることから、\(I\)が不動点であることが分かる。すなわち、
\begin{eqnarray}
j &:& F(I) \rightarrow I \ \ (cf \ Fix : F (Fix (F)) \rightarrow Fix (F)) \\
m &:& I \rightarrow F(I) \ \ (cf \ unFix : Fix (F) \rightarrow F (Fix (F))
\end{eqnarray}
となり、\(j\)は\(Fix\)であり、\(m\)は\(unFix\)である。また\(Fix(F)\)が台集合であることにも注意して欲しい。

4.4 Catamorphism

F-代数で表された自然数は、1)出発点となるものと、2)任意の\(n\)という数とその次の数との関係、を用いて定義した。すなわち始まりの値\(0\)と、任意の数\(n\)が与えられたときにその次の数\(n+1\)が求められるように定めた。このように定義されたものからは、最初に初めの数\(0\)を用意し、それに次の数を求める方法を適応して\(1\)を求め、さらにこれを適応して\(2\)を求めるということを繰り返す。

これは高校の頃に習った数学的帰納法だ。これまで説明した方法を一般化し、数学的帰納法をより自然な形で表して、利用できるようにしたのがCatamorphismである(残念ながらCatamorphismに対する日本語は用意されていない)。

F-代数の圏の性質

下図のように、F-始代数\( (Fix (F),F (Fix (F)) \rightarrow Fix (F)) \)とF-代数\( (A,α:F(A) \rightarrow A) \)を用意しよう。これはF-代数の圏なので下図は可換図式である。

f:id:bitterharvest:20190606082939p:plain
図9:始対象\(Fix(F)\)を有するF-代数の圏

左側はF-始代数であることから、\( F (Fix (F))\)と\(Fix (F) \)は同型であり、\( Fix . unFix = id_{Fix (F)} \)かつ\( unFix . Fix = id_{F(Fix (F))} \) とする\(unFix : Fix (F) \rightarrow F (Fix (F)) \)が存在する。また\(unFix (Fix \ x) = x \)である。

さらに\( Fix F \)が始対象であることから、\(A\)への射が存在する。これを\(m\)としよう。これにより\( F (Fix F) \)から\(F (A) \)への射は\(F(m)\)となる。

左側のF-始代数\( (Fix (F),F (Fix (F)) \rightarrow Fix (F)) \) と右側のF-代数\( (A,α:F(A) \rightarrow A) \)が準同型であることから、
\begin{eqnarray}
m = α . F(m) . unFix
\end{eqnarray}
となる。

上記の式が数学的帰納法を与えるが、これを実際の例で追っていこう。

例1 加算

それではモノイドでの加算を利用してHaskellを用いて具体的に見ていくこととしよう。モノイドでの加算はこれまで用いていたものではなく、リストを用いることにしよう。

data ListF a b = Nil | Cons a b

これは自己関手なので、次のように\(Functor\)のインスタンスとする。

instance Functor (ListF a) where
  fmap f Nil = Nil
  fmap f (Cons e lst) = Cons e (f lst)

さらにF-代数や不動点に関しても定めておこう。

type Algebra f a = f a -> a

newtype Fix f = Fix ( f (Fix f))

unFix :: Fix f -> f (Fix f)
unFix (Fix x) = x

\(ListF\)の評価射を\(sumAlg\)とすると、この射は次のようになる。

sumAlg :: Algebra (ListF Int) Int
sumAlg Nil = 0 
sumAlg (Cons e acc) = e + acc

さらに射\(m\)を\(cata \ alg\)としよう。ここで、\(alg\)は評価射である。次のようになる。

cata :: Functor f => Algebra f a -> Fix f -> a
cata alg = alg . fmap (cata alg) . unFix

ここまでのプログラムはまとめると次のようになる。

type Algebra f a = f a -> a

newtype Fix f = Fix ( f (Fix f))

unFix :: Fix f -> f (Fix f)
unFix (Fix x) = x

cata :: Functor f => Algebra f a -> Fix f -> a
cata alg = alg . fmap (cata alg) . unFix

data ListF a b = Nil | Cons a b

instance Functor (ListF a) where
  fmap f Nil = Nil
  fmap f (Cons e lst) = Cons e (f lst)

sumAlg :: Algebra (ListF Int) Int
sumAlg Nil = 0 
sumAlg (Cons e acc) = e + acc

それではプログラムの動きを見てみよう。
最初は何もない状態から始まるので、次のようになっている。これはF-代数の圏なので可換図式である。

f:id:bitterharvest:20190606083008p:plain
図10:加算の処理は\(N il\)から始まる

まず左下のところから説明しよう。ここは始対象が入る場所だ。\( N il \)がそのような役割を担うが、不動点であるので\( Fix \ N il \)となる。この値を求めたいのだが、下側の射\( (cata \ sumAlg) \)からは直接求めることができないので、上側の経路を経て値を得る。

すなわち\(unFix (Fix \ N il) \)を利用して、左上の\(N il\)を得る。次に\(fmap \ (cata \ sumAlg) \ N il = N il \)によって、右上の\(N il\)を得る。これを評価射\(sumAlg\)で値を得ると、右下の0となる。

それでは、これに\(e\)という値を加える場合を考えてみよう。下図のようになる。

f:id:bitterharvest:20190606083030p:plain
図11:加算の処理:\(Cons\)で新しい値を追加する

左下は\(Cons\)によってこれまでのものに\(e\)を追加するということになる。これまでのものは先ほどの\(Fix \ N il\)である。またここは不動点であるので、前のときと同じよう\(Fix\)をつけて\(Fix \ $ \ Cons \ e \ (Fix \ N il) \)となる。

これを\(unFix\)で持ち上げると、左上の\( Cons \ e \ (Fix \ N il) \)となる。これに\(fmap \ (cata \ sumAlg) \) を施すと、
\begin{eqnarray}
&& fmap \ (cata \ sumAlg) \ (Cons \ e \ (Fix \ N il)) \\
&=& Cons \ e \ ( (cata \ sumAlg) \ (Fix \ N il)) \\
&=& Cons \ e \ N il
\end{eqnarray}
より、右上は\( Cons \ e \ N il \)となる。これを評価射\(sumAlg\)で値を得ると、右下の\(e\)となる。

さらに、\(d\)を加える場合の可換図式は以下のようになる。

f:id:bitterharvest:20190606083050p:plain
図12:加算の処理:\(Cons\)でさらに新しい値を追加する

そして一般化した可換図式は次のようになる。

f:id:bitterharvest:20190606083152p:plain
図13:加算の処理:一般化する

例2 フィボナッチ数

次はフィボナッチ数を考えてみよう。これは、\(1,1\)で初めて、先行する二つの数の和を次の値とするものだ。すなわち\(1,1,2,3,5,8,13,21…\)である。

それではこれをCatamorphismを利用してプログラムを作成しよう。用意するデータ型は自然数と同じように、最初の値を決めるものと、その後の続きを決めるものとを用意する。

data NatF a = Zero | Succ a

これは自己関手なので\(Functor\)のインスタンスとする。

instance Functor NatF where
  fmap f Zero = Zero
  fmap f (Succ a) = Succ (f a)

評価射を\(fib\)とすると

fib :: Algebra NatF (Int, Int)
fib Zero = (1,1)
fib (Succ (m, n)) = (n, m + n)

プログラムを実行するために、不動点を次のように定める。

lstFib :: Fix NatF
lstFib = Fix $Succ (Fix $ Succ (Fix $ Succ ( Fix $ Succ (Fix Zero))))

実行してみよう。

f:id:bitterharvest:20190606083252p:plain
図14:F-代数の圏を利用してフィボナッチ数を定義し、それを実行する

4.5 Anamorphism

これまでに説明してきたCatamorphismに対して双対なのが、Anamorphismである。F-代数の矢印を全て反対にすると、次のようにF-余代数を得ることができる。

用語の定義

AnamorphismがCatamorphismに対して双対であることから、Catamorphismの中で用いた用語に対して、双対の用語を定義できる。それらをまとめると次のようになる。

F-余代数:\(F\)を圏\(\mathcal{C}\)上の自己関手\(F: \mathcal{C} \rightarrow \mathcal{C} \)とするとき、\(\mathcal{C}\)の対象\(A\)と射\(α:A \rightarrow F(A) \)の組\( (A,α) \)の組である。

F-余代数の準同型:F-余代数\( (A,α:A \rightarrow F(A) ) \)から別のF-余代数\( (B,β:B \rightarrow F(B) ) \)への準同型の射とは\(\mathcal{C}\)の射\(m:A \rightarrow B \)であって、これは\( F(m) \circ α = β \circ m \)を満たす。これよりある自己関手\(F\)に対して、F-余代数全体は圏をなす。そしてF-余代数の準同型射を一般にAnamorphismという。そして準同型を射として構成した圏をF-余代数の圏と呼ぶ

f:id:bitterharvest:20190606083316p:plain
図15:F-余代数の準同型

F-終余代数:自己関手\(F\)に対するF-余代数の圏が終対象を有するとき、その終対象をF-終余代数と呼ぶ。F-余代数の終対象は、不動点である(不動点には最大なものと最小なものがあり、厳密には、Catamorphismのときは最小不動点、Anamorphismのときは最大不動点である)。
下図で、左側はF-終余代数で右側はF-余代数である。
f:id:bitterharvest:20190605085017p:plain
図16:F-終余代数とF-余代数

用語の定義が住んだので、Haskellでプログラムを作ってみよう。最初に余代数\(Coalgebra\)を定義しよう。

type Coalgebra f a = a -> f a

次に準同型射\(m\)を定義する。ここではCatamorphismのときと同様に、評価射\(α\)を\(coa\)とし、\(m\)を\( a na \ coa \)としよう。

ana :: Functor f => Coalgebra f a -> a -> Fix f
ana coa = Fix . fmap (ana coa) . coa

Catamorphismのときは、\(ListF\)を用意したが、今度は\(StreamF\)を用意しよう。\(ListF\)は空のリストから始まったが、\(StreamF\)は無限な長さのストリームだ。次のように定義する。

data StreamF e a = Stream e a

\(Functor\)のインスタンスにしよう。

instance Functor (StreamF e) where
  fmap f (Stream e a) = Stream e (f a)

それでは素数を得ることを考えよう。エラストテネスは自然数のリストがあったとき、素数にたいしてその倍数を除くということを原理にしている。より詳細に説明すると、2で始まる整数のリスト\(lst\)を用意しておき、\(lst\)の先頭を素数としておりだし、先頭を除いたリストからその倍数を除いたリストを新たなリストとして、この操作を繰り返す。そして得られた素数の列はストリームの中に納める。

それではプログラミングしてみよう。ここでは上の図の右側のF-余代数の部分の評価射を考えることにしよう。\(A\)のところは整数のリスト\(p:ps\)で、先頭\(p\)は素数である。\(ps\)はそれを除いた残りのリストである。

これに対して評価射を施したのが\(F(A)\)である。ここではエラストテネスの古いを施すこととなるので、評価射を\(era\)となずけよう。データ型はストリーム\(StreamF\)となる。ストリームの最初の要素はもちろん素数の\(p\)だ。次の要素は倍数を除いたリストだ。倍数を取り除く処理を\(filter\)を用いて表すと次のようになる。

era ::  Coalgebra (StreamF Int) [Int]
era (p:ps) = Stream p (filter (\a -> mod a p /= 0) ps)

これより素数の列\(primes\)は

primes = ana era [2..]

しかしこれはストリームになっているので、表示することができない。ストリームをリストにするためには、Catamorphisumを用いる。これは次のようになる。

ary :: Algebra (StreamF Int) [Int]
ary (Stream e a) = e:a

最初の100個の素数を取り出してみよう。

f:id:bitterharvest:20190606085152p:plain
図17:F-余代数を用いて作成した素数のプログラムを実行する

武蔵国府・武蔵府中熊野古墳を訪ねる

昨日(5月17日)、武蔵国府があった地を訪れた。クスノキがうっそうと茂る大国魂神社と重なるように、国府跡は存在する。現在の地名は東京都府中市、最寄り駅は南武線府中本町駅、あるいは、京王線府中駅だ。

国府が設けられたころ、武蔵国で最も勢力のあった地域は、埼玉県行田市の埼玉古墳であった。しかもこの時期、武蔵野国東海道ではなく、東山道武蔵路に属していた。このため、ヤマト王権に近くて便利なのは埼玉のほうだ。それにもかかわらず、なぜ府中に国府が置かれたのかと感じていたので、現地を訪れて手がかりをつかみたいと思い出かけた。

文献からの手掛かりは以下の通りだ。この地域の状況を大きく変えたのは、国府が設定される1世紀半前の事件だろう。6世紀の中ごろ、関東と九州で、その地の豪族とヤマト王権の勢力関係を一変させる事件が起きた。九州での磐井の乱(527年)、関東での武蔵国造の乱(534年)だ。

武蔵国造の乱は、『日本書紀安閑天皇元年(534年)状に記載されている。笠原直使主(かさはらのあたいおぬし)と、同族の小杵(おぎ)との勢力争いだ。小杵が、上毛野君小熊(かみつけののきみおぐま)の助けを借りて、使主を殺害しようとしたが、この謀を知った使主が京に上り、ヤマト王権に助力を求めた。ヤマト王権は小杵を誅し、使主を武蔵国の国造(くにつくり)に定めた。使主は、これを受けて、横渟・橘花・多氷・倉樔の4か所を屯倉(みやけ)として献上した。

横渟は横見郡(埼玉県比企郡吉見町)、 橘花橘樹郡(川崎市幸区北加瀬から横浜市港北区日吉付近)、多氷は多磨郡(東京都あきる野市)、倉樔は久良郡(横浜市南東部)と比定され、橘花・多氷・倉樔は、府中を囲むような地域である。屯倉大和王権が直接経営する土地を意味し、献上されたこの地域は、ヤマト王権にとっては重要な地となり、府中に国府を設置する必然性が存在するようになったのだろう。

武蔵国府は、前記したように、南武線府中本町駅あるいは京王線府中駅が最寄り駅だ。下図で下部に府中本町駅、上部に府中駅、中央の下部に大国魂神社、その左右にふるさと府中歴史館、武蔵国府跡がある。さらに、府中本町駅のすぐ右には、府中御殿井戸跡発見場所がある。
f:id:bitterharvest:20190518130553p:plain

平成26年に府中市教育委員会から提案された国史武蔵国府保存管理計画書には、武蔵国府関連遺跡と周辺の遺跡が掲載されており、当時の状況が分かる。図下部の武蔵国衙跡が国府の中心で、前に述べたように、大国魂神社と重なっている。また、上部には少し遅れて設置されたであろう武蔵国分寺跡がある。これらの地域が東山道武蔵路で結ばれている。
f:id:bitterharvest:20190518130632p:plain
一つ前の地図に戻ってみると、国府跡は大国魂神社の東側にある。ここには国府の中枢の役所である国衙が置かれていた。赤い柱は、そのときの建物の柱の跡があった場所だ。
f:id:bitterharvest:20190518130422j:plain
f:id:bitterharvest:20190518130453j:plain
f:id:bitterharvest:20190518130347j:plain

また府中本町駅の東側に昨年の11月から「国司舘と家康御殿史跡広場」がオープンしている(家康御殿とあるのは、家康、秀忠、家光の三代がこの地を鷹狩の宿舎などとして用いたため)。国司舘は国司が居住する屋敷で、やはり柱の位置が示されている。帰宅してから存在に気がついたので残念ながら写真がない。府中観光協会がここの様子を説明しているので、そちらを見て欲しい。

大国魂神社の参道に沿った「ふるさと府中歴史館」には土器や瓦などの出土遺物が展示されている。
f:id:bitterharvest:20190518130312j:plain
f:id:bitterharvest:20190518130953j:plain

府中が武蔵国府の地として選ばれた理由が、先ほど説明したように屯倉の地にあったとすれば、屯倉の管理・運営を支えた地元の豪族が存在するはずだ。そのヒントとなるのが武蔵府中熊野神社古墳だ。

この遺跡は南武線の西府(にしふ)駅が最寄り駅だ。西府駅からほぼ真北に向かい、甲州街道を越えた地点が、熊野神社だ。それを奥に進んでいくと古墳にたどり着く。
f:id:bitterharvest:20190518130705p:plain

熊野神社と古墳への入り口だ。
f:id:bitterharvest:20190518125315j:plain

熊野神社を右手に、
f:id:bitterharvest:20190518125344j:plain

左手にしたときは
f:id:bitterharvest:20190518125414j:plain

全体を写すと、
f:id:bitterharvest:20190518125441j:plain

この古墳は、上部が円く、下部が方形の、珍しい形の上円下方墳だ。同型の古墳は、奈良市のカラト古墳、沼津市の清水柳北1号墳、福島県白河市の野路久保古墳が確認されているに過ぎない。しかもこれらの段築は2段だが、ここは3段だ。高さ4.8m(推定高5m以上)、上円部の直径16m、下方部は、一辺が、それぞれ上段では23m、下段では32mの正方形だ。それぞれの長さ比は、1:√2:2となっていて、均衡がとれていて面白い。

埋葬施設は複式構造の切石積横穴式石室である。石室に入ることもできる。
f:id:bitterharvest:20190518125509j:plain

この古墳ができたのは、飛鳥時代の7世紀中ごろである。武蔵国府は奈良時代の初めから平安時代の中頃(8世紀~11世紀)に設置されていたので、古墳は、武蔵国府が設置される直前に構築されたので、武蔵国府とのつながりが特に深いと推測されている。

なおこの古墳に先立って、6世紀から7世紀前半にかけては、西府駅南側の御嶽塚古墳群、その西側に高倉古墳群(地図の高倉塚古墳もその中の一つ)が存在しており、もう少し古い時代にも、小地域の有力者が住んでいたと考えられている。

最後になったが、もちろん大国魂神社も訪れた。社伝『府中六所社伝』などに記された伝承によれば、今から1900年前に創建されたとなっている。国府よりも古いとなるが、果たしてどうなのだろう。大国魂神社という名称は明治になってからのもので、それまでは六所宮と呼ばれていた。これは武蔵国の一之宮から六之宮までを合わせて祀るためである。境内には様々な建物が立っている。それらを見ていこう。

ますは隋神門、
f:id:bitterharvest:20190518125537j:plain

隋神の一方の神は櫛磐間戸命で
f:id:bitterharvest:20190518125606j:plain
他方の神は豊磐間戸命である。
f:id:bitterharvest:20190518125633j:plain

鼓楼、
f:id:bitterharvest:20190518125705j:plain

拝殿、
f:id:bitterharvest:20190518125735j:plain

本殿、
f:id:bitterharvest:20190518125806j:plain

徳川家所縁の東照宮も、
f:id:bitterharvest:20190518125910j:plain

参道、
f:id:bitterharvest:20190518130027j:plain

今回の目的は、国府がなぜ府中に設置されたかを探ることであった。武蔵国造の乱によってヤマト朝廷に献上された屯倉についての手掛かりは得られなかったものの、府中国府跡に向かっている電車のなかで、武蔵府中熊野神社古墳の存在を知り、訪ねることができたのは良い収穫だった。そのおかげで珍しい形の古墳を見ることができたし、隣接する展示館には丁寧な説明があり、新しい知識を得ることができた。

鞘尻金具(さやじりかなぐ)も新しく得た知識の一つだ。これは太刀の鞘の先に使われた金具で、七曜文(1個の小さな円を6個の小さな円が囲い込む)という飾りがついている。この文様は、富本銭のものと同じで、7世紀後葉の作品であることを示している。古墳が構築された時代を教えてくれる物証にもなっていて、ささやかなものが重要な情報を伝えてくれるという良い例だ。今後も国府跡の整備が進むことと思われるので、府中が国府に選ばれたことを示す新たな発見があることを期待して、散策を終えた。
f:id:bitterharvest:20190518130104j:plain

モノイドを攻略する

3. モノイドとコモノイド

今回はモノイド(monoid)と、そして、その双対であるコモノイド(comonoid)を説明しよう。モノイドという用語を使うと難解だと感じる読者も多いことだろうが、小学校以来学んできた足し算や掛け算などの多くの二項演算に関するものだ。モノイドという概念を、最初に理論的に学ぶのはおそらく群論だろう。

今回は、群論から入って、圏論の世界へと進み、Haskellで実現するという長い旅に出ることにしよう。

3.1 群論における半群とモノイド

群論のスタートとなるのは半群だ。殆どの二項演算がこれに属す。その定義は次のようになっている。
[半群の定義]
集合\(S\)とその上の二項演算子\(\bullet : S \times S \rightarrow S\)が与えられたとき、

1)組\((S,\bullet)\)が結合律、すなわち\(S\)の任意の\(a,b,c\)に対して\((a \bullet b) \bullet c = a \bullet (b \bullet c) \)が成り立つ

ならば、これを半群という。

引き算と割り算は結合律が成り立たないので半群とはならないが、足し算と掛け算は結合律が成り立つので半群となる。

半群の中で、単位元を有し、単位律が成り立つものをモノイドという。即ち、
[モノイドの定義]
集合\(S\)とその上の二項演算子\(\bullet : S \times S \rightarrow S\)が与えられたとき、

1)組\((S,\bullet)\)が結合律、すなわち\(S\)の任意の\(a,b,c\)に対して\((a \bullet b) \bullet c = a \bullet (b \bullet c) \)が成り立ち

2)\(S\)に単位元\(i\)が存在し、単位律、すなわち、\(S\)の任意の\(a\)に対して\(i \bullet a = a = a \bullet i \)が成り立つ

ならば、これをモノイドという。

足し算での単位元は\(0\)、掛け算でのそれは\(1\)である。

3.2 モノイドを圏として構成する

群論でのモノイドを、圏論での圏として、構成することを考えてみよう。圏の主要な構成要素は対象と射である。高校までの数学で学んできた「集合と関数」の考え方に素直に従った場合、集合を対象に、関数を射にするのが自然のように思われるだろう。すなわち集合\(S\)を対象に、二項演算子\(\bullet : S \times S \rightarrow S\)を射にしてはと思うだろう。

このようにすると、困った問題が生じる。圏を構成するためには、射と射を結びつける合成を必要とする。射が二項演算子\(\bullet : S \times S \rightarrow S\)だとすると、合成は何にしたらよいのだろう。私も圏論を学び始めたときは、ここでおおいに悩んだ。

参考書に描かれているモノイドの概念図を長いこと見つめた後で、発想の転換が必要なのだと思えるようになった。群論での二項演算子\(\bullet\)は、結合律を求めている。これは射ではなく合成としての性質だ。そこで二項演算子を合成にしてみよう。このようにすると、合成させられるものは射ということになる。すなわち集合\(S\)は射となる。

次の難関は射のドメインとコドメインだ。二項演算子を乗算と考えると、乗算が合成で、その被乗数と乗数が射ということになる。射は矢(arrow)と書かれることも多いが、矢はどこから来て、どこに行くのだろう。数学的な言葉で言うと、ドメインとコドメインをどのように定めたらよいのだろう。

矢は連続して何本も打たれることがある。数学的な言葉でいうと合成だ。これに似たような現象は、行ったきりの矢ではなく、手元に戻ってくるブーメランだ。そこで、ブーメランの手元をドメイン、コドメインとすることにしよう。手元はただ一つなので、これを★ということにしよう。そしてドメインとコドメインは対象となる。対象はこれだけということにしよう。図で表すと下図のようになる。

f:id:bitterharvest:20190301105316p:plain
図1:モノイドの概念図

このような考え方を元にして、モノイドを圏として構成しよう。

項目 構成要素
対象の集まり
射の集まり \( S =\{a,b,c,…\} : ★ \rightarrow ★ \)
ドメインとコドメイン
恒等射 \(i \in S \)
合成 \(\bullet\)
結合律 \( (f \bullet g) \bullet h = f \bullet (g \bullet h) \ where f,g,h \in S \)
単位律 \( i \bullet f = f = f \bullet i \ where f \in S\)

具体的な例を示そう。正整数の乗算は次のように構成することができる。

項目 構成要素
対象の集まり
射の集まり \( S =\{1,2,3,…\}: ★ \rightarrow ★ \)
ドメインとコドメイン
恒等射 \(1\)
合成 \(\times\)
結合律 \( (f \bullet g) \bullet h = f \bullet (g \bullet h) \ where f,g,h \in S \)
単位律 \( i \bullet f = f = f \bullet i \ where f \in S\)

圏は条件を満たすように構成要素を定義すればよいので、モノイドを圏として表す方法は、この外にも考えることができる。しかし数学者は簡潔で優雅な表現を求めるので、現在のところこれが最も的確な表現だと彼らは思っている。

3.3 Haskellでのモノイドの定義

それではHaskellで、モノイドがどのように実装されているかを見てみよう。Hasekllでは\(Semigroup\)というクラスを用意し、その下位クラスで\(Monoid\)を定義している。
\(Semigroup\)の定義は簡単で、二項演算子\( (< >) \)を定義している。

class Semigroup m where
  (<>) :: m -> m -> m

また結合律については、このクラスのインスタンスはこれを満足しなければならないという約束になっている。

そしてモノイドは次のように、単位元を\(mempty\)とし、二項演算子を\(mappend\)で置き換えている。

class Semigroup m => Monoid m where
  mempty :: m
  mappend :: m -> m -> m
  mappend = (<>)

但し次の条件を満たさないといけない。

x <> mempty = x
mempty <> x = x
(x <> y) <> z = x <> (y <> z)

このようにHaskellでの定義は、群論での定義を踏襲していることが分かる。そして圏論の圏としては定義されていないことも分かる。

3.4 モノイドの例

モノイドの例を上げよう。よく使うのはリストだろう。これは次のように定義できる。

instance Semigroup [a] where
  (<>) = (++)
instance Monoid [a] where
  mempty = []

なお、要求されている単位律や結合律が満たされていることは明らかである。

馴染みのあるところで、掛け算の例も挙げておこう。被乗数と乗数は\(Product\)というデータ型で定義されているとしよう。

newtype Product n = Product n
instance Num n => Semigroup (Product n) where
  Product x <> Product y = Product (x * y)
instance Num n => Monoid (Product n) where
  mempty = Product 1

同じように足し算は次のようになる。

newtype Sum n = Sum n
instance Num n => Semigroup (Sum n) where
  Sum x <> Sum y = Sum (x + y)
instance Num n => Monoid (Sum n) where
  mempty = Sum 0

もう少し、複雑な例を挙げてみよう。デカルト積だ、これは二つの対象の積だ。例えばトランプは種類\(S=\{♡,♠,♦.♣\}\)と数字\(T=\{1,2,,,,9,J,Q,K\}\)の対\(S \times T\)、例えば\((♠,9)\)、で表されるが、これはデカルト積の一例だ。Haskellでは次のように定義できる。

instance Semigroup () where
  _ <> _ = ()
instance Monoid () where
  mempty = ()
instance (Semigroup a, Semigroup b) => Semigroup (a, b) where
  (a, b) <> (a’,b’) = (a <> a’, b <> b’)
instance (Monoid a, Monoid b) => Monoid (a, b) where
  mempty = (mempty, mempty)

ここで、\(((),a)\)と\(a\)とが同型であることに注意しておく必要がある。圏論的に表現すれば、\(((),A) \cong A\)である。
少し利用してみよう。ここでは\(Monoid\)のクラスで用意されているものを利用した。

f:id:bitterharvest:20190301105528p:plain
図2:Haskellでの実行例

これまでにあげた例は二つの項の積だが、これらを最も抽象化したものがテンソル積である。

3.5 モノイド対象

この記事の最初の方で、群論での半群とモノイドを説明し、そしてそれを圏として次のように構成した。

項目 構成要素
対象の集まり
射の集まり \( S =\{a,b,c,…\} : ★ \rightarrow ★ \)
ドメインとコドメイン
恒等射 \(i \in S \)
合成 \(\bullet\)
結合律 \( (f \bullet g) \bullet h = f \bullet (g \bullet h) \ where f,g,h \in S \)
単位律 \( i \bullet f = f = f \bullet i \ where f \in S\)

それでは、これをもう少し抽象化することにしよう。抽象化の一つは関手を導入することだ。関手は圏から圏への関数なので、圏を対象とし、関手を射とすることができる。いま、圏\(\mathcal{C}\)から同じ圏\(\mathcal{C}\)への関手\(M\)を考えてみよう。また関手と関手の合成を\( \otimes \)とすると、次の左側の図が得られる。そして圏\(\mathcal{C}\)を★で表し、これを一か所にまとめると右の図が得られる。これは先に述べたモノイドと同じようには見えるはずだ。

f:id:bitterharvest:20190411092626p:plain
図3:一つの関手\(M\)を射としてモノイドを構成

これを圏として構成したのが次の表の右側だ。

項目 群論からのモノイド モノイド対象\(M\)
対象の集まり \(\mathcal{C}\)
射の集まり \( a,b,c,…\in S\) \( M : \mathcal{C} \rightarrow \mathcal{C}\)
ドメイン \(\mathcal{C}\)
ドメイン \(\mathcal{C}\)
恒等射 \( i \in S \) \(I : \mathcal{C} \rightarrow \mathcal{C}\)
合成 \(\bullet\) \( \otimes \)
単位律 \(i \bullet a = a = a \bullet i\) \(λ : I \otimes M \cong M \\ ρ : M \cong M \otimes I\)
結合律 \((a \bullet b) \bullet c =a \bullet (b \bullet c) \) \( α : (M \otimes M) \otimes M \cong M \otimes (M \otimes M)\)

すなわち圏\(\mathcal{C}\)を対象とし、関手\(M\)を射とし、そして自身への関手\(I\)を恒等射とし、関手と関手の合成\(\otimes\)をモノイドでの合成としたものだ。もちろん単位律
\begin{eqnarray}
λ : I \otimes M \cong M \\
ρ : M \cong M \otimes I
\end{eqnarray}
と結合律
\begin{eqnarray}
α : (M \otimes M) \otimes M \cong M \otimes (M \otimes M)
\end{eqnarray}
は満たさなければならない。なお上記で\( \cong \)は自然同型である。自然同型について簡単にふれておこう。ある空間\(A\)からある空間\( B\)への射\(f\)が逆写像を有するとき、射\(f\)を同型射あるいは単に同型という。空間を圏とし、写像を関手としたときに、関手にたいして同様なことが成り立つときに、自然同型という。

もう少し厳密に説明すると、圏\(\mathcal{C}\)から圏\(\mathcal{D}\)へ関手\(F,G\)が存在し、\(F\)から\(G\)への射\(η\)(これは自然変換と呼ばれる)が存在したとする。このとき、\(\mathcal{C}\)の任意の対象\(x\)に対して\(η_x\)が圏\(\mathcal{D}\)の同型射となっているとき、自然同型という。図で示すと下図のとおりである。

f:id:bitterharvest:20190413092231p:plain
図4:自然同型は成分ごとに同型射となることを言う


さて今導入したモノイドの構造では、モノイドが有する性質、すなわち二項演算子が見えにくい。そこで射\(M,I\)を対象にし、モノイドの構造が現れるようにしよう。二項演算子を一般化するとテンソル積となるが、ここではこれを表すために\(\otimes\)を用いよう。そしてテンソル積が圏の構成の中で表れるようにしよう。すなわち、テンソル積\(μ: M \otimes M \rightarrow M\)を射と考えることにしよう。

さらにもう一つはモノイドという対象を作り出してくれる射だ。これを\(η:I \rightarrow M\)としよう。ビッグバンに似たような性質を持つ。ビッグバンによって宇宙が生じたように、\(η\)は対象\(M\)を生み出す。

なお\(μ,η\)は関手から関手への射なので、自然変換である。

最後に単位律と結合律が成り立つようにしなければならないが、これは同じである。。

項目 モノイド対象\(M\) 抽象化(射を対象に)
対象の集まり \(\mathcal{C}\) \( M, I \)
射の集まり \( M : \mathcal{C} \rightarrow \mathcal{C}\) \( μ : M \otimes M \rightarrow M \\ η:I \rightarrow M \)
ドメイン \(\mathcal{C}\) \((M,M),I\)
ドメイン \(\mathcal{C}\) \(M\)
恒等射 \(I : \mathcal{C} \rightarrow \mathcal{C}\) \(I_M : M \rightarrow M \)
合成 \( \otimes \) \(\otimes\)
単位律 \(λ : I \otimes M \cong M \\ ρ : M \cong M \otimes I\) \(λ : I \otimes M \cong M \\ ρ : M \cong M \otimes I\)
結合律 \( α : (M \otimes M) \otimes M \\ \cong M \otimes (M \otimes M)\) \( α : (M \otimes M) \otimes M \\ \cong M \otimes (M \otimes M)\)

このようにしてできたのは、一般に、モノイド対象と呼ばれる。これまでの話をまとめて、モノイド対象を定義してみよう。

[モノイド対象の定義]

モノイド対象( \( M,μ,η\))とはモノイド圏(\( \mathcal{C}, \otimes, I, α, λ, ρ \))が与えられた時、\(\mathcal{C}\)の対象\(M\)および二つの射(\(μ : M \otimes M \rightarrow M, η: I \rightarrow M \))を有し、下記の単位子図式と五角形図式を満たすものである。

f:id:bitterharvest:20190301110152p:plain
図5:モノイド対象での単位子図式

f:id:bitterharvest:20190301110301p:plain
図6:モノイド対象での五角形図式

3.6 モノイド圏

モノイド圏は一つまたは複数のモノイド対象をその対象にしたもので次のように定義される。

[モノイド圏の定義]

モノイド圏(\( \mathcal{C}, \otimes, I, α, λ, ρ \))とは、圏 \(\mathcal{C} \)が次の条件を備えているときである。
1) テンソル積と呼ばれる双関手\(\otimes : \mathcal{C} \times \mathcal{C} \rightarrow \mathcal{C} \)
2) モノイド単位(あるいは単位対象)\(I\)
3) 結合律:\(α_{A,B,C}: (A \otimes B) \otimes C \cong A \otimes (B \otimes C)\) (ただし、\(α\)は自然同型)
4) 右単位律:\(λ_A : I \otimes A \cong A \), 左単位律:\(ρ_A : A \otimes I \cong A \) (ただし、\(λ, ρ\)は自然同型)
モノイド圏を概念図で表すと以下のようになる。

f:id:bitterharvest:20190301105947p:plain
図7:モノイド圏の概念図

モノイド圏とモノイド対象との関係を概念的に表すと下図になる(ここでのモノイド圏は一つのモノイド対象を持つものとする)。

f:id:bitterharvest:20190301110732p:plain
図8:モノイド圏とモノイド対象の関係

またモノイド圏の単位律と結合律に関する可換図を下図に示す。

f:id:bitterharvest:20190402082158p:plain
図9:モノイド圏での単位律を表す可換図
f:id:bitterharvest:20190402082303p:plain
図10:モノイド圏での結合律を表す可換図

3.7 コモノイド

モナイド圏とモナイド対象の矢印を逆にするとこれらと双対の関係にあるコモノイド圏とコモノイド対象を得ることができる。そこで、ここではコモナイド対象について少し詳しく説明しよう。

モノイド対象( \( M,μ,η\))は、モノイド圏(\( \mathcal{C}, \otimes, I, α, λ, ρ \))が与えられた時、\(\mathcal{C}\)の対象\(M\)および二つの射(\(μ : M \otimes M \rightarrow M, η: I \rightarrow M \))を有し、下記の単位子図式と五角形図式を満たすものであった。この定義の中で重要なのは、モノイド対象を定義している二つの射(\(μ : M \otimes M \rightarrow M, η: I \rightarrow M \))だ。

そこで、ここでは、これら二つについて考えてみることにしよう。矢印の方向を反対にすると、
\begin{eqnarray}
δ : M \rightarrow M \otimes M \\
ε: M \rightarrow I
\end{eqnarray}

となる。\(δ\)は、対象のコピーを取って対にしているだけなので、面白いことをしてはいない。このようなわけで、Haskellにはコモナドは実装されていないが、実現することは次のように可能である。

class Comonoid m where
  split :: m -> (m,m)
  destroy :: m -> ()

instance Comonoid a where
  split a = (a,a)
  destroy a = ()

モナドが自己関手の(小さい圏の)圏で記述されたモノイドと同じであったが、同様なことがコモナドとコモノイドについても言える。コモノイドは面白くもなんともないのに、これから生じるコモナドが前の記事で書いたようにとても実用的な性質を持っている。このギャップがコモノイドとモノイドの関係を魅力的にさせてくれる。

3.8 Haskellでの実装

モノイドとコモノイドの理解を深めるために、Haskellでどのように実現されているかを見ていくことにしよう。本格的ではないが、実験的なものが、ライブラリー"data-category"として用意されている。これをダウンロードしよう。解凍したフォルダーの直下にDataと呼ばれるフォルダーがある。ここが、このライブラリーを用いるときの先頭になるフォルダーだ。

それではこのライブラリーを使ってみよう。Dataの直下に、Category.hsと呼ばれるHaskellのソースプログラムがあるので、これをHaskellのプラットフォームであるWinGHCiにドラッグ&ドロップする。ソースプログラムがロードされ、このプログラムが実行できるようになる。

しかし我々が実行したいのは、フォルダーCategoryの直下にあるMonoidal.hsだ。Category.hsをロードした時点でのディレクトリーはCategoryになっているので、一つ上のディレクトリーDataに移したあと、Monoidal.hsをロードする。このときドラッグ&ドロップを用いず、キーボードより

:load "Data/Category/Monoidal.hs"

と打ち込む必要がある。さもないと、ロードに先立ってディレクトリーがData/Categoryに移動してしまう。

それでは、環境が整ったので、プログラムの中身を見ることにしよう。

f:id:bitterharvest:20190320090046p:plain
図11:Monoidalのパッケージを利用できるように関連するファイルをロードする

1)圏を定義する

ライブラリーを作成した作者は、ソースコードをアップロードしているだけで、その考え方を説明していない。このためプログラムを説明するときには、作者の意図を読み解いていくことが必要だ。もしかすると作者の意図とは異なるかもしれないが、ライブラリーのソースコードを読んでいくことにしよう。なお、このライブラリーは一から作り上げているので、とても基本的なところからスタートする。

ライブラリーは圏を定義するための\(Category\)と呼ばれるクラスを用意している。しかし理解しやすくするために、そのもとになっているだろうと思われる考え方を最初に説明しておこう。

集合と関数は馴染みのある言葉だ。集合\(A\)と\(B\)があり、\(A\)のそれぞれの要素に対して\(B\)のある要素を割当てる関数\(f\)があるというのが出発点になっている。さらに集合\(C\)があり、\(B\)から\(C\)へ写像する関数\(g\)がある。このとき、\(f\)と\(g\)を合成した関数は、\(A\)から\(C\)への写像となる。これを\(h\)で表すと、\(h (x) = g \circ f (x)\)となる。

このような集合と関数の概念を、圏論の世界で、なるだけ一般的に表そうとしたのが、アロー(arrow)と呼ばれる概念だ。そこではすべてをアローで表す。アローは\(k \ a \ b\)で表され、これは射\(k\)が\(a\)から\(b\)へと向かうと考えるとよい。

先の集合と関数で説明した関数\(f\)は\(k \ A \ B\)となり、集合\(A\)は恒等射\(k \ A \ B\)となる。また、関数の合成\(g \circ f\)は\(k \ B \ C \ . \ k \ A \ B\)となり、準同型写像となる。

上で説明した集合を任意のものについて論じている場合には、Haskellでは型変数を用い、その場合には小文字を用いる。例えば\(f\)は\(k \ a \ b\)のようになる。

これを図で表すと以下のようになる。これからも分かるように、集合と関数の空間からアローだけで構成された世界へと関手\(arr\)で写像して圏を構成している。

f:id:bitterharvest:20190418093254p:plain
図12:アロー\(k \ a \ b \)は\(a\)から\(b\)へと向かう射\(k\)であるが、関手\(arr\)によって集合と関数の世界からアローだけで構成された世界へと移動することができる。

それではライブラリーの説明に移ろう。そこではオリジナルが集合であったアローを明確にするため、\(Obj \ k\)というデータ型を用意している。

type Obj k a = k a a

そして、集合と関数の時の関数のソースとターゲットを明確にするために、それらのメソッドを用意して、次のように\(Category\)の定義をしている。

class Category k where 
  src :: k a b -> Obj k a 
  tgt :: k a b -> Obj k b 
  (.) :: k b c -> k a b -> k a c 

圏としての構造をまとめると次のようになる。これからも分かるように、極めて単純な構造であることが分かる。

\(k\)
対象の集まり
射の集まり \(k \ a \ b \)
ドメインとコドメイン
恒等射 \(id_a :: k \ a \ a \)
合成 (.)
結合律 \( (k \ c \ d . k \ b \ c) . k \ a \ b = k \ c \ d . ( k \ b \ c . k \ a \ b) \)
単位律 \(id_b . k \ a \ b = k \ a \ b = k \ a \ b . id_a \)

このクラスにはインスタンスが一つだけ用意されている。それは\(k\)を関数\( (->)\)としたものだ。関手\(arr\)で一度持ち上げておいて、元に戻すようで変な感じになるが、集合の部分が射で表されているので、元の集合と関数の世界とは違うことに注意しよう。

instance Category (->) where 
  src _ = \x -> x 
  tgt _ = \x -> x 
  g . f  = \x -> g (f x)  

圏の構造を示すと次のようになる。

\(->\)
対象の集まり
射の集まり \(f,g,h,… \)
ドメインとコドメイン
恒等射 \(id\)
合成 (.)
結合律 \( (f . g) . h = f . ( g . h) \)
単位律 \(id . f = f = f . id \)

実行例を示してみよう。但し、”Data.Category”には関数が実装されていないので、”Control.Arrow”のライブラリーをインポートして使った。以下の実行例で、\(x -> x \)は入力、\(y -> y \)は出力を意味し、集合での\(A\)と\(B\)に相当する。

f:id:bitterharvest:20190418094747p:plain
図13:アローを用いた世界での実行例

2)終対象を用意する

この記事では示さなかったが、モノイドは終対象を持つ。終対象に対するクラス\(HasTerminalObject\)は次のように定義されている。

class Category k => HasTerminalObject k where
  type TerminalObject k :: * 
  terminalObject :: Obj k (TerminalObject k) 
  terminate :: Obj k a -> k a (TerminalObject k) 

図で示すと次のようである。なお図では集合と関数の関係が、圏として構成された後にも反映ざれるように、元々は集合であった部分を薄緑色で表した。ライブラリーの作成者も\(Obj\)という言葉を用いたのはそのためだろう。しかし、圏の構成から見るとこれらは射であることに注意しておこう。

f:id:bitterharvest:20190418095043p:plain
図14:終対象を定義する。

インスタンス\(->\)は次のように定義されている。

instance HasTerminalObject (->) where 
  type TerminalObject (->) = () 
  terminalObject = \x -> x 
  terminate _ _ = () 

3)バイナリー積を用意する

次はいよいよ二項演算だ。もう一度、アローの話に移そう。アローを構成するものはすべてが射だ。そしてアローはつなぎ合わせることが可能だ。まるでシステムを構成する部品のようだ。しかも部品の種類が一種だけ、全てがアローというのも魅力的だ。部品のつなぎ方には、直列と並列がある。

直列接続は合成だ。並列接続は二項演算だ。二項演算子の左右にはそれぞれ左の項と右の項があるが、これらの項は別々に計算した後で、二項演算を施せばよい。このため左右の項を別々に計算するという方法は、それぞれを別々に計算するという考え方へと導いてくれる。

そこでアローを並列に接続する方法を考えてみよう。二つのものを並列にすることを考えさえすれば、多数のものを並列に接続する手段を得ることができる。そこで二つを並列にする方法を考えてみよう。これは様々であるが、ここではライブラリーに実装されている並列接続を示そう。下図のようだ。

f:id:bitterharvest:20190418100359p:plain
図15:二つのアローを並列に接続する。

\(proj1,proj2\)は、二つの値を取り、その一方をとるものである。\( (\& \& \&) \)は一つの値に対して、二つの射\(f,g\)からの出力を得るというものだ。\( (\ast \ast \ast) \)は別々の値に対して、それぞれの射\(f,g\)からの出力を得るというものだ。

ところで並列処理にするためには、上図に示したように、複数の入力、複数の関数、複数の出力が必要になる。ライブラリーでは、この複数に対応するのが、バイナリー積(\(BinaryProduct\))だ。クラスの定義の中で\( BinaryProduct (k :: * -> * -> *) x y :: *\)と定義されている。また、インスタンス\( (->)\)に対しては\( BinaryProduct (->) x y = (x, y) \)と定義されている。

ライブラリーではクラスは次のように定義されている。

class Category k => HasBinaryProducts k where 
  type BinaryProduct (k :: * -> * -> *) x y :: * 
  proj1 :: Obj k x -> Obj k y -> k (BinaryProduct k x y) x
  proj2 :: Obj k x -> Obj k y -> k (BinaryProduct k x y) y
  (&&&) :: k a x -> k a y -> k a (BinaryProduct k x y) 
  (***) :: k a x -> k b -> k (BinaryProduct k a b) (BinaryProduct k b1 b2) 
  l *** r = (l . proj1 (src l) (src r)) &&& (r . proj2 (src l) (src r)) 

そして\(->\)に対するインスタンスは次のようになっている。

instance HasBinaryProducts (->) where 
  type BinaryProduct (->) x y = (x, y) 
  proj1 _ _ = \(x, _) -> x 
  proj2 _ _ = \(_, y) -> y 
  f &&& g = \x -> (f x, g x) 
  f *** g = \(x, y) -> (f x, g y) 

4)圏同士のバイナリー積を用意する

モノイドを圏論として表すための準備がだいぶ整ってきた。モノイドを構成するのに必要とされる二つの圏の積を別の圏に関手で写像することを考えよう。

ここからの説明は下図を用いて行う。

f:id:bitterharvest:20190418101138p:plain
図16:圏論の中でモノイドを定義する。

図に示したように、二つの圏\(\mathcal{C}1, \mathcal{C}2\)があるとし、それぞれから任意のアロー\( c1 \ a1 \ b1, c2 \ a2 \ b2 \)を取り出したとしよう。この積を\(:**:\)で表すこととしよう。この二項演算子は、アローの接続のところで示したように、それぞれのアローを並列に処理すると考えることができる。

さらに、圏\(\mathcal{C}1, \mathcal{C}2\)は圏\(\mathcal{C}\)の対象であるとしよう。また、圏\(\mathcal{C}\)からは双関手によって圏\(\mathcal{C}3\)に写像されるとしよう。すなわちアローの積\( (c1 \ a1, \ b1) :**: (c2 \ a2, \ b2) \)は双関手\(ProductFunctor\)によって、圏\(\mathcal{C}3\)のあるアロー\( c1 \ c2 \ (a1, a2 \ (b1,b2) \)に写像されるとする。

勘のいい読者は、これはモノイド圏だと、思っただろう。実際、モノイド圏の説明の中で用いた\(A,B,C=A \otimes B\)は\( c1 \ a1, \ b1), (c2 \ a2, \ b2), c1 \ c2 \ (a1, a2 \ (b1,b2) \)に対応し、テンソル積\(\otimes\)は\(:**:\)に対応する。また、\(\mathcal{C}1, \mathcal{C}2, \mathcal{C}3\)が同じとき、\(A,B,C\)は\(M\)となりモノイド対象となる。ライブラリーはこの関係を用いて実装されている。

それではライブラリーでどのように定義されているかを見ていくこととしよう。

data (:**:) :: (* -> * -> *) -> (* -> * -> *) -> * -> * -> * where
  (:**:) :: c1 a1 b1 -> c2 a2 b2 -> (:**:) c1 c2 (a1, a2) (b1, b2)

\(Category\)のインスタンスとして次のように定義されている。

instance (Category c1, Category c2) => Category (c1 :**: c2) where
  src (a1 :**: a2)            = src a1 :**: src a2
  tgt (a1 :**: a2)            = tgt a1 :**: tgt a2
  (a1 :**: a2) . (b1 :**: b2) = (a1 . b1) :**: (a2 . b2)

また、終対象に対しては次のように定義されている。

instance (HasTerminalObject c1, HasTerminalObject c2) => HasTerminalObject (c1 :**: c2) where 
  type TerminalObject (c1 :**: c2) = (TerminalObject c1, TerminalObject c2) 
  terminalObject = terminalObject :**: terminalObject 
  terminate (a1 :**: a2) = terminate a1 :**: terminate a2  

さらに、この圏がバイナリー積に対しては次のように定義されている。

instance (HasBinaryProducts c1, HasBinaryProducts c2) => HasBinaryProducts (c1 :**: c2) where 
  type BinaryProduct (c1 :**: c2) (x1, x2) (y1, y2) = (BinaryProduct c1 x1 y1, BinaryProduct c2 x2 y2) 
  proj1 (x1 :**: x2) (y1 :**: y2) = proj1 x1 y1 :**: proj1 x2 y2 
  proj2 (x1 :**: x2) (y1 :**: y2) = proj2 x1 y1 :**: proj2 x2 y2 
  (f1 :**: f2) &&& (g1 :**: g2) = (f1 &&& g1) :**: (f2 &&& g2) 
  (f1 :**: f2) *** (g1 :**: g2) = (f1 *** g1) :**: (f2 *** g2) 

5)テンソル積を用意する

それではいよいよテンソル積を定義することにしよう。

class (Category (Dom ftag), Category (Cod ftag)) => Functor ftag where 
  type Dom ftag :: * -> * -> * 
  type Cod ftag :: * -> * -> *
  type ftag :% a :: *
  (%) :: ftag -> Dom ftag a b -> Cod ftag (ftag :% a) (ftag :% b)

テンソル積のインスタンスを作ろう。そのために、二項演算に体操する双関手\(ProductFunctor\)を用意しよう。

data ProductFunctor (k :: * -> * -> *) = ProductFunctor 

それではこれを双関手としよう。

instance HasBinaryProducts k => Functor (ProductFunctor k) where 
  type Dom (ProductFunctor k) = k :**: k 
  type Cod (ProductFunctor k) = k 
  type ProductFunctor k :% (a, b) = BinaryProduct k a b 
  ProductFunctor % (a1 :**: a2) = a1 *** a2 

テンソル積のクラスは次のように定義されている。

class (Functor f, Dom f ~ (Cod f :**: Cod f)) => TensorProduct f where 
  type Unit f :: * 
  unitObject :: f -> Obj (Cod f) (Unit f) 
  leftUnitor :: Cod f ~ k => f -> Obj k a -> k (f :% (Unit f, a)) a 
  leftUnitorInv :: Cod f ~ k => f -> Obj k a -> k a (f :% (Unit f, a)) 
  rightUnitor :: Cod f ~ k => f -> Obj k a -> k (f :% (a, Unit f)) a 
  rightUnitorInv :: Cod f ~ k => f -> Obj k a -> k a (f :% (a, Unit f)) 
  associator :: Cod f ~ k => f -> Obj k a -> Obj k b -> Obj k c -> k (f :% (f :% (a, b), c)) (f :% (a, f :% (b, c))) 
  associatorInv :: Cod f ~ k => f -> Obj k a -> Obj k b -> Obj k c -> k (f :% (a, f :% (b, c))) (f :% (f :% (a, b), c)) 

これを用いてテンソル積のインスタンスは次のように定義されている。

instance (HasTerminalObject k, HasBinaryProducts k) => TensorProduct (ProductFunctor k) where 
  type Unit (ProductFunctor k) = TerminalObject k 
  unitObject _ = terminalObject 
  leftUnitor _ a = proj2 terminalObject a 
  leftUnitorInv _ a = terminate a &&& a 
  rightUnitor _ a = proj1 a terminalObject 
  rightUnitorInv _ a = a &&& terminate a 
  associator _ a b c = (proj1 a b . proj1 (a *** b) c) &&& (proj2 a b *** c) 
  associatorInv _ a b c = (a *** proj1 b c) &&& (proj2 b c . proj2 a (b *** c)) 

実行例を示そう。単位律、結合律が成り立っていることが分かる。

f:id:bitterharvest:20190419104032p:plain
図17:テンソル積のプログラムを実行する。

そして上記のインスタンスは、\(TensorProduct\)を\(\otimes\)とし、\( unitObject \ ( ) \)を\(I\)とすると、モノイド圏の定義と合致していることが分かる。また、下図に示すようにモノイド対象となることも分かる。

f:id:bitterharvest:20190427094155p:plain
図18:モノイド対象であることを示した概念図。

相模国の古墳遺跡(秋葉山古墳群)を訪れる

数年前にとある講演会で、南関東は古墳の過疎地だ、という話を聴いたことがある。

確かに全長が100メートルを超えるような大規模な古墳はほとんど存在しないが、小規模な古墳はあちらこちらに点在している。多摩川沿いの東京側には荏原台古墳群と呼ばれるものがあり、ここには50基の古墳がある。その中でも最大の古墳である亀甲山古墳は、南関東では珍しく、全長107メートルを誇っている。

この対岸の川崎側にも、川に沿って、綱島古墳を始めとして、小さな古墳が点在している。さらにもう少し内部に入ると、稲荷山古墳群がある。もっと西に進み、国境(くにざかい)となっている境川を越えて、武蔵国から相模国へと入ると、この辺りは古代には高座(たかくら)郡と呼ばれていた地域だ。

この郡には国史跡となっている秋葉山古墳群がある。最寄り駅は小田急線の座間駅あるいは相鉄線かしわ台駅だが、目的地までは少し歩く必要がある。近くにはやはり国史跡に指定されている相模国分寺跡、国分尼寺跡があり、このあたりには有力な首長が居住していたことをうかがわせるが、集落跡はまだ発見されていない。このようなことをネットで調べていくうちに、秋葉山古墳群は3~4世紀にかけての相模湾周辺での最大規模の古墳群である、という情報を入手したので3月15日(金)に訪れてみた。

秋葉山古墳群は海老名市に位置しており、そこは神奈川県の地図上の中心ともいえる場所だ。その北には縄文時代の遺跡として有名な勝坂遺跡があり、南には先に挙げたように相模国分寺・国分尼寺跡がある。さらに南には、弥生時代の人々の地域移動の一端を伝えてくれる神崎遺跡がある。この遺跡はとてもユニークで、東海地方の人々が、おそらくは豊川周辺の人々と推定されているが、この地に移動してきたが、短期間のうちに放棄されたと見なされている場所だ。このように秋葉山古墳群のあたりは、相模川に沿って広がる台地を利用して、先史時代から人々が営みを続けてきた場所だ。
f:id:bitterharvest:20190318093711p:plain

秋葉山古墳群には車で行ったが、遺跡見学を楽しんだ一方で、ナビに欠点があることも認識させられた。

秋葉山古墳群は246号線の北側に位置している。東京の方から向かうと、246号線を右折することになるが、出口の上今泉では残念ながら右折することができない。このためいったん左折したあと、近くでUターンしてここに戻り、246号線を横断して目的地に向かうのがよいのだが、ナビはそうしてくれなかった。Uターンを潔しとしないので、別のところで横断しようとし、上今泉の交差点を左折したあとすぐに右折するようにと指示してきた。
f:id:bitterharvest:20190319093544p:plain

あとで判明するのだが、この指示に従うと大変だ。山中でもないのに、こんな細いところをと思うような道を登り始め、途中さらに狭くなって車一台がやっとになり、しばらく行くと246号線の上にかかっている細い橋に出くわした。この橋を渡るようにナビは指示しているが、欄干の先端を見ると、こすった跡があった。被害に遭う車が多いためだろうか、先端には被害を小さくするためのテープが巻いてあった。一回で曲がるには狭すぎ、バックしてハンドルを切り直し、やっと車を橋の方向に向けることができた。欄干の角にぶつけることなく、橋を渡った瞬間にはほっとした。

このあと目的地でも小さなトラブルがあった。目的地は秋葉山古墳群だ。しかし地図からも分かる通り、ナビは目的地の右側を到着地として指示している。秋葉山古墳群に行くためには、山の方へと向かっている左側の細い道を登って行かなければならない。246号線を曲がった後にはあのような狭い道を指示したのにも関わらす、秋葉山古墳群への入り口へと向かう道をナビは避けたようだ。少し周りをぐるぐる回ったあと、無事に秋葉山古墳群の駐車場にたどり着いた。
f:id:bitterharvest:20190318093805j:plain

入り口には古墳群の簡単な説明が掲示されていた。
f:id:bitterharvest:20190318093833j:plain

説明によると、秋葉山古墳群には5基の古墳があり、3~4世紀のものだ。3,4号墳が最も古く3世紀の弥生時代後期から古墳時代過渡期にかけてのもので、それぞれ前方後円墳前方後方墳だ。弥生時代には、一般的に前方後方墳から前方後円墳へと移行してゆくので、4号墳の方が古いのではとも考えられている。

4号墳は民家の近くにある。
f:id:bitterharvest:20190318093910j:plain
f:id:bitterharvest:20190318093946j:plain
3号墳はこの古墳群の中では立派だ。
f:id:bitterharvest:20190318094017j:plain
f:id:bitterharvest:20190318094046j:plain
これらの古墳に続いて、3世紀末から4世紀末に造営されたのが2号墳だ。3号墳と同じように前方後円墳だ。ここからは他にあまり見ることができない円筒形の土器が出土している。
f:id:bitterharvest:20190318094119j:plain
次が1号墳で4世紀に造営されたと考えられている。入り口から直ぐのところにある。
f:id:bitterharvest:20190318094219j:plain
f:id:bitterharvest:20190318094251j:plain
そして同じ時期に造営されたのが5号墳で、形も簡素な方墳だ。説明には4世紀前半と書かれているが、そうではなく4世紀中期のようだ。
f:id:bitterharvest:20190318094321j:plain

ここの古墳群はこぢんまりとまとまっているので、丁寧に観察してもそれほどかからない。古墳を探索しているときに、犬を連れて散策している人に何人かあったが、見学に来たのは私一人のようだった。古墳からは土器が出土しているが、これらは海老名市温故館に展示されているとのことだ。温故館には別の目的で訪問したことがあるが、次回訪問するときは、秋葉山古墳群から出土した土器に注目して見学したいと考えている。

日本100名城の八王子城跡を訪ねる

八王子に立派なお城の跡があるという話を、発掘調査と整備に関わった方から教えて頂いた。年初に大分県の岡城を訪問し、戦国時代の山城に興味を抱いていたので、是非訪問したいと思っていた。しかし春先で気候が不安定なため、なかなかその日が巡ってこなかったが、たまたま快晴になった3月5日(火)を逃してはいけないと判断し、午前中の用事を済ませ出かけた。

多くの遺跡は不便なところが多いが、ここも御多分に漏れずだ。バス利用ではとても大変そうなので、自家用車を利用した。圏央道を高尾山インターチェンジでおり、甲州街道を新宿方面に、そして高尾駅の前で左折、高尾街道を北に向かった。天気が良かったためだろう、京王線高尾山口駅とJR線の高尾駅の周辺には、火曜日にもかかわらず、多くのハイキング客が出ていた。人気の高い高尾山を目指しているものと思われた。

高尾街道は交通量も少なかったので、あたりの景色を楽しみながらの運転だ。側道にそって大きな街路樹が植えられ、さらに周囲は林に囲まれていて、自然に富んだ山中を思わせる風景だ。天皇陵に近いので整備されているのだろうなどと思いを巡らしているうちに、左折すべき城山大橋に至った。曲がってまっすぐ進み八王子霊園手前の城跡入り口でさらに左折した。インターチェンジを出てからずっと左折の連続で、ちょうどカタカナのコの字を下から書いたように移動してきた。コの字の上を描くかのように、最後の角を曲がった。景色も一変し、霊園が近いためだろう、石材屋さんが目立ち、過去の世界へと誘ってくれた。途中から、道は石畳となり狭くなったが、迷うことなく駐車場に到着した。土日はここまでバスが来ているようだ。
f:id:bitterharvest:20190307110521p:plain
車を降りると近くにガイダンス施設があったので立ち寄った。ベネチア製のレースガラス器の破片が城跡から見つかったという話を聞いていたが、復元したものが飾られていた。
f:id:bitterharvest:20190307110707j:plain

現地の状況を得るものが有ればと思って立ち寄ったのだが、ツアーマップは見つからず八王子城の概略を示した一枚のパンフレットを手に入れただけで、あまり有効な情報も得られないまま施設を出て、本丸方面という表示板を見て、取り敢えずそちらに向かって歩き出した。途中の広場には八王子城跡の地形の模型があった。下の方が城主の館があったところ、上の方が本丸などがある山城だ。我々は本丸を目指すこととした。
f:id:bitterharvest:20190307110631j:plain

ここが山城へ入る入り口だ。下山してくる人たちに出会ったが、どの人も登山靴を履き、杖をもち、リュックを背負ったいた。我々は、セーターの上に冬物のコートそしてジーパンといういでたちなので、間違ったところに来てしまったかなと不安を感じた。右側の看板にも滑落事故が多いので十分な装備で登山をするようにという注意書きがあった。本丸がある地点の標高は460メートル、歩いて40分くらいだ。気後れしたが、運動靴を履いてきたので、それなりの準備ができているので大丈夫だろうと気を強く持って、山城への道を登り始めた。
f:id:bitterharvest:20190307110739j:plain

少し歩きはじめると、道はすぐに山道となった。予想に反してなだらかなハイキングコースではないようだ。
f:id:bitterharvest:20190307110819j:plain
相当に登ったと思ったとき、4合目という標識に出くわし、ちょっとがっかりしたが、天気にも恵まれ、空気も澄んでいるので、気持ちを切り替えてさらに進んだ。
f:id:bitterharvest:20190307110854j:plain
しばらく進むと梅林が見えてきた。山道でののどかな景色は心を和ませてくれる。
f:id:bitterharvest:20190307110935j:plain
山頂に近くなったのだろう。展望が開けてきた。眺望を楽しみながら休憩をしている人に、方向を教えてもらった。中央に見える高い建物が八王子駅周辺、左側に見える白い円形の建物が西武ドームとのことだった。また筑波山東京スカイツリーが見えることもあるそうだ。
f:id:bitterharvest:20190307111011j:plain
そうこうするうちに八王子神社に着いた。
f:id:bitterharvest:20190307111049j:plain
この地点より20メートル程度高いところが本丸跡だ。
f:id:bitterharvest:20190307111126j:plain
f:id:bitterharvest:20190307111154j:plain
また本丸を散り囲んでいるのが松本曲輪・小宮曲輪だ。きっと凄惨な戦いの場になった場所だろう。
f:id:bitterharvest:20190307111228j:plain
毎日のようにここを訪れているという方から付近の情報を得た。1.2Km先には富士見台があり、富士山が見えることもあるということだった。また、登ってきた道の麓には御主殿跡があるので見学するとよいとのことだった。富士見台はまたの機会に譲ることにし、訪ねたいと思っていた御主殿跡へ向かうことにした。

滑りやすい山道に足を取られそうになりながら、来た道を引き返した。

御主殿跡に近づくと訪問客が目立つようになってきたが、彼らは我々と同じ服装だ。自然と彼らの中に溶け込んで、遺跡を楽しむことができた。最初に現れたのが曳橋だ。竪に立て籠もるときにはこの橋を落とそうとしたのだろう。
f:id:bitterharvest:20190307111320j:plain
f:id:bitterharvest:20190307111352j:plain

曳橋を渡ると櫓(やぐら)門跡だ。発掘調査をした方に是非見て欲しいと勧められた場所だ。石垣がきれいだ。殆どの石は当時のものだそうだ。
f:id:bitterharvest:20190307111421j:plain
f:id:bitterharvest:20190307111450j:plain
f:id:bitterharvest:20190307111520j:plain
石段の先は広場になっていた。
f:id:bitterharvest:20190307111558j:plain
礎石があちらこちらにあり、それぞれがどのような建物のものであったかが示されていた。政務が執り行われた主殿の礎石だ。
f:id:bitterharvest:20190307111631j:plain
来客者の饗応を行う会所は、礎石の上に床面が造られ、間取りが分かるようになっていた。
f:id:bitterharvest:20190307111656j:plain

最後になったが、八王子城の沿革を記しておこう。築城は戦国時代。築城したのは北条氏照だ。この当時の北条家の領地は関八州に及ぶ広大なもので、領主は兄の氏政であった。北条家の本拠地はもちろん小田原だが、広大な領地を支配するために、関東一円に出城を構築し、小田原に近い城は兄弟に守らせていた。八王子城は北関東から攻め組んでくる敵を防ぐための重要な拠点で、ウィキペディアには1571年ごろに築城、1581年ごろに氏照が本拠にしたと書かれているが、発掘調査に携わった方は、1582年(天正10年)と思われる史料に「普請」という文字があり、1587年(天正15年)と推定される史料には氏照は小田原におり、狩野一庵が「八王子ニ令留守居候間」とあると書かれていると教えてくれた。また氏照は八王子城が築城される前は滝山城の城主で、1587年ころには居城を八王子城に移したものと推察されているとのことだった。

八王子城は石垣で固められた山城で、城を象徴する天守閣は存在しない。急峻な山を切り拓いき、山全体を守りを主体にした構造物にしている。豊臣秀吉は天下統一を目指して小田原征伐を行うが、その一環として八王子城の攻撃を行う。攻撃したのは、上杉景勝前田利家真田昌幸だ。総勢15,000人の部隊に攻め込まれ、一日で勝敗は決してしまう。1590年(天正18年)7月24日(旧暦6月23日)のことだ。城主の氏照以下家臣は小田原に駆けつけており、城代以下のわずかな将兵と領国内の農民と婦女子で戦った。このときの守備側の総勢は3,000人だが、ひとたまりもなかったようだ。御主殿の近くにある滝の上流で北条方の武将や婦女子は自刃し、身を投じたとのことだ。

御主殿跡や櫓門跡などの詳しい説明はボランティアの方がしてくれるということなので、いつか再び訪れて、今回見逃した御主殿の滝なども含めて、とっておきの話を伺いたいと思っている。

鎌倉歴史文化交流館と扇ガ谷の寺々を訪ねる

「鎌倉Disaster 災害と復興」という企画展の招待券を頂いたので、その会場である鎌倉歴史文化交流館と近辺の寺々を2月16日(土)に訪ねた。

所在地は鎌倉の扇ガ谷(おうぎがやつ)だ。扇ガ谷という地名からは室町時代扇谷上杉家を思い出す。そこの家宰の太田道灌は、江戸城を築いたことで有名だ。

鎌倉歴史文化交流館の建物は、イギリスの著名な建築家ノーマン・フォスターさんが設計したもので、これだけでも見る価値がある。

交流館は無量寺跡と呼ばれているところにあり、2002年の発掘調査で建物の礎石や庭園の跡が発掘され、本当に無量寺の跡ではと期待が高まったが、残念ながら確定されるにはまだ至っていない。鎌倉時代の歴史を記載した『吾妻鏡』には、安達義景(霜月騒動で有名な泰盛の父)の13回忌に触れて、「無量寺は安達氏の菩提寺で甘縄にあった」となっている。しかし、甘縄という場所は長谷や由比ガ浜に近く、扇ガ谷からは随分と離れている。このため無量寺跡と確定するには、さらなる調査が必要とされている。

鎌倉時代に栄華を誇った鎌倉は、室町時代の1455年に鎌倉公方から古河公方へと移転したあとは、すっかりさびれてしまい、江戸時代には一漁村に過ぎなかったそうだ。しかし江戸時代の末頃ともなると、物見遊山の客が増えだして少しずつ活気を取り戻し、さらに明治時代になると、別荘地として利用されるようになったそうだ。大正時代には、この無量寺跡にも三菱財閥の岩崎小弥太の別荘が、また隣には番頭だった荘清次郎の別荘が建てられた。

岩崎弥太郎の別荘跡地には2004年にセンチュリー文化財団(旺文社創業者の赤尾好夫によって設立)によって、ノーマン・フォスターさん設計の個人住宅が建築され、2013年に土地と建物が鎌倉市に寄贈された。2017年5月より、鎌倉歴史文化交流館として利用されている。

扇ガ谷は鎌倉駅からは北西の方向で、横須賀線の西側だ。この日に訪れたのは、鎌倉歴史文化交流館、寿福寺、英勝寺だ。寿福寺には源実朝北条政子の墓もある。
f:id:bitterharvest:20190218143909p:plain

鎌倉歴史文化交流館は二つの建物からなっている。向かって左側にあるのが別館、
f:id:bitterharvest:20190218143953j:plain
右側が本館だ。壁は輸入品の人工大理石、ところどころに青みがかった灰色の塊があるがこの部分は本当の大理石だ。
f:id:bitterharvest:20190218144024j:plain
f:id:bitterharvest:20190218144057j:plain
門を入ってすぐのところでは、春の訪れが近いことを梅花が教えてくれた。
f:id:bitterharvest:20190218144136j:plain
本館には、通史展示室、中世展示室、近世・近現代展示室がある。通史展示室には、鎌倉時代の法令である御成敗式目のレプリカと
f:id:bitterharvest:20190218144207j:plain
鎌倉時代の歴史を綴った『吾妻鏡』が並べて展示されていた。吾妻鏡には漢文訓読のためのルビや返り点がつけられていることに興味を持った。
f:id:bitterharvest:20190218144237j:plain
縄文・弥生時代の展示品もあった。
f:id:bitterharvest:20190218144310j:plain
中世展示室はこの館のメインだ。源頼朝は鎌倉に鶴岡八幡宮勝長寿院永福寺(ようふくじ)と3つの寺院を建立した。その中で、永福寺は奥州平泉の中尊寺を模した寺院と考えられており、その遺跡から発掘された遺物が展示されていた。経典を納めるための銅製経筒(きょうづつ)
f:id:bitterharvest:20190218144348j:plain
復元された瓦屋根などが展示されていた。
f:id:bitterharvest:20190218144423j:plain
また、永福寺を復元した絵画も。さぞかし荘厳な寺院だったのだろうと想像させてくれた。
f:id:bitterharvest:20190218144451j:plain
また狭い土地に幕府がつくられた鎌倉では、山の岩肌を掘ってやぐらと呼ばれる穴を造り、そこを墓所とし、やぐらの入り口近くには板碑や五輪塔が立てられた。
f:id:bitterharvest:20190218144525j:plain
また南宋との貿易も盛んにおこなわれ、多量の宋銭が持ち込まれた。国内の貨幣として使われたばかりではなく、同製品の材料としても使われた。鎌倉の大仏にも使われたようである。

今日の貨幣はもちろん日本政府が発行したものを利用しているが、当時は隣の国の銭貨を利用していた。これは宋が滅んで元になったあとも続いた。元が紙幣を用いたために、不要になった宋銭がさらに大量に入ってきたようだ。

為政者が製造したものではなく、世間の信用だけで中国の宋銭が国内の貨幣と流通したことに、貨幣とは何かという秘密が隠されているようだ。ビットコインなどもこれと同じ原理で流通していると考えることができるだろう。

さらにはこのころの為政者はまだ世間の信用に足るだけの力がなかったともいえる。富本銭・和同開珎など古代には銭貨は存在したが、本格的には使われなかったようで、為政者が発行した貨幣が本当に使われるようになるまでには、江戸時代の到来を待たなければならない。
f:id:bitterharvest:20190218144557j:plain
わき道にそれてしまったので、鎌倉歴史文化交流館の中世室の展示場に戻ろう。ここからは庭の様子も見ることができた。山が傍まで迫り、削られた山肌を見せてくれた。鎌倉の特徴ともなっている石の肌だ。鎌倉石とも呼ばれる砂岩で、加工しやすいことから建材として長いこと利用された。今日では鎌倉の景観を保つために掘削することを禁じられている。
f:id:bitterharvest:20190218144633j:plain
f:id:bitterharvest:20190218144709j:plain
近世・近現代展示室には、第二次世界大戦のときに多数のユダヤ人にビザを発給して助けた杉原千畝さんに関する資料も置かれていた。

この後、別館で学芸員の方から、鎌倉時代地震と火事、関東大震災による建物の倒壊についての説明を受けた。鎌倉時代は災害がとても多かったようで、この時代の建物はほとんど残っていないとのことであった。また関東大震災ではかやぶき屋根の建物は殆ど倒壊してしまったそうだ。大震災の3日ぐらい前に来た台風が大量の雨を降らせたため、かやぶき屋根が大量の水分を含んでいたことも一因のようだが、当時のかやぶき屋根の建物は脆かったようだ。

鎌倉歴史文化交流館の隣には、三菱財閥の番頭であった荘さんの別荘があった。古我邸と呼ばれているが、鎌倉三大洋館の一つで、現在はフレンチレストランとして利用されている。この日は結婚式が行われていて、中に入ることはできなかった。
f:id:bitterharvest:20190218144737j:plain
このあと、源実朝北条政子の墓を訪れるために寿福寺へと向かう。道の途中には山を切り抜いたトンネルがあった。
f:id:bitterharvest:20190218144808j:plain
寿福寺の墓地の山沿いには北条政子の墓が
f:id:bitterharvest:20190218144845j:plain
そばには実朝の墓が
f:id:bitterharvest:20190218144921j:plain
いずれもやぐらの中にあり、五輪塔が置かれていた。周りにもたくさんのやぐらがあった。
f:id:bitterharvest:20190218144953j:plain
そして寿福寺だ。このお寺は、源頼朝が没した翌年(1200年)に北条政子が明菴栄西(みょうあんえいさい)を開山に招いて建立したものだ。本堂は
f:id:bitterharvest:20190218145032j:plain
本堂の方から山門を見ると、
f:id:bitterharvest:20190218145104j:plain
そして山門
f:id:bitterharvest:20190218145215j:plain
次は鎌倉唯一の尼寺の英勝寺へ向かった。ここは江戸城築城前の太田道灌の邸があったところと伝えられている。太田道灌と英勝寺には深いつながりがあるが、由来は次の通り。

江戸時代、太田道灌から数えて4代目の太田康資(やすすけ)の息女とされるお勝が、徳川家康の側女となった。家康との間に生まれた市姫が幼くして亡くなったあと、お勝は家康の命により初代の水戸藩主となる徳川頼房の養母となる。家康の死後、仏門に入って英勝院と称し、三代将軍家光より父祖の地の扇ガ谷を下賜され、英勝寺を創建した。道路沿いには大正10年に建てられた由来を示す碑があった。
f:id:bitterharvest:20190218145250j:plain
英勝寺の仏殿だ。
f:id:bitterharvest:20190218145320j:plain
山門と仏殿
f:id:bitterharvest:20190218145355j:plain
本堂には運慶の作と伝えられている阿弥陀三尊が安置されていた。
f:id:bitterharvest:20190218145426j:plain
最後に涅槃図。
f:id:bitterharvest:20190218145501j:plain

扇ガ谷は、源氏山公園から銭洗弁天へ抜けようとするハイキング客を除けば、観光客がはまり入ってこない静かなところだ。鎌倉歴史文化交流館も民家の中に立地していることに配慮して日曜日は休館にしている。訪れた日は土曜日の午前中だったが、ときどき人と行きかう程度で静かな鎌倉を楽しむことができた。

新しく得た情報もあった。鎌倉の災害について説明してくれた学芸員の方から、明応地震(1495年)による津波で、鎌倉大仏を囲っていた建物、いわゆる大仏殿が流されたという言い伝えがあるが、それは誤りだと教えて頂いた。

南北朝時代に書かれた『鎌倉大日記』によれば、「明応四乙卯八月十五日(1495年9月3日)、大地震、洪水、鎌倉由比浜海水到千度檀、水勢大仏殿破堂舎屋、溺死人二百余」」となっている。これからは津波が大仏殿に達して被害を与えたと読むことができる。また江戸時代の文献の『続本朝通鑑』など複数の文献には「大仏殿破壊」と記されている。江戸時代の資料から、この時代には大仏殿が流されたという俗説がはびこっていたと推定される。

しかし万里集九が書いた『梅花無尽蔵』によれば、大仏殿はそもそも存在しなかったとのことである。万里集九は、明応地震の9年前の文明18年10月24日(1486年11月20日)に、大仏を訪れて、「遂見長谷観音之古道場、相去数百歩、而両山之間、逢銅大仏仏長七八丈、腹中空洞、応容数百人背後有穴、脱鞋入腹、僉云、此中往々博奕者白昼呼五白之処也。無堂宇而露坐突兀」と記してある。すなわち二つの山の間から銅でできている大仏に逢ったとなっているので、歴史のプロの間では、大仏殿が流されたというのは間違いだと考えられていると教えて頂いた。

これらの説明をまとめると、大仏堂は1283年に浄光の勧進によって建立が始まり、1243年には開眼供養が行われた(吾妻鑑)。また、その1年前には大仏殿も2/3ほど完成していたようだが、大仏は銅製ではなく木製だったようだ(東関紀行)。そして現存する大仏は1252年から造られたものとされている。大仏殿は1235年(太平記)と1369年(鎌倉大日記)に台風の大風で倒壊した。大仏の右肩には凹みがあるそうで、倒壊のときに生じたものと考えられている。これ以降は大仏殿は再建されることはなかったと見なされている。

そして後年になって明応地震の恐ろしさを強調するために、大仏殿が津波により倒壊されたという俗説が生まれたようだ。善意に考えれば、大きな被害に襲われる可能性もないわけではないので、十分に備えておく必要があるということを俗説は伝えたかったのであろう。

なお、関東大震災では大仏は前に45㎝動き、次の日の余震では30㎝後ろに移動したそうだ。鎌倉の建造物が多く倒れる中で、壊れなかったのは堅牢に造られていたためだろうと学芸員の方から伺った。

駅前に戻ると、そこは人で埋め尽くされていたので、昼食をとることをやめて、早々と帰路についた。寒い日が続いたあとの穏やかな日で、短い時間だったが、新しい情報も得ることができ、満足して横須賀線の車中に身をおいた。

冬の「よこはま動物園ズーラシア」を見学する

冬の動物園を訪れてみたいと思う人はそれほど多くないだろう。木枯らしが吹く中を、何時間も歩いて回るのはモノ好きの部類に属すだろう。動物たちも、暑い地域出身が多いだろうから、屋外で観客を迎えるよりも、室内で暖を取りながら休んでいる方が快適に違いない。我々も、木曜日(2月7日)が4月並みの暖かさになるという天気予報が出るまでは、動物園を訪れてみようなどとは考えもしなかった。思いがけず、外出日和の日が訪れるというニュースをきいて、近くにありながら訪れる機会のなかった「よこはま動物園ズーラシア」に行くことにした。

ズーラシアは都市型の動物園としては大きい方だ。上野動物園が14ha、多摩動物公園が60ha、東武動物公園が61ha、野毛山動物園が3.3haだ。そしてズーラシアは50haだ。ここは7つのゾーンに分けてあり、地域・気候帯別に生育環境を再現しているとのことだった。

訪れた日は17度まで気温が上がることが予想されていたので、我々と同じように動物園に行こうと考えた人もいたのだろう、思いのほか幼児連れの家族が多かった。幼稚園に入園する前の幼児と、その母親、さらにおじいさん・おばあさんというグループが圧倒的な比率だった。そして、わずかな比率で大学生のカップルが混じっていた。大学入試のために早々と春休みに入った私立大学の学生だろう。一組のカップルは、我々と行動パターンが似ていたのだろう。最初から最後まで我々の前後を見学していた。そして我々と同じ定年後の老夫婦がわずかに見かけられた。

正面の入り口から入場すると、最初のゾーンは「アジアの熱帯林」だ。最初にお出まししてくれたのは動物園の象徴ともいうべき象だ。ズーラシアはゆったりと造られているので、動物たちの動きが自然だ。ここの象はインド象だ。インド北東部や南部の草原に住んでいて、長老のメスを中心に母系家族群をつくり、オスは単独か数頭で行動するそうだ。
f:id:bitterharvest:20190212093519j:plain
象の次はフランソワルトンだ。ベトナム北東部や中国南部の鉱山の森林に生息するオナガザルの仲間だ。群れは1頭のオスと複数のメスとその子供からなり、メスが優勢な母系家族だ。
f:id:bitterharvest:20190212093556j:plain
ライオンと言うとアフリカと思われがちだが、ズーラシアにはインドライオンがいた。
f:id:bitterharvest:20190212093632j:plain
「アジアの熱帯林」にお別れをして、これからは「亜寒帯の森」のゾーンだ。最初はカモシカの仲間のゴールデンターキンだ。中国の中央山岳地帯に生息し、群れは家族群で1頭のオスが複数のメスを率いている。
f:id:bitterharvest:20190212093715j:plain
レッサーパンダアムールヒョウをみて、ユーラシアカワウソへと歩を進めた。水中での動きが速すぎて、写真に収めるのが難しかった。
f:id:bitterharvest:20190212093753j:plain
フンボルトペンギンもひょうきんに我々を出迎えてくれた。ペルーからチリの沿岸部で生息する彼らにとってこの日は暑すぎたのではと感じられた。
f:id:bitterharvest:20190212093832j:plain
f:id:bitterharvest:20190212093910j:plain
ミナミアフリカオットセイも水の中を楽しんでいた。
f:id:bitterharvest:20190212093945j:plain
ホッキョクグマだ。
f:id:bitterharvest:20190212094018j:plain
さらに進んで、「オセアニアの草原」だ。ニューギニア島の中央から東部に生息するセスジキノボリカンガルーだ。珍しいことに樹の上で生活している。
f:id:bitterharvest:20190212094058j:plain
さらに進むと「中央アジアの高地」だ。テングザル、チベットモンキーを見て、ドールだ。ここではタイミングよく職員の方が説明してくれた。かつては30頭もいたが、繁殖が難しかったため、今では3頭になっているそうだ。動物園を維持することの難しさを教えてもらった。
f:id:bitterharvest:20190212094142j:plain
隣にはモウコノロバ。馬科の中では一番小型だそうだが、力が強く記憶力もよいことから古くから家畜として使用されていたそうだ。体高は117~142cm、体重は260kgだそうだ。
f:id:bitterharvest:20190212100300j:plain
ここで「中央アジアの高地」にお別れをして、次は「日本の山里」だ。最初はコウノトリ。江戸時代までは何処にでもいて普通に見られたそうだが、戦後絶滅し、そのあと人工繁殖によって増加し、最近では200羽を超えているそうだ。
f:id:bitterharvest:20190212100335j:plain
コウノトリはタンチョウと間違われることが多かったそうであるが、その横には、やはり紛らわしいクロズル・マナヅルが生活していた。

ツシマヤマネコは夢を見ていた。
f:id:bitterharvest:20190212100404j:plain
アナグマ、タヌキ、キツネ、ニホンザルをみたあと(ツキノワグマは本日は休養日とのこと、見ることはかなわなかった)、「アマゾンの密林」に入る。ここでの目玉はカピバラだろう。但し、日本の冬は彼らには向かないのだろう。暖を取って静かに寝ていた。
f:id:bitterharvest:20190212100451j:plain
イヌやサルなど数種類の動物を見た後、「アフリカの熱帯雨林」へと向かう。ここの見どころはキリン科のオカピだ。残念ながらいいポーズをしてくれなかった。
f:id:bitterharvest:20190212100533j:plain
こちらは、アカカワイノシシだ。
f:id:bitterharvest:20190212100651j:plain
類人猿のチンパンジーだ。人類に最も近い種だ。
f:id:bitterharvest:20190212100721j:plain
そして、最後のゾーンである「アフリカのサバンナ」へと向かった。疲れも出てきたし、お腹もすいてきたので、まずはレストランに入って一休みした。隣の席を見ると、老夫婦が孫と一緒にいた。しかし何となく孫との接し方がしっくりといってないように感じられた。そうこうするうちに、お母さんと思われる人がトイレから戻ってきた。化粧の仕方がユニークだなと感じた。老夫婦とは笑顔を交わすことはあるが、言葉を交わさない。赤ちゃんには話しかけているのだが、その言葉は老夫婦には伝わっていないようだ。国際化が進んだこの頃では、このようなことは日常的に見る光景だが、身近で実感することはそれほどで多くはない。帰り道では、タイからと思われるグループにすれ違った。冬の動物園も外国人の観光コースの一つになったのかと強く印象づけられた瞬間でもあった。
食事をとった後、「アフリカのサバンナ」のゾーンを見学した。サイ、ミーアキャット、ライオン、キリンなど見慣れた動物たちに会った。
f:id:bitterharvest:20190212102654j:plain
f:id:bitterharvest:20190212102734j:plain
f:id:bitterharvest:20190212102805j:plain
f:id:bitterharvest:20190212102840j:plain

そして14時半に退園した。10時近くに入園したので、休憩を含めて4時間半の見学であった。待ち時間もなく、十分に時間をかけてゆっくりと見ることができ、大いに楽しんだ一日であった。オフシーズンの小春日和の日には、このような場所を訪問するのがよいと改めて納得し、ズーラシアを後にした。

コモナドを攻略する

2.コモナド

今回の記事はコモナド(余モンドとも言われる)だ。モナドはあちらこちらで出会うことが多いが、コモナドについての説明はそれほど多くない。今回の記事でも示すが、実はコモナドの概念はとても面白く、現実の世界の中でこれはコモナドではと思うことが多々ある。同窓会などで、久しぶりにかつてのクラスメイトに会って、昔話に話を咲かせているときに、思い出が違っていることにビックリすることが往々にしてある。事実は変わらないはずなのだが、年月がたつにつれてそれぞれの記憶が変容し、異なってしまったのだろう。これなどコモナドのよい例だと思うのだが、正しいかどうかは記事を読んでから確認して欲しい。

2.1 コモナドの定義

モナドモナドは双対概念だ。コモナドは、モナドを定義したときの射の矢印の方向を反対にするだけなのだが、その概念から受け取る感覚は、随分と異なるものになる。圏論でのモナドは哲学からの借用語だが、元々の意味は、単純な実体(elementary particle)であった。そしてそれを表現したものを、表象(representation)と呼んでいた。

これを利用して、圏論での基本的な概念は次のようになっている。
1)単純な実体\(A\)をカプセル化して表象\(T(A)\)を得るための
\begin{eqnarray}
return:A \rightarrow T(A)
\end{eqnarray}
と、
2)カプセル化したものをさらにカプセル化してもそれは変わらないとするための
\begin{eqnarray}
join:T(T(A)) \rightarrow T(A)
\end{eqnarray}
という射を導入して、モナドを定義した。

モナドはこれとは反対の概念になるので、表象から単純な実体を得ることと、表象からさらに表象化されたものを作るということになる。圏論でコモナドを定義するときは、
1)カプセルをはずして対象を得る、即ち、
\begin{eqnarray}
extract:W(A) \rightarrow A
\end{eqnarray}
と、
2)カプセル化したものをさらにカプセル化する
\begin{eqnarray}
duplicate:W(A) \rightarrow W(W(A))
\end{eqnarray}
という射を導入すればよい。

2.2 コモナドライフゲームに生かされている

それでは、コモナドはどのような場面に現れるのであろう。Bartosz Milewskiさんが動画の中で教えてくれたのがライフゲーム(Conway’s Game of Life)だ。ライフゲームを簡単に説明しよう。

ライフゲームは、1970年にイギリスの数学者ジョン・ホートン・コンウェイ(John Horton Conway)により生み出された。これは、生物集団の動的な変化の一端を示してくれるなかなか面白いシミュレーションゲームだ。集団内の各生物の生死はそれを取り囲む環境によって決まるという簡単なルールを導入しただけで、生物集団が消滅したり、成長したり、循環するなどのダイナミックな動きを示してくれる。ルールは次の4個だけだ。
誕生:死んでいるセルに隣接する生きたセルが丁度三つあれば、次の世代は誕生する。
生存:生きているセルに隣接するセルが二つか三つならば、次の世代は生存する。
過疎:生きているセルに隣接する生きたセルが一つ以下ならば、過疎により死滅する。
過密:生きているセルに隣接するセルが四つ以上ならば、過密により死滅する。

例を下図に示そう。

f:id:bitterharvest:20190202141254p:plain
図1:ライフゲームはコモナドのよい例だ。各セルの生死はそれを取り囲む8個のセルの状態によって定まる

このルールから次のことが言える。中心のセルが、誕生してくるか、生き残るか、死滅するかは、その周りの8つのセルの状態によって定まる。次世代の中心のセルの状態\(A\)は、現世代での中心のセルを取り巻いている環境\(W(A)\)によって定まると考えることができる。即ち、\( W(A) \rightarrow A\)と考えることができる。

中心のセル\(A\)を取り巻く周辺のセルの状態\(W(A)\)は環境を与えたが、このときの周辺セルの状態\(W(A)\)から、これらのセルを取り巻く前世代の環境\( W ( W(A)\)へと(あるいはこれを作り出す候補の一つへと)立ち返ることができるであろう。これは、\( W(A) \rightarrow W(W(A))\)と考えることができるだろう。

このように考えると、ライフゲームはコモナドの概念に即したものと言える。ライフゲームで検索するとYouTubeにたくさんの例が載っているので、興味のある読者は参考にされるとよいと思う。

2.3 コモナドは信号処理でも生かされている

Bartosz Milewskiさんは、ライフゲームのほかにもう一つの例を挙げてくれた。それは信号処理だ。我々がコンサートホールで聴く音は、楽器の音そのものではない。直接伝わってくる音だけではなく、壁に跳ね返って入ってくる音もあるし、さらには壁で跳ね返った音が別の壁で跳ね返って入ってくる音もある。一般には、楽器から出た音がコンサートホールというフィルタを通った後の音を聴いていると考えてよい。

これを工学的に扱うのが信号処理だ。コンサートホールでのオーケストラと聴衆の関係をモデル化すると下図のようになる。オーケストラが出す音は入力信号で、聴衆が聞く音は出力信号だ。オーケストラの音はホールという音響装置を伝わって聴衆の耳に入るが、入力信号を変化させて異なる信号を出力するものをフィルタと呼ぶ。この例ではフィルタの役割をしているのはホールだ。

f:id:bitterharvest:20190203083910p:plain
図2:オーケストラホールもコモナドのよい例だ。オーケストラが奏でる曲はホールというフィルタを通して聴衆の耳に入るが、フィルタはコモナドを定義する重要な射の役割を果たしている
信号処理の理論は、入力信号が分かったときに、出力信号がどのようになるかを教えてくれる。この理論は、線形で時不変であることを前提にしている。即ち、下記の式が成り立つ理想的な状況だ。
\begin{eqnarray}
L(C_1 f_1(t)+ C_2 f_2(t)) &=& C_1 L(f_1(t))+ C_2 L(f_2(t)) \\
L(f(t-τ)) &=& g(t-τ)
\end{eqnarray}
最初の式は線形であることを表している。すなわち入力信号が\(C_1 f_1(t)\)と\(C_2 f_2(t)\)とを加えたものであるとき、出力信号は、やはり、それぞれの出力信号\(C_1 L(f_1(t))\)と\(C_2 L(f_2(t))\)との和になるというものだ。最後の式は、時不変を表すもので、時間を変えて入力信号を与えたとしても、出力信号の形は同じになるというものだ。即ち、時間に依らないというものだ。

これらの条件を前提にして、入力信号に対する出力信号を得るためには、基本演算として畳み込みを利用する。これを用いるためにはインパルス応答を理解しておかないといけない。

インパルスは、時間幅が無限小で高さが無限大のパルスをいう(数学的なモデルなので、実感としてつかみにくいが、時間\(t=0\)のときだけ高さが1になる信号と理解しておけばよい)。このインパルスを入力信号としてフィルタに入力したとき、そこから出力された出力信号をインパルス応答という。

f:id:bitterharvest:20190204084256p:plain
図3:インパルス応答は、無限大の高さと無限小の幅の入力信号が与えられたときのフィルタからの出力でこれをインパルス応答と呼ぶ。しかし、この定義ではインパルスのイメージがつかみにくいので、\(t=0\)のときにだけ高さ1になる信号と考え、これを入力信号とし、フィルタを通ったあとの出力信号をインパルス応答という
フィルタのインパルス応答\(h(t)\)が分かっている場合には、線形で時不変であるならば、どのような入力信号を与えたとしても、それに対応した出力信号を得ることができる。
f:id:bitterharvest:20190202142151p:plain
図4:入力信号が与えられたとき、それぞれの時点である高さのパルスが与えられたと見なし、それへの応答を畳み込むことで出力信号を求めることができる

その原理を示したのが下図である。入力信号が始まるとき、即ち\(τ=0\)のときの出力信号を求める(橙色)。これは、入力信号の高さ分だけインパルス応答を高めてあげればよい。同じように、時不変であることを利用して、1単位時間だけ経過したときに受けた入力信号、即ち\(τ=1\)、のときの出力信号を求める(薄茶色)。同じように、\(τ=2,3,4…\)に対しても出力信号を求める(薄緑、肌色、茶…)。
f:id:bitterharvest:20190202142629p:plain
図5:畳み込みの原理は、線形で時不変であるという条件を用いて、応答の遅延に合わせてく足し合わせることで得られる。

それでは、時間が\(m\)のときの出力信号がどのようになるかを考えてみよう。これは、線形であることを利用して、時間\(n\)(但し\(n \le m\))の出力の和となる。例えば、\(m=4\)であれば、\(n=0,1,2,3,4\)の出力信号の和となる。入力信号を\(f(t)\)としインパルス応答を\(h(t)\)として、式で表すと、
\begin{eqnarray}
g(m) = \sum^m_{n=0}f(n) h(m-n)
\end{eqnarray}
となる。ところで、\(f(n)\)は、時間\(n\)から\(n+1\)までを代表した値であるので、それを明示すると上の式は次のようになる。
\begin{eqnarray}
g(m) = \sum^m_{n=0}f(n) h(m-n) \times ( (n+1) –n)
\end{eqnarray}
そこで、刻み幅を1ではなく、微小な間隔\(dτ\)としよう。そして、\(m,n\)を\(mdτ,ndτ\)で置き換えると上式は、
\begin{eqnarray}
g(mdτ) = \sum^{mdτ}_{ndτ=0}f(ndτ) h(mdτ-ndτ) dτ
\end{eqnarray}
となる。さらに、\(t=mdτ, τ=ndτ\)とすると上式は、
\begin{eqnarray}
g(t) = \sum^t_{τ=0}f(τ) h(t -τ) dτ
\end{eqnarray}

\(h(t-τ)\)の値は、\(τ\)が\(-\infty\)から0までと、\(t\)から\(\infty\)まででは0であることに注意して、上式を積分の形にすると次の式が得られる。
\begin{eqnarray}
g(t) = \int^{-\infty}_{\infty}f(τ) h(t-τ)dτ
\end{eqnarray}

このように信号処理での畳み込みは、これまでに入力された信号毎に、その大きさに合わせてインパルス応答を求め、それらを重ね合わせたものである。このため、出力信号は、入力信号をフィルタ\(L\)によってカプセル化されたものと見なすことができる。もし入力信号も同じようにカプセル化されたものであるとするならば、\(g:L(A) \rightarrow L(L(A))\)となり、コモナドの\(duplicate\)を想起させる。これについては、後半でもう一度触れることにしよう。

2.4 Haskellモナドを利用してコモナドを定義する

モナドを攻略するという記事の中で、Haskellでのモナドの定義は以下のように記した。

class Applicative m => Monad m where
  (>>=) :: forall a b. m a -> (a -> m b) -> m b

  (>>) :: forall a b. m a -> m b -> m b
  m >> k = m >>= \_ - > k

  return :: a -> m a
  return = pure

  fail :: String -> m a
  fail s = errorWithoutStackTrace s

さらに、これらのメソッドは単位律と結合律を満足する。

上の定義で、\((>>=)\)は次のように書き換えることも可能である。2,4番目のメソッドを省いてモナドを定義すると次のようになる。

class Applicative m => Monad m where
  (>=>) :: forall a b c. (a -> m b) -> (b -> m c) -> (a -> m c)
  return :: a -> m a

これより\((>=>)\)が、関数の合成に似ていることに気がつくと思う。即ち、次のように類似している。

(.) :: (a -> b) -> (b -> c) -> (a -> c)
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)

一般にモナドへの射をクライスリ射と呼ぶ(上記の\(a \rightarrow m \ b, b \rightarrow m \ c\)はクライスリ射)ので、この合成は左から右へのクライスリ射の合成と呼ばれる。

さらに、恒等射についても次のように類似する。

id : a -> a
return :: Monad m => a -> m a

それでは、コモナド定義してみよう。矢印の向きを変えればよいので、次のようになる。なお、モナドの場合には、\(Functor\)と\(M onad\)の間に\(Applicative\)というクラスが存在したが、コモナドの場合にはそのようなものがないので、\(Functor\)から継承することにする。

class Functor w => Comonad w where
  (=>=) :: forall a b c. (w a -> b) -> (w b -> c) -> (w a -> c)
  extract :: w a -> a

なお、これらのメソッドは単位律、結合律は満たすものとする。また\((>=>)\)の場合と同様に、\((=>=)\)を左から右へのコクライスリ射の合成という。

Haskellではインスタンスを作り出してメソッドを使えるようにすることが重要だ。そこで、データ型を用意して、メソッドを実装することを考えてみよう。コモナドはカプセルをはずして中身を取り出すようになっているので、(任意の)データ型\(a\)が環境としての(任意の)データ型\(e\)でカプセル化されており、関数\(f\)によって、(任意の)データ型\(b\)が取り出されると考えよう。即ち、Haskellで記述すると、

f :: (a,e) -> b 

と考える。即ち、\(a\)と\(e\)の積と考えて、次のようなデータ型を用意しよう。

data Prod e a = Prod e a

それではデータ型\(Prod \ e \ a\)をコモナドインスタンスとして定義しよう。これは次のようになる。

instance Functor (Prod e) where
  fmap f (Prod e a) = Prod e (f a)

instance Comonad (Prod e) where
  f =>= g = \(Prod e a) -> let b = f (Prod e a)
                               c = g (Prod e b)
                           in c
  extract (Prod e a) = a 

それではプログラムを使った例を示そう。

f:id:bitterharvest:20190202143001p:plain
図6:環境でカプセル化したデータ型\(P( e \ a)\)の実行例

プログラムのコードは次のようになっている。
f:id:bitterharvest:20190202143224p:plain
図7:環境でカプセル化したデータ型\(P( e \ a)\)のコード

2.5 Haskellのコモナドから圏論でのコモナド

圏論でのコモナドは、\(extract\)と\(duplicate\)を用いて定義していた。そこで、Haskellの定義から導き出すことにしよう。

\((=>=)\)の定義の中では二つの関数を入力にしている。即ち\(f : w \ a \rightarrow b\)と\(g: w \ b \rightarrow c\)である。\(g\)は入力として\(w \ b\)を必要とするので、\(f\)を利用して\(w \ b\)を出力するような関数\(extend\)を定義しよう。これは次のようになる。

extend :: (w a -> b) -> w a -> w b

このようにすると、

 (=>=) f g = g . extend f

となる。

プログラムは下記のようになる。

f:id:bitterharvest:20190202143415p:plain
図8:コモナドのクラスを\(extract,duplicate\)で定義する

それでは\(duplicate\)から\(extend\)が得られることを示そう。そのために\(duplicate\)を次のように定義しておこう。

duplicate :: w a -> w (w a)

一方\(extend\)は

extend :: (w a -> b) -> w a -> w  b

であり、射\( (w \ a \rightarrow b)\)を利用している。そこで、この射を関手\(w\)で持ち上げることを考えよう。\(fmap\)は次のように次のように定義されていた(なお、下での\(f\)は、紛らわしいのだが、関手であり、これまでの\(f\)とは別物だ)。

fmap :: (a -> b) -> f a -> f b

従って、

fmap :: (w a -> b) -> w (w a) -> w b

である。
これより、

extend f (w a) = fmap f (duplicate (w a))

となる。\( w \ a \)は任意なので、上の式は、

extend f = fmap f . duplicate

となり、さらに、

extend id = fmap id . duplicate

即ち、

extend id = duplicate

となる。
従って、コモナドは以下のように\(duplicate\)と\(extract\)を用いて表すことができる。

class Functor w => Comonad w where
  duplicate :: w a -> w (w a)
  extract :: w a -> a

extend f = fmap f . duplicate
(=>=) f g = g . extend f

もちろん、これらのメソッドは単位律と結合律を満足しなければならない。

2.6 信号処理をコモナドで実現する

信号処理の原理について説明したが、コモナドの概念が分かってきたところで、これを実際に使ってみよう。

f:id:bitterharvest:20190205095543p:plain
図9:入力信号をスムーズ化して出力する。\(n\)の時間内に入ってきた入力信号の平均を出力する
ここでのフィルタはスムーズな信号を得ることとし、\(n\)時間前までの入力信号の平均をとるものとしよう。

式で表すと次のようになる。
\begin{eqnarray}
g(n) =\frac{1}{n} \sum^n_{m=0}f(m)
\end{eqnarray}
極めて簡単な式だ。そこで、入力信号をストリームで表すことにし、データ型\(Stream\)を用意しよう。

data Stream a = Cons a (Stream a) | Null deriving Show

上の定義で、\(Cons \ a\)の\(a\)が現時点の入力信号だ。そして、\(Stream \ a\)はそれ以前の入力信号の列で新しいものほど左側にある。

これをコモナドインスタンスにしよう。

instance Functor Stream where
  fmap f Null = Null
  fmap f (Cons a as) = Cons (f a) (fmap f as)

instance Comonad Stream where
  extract (Cons a _) = a
  duplicate Null = Null
  duplicate (Cons a as) = (Cons (Cons a as) (duplicate as))

上の定義で、duplicateはストリームのストリームを作っている。そして、最初のストリームは、現時点までの入力信号の列である。そして、次のストリームは、一つ前の時点までに受けた入力信号の列である。

それでは、ある時点までの入力信号の列をストリームの形で受けたときの、その時点での出力信号を求めてみよう。先の式で示したように、ストリームの最初から\(n\)個までの入力信号を足し合わせ(以下のプログラムでは\(sumN\)である)、それらを\(n\)で割ればよい(以下のプログラムでは\(aveN\)である)ので、次のようになる。

sumN :: Num a => Int -> (Stream a) -> a
sumN n Null = 0
sumN n (Cons a as) = if n <= 0 then 0 else a + (sumN (n-1) as)

aveN :: Fractional a => Int -> Stream a -> a
aveN n Null = 0
aveN n stm = (sumN n stm) / (fromIntegral n)

これを、現時点までの入力信号の列、一つ前までの入力信号の列、二つ前までの入力信号の列、…からそれぞれ出力信号を得れば、現時点までの出力信号の列を得ることができる。従って、

outN :: Fractional a => Int -> (Stream a) -> (Stream a)
outN n Null = Null
outN n stm = fmap (aveN n) (duplicate stm)

となる。
この式は以下のようにしてもよい。

outN :: Fractional a => Int -> (Stream a) -> (Stream a)
outN n Null = Null
outN n stm = extend (aveN n) stm

少し簡単すぎたので、もう少し一般的な信号処理を扱ってみよう。

インパルス応答は、現在の時間での応答、次の時間が来たときの応答、その次の時間が来たときの応答というように、入力信号列と同様に、ストリームで表すことができる。そこで、ある時点までの入力信号の列が与えられているときに、そのときの出力は次のように表すことができる。

以下のプログラムで、\(zipstream\)はある時点での出力信号を求めるためのものである。これはストリームになっていて、この時点に入ってきた入力信号に対するこの時点の出力信号、その一つ前の時点で入ってきた入力信号に対するこの時点の出力信号、さらに一つ前の入力信号に対するこの時点の出力信号となっている。即ち、この時点までに入ってきた入力信号からの子の時点での出力信号の列である。\(zipstream\)は三つの入力を受ける。それらは \( f \ inp \ stm\)で、\(inp\)はインパルス応答、\(stm\)は入力信号である。なお、\(f\)はインパルス応答と入力信号のそれぞれに対する演算で、この場合は常に乗算である。

また、\(conv\)はある時点での出力信号の総和をとる。

zipstream :: Num a => (a -> a -> a) -> (Stream a) -> (Stream a) -> (Stream a)
zipstream f Null _ = Null
zipstream f _ Null = Null
zipstream f (Cons a as) (Cons b bs) = Cons (f a b) (zipstream f as bs)

conv :: Num a => (Stream a) -> a
conv Null = 0
conv (Cons a as) = a + (conv as)

\(out\)は現時点までの出力信号の列である。

outC :: Num a => (Stream a) -> (Stream a) -> (Stream a)
outC inp stm = fmap conv (extend (zipstream (*) inp) stm)
--outC inp stm = fmap conv (fmap (zipstream (*) inp) (duplicate stm))

それでは利用してみよう。例として用いるのは信号処理の原理を説明したときの例だ。もう一度図を表示しよう。

f:id:bitterharvest:20190202142151p:plain
図10:上記の信号処理と同じ結果をプログラムが出力するかを確認する
入力信号のストリームは、新しい信号ほどストリームの左側に来るので、入力信号の図で左側からストリームに詰め込んでいく。従って、最も奥に詰め込まれる入力は、図で時間\(0\)のときの\(1\)という値だ。そこで一番奥を\(Cons 1 Null\)として、入力の値を詰めていくと次のようになる。

stm = Cons 0 (Cons 0 (Cons 0 (Cons 0 (Cons 0 (Cons 0 (Cons 0 (Cons 0 (Cons 0 (Cons 0 (Cons 0 (Cons (-2.5) (Cons 0.8 (Cons 2.8 (Cons 1.4 (Cons 1 Null)))))))))))))))

インパルス応答の図は、左側に行くほどより以前に来た入力に応答するようになっているので、左側がストリームの先頭になるようにする。従って次のようになる。

inp = Cons 0 (Cons 0.53 (Cons 0.42 (Cons 0.13 (Cons (-0.05) (Cons (-0.09) (Cons (-0.05) (Cons (-0.01) (Cons 0.01 (Cons 0.01 (Cons 0.01 (Cons 0 Null)))))))))))

全体のプログラムを示しておこう。

f:id:bitterharvest:20190202144228p:plain
図11:信号処理のプログラム

これを実行してみよう。結果は次のようになる。ストリームの左側の方が新しい出力である。プログラムの実行結果を見ると、図の値と同じであることが分かり、プログラムが適切に機能していることが分かる。

f:id:bitterharvest:20190202144344p:plain
図12:信号処理のプログラムの実行結果

信号処理での畳み込みのプログラムが、このようにすっきりと短いコードで書き表せるのはHaskellの特徴だ。C言語で書いていた時のわずらわしさは、ここにはない。

2.7 圏論でのコモナド

それではHaskellから圏論へと場面を変えることにしよう。Haskellで用いた関数\(duplicate,extract\)は、圏論では自然変換と考えるのがよい。このようにすると、

extract:: w a -> a

は下図のように考えることができる。

f:id:bitterharvest:20190204205357p:plain
図13:Haskellで定義されている関数\(extract\)を、圏論でのコモナドの圏の射として定義するときは、自然変換と見なして行う

すなわち\(w \ a\)は関手\(W:A \rightarrow W(A)\)と見なすことができ、\(a\)は関手\(I:A \rightarrow A\)と見なすことが可能である。この結果、\(extract\)は自然変換\(ε:W \rightarrow I \)とすることができる。

同様に、\(duplicate\)は下図に示すように\(δ:W \rightarrow W \circ W\)とすることができる。

f:id:bitterharvest:20190204205814p:plain
図14:\(duplicate\)についても自然変換と見なして定義する

また、単位律、結合律が守られることから、これを可換図式で表すと下図が得られる。右側の二つの図は、コモナドの三角恒等式と呼ばれるものだ。
f:id:bitterharvest:20190204205940p:plain
図15:コモナドの圏での単位律、結合律に相当するものを可換図式で表す

それでは、コモナドの圏を定義しておこう。
モナドの圏の構成
対象:\(I_C,W,W \circ W, W \circ W circ W,…\)
射:\(ε:I_C \rightarrow W, δ:W \rightarrow W \circ W\)
恒等射:\(I_W\)
合成:\( \circ \)
結合律:\( δ \circ (I_W \circ δ) = δ \circ (δ \circ W) \)
単位律:\(( ε \circ I_W) \circ δ = I_W = (I_W \circ ε) \circ δ \)
図で表すと以下のようになる。
f:id:bitterharvest:20190204210056p:plain
図16:コモナドの圏:関手が対象となり、自然変換が射となる

2.8 コモナドと随伴との関係

それではコモナドと随伴との関係を見てみよう。随伴には、内容は同じだが複数の定義がある。余単位(counit)・単位(unit)随伴はその中の一つで、それは次のようになっている。
圏\(\mathcal{C}\)と\(\mathcal{D}\)の余単位・単位随伴は二つの関手
\begin{eqnarray}
L: \mathcal{D} \rightarrow \mathcal{C} \\
R: \mathcal{C} \rightarrow \mathcal{D}
\end{eqnarray}
および二つの自然変換
\begin{eqnarray}
η: I_\mathcal{D} \rightarrow R \circ L \\
ε: L \circ R \rightarrow I_\mathcal{C}
\end{eqnarray}
であって(ηは単位、εは余単位と呼ばれる)、これらの合成
\begin{eqnarray}
L =L \circ I_\mathcal{D} \xrightarrow{L \circ η} L \circ R \circ L \xrightarrow{ε\circ L} L \\
R = I_\mathcal{D} \circ R \xrightarrow{η\circ R} R \circ L \circ R \xrightarrow{R \circ ε} R
\end{eqnarray}
がそれぞれ\(L\)と\(R\)上の恒等変換\(I_L,I_R\)となることである。これは三角恒等式(triangle identities)と呼ばれる。

図で表してみよう。随伴の定義に関する図は次のようになっている。

f:id:bitterharvest:20181222203140p:plain
図17:随伴の定義にはいくつかあるが、単位(\(unit:I_\mathcal{D} \rightarrow R \circ L\))・余単位(\(counit:L \circ R \rightarrow I_\mathcal{C}\))を用いての定義も良く用いられる

また、三角恒等式を関図式で表すと次の通りだ。

f:id:bitterharvest:20181223065614p:plain
図18:余単位・単位による随伴の定義の一部である三角恒等式の可換図式
それではこの定義からコモナドを導くこととしよう。コモナドでの射\(δ,ε\)が、随伴を定めている\(η,ε\)から得られることを示せばよい。そこで、
\begin{eqnarray}
W=L \circ R
\end{eqnarray}
としてみよう。コモナド側の\(ε\)を得ることは簡単だ。
\begin{eqnarray}
ε : I_\mathcal{D} \xrightarrow{ε} L \circ R = W
\end{eqnarray}

それでは\(δ\)について考えよう。次のようにすればよい。
\begin{eqnarray}
δ : W = L \circ R = L \circ I_D \circ R \xrightarrow{L \circ η \circ R} L \circ R \circ L \circ R = W \circ W
\end{eqnarray}

モナドの圏での単位律、結合律も同じように得られるので試みて欲しい。

北部九州を旅行する(4日目午後)-大宰府から鴻臚館へ

筑紫君磐井の岩戸山古墳を見学したあとの午後も、福岡県の歴史的な遺産を訪ねた。最初の目的地は、古代においては九州の中心地であった大宰府だ。

岩戸山古墳からバスで久留米に戻ったが、さらに久留米駅から西鉄の電車を利用して大宰府に行くためには、西鉄二日市西鉄大宰府線に乗り換える必要がある。二日市駅から大宰府駅まではわずか二駅だが、これまでに利用した電車やバスと違って、やけに混んでいることに気がついた。しかも、日本語以外の言葉があちらこちらから聞こえてきた。

駅舎を出てさらにビックリ。太宰府天満宮までの道は人で埋め尽くされていた。人波が切れたときに参道の風景を写真に収めたがこの通り。
f:id:bitterharvest:20190124100531j:plain
1月12日の土曜日ということがあったのかもしれないが、閑散とした遺跡に馴染んできた身には、この人ごみはこたえた。太宰府天満宮の写真を撮って、早々に退散することとした。
f:id:bitterharvest:20190124100613j:plain
当初はやはり大宰府にある九州国立博物館をゆっくり見学しようと思っていたが、これも断念し、板付遺跡へと向かうことにした。ここは、西鉄天神大牟田線では井尻駅が最も近い。ここから歩くと25分程度だが、幸いにも駅を出たときにタクシーが来たのでこれを利用した。
f:id:bitterharvest:20190124100459p:plain
板付遺跡は、日本最古の稲作集落として知られ、その集落は弥生時代の特徴である環濠によって囲まれている。しかも環濠は二重だ。集落を外敵から守るために強固な構えにする必要があったのだろう。集落の周囲からは水田跡が発見された。この水田は、土砂が堆積してできた沖積地に築かれた。次の写真は板付遺跡の外観だ。左側が二重の環濠で囲まれた集落。真ん中が水田だ。
f:id:bitterharvest:20190124100644j:plain
最初に環濠集落を訪れた。環濠は幅約6m深さが3~3.5mだ。
f:id:bitterharvest:20190124100717j:plain
住居跡は発見されなかったそうだが、板付集落と同時期の福岡県粕屋町江尻遺跡の発掘例をもとに、竪穴住居が復元されていた。このような竪穴住居は、大韓民国忠清南道の松菊里(ソングンニ)遺跡から発見されたことから、松菊里(しょうぎくり)型住宅とも呼ばれている。
f:id:bitterharvest:20190124100749j:plain
f:id:bitterharvest:20190124100821j:plain
水田跡は、
f:id:bitterharvest:20190124100857j:plain
板付遺跡の周囲の地形だ。谷の出口に近いところに築かれたことが分かる
f:id:bitterharvest:20190124101033j:plain
板付遺跡の模型だ。集落が少し小高いところに位置していることが分かる。
f:id:bitterharvest:20190124100931j:plain
また板付遺跡弥生館には土器も展示されていた。
f:id:bitterharvest:20190124101101j:plain

この後バスと地下鉄を利用して、鴻臚館へと向かう。この場所はかつて平和台球場があった場所だ。

鴻臚館は、現在の迎賓館に相当する施設だ。磐井の乱(527~528年)の後の536年に、那津のほとりに那津官家(なのつのみやけ)が設けられ、九州支配と外交を担った。白村江の戦い(663年)の翌年、行政機能は太宰府に移され、那津のほとりには海外交流と国防の拠点施設が残され、この施設は筑紫館と呼ばれ、唐、新羅渤海使節を迎えた。鴻臚館という名称は、駐豪唐王朝の鴻臚寺に由来し、9世紀前半頃から用いられるようになった。菅原道真遣唐使の中止(894年)の後も貿易は続けられ、中国・朝鮮からの商人たちは鴻臚館に滞在した。貿易は10世紀初めごろ官営から民営へと移行するが、鴻臚館は商人たちの滞在場所として維持された。しかし、11世紀半ばごろにはその役割を終えた。

鴻臚館の場所が確定されたのは最近で、1987年に平和台球場外野席改修の際に遺構が確認され、その翌年から発掘調査が始まった。

鴻臚館の外観、
f:id:bitterharvest:20190124101136j:plain
復元された鴻臚館、
f:id:bitterharvest:20190124101205j:plain
f:id:bitterharvest:20190124101234j:plain
鴻臚館については、奈良時代に編纂された万葉集の中にも出てくる。新羅に遣わされた使節の一行が763年に詠った「筑紫の舘(たち)に至りて遥(はるか)に本郷(もとつくに)を望みて、悽愴(いた)みて作れる歌四首」がそれである。

志賀の海人(あま)の一日もおちず焼く塩のからき恋をも吾(あ)れはするかも
志賀の浦に漁(いざり)する海人(あま)家人(いへひと)の待ち恋ふらむに明(あ)かし釣る魚(うを)
可之布江(かしふえ)に鶴(たづ)鳴き渡る志賀の浦に沖つ白波立ちし来(く)らしも
今よりは秋づきぬらしあしひきの山(やま)松蔭(まつかげ)にひぐらし鳴きぬ

鴻臚館跡からは、当時の貿易によって輸入された白磁器や青磁器が発掘されている。
f:id:bitterharvest:20190124101303j:plain
f:id:bitterharvest:20190124101335j:plain
また遣唐使船の模型もあった。
f:id:bitterharvest:20190124101403j:plain
トイレも発見されていて、以下の写真は、その時に使われた籌木(ちゅうぎ)、当時のトイレットペーパーだ。ケガしそうで嫌だが、このようなものが使われていた。
f:id:bitterharvest:20190124101433j:plain

鴻臚館を出るときに、窓口の方が地図を参照にしながら、福岡城の見学場所を教えてくれた。
f:id:bitterharvest:20190124105114j:plain
福岡城むかし探訪館」で紹介のビデオを流しているので、それを見てから見学するといいということだったので、まずは探訪館を訪れた。そこには、福岡城の模型もあった。
f:id:bitterharvest:20190124101526j:plain
また、ビデオによれば、福岡城は戦国時代の武将黒田長政により築かれた城で、関ケ原の戦いでの功績により、豊前国中津16万石から筑前一国52.3万石に転封され、博多を望む福崎の丘陵地に城を築き、明治になるまで、黒田氏が藩主としてこの地に居城したとのことだ。

ビデオを見た後、窓口の方が教えてくれた順路に従って、福岡城を見学した。

三の丸、二の丸、本丸、天守台へと続く城内へと導く主要な門であった東御門跡、
f:id:bitterharvest:20190124101644j:plain
そして、本丸の北東隅にある祈念櫓(やぐら)だ。
f:id:bitterharvest:20190124101714j:plain
f:id:bitterharvest:20190124101738j:plain
近くの梅林では梅が咲き始め、香ばしいにおいがした。
f:id:bitterharvest:20190124101822j:plain
本丸から福岡の市街地を望んだ。
f:id:bitterharvest:20190124101853j:plain
裏御門跡、
f:id:bitterharvest:20190124101940j:plain
江戸時代から場内に残る唯一の櫓の多聞櫓、国指定重要文化財になっている。
f:id:bitterharvest:20190124102021j:plain
f:id:bitterharvest:20190124102052j:plain
西側にあり、日常の通用門として利用された下之橋御門、
f:id:bitterharvest:20190124102144j:plain

福岡城を抜けたころには、日もだいぶ傾き、寒くもなってきたので、帰路に着くこととした。

これまで北部九州については全く土地勘がなかったので、歴史の書物の中で、これらの地名が出てきたとしても、具体的なイメージを抱くことができず、概念的にしか理解できないでいた。今回、訪問することによって、それぞれの土地の地形も分かり、さらには、それぞれの地域がどのように結びついているのかも、感覚的にも分かるようになった。「百聞は一見に如かず」という諺があるけれども、その通りだと改めて認識し、とても良い旅だったと、旅行から二週間たった今でも思っている。

北部九州を旅行する(4日目午前)ー筑紫君磐井の遺跡を訪ねる

北部九州の旅行を始めてから4日目、最終日だ。夜7時の飛行機で東京に戻ることにしているので、見学の時間はたっぷりだ。前日、吉野ケ里遺跡を見学しているときに、北部九州の古代国家について、ボランティアガイドの人と意見の食い違いはあったが、楽しく談笑している中で、磐井の乱が話題に上った。そのとき、ボランティアガイドの人が、その地は向こう側の八女だと教えてくれた。吉野ケ里遺跡からこんなにも近いところに磐井が残した遺跡があろうとは思ってもいなかったので、当初の予定を変更して、磐井の墓と思われている岩戸山古墳へと向かうことにした。
f:id:bitterharvest:20190121160204p:plain
ホテルはJRの駅から遠いので交通の便が良いとは言えないのだが、都合のよいことにホテルの近くから久留米駅行のバスが出ていることが分かった。さらに良いことに、久留米駅で乗り換えて八女方面に向かえば、岩戸山古墳にたどり着けることも分かった。ホテルのフロントでバスの時刻を教えてもらい、8時14分のバスに乗る。携帯電話で確認したらこの時刻にはバスは走っていないので少し心配になったが、ホテルからの情報を信用して、無事に岩戸山古墳へと向かうことができた。

久留米駅に近づいたころ、バスの窓から趣のある教会が目に入ってきた。由緒ある建物ではと写真を撮った。後で調べたところ、毛利秀包(ひでかね)が久留米領主であった時代(1587~1600)に始まるそうだ。黒田如水の仲介もあって秀包は、キリシタン大名大友宗麟の七女マセンチア引地を妻にし、宗麟や妻の勧めによって洗礼を受け、宣教師を保護し、城のそばに教会堂を建立したそうだ(イエズス会年報1600年)。写真の聖堂は1955年に建てられたものだ。
f:id:bitterharvest:20190121160247j:plain
久留米駅でバスを乗り換え、最寄りのバス停の福島高校前で降車した。岩戸山古墳の近くには八女市岩手山歴史文化交流館があり、まずはここに立ち寄った。ここでは、岩手山古墳の石像を中心にした展示があった。

展示室を入るとすぐに、「リーダーの誕生」という説明があり、2000年前ごろの北部九州で大集落が発生したことを教えてくれた。春日市の須玖(すく)・岡本遺跡群(奴国)、糸島氏の三雲・井原遺跡群(伊都国)などとともに、八女市にも大規模な環濠を伴う室岡遺跡群がうまれたそうだ(ここでは説明されていなかったが、前日に訪問した吉野ケ里遺跡も含まれるが、室岡遺跡とともにクニの名前は残っていない)。次の写真は室岡遺跡群の西山ノ上遺跡から発見された遺物だ。鉄片が展示されていて、この当時、先進的な場所であったことが分かる。
f:id:bitterharvest:20190121160341j:plain
同じように先進性を示す茶ノ木ノ本遺跡から出土された銅鉾(どうほこ)・同鏡などもあった。
f:id:bitterharvest:20190121160424j:plain
f:id:bitterharvest:20190121160502j:plain
古墳時代になると円墳や前方後円墳が現れる。
f:id:bitterharvest:20190121160543j:plain
5世紀初めの立山山24号墳からは銅鏡・勾玉・製鉄武器が副葬されていることから、この地方に有力者が出現したことがわかる。
f:id:bitterharvest:20190121160616j:plain
f:id:bitterharvest:20190121160655j:plain
同じころ前方後円墳も現れる。これは有力者が統合され、「磐井」一族が生み出されたとも考えられている。前方後円墳は系列をなし、5世紀には、石人山古墳、岩櫃山古墳、そして6世紀になるとこの地域では最大規模の岩戸山古墳が現れ、その後に磐井の乱で滅ぼされた影響を受けたのだろう、小型化した乗場古墳・善蔵塚古墳・鶴見山古墳を経て、7世紀には円墳の童男山古墳へとなる。

岩戸山古墳からは沢山の石像が出現している。しばらく見ていこう。「刀を帯び鞘を負う石人」
f:id:bitterharvest:20190121160743j:plain
「鞘を負う石人」
f:id:bitterharvest:20190121160826j:plain
石刀
f:id:bitterharvest:20190121160907j:plain
武装石人頭部」
f:id:bitterharvest:20190121161003j:plain
武装石人」
f:id:bitterharvest:20190121161049j:plain
「石鞘」
f:id:bitterharvest:20190121161127j:plain
「石盾」
f:id:bitterharvest:20190121161212j:plain
f:id:bitterharvest:20190121161243j:plain
その他にもたくさんの石像があった。
f:id:bitterharvest:20190121161329j:plain
f:id:bitterharvest:20190121161502j:plain
f:id:bitterharvest:20190121161538j:plain
f:id:bitterharvest:20190121161609j:plain
f:id:bitterharvest:20190121161642j:plain

磐井の乱とは継体天皇の時代の北部九州でのヤマトと磐井との争いであった。527年にヤマト王権は、近江毛野が率いる軍を朝鮮半島へ出兵させようとしたが、筑紫君磐井にはばまれたので、ヤマト王権は北部九州に物部麁鹿火(あらかい)と大友金村を北部九州を派遣した。そして、磐井はヤマト王権軍によって鎮圧された。

磐井の乱終結した後、ヤマト王権から罰せられることを恐れた磐井の息子の葛子(くずこ)は、糟屋の地を差し出した。ヤマト王権はこの地を屯倉とし、このあと北部九州に次々に屯倉を設置していき、ヤマト王権による中央集権化が進んでいった。そのような中にあって、磐井の後継者たちは、90m規模の岩手山古墳には劣るものの、乗場古墳・鶴見山古墳などの大型前方後円墳を次々に築造し、一族再生の機会をうかがったようだ。

ヤマト王権により設置された北部九州の屯倉が下の写真の赤い丸の部分だ。。
f:id:bitterharvest:20190121161747j:plain

磐井の側近たちの墓とも考えられている6世紀の釘崎古墳から発掘された武具だ。
f:id:bitterharvest:20190121161852j:plain
f:id:bitterharvest:20190121161926j:plain
f:id:bitterharvest:20190121162000j:plain

交流館を抜けて岩戸山古墳へと行った。模造だが石像が展示されていた。ここは筑紫国風土記に記載されている別区と呼ばれる場所だ。
f:id:bitterharvest:20190121162044j:plain
岩戸山古墳の入り口、
f:id:bitterharvest:20190121162118j:plain
古墳は鬱蒼たる樹木で覆われていた。
f:id:bitterharvest:20190121162214j:plain
f:id:bitterharvest:20190121162244j:plain
近くには岩戸山4号古墳があり、石室が見られるようになっていた。
f:id:bitterharvest:20190121162323j:plain
f:id:bitterharvest:20190121162353j:plain

岩戸山古墳をたっぷりと見学したので、古代時代の九州の中心地である大宰府へと向かう。
f:id:bitterharvest:20190121162723p:plain
久留米に近づいたころ車窓に何とも変わった大仏と塔が現れた。後でインターネットで調べたところ、成田山久留米分院の救世慈母大観音様とインドのブッタガヤ大仏塔と同型の塔ということが分かった。
f:id:bitterharvest:20190121162436j:plain
久留米駅西鉄天神大牟田線に乗り換えて大宰府へと向かった。この続きは次のブログで紹介しよう。

北部九州を旅行する(3日目)ー吉野ケ里歴史公園を訪れる

三日目は吉野ケ里遺跡だ。日本史を勉強し始めてから、弥生時代の最大集落であるこの遺跡を訪ねてみたいと思っていた。また、卑弥呼邪馬台国だったと信じている人もいるので、確認してみたいとも考えていた。

由布院温泉から吉野ケ里遺跡までは列車だ。由布院駅9時7分発の特急ゆふ2号で鳥栖駅に向かい、そのあと長崎本線に乗り換えて吉野ヶ里公園駅で下車すればよい。北部九州を横断して、乗り換え時間も含めて約2時間半の列車の旅だ。
f:id:bitterharvest:20190119144228p:plain
吉野ヶ里公園駅で降り、歴史公園の方に向かうのは、私一人だ。のんびりとそしてゆっくりと見学できそうで期待が高まる。駅から公園までの直線道路は沢山のお客さんが来る時期に備えてなのだろう、舗装工事を行っていた。このため、迂回路が用意されていて、たんぼを巡りながら目的地へと向かった。
f:id:bitterharvest:20190119144304p:plain
吉野ケ里歴史公園は地図からも分かるように広い。まずは腹ごしらえということで、東口の歴史公園センターへと歩を進めた。食堂で食べている人は、殆どが公園の関係者で、見学客はやはり私一人のようだ。ちゃんぽんを食べて一息ついたところで、背中の荷物をロッカーに預けて身軽にし、公園へと向かった。

吉野ケ里遺跡は、水田稲作が始まった弥生時代の遺跡だ。ここの歴史は、弥生時代前期(紀元前3~2世紀)、中期(紀元前2~紀元1世紀)、後期(紀元1~3世紀)に分けられる。

前期には丘陵一帯に分散的に「ムラ」が誕生し、南側一帯には環濠を掘った集落が出現し「ムラ」から「クニ」へと発展する兆しを見せた。集落の規模は2.5haだ。

中期には、南の丘陵を一周する大きな環濠が掘られ、首長を葬る「墳丘墓」やたくさんの「甕壺墓地」が作られた。集落の防御が厳重になっていることから争いが激化したと考えられている。集落の規模は20haだ。

後期には、集落は北の方へと拡大し、40haを超える国内最大規模の環濠集落となる。北部には、首長が居住し祭祀の場であったと考えられる北内郭と、高位階層の人々の居住区と推定される南内郭とがある。西方にはクニの物資を集積し、市の可能性もある高床倉庫群がある。また、南部には一般の人々が居住していた集落がある。

吉野ケ里歴史公園は、弥生時代後期の集落を復元したものだ。後期(紀元1~3世紀)は、中国では後漢の時代だ。57年には光武帝が倭の奴国の使者に対して金印を授け、107年には倭国帥升(すいしょう)が後漢朝貢し、239年には卑弥呼が難升米(なしめ)らを魏に派遣しており、中国との交流が活発な時期だ。

吉野ケ里歴史公園では、1800年ぐらい前の時代を垣間見れることを楽しみに、意気揚々と入り口へと向かった。
f:id:bitterharvest:20190119144400j:plain

公園内は20分ごとにバスが巡回していた。中の様子を知るために、南端から北端へと向かっているバスに乗った。最初にたどり着いたのは古代植物館だ。

最近とみに温暖化をもたらす環境破壊が大きな問題となっているが、この問題は今に始まったことではない。実は人間が定住生活を始めるようになってから、森林破壊が始まったと言われている。古代植物館では、弥生時代の推移とともに森林がどのように変化したかの説明があった。

人が住み着く前までは、吉野ケ里丘陵は、カシ・シイなどの照葉樹林を中心に、コナラ・クリなどの落葉樹が生息していたと考えられている。

弥生時代が始まると、集落を作るために樹木が伐採され、落葉樹が急激に減少し、ススキなどでの草地が広がった。そして、弥生時代の終わりごろになると、低地では稲の花粉が増えて水田稲作が本格したことが分かり、森では原生林の伐採が行われ、その後に成長するエノキ・ムクノキが増えて二次林へと変化したことが分かっている。

古代植物館の周りでは、縄文時代から弥生時代前期の常緑樹林と、弥生時代の終わりごろの落葉樹林が混ざったススキなどが広がる草地の植栽を再生しようとしている。人間の営みが自然にどのような影響を及ぼしたかを体験できる意欲的な試みだ。

古代植物館には、弥生時代の道具類も展示されていた。その中でも驚かされたのが、甕棺墓に使われた甕の大きさだ。人間一人を入れるのだからかなりの大きさが必要なのは分かるが、それにしてもどのようにして作ったのだろうか。
f:id:bitterharvest:20190119144443j:plain
土器類も展示されていた。横浜市歴史博物館に展示されている土器と比較するとすっきりしている。
f:id:bitterharvest:20190119144516j:plain
道具類も展示されていた。鉄製品が多いのにびっくり。北部九州がこの時代の先進地域であったことを改めて認識させてくれた。
f:id:bitterharvest:20190119144606j:plain
またバスに乗って、北墳丘墓へと向かう。バスを降りたところは弥生時代の集落を特徴づける環濠の近くだ。
f:id:bitterharvest:20190119152849j:plain
北墳丘墓の全景だ。
f:id:bitterharvest:20190119144648j:plain
この墳丘墓は、弥生時代後期のものではなく、中期(紀元前2世紀~紀元1世紀)のものだ。南北40m、東西27m、盛土の高さ4.5mだ。ここからは成人用の甕棺14基が発掘され、その多くから銅剣や管玉が発見された。歴代の王または首長と考えられる人が葬られたと考えられ、弥生時代の「クニ」社会を裏付ける有用な遺跡だ。

建物の中は、甕棺が発掘されたときの状態に保たれている。
f:id:bitterharvest:20190119144729j:plain
銅剣が納められている甕棺もある。
f:id:bitterharvest:20190119144811j:plain
f:id:bitterharvest:20190119144840j:plain
この後、北内郭へと向かう。途中に甕棺墓列がある。これはやはり弥生時代中期の墓だが、王ではなく一般の人の墓だ。
f:id:bitterharvest:20190119144926j:plain
f:id:bitterharvest:20190119145007j:plain
北内郭は、祭祀のための主祭殿や物見櫓があり、まつりごとの場所だ。
f:id:bitterharvest:20190119145050j:plain
主祭殿は2,3階に上ることができ、神がかりの様子を示す展示などがあった。
f:id:bitterharvest:20190119145131j:plain
南内閣は高位者層の居住地だ。
f:id:bitterharvest:20190119145209j:plain
f:id:bitterharvest:20190119145245j:plain
南内閣の近くには展示室があり、そこにもたくさんの甕棺と
f:id:bitterharvest:20190119145322j:plain
銅剣と、
f:id:bitterharvest:20190119145401j:plain
さらには、頭部のない遺骨が甕棺の中に入った状態で展示されていた。
f:id:bitterharvest:20190119145438j:plain
南のムラに移動すると、そこは一般の人のための集落だった。
f:id:bitterharvest:20190119145520j:plain
f:id:bitterharvest:20190119145555j:plain
f:id:bitterharvest:20190119145647j:plain
最後に訪れたのは、倉と市だ。ここには、高床式の倉がたくさん復元されていた。
f:id:bitterharvest:20190119145939j:plain
4時間半もたっぷりと吉野ケ里歴史公園を見学し、その大きさに圧倒されて、今日の宿泊場所の吉野ケ里温泉ホテルへと向かった。復元された史跡ではあるが実物に近いものを通して、実感として、古代でのムラからクニへの変化を理解することができ、有意義な訪問であった。