TETRA’s MATH

Python「if文のネスト」、“二十の扉”風に果物をあてる

 『スッキリわかるPython入門 (スッキリシリーズ)』を参考にして、Python入門を試みている。

 基礎を扱ったI部の内容のなかで、「ここは自分でやってみたほうがいいかもな」と思ったのが、「if文のネスト」なるもの。考え方が難しいというよりも、これまでより少し行数が多くなって構造が出てくるので、そういう意味での難しさがあるように感じた。

 「if文」というのは、「もし〇〇〇だったらこうしてね」という条件をもとに分岐させるものだけど、「ネスト」というのはいわゆる入れ子のことであるらしく、つまりif文のなかにif文があるということらしい。「ネスト」自体は、これよりも前のコレクションのところで出てくる。

 「if文のネスト」の例として、「晩ご飯をレコメンドするチャットボット」のプログラムが示されている。

 最初は、YES・NOチャートみたいだなと思ったのだけれど、あれは途中で合流することもあるから違うかなぁと考えていたら、昔懐かし「二十の扉」ゲームのことを思い出した。ちょっと調べたところ、もともとはラジオのクイズ番組だったらしい。私が生まれる前に放送は終了しているので、ゲームとして残ったものをやっていたのだろう。

 「二十の扉」というのは、決められたカテゴリーの中から何か答えを決めて、20以内の問いからそれがなんなのかをあてるゲーム。

 「if文のネスト」を使って「二十の扉」風の遊びができないかな、と考えてみた。果物あたりをカテゴリーにして。選択肢の中から選ぶ方式だったらプログラムにできるかな?と最初は思ったのだけれど、それじゃ面白くないので、自分がすぐに思いつく果物だったらあてられるようなものをなんとかがんばって作ることにした。20個の質問は多すぎるので、それよりは少ない数で。(※末尾に表示してあります)

 この時点で elif の存在は知っていたのだけれど、「果物あて」で使えるのかどうか、どう使っていいのかがわからなかったので、if と else の組み合わせだけで進めていった。

 候補の果物を紙に書き出して、共通点と相違点を考えながら「うーん、うーん」とうなりつつ、「いま私はプログラミングの勉強をしているのだろうか??」という素朴な疑問が浮かぶことは浮かんだけれど、まあ、楽しかったのでよしとする。

 とにかく愚直に組み立てるだけだったので、プログラムを作ること自体は難しくなかった。

 予定外の答えへの対応も考えて、ウキウキしながら娘にやってみてもらった。「マニアックな答えでも大丈夫だよ!」と余裕を見せつつ。

 が。

 娘が用意した答えはといえば。

 「ドラゴンフル―ツ」

 そうなると、

  外から見て赤いですか? Y
  → 切らずに一口で食べられますか? N
  → りんごですね!

という、あの労力はなんだったのだという最短コースを経て、しかも「あてられない」という事態がいきなり発生。

 そういえば、候補に入れていなかったマンゴーだってあてはまる。「外から見てすべすべしていますか?」を加えてドラゴンフルーツをふるいにかけても、りんごとマンゴーの区別化はできない。

 嗚呼。

 世の中にはなんとたくさんの果物の種類があることよ……

 もっといろんな果物に対応できるプログラムにしたいという気持ちがないこともないけれど、いや、その気持ちはやっぱりないので、ドラゴンフルーツとマンゴーだけ加えて、それで満足することにした。

 どんな質問をどんな順序ですれば、もっとすっきりしたプログラムになるかを考えることにはそれなりに意味があるかもしれないが、そのためにはプログラムの前に果物の研究が必要になりそうなので、今回は見送ることにする。

 では、〔果物あて〕のプログラムを表示します。「バナナ vs ぶどう、みかん」を分ける質問が少し微妙です。あと、半角スペース4つ分を全角スペース2つ分に変えてあります。

(※ ifとelse で分岐させると、「Y」以外で入力したり、ただエンターキーを押しても先に進んでしまうことに途中で気づいた。そこはどうするんだろう?という疑問はわいたけれども、とりあえず保留の課題とした)

〔果物あて〕
print('果物をひとつ思い浮かべて、これから出す質問にYかNで答えてください。その果物をあててみせます!')
soto_aka = input('外から見て赤いですか?')
if soto_aka == 'Y':
  hitokuchi = input('切らずに一口で食べられますか?')
  if hitokuchi == 'Y':
    kandume = input('その果物の缶詰はありますか?')
    if kandume == 'Y':
      print('さくらんぼですね!')
    else:
      print('いちごですね!')
  else:
    subesube = input('皮の表面がすべすべしていますか?')
    if subesube == 'Y':
      tane = input('種が大きいですか?')
      if tane == 'Y':
        print('マンゴーですね!')
      else:
        print('りんごですね!')
    else:
    print('ドラゴンフルーツですね!')
else:
  kawa = input('手で簡単に皮が剥けますか?')
  if kawa == 'Y':
    sanmi = input('酸味がほとんどありませんか?')
    if sanmi == 'Y':
      print('バナナですね!')
    else:
      kandume = input('その果物の缶詰はありますか?')
      if kandume == 'Y':
        print('みかんですね!')
      else:
        print('ぶどうですね!')
  else:
    kandume = input('その果物の缶詰はありますか?')
    if kandume == 'Y':
      kanji = input('漢字1字で書けますか?')
      if kanji == 'Y':
        print('桃ですね!')
      else:
        print('パイナップルですね!')
    else:
      iro = input('皮と切り口の色がほぼ同じですか?')
      if iro == 'Y':
        print('柿ですね!')
      else:
        kisetsu = input('季節感がありますか?')
        if kisetsu == 'Y':
          print('すいかですね!')
        else:
          kiwi = input('キウイフルーツかな?')
          if kiwi == 'Y':
            print('あたってよかったです!')
          else:
            kotae = input('降参です、答えを教えてください。')

            print(f'{kotae}でしたか!それは思いつきませんでした。')


 そういえば、選択肢にメロンも入れていなかった。
その他 | permalink

Python基礎の勉強、「できる・できない」

 『スッキリわかるPython入門 (スッキリシリーズ)』を読みながら、少しずつPythonに慣れていこうとしているきょうこのごろ。

 このテキストは、導入部分のあと二部構成になっており、I部で基礎を学んで、II部はPythonの部品を組み立てる練習になっている。

 基礎では、変数とデータ型、コレクション、条件分岐、繰り返しが扱われていて、超初心者本よりはだいぶ難しいけれど、それでも基本的な雰囲気は、超初心者本の延長上にあると感じられる。

 なんというのか、「まだできない」けど「わかる」感じというか。できるようになりたいのなら、ある程度の努力をすればできるようになるだろうと思えるというか。この感覚は久しぶりだなぁと思った。たとえば圏論の勉強では、こういう感覚はない。何しろ、「できる・できない」が判定されるような作業をしていなかったので。

 さらに、プログラミングの練習では、「できる・できない」がすぐにはっきりするのでありがたい。そして、「できない」ときにもエラーが親切に教えてくれる。

 過去のファイルを保存しているので、エラーをひとつ取り出してみる。(この記事を投稿をする前に確認しようとしたら、もうなかった。ちゃんと保存していなかったので、一時的に保存されていたのだろうか?)

 なお、「=」や「+」の前後をあけたほうがいいということについて、本のどこかに書いてあるのかもしれないし、実際、本のなかのプログラムはそうなっているのだけれど、私は別のところで知って、以下の時点ではまだそのことに気づいていなかったので、そのまま示すことにする。また、半角スペース4つ分を全角スペース2つ分に変えている。
name=input('あなたの名前を入れてください')
print('{}さん、こんにちは!'.foamrt(name))
food=inport('{}さんの好きな食べ物を入れてください')
if food=='チーズケーキ':
  print('私も{}が好きですよ!'.format(food))
else:
  print('{}がお好きなのですね!.format(food)')
 まずは、2行目が違うよ、'str' object has no attribute 'foamrt'だよという内容のことをエラーが教えてくれた。よく見れば format が foamrt になってしまっている。

 なるほどと思って修正すると、やっぱりエラーで今度は3行め。input が inport になってしまっている。ここを修正してもへんな表示になるのは、format で {} に入れるものを指定していないから。

 やれやれと思って修正すると、まだミスがある。最後の「‘」の位置が違う。これを修正すると、うまく出力されるようになった。

 ちなみにこの「if文」は第3章で出てくるので、基礎編のだいぶ先なのだけれど、日付から察するに、はじめの“ざっと読み”の途中で面白そうだと思って自分でやってみたのかもしれない。

 こういうミスをするうちにやることでもないのかもしれないが、面白そうと思えるところからやって、ついでにその前の基本的なところを確認するというのもわるくないかもしれない。

 というわけで、少なくともI部については、エラーが出ても、なんとか自分で解決しながら読み進めることができている。

 ただ、あいかわらすべてはやっていないし、ひとりで全部はできないのだった。
その他 | permalink

Python勉強スタート、言われた通りにやるということ

 超初心者が初心者になるためのPython入門本の最初の1冊だけを端折り読みして「勉強スタート」とするのもおこがましい気がしたので、前回は事始めとして、こちらを第一歩とすることにした。

 購入したのは次のテキスト。

 『スッキリわかるPython入門 (スッキリシリーズ)』

 レビューから察するに、Pythonを使ってプログラミング入門を果たそうとする私向きであると判断して選んだ。

 ところが。

 超初心者のまま第一歩を踏み出そうとして、さっそく「えー」となる。新たな何かをインストールしなければいけないもよう。

 Anaconda? JupyterLab? なんでしょうかそれは。

 そういえば前回は、それがなんなのかよくわからないままIDLEというものを使ったのだった。そもそもこのIDLEというのはなんだったのだ?と思って、確かこの段階でIDLEを検索したのだったと思う。少しわかったような、やっぱりわからないような。

 よくわからないまま、とりあえず Anaconda も JupyterLabも 言われる通りにやってみた。なお、このスッキリシリーズのサイトには「インストール手順集」というものがあり、大変わかりやすい。

 Haskell関係ないかしら?と思ってさがしたけれどなかった。本も出ていないらしい。Haskellはスッキリわかることはないのだろうか? というか、需要がそれほどないのかな?

 何をやればいいかはわかったのだけれど、Anacondaのインストールがあともうほんの少しというところで止まってしまって、キャンセルすることもできない事態となり、どうしたものかと対応策を検索しようとしていたら、無事に終了して、JupyterLabも起動することができた。よかったよかった。

 前の本でもそうだったけれど、出てくる単語の意味がよくわからなくても、とりあえず書かれてあることを素直に実行すればその通りになるのだな、と何かにつけ思うことであった。

 というわけで、無事に環境を用意することができて、第一章を進めていった。前回と違って文字列の加工ではなく計算から始まるけれども、第一章の全体的な雰囲気というか難易度としては、超初心者本の(1)とだいたい同じか、ほんの少しだけ上だという感じがした。

 どこがほんの少し上かというと、input や format が出てくるところ。

 何しろ動機が動機なので(Python習得が目的ではないので)、すべてを真面目にやることはせず、前回同様、何かしたいときに何をすればいいかを確認して言われた通りにやればよさそうだな、という感触を持ちながらとりあえずページをめくっていった。

 途中でフローチャートが出てきて、おお、なんとなくプログラミングっぽくなってきたぞと思いながら。

 ところが。

 条件分岐の前のinputの練習をしようとしていたら、どうにもうまくいかない。言われたことを言われた通りにしようとしているはずなのに、なんだかんだエラーが出る。

 言われた通りにやってもできないという事態を初体験。

 しかし、「またあとで落ち着いてやってみよう」と思っていったん作業を終了し、時間をおいたらすんなりできた。もしかすると自分のパソコンの問題だったのかもしれない。

 そのあとも「ふむふむ」と思いつつページをめくっていったのだが、なんというのか「何かをやりたいときに、それができる方法を見つけて、言われた通りにやればいいのだな」と「思う」ことと、実際にできるかどうかは別問題だな、と感じるようになった。

 そもそも「言われた通りにやる」というのは、ほんの最初の一歩だけの話、丸写しするかほんの少しだけアレンジすればいい段階の話なので、結局のところ何をどう組み合わせるかを自分で考えて自分で実践できないうちは、やっているとは言えないと思うようになった。いまさらといえばいまさらだし、ある意味では一歩成長したとも言える。

 というわけで、かなりざっくりひととおり眺めたあと、また前にもどって、今度は1回めよりは少し丁寧に読み進めている。
その他 | permalink

Python勉強、事始め

 以下のようなプロセスを経て、Pythonを勉強することになった。

=====================

圏論をもっと感じたい
→ Haskellはどんなものかのぞいてみたい
→ Haskell入門本がプログラミング経験を前提としている
 (特に命令型というものらしいが意味はさっぱりわからず)
→ その候補のなかでやってみてもいいかなと思えたのがPythonだった

=====================

 まず参考にさせていただいたのは、次のKindle本。

 『プログラミング超初心者が初心者になるためのPython入門(1)
  セットアップ・文字列・数値編』 たっく、ちょっぷ (著)


 安いうえにアプローチがすばらしい。そうだ、まずは初心者になリたい。

 プログラミングに手が出せなかったのは、その環境を入手する方法からしてさっぱりわからなかったからだ。もちろん検索すれば教えもらえるのだけれど、例によって自分の心配性と強迫観念が持ち上がってしまう。

 さすがに、書店に走るとか電気屋さんに走るとかはしなかったし、Amazonで「プログラミング言語売ってないかなー」とさがすこともなかったが(たぶん)、「へんなところからへんなものをもってきて、大変なことにならないか?」とか、「ちゃんとしたらところから、すごくちゃんとしたものをもってきて、えらいことにならないか?」という不安がぬぐえず第一歩が踏み出せずにいた。

 Haskellに関しては、心配性と強迫とは別問題で、この部分でつまずいた(つまりやろうとしたことはある)。Pythonにほんの少し慣れてきたころ、Haskellもいけるんじゃね?というおおいなる勘違いのもと、1冊買った入門本の最初の一歩を参考にやろうとしたのだが、何をどこからどうダウンロードすればいいのかさっぱりわからない。というか、しようとしても先に進めない。

 その点、Pythonは勇気さえ出せば、最初の一歩はスムーズに踏み出せた。それもこれも上記の本がとても親切だからだと思う。

 まずはIDLEなるものを使ってみる。IDLEの名の由来がモンティ・パイソンの一員だということはわかったが、IDLEなるものがなんなのかはさっぱりわからないまま、始めてみた。

 ところが。

 さっそくつまずく。「print」の段階で。つまり超最初の段階でうまくいかない。しばらくあれこれ試してみたが解決しないので、あわてずさわがずあきらめず検索してみたところ、()でくくらなくてはいけないことがわかった。くくってみたらうまくいった。

 その後はまあまあ好調で、本の通りにしばらくまじめにやっていった。ときどき「ん?」となるところはあったけれど、「何かをするためには何かをすればよく、その“何”が変わっていくのだな」ということがわかってきた。

 文字列を加工したり、変数を使って同じようなことをやったり、変数に変数を入れたり。

 そんなこんなで慣れてきて端折るようになっていったのだけれど、typeのところはやっておいたほうがいいと思ったのでやってみた。データ型が整数であることの出力を見たくて

x=99
print(type(x))

を入力画面に入れたら、「class」として出てくる。あれ? typeではないの?

(※ 上記の話を書くために〈〉に入れた状態で出力の文字を書いたら表示されず、あ、そうか、いま使っているブログのエディターではそれはタグになってしまうのだということをいまさらのように認識した。)

 ここもあわてずさわがずネットで検索してみたところ、classと出力されてよいらしいとわかった。今参考にしている本は2015年発行なのだが、printの()のこともそうだけど、どこかの段階でPythonの仕様(という言い方でいいのかな?)が変わったのだろうか。

 練習問題で、10.0の型を確認しましょう的なことが書いてあったので、おお、この場合はどうなるのだろうと思いつつやってみて、なるほどと思った(ちなみにこの少しあとのページでその答えが出てくる)。

 そのあとは、ごく簡単な計算。ここも大丈夫そう。

 なんとなく雰囲気はわかってきた。たとえば、テキストを見てはいけない理解度テストを出されたとしても点数はとれないが、つまり覚えてはいないが、テキストを見てもいいのなら、何かをするときにテキストで確認して、言われたことを言われた通りにやればいいのだな、ということはわかってきた。

 というわけで、全部はやっていないけれど十分にもとはとったし、これ以上勉強するのであればもう少し新しい本を参考にしたほうがいいような気がしたので、ひとまず先に進むことにした。

 なお、今回、参考にさせていただいた初心者になるシリーズ本は続いており、まだ(1)しかやっていないので、いまだ超初心者のままではある。
その他 | permalink

プログラミングに接触しなかった過去をふりかえる

 プログラミングのことは気になることは気になっていた。勉強したいというより、どういうものかをある程度わかっておいたほうがいいのではないか、わかっていないといけないのではないかという、ある種うっすらとした強迫観念で気になっていた。

 しかし、少しのぞいてみたくてもどこから何を始めていいのかさっぱりわからない。入門本はあれこれありそうだけれど、何をどう選べばいいかわからないし、惹かれる本が見つからない。

 たとえば、ゲームというものにとんと興味がないので、「ゲームを作ろう!」的なアプローチの入門本には意欲がわかない。

 毎日こんなに麻雀ゲームをやっておきながらなんだけど、麻雀ゲームは麻雀というものをすでにある程度知っていて、ゲームでひとりでも気軽にやれるのでやっているわけであって、パソコンでやるゲームそのものが好きというわけではないのだ。

 それから、ブログをこんなに長くやっておきながらなんだけど、サイト構築やWebデザインというものにもとんと興味がない。必要にせまられてHTMLやCSSをほんの少しいじることはあるけれど、それ以上のことを知りたいという希望がない。あとで話題に出てくるJavaにも興味がわかない。

 一方で、「Excelでマクロを組めばいいのではないか」という話もあるが、これまた興味がない。

 つまり、プログラミング、あるいはそれっぽいことでやってみたいことがないから、なかなか始められない、ということがひとつにはあったと思う。

 ならばやらなくてもいいんじゃないか?

 というわけで、やっていなかった。

 が。

 先日までの圏論の勉強でモナドをのぞいたりHaskellの話を読んだりすると、やっぱりやってみたくなる。

 プログラミングができるようになりたいというよりも、プログラミングのことを少しでも知っていれば、もっとわかること、感じられることがあるようになるのではないか、という期待のもとに。

 というか、ぶっちゃけ、Haskellだけに興味がある。

 恐れずに付け加えれば、C言語なるものにも昔は少し興味があった。なぜかは自分でもわからないのだけれど、もしかすると他のことよりもイメージがわかないからかもしれないし、逆に、プログラミングっぽいというイメージを勝手に抱いているのかもしれない。しかし、少し調べてみたところ、私なんぞが手を出せるものではないということを感じたので近づかずにいる。

 で、Haskellについてなのだけれど、入門本を買おうとしても、ある程度のプログラミング経験を前提としていることが多いように思う。はなっからの素人向けのHaskell本を見つけられていない。そもそも、はなっからの未経験者にHaskellは無理なのだろうか?

 と言いつつ白状すると、実はHaskell入門本を1冊買ってしまっている。命令型プログラミング言語(C ++ やJava、Pythonなど)でのプログラミング経験者を対象として書かれてある本。ただし、大げさなプログラミングの経験がなくてもこの本をとったあなたならきっと大丈夫的なことも書いてくれている。

 C++は、さっき書いたC言語の仲間だと認識しているので手を出さない。先ほど書いたようにJavaにも興味がわかない。

 そうなるとPythonということになる。

 「思い返せばそういう流れだった気がする」という記憶で書いているのだけれど、Pythonはその名は知っていたように思う。ただし、心のなかで「フォトン」と呼んでいた。いまも気をしっかりしておかないとそう呼んでしまう。フォトンってなんだったっけ?と思いきや、光子のことだった。

 ちなみにHaskellは、心のなかでずっと「ハスクル」と呼んでいた。たぶん、10年以上そう呼んでいたと思う。

 ついでに言えば、TeXが出たばかりのころは「テックス」と呼んでいた。その話を友人たちとクヌース先生来日の話題といっしょにおしゃべりした記憶があり、あれはいつだったのだろうかと調べてみたら京都賞受賞が1996年だったから、つまりはそれよリ少しあとの話だったのだと思う。

 ちなみに、TeXも勉強しようとしたことがない。

 LaTeXもない。

 なんにもない。

 なお、どれがプログラム言語でどれが違うのかよくわかっていないまま、私のなかでの「プログラミングっぽいもの」というカテゴリーの中に入っている固有名詞を出している。

 プログラミング言語にしろ、その他のことにしろ、中身を知らないのに、興味を持ったり持たなかったりするのはなぜなんだろう?と自分でも不思議に思うのだが、中身を知らなくても接触はあるわけで、その間になんらかのイメージがついてしまっているのかもしれない。

 そういえば思い出したのだけれど、20年くらい前だったか、ちょっと趣味的用事があって、きわめて基本的なプログラムと接触した覚えがある。あれはなんだったのか記憶をたどってみたところ、N88-BASICという名称が浮きあがってきた。やりたいことがあったので(手作業だと大変な作図作業だったので)ちょっとだけ接触したのだった。

 そんなこんなで、気になりつつも、ずっと接触せずにいたプログラミング。なんだかんだで、なかば消去法でPythonに落ち着き、ゆるゆると勉強を始めている。
その他 | permalink

『圏論の道案内』はけっこうお得かも

 『圏論の道案内』(西郷甲矢人・能美十三)と『圏論による論理学』(清水義夫)をメインの参考テキストとして、時々『圏論の歩き方』も参照しながら圏論の勉強を進めてきた。

 とりあえず随伴関係の雰囲気だけはなんとなくつかめた気がするし、モナドをのぞくところまではけた。のぞいただけだけど。

 『圏論の道案内』では、このあと「モナドから随伴へ」ということでKleisli圏が出てきて、「計算効果とモナドとHaskell」の話になって、まとめの章である第10章へと続く。

 できればそこまで行きたかったのだけれど、少しのぞいてみて、「これはある程度プログラミングのことをわかっている人でないとピンとこない話なのでは?」と感じたので、いったん立ち止まることにしたしだい。

 そして思うことは、『圏論の道案内』はけっこうお得なのではないか、ということ。

 第10章に書いてあるように、著者としては「自然変換は大事だ」という八字を読者の心に刻んでもらうことがいちばんの願いなのかもしれない。

 しかし、『圏論の歩き方』p.285の脚注から察するに、自然変換が圏論の真髄だという説のほかに、随伴関係こそが真髄であるという説もあるらしく、『圏論の道案内』ではその随伴関係についても扱ってくれているわけなのだ。

 そして、Haskellにもほんの少し触れていてくれる。

 これはけっこう、ありがたいことなのではなかろうか? 初心者向けのわかりやすい本でありながら、圏論の二大真髄の雰囲気を伝えてくれるうえ、Haskellにもちょっと触れておいてくれるなんて。

 さらに、モナドを少しながめたいまとなっては、関手のところでモノイド準同型に3節分割かれているのも実はありがたいことなのではないかと思えてきた。著者のねらいではなかったとしても。

 対象が1つしかなくて、ぐるぐるしてかえってわかりにくく感じられるモノイドを敬遠していたのだけれど、何しろモナドは「自己関手圏のモノイドのようなもの」であるらしく、“モノイド”をわかっていないと、“モノイドのようなもの”という方向からのアプローチはできない。

 そのモノイド準同型のところでは「量」の話が出てきており、内包量も出てきていて、過去の自分ならここがいちばんの扱いどころだったかもしれない。『圏論の歩き方』での西郷甲矢人さんの文末のコメントのことは頭に入っていたので、おそらくそこにもつながる話なのだろうと推測している。(

 ただ、いまじゃないという気がしている。というわけで、タイミング待ちなのだった。

 お得と書いておきながらなんだけれども、実はまだほんの一部しかこの本を読んでいない。上記のモノイドについてもそうだし、普遍性もろもろもそうだし、コンマ圏というルビのついた一般射圏についても、チャレンジしかけがたいまは無理だと断念した。

 とりあえず「随伴関係の雰囲気だけでも感じたい」という目的意識については気がすんだ。

 あとは、例の「コロッケのマッシュポテト包み」のことやモノイド、モナドのぐるぐるする感じ、3つを2つに、2つを1つにしていく感じ、プログラミングのこと、圏論の普遍性もろもろのことなど気になることはあるので、どちらの方向に進めばいいのかしばらくゆるゆる探索していこうと思う。
圏論 | permalink

圏論「随伴からモナドへ」、自己関手圏におけるモノイドのようなもの

 『圏論の道案内』(西郷・能美)をメインの参考テキストとして、モナドがどんなものかをのぞくだけのぞいてみることにした。

 前回、GFを一つの関手とみて、「2乗から1乗へ」(GFGFからGFへ)、あるいは「3乗から1乗へ」(GFGFGFからGFへ)というふうに、「次数」を戻すことについて考えて、次の図1のような図式が得られることを見た。

図1


 これとは別にもうひとつ、GFについて重要な関係式があるとして、次の図が示されている。

図2


 随伴の三角等式からすぐわかると書いてあり、自分で考えてみたのだけれど、以下のようにそれぞれにGやFを加えたあとで合体させれば、図2になることはなるな、と思った。が、こう考えていいのかどうかはよくわからない。

図3


 図2は「単位律」を示したものであるらしい。「次数」を上げるη:idC⇒GFと整合的というようなことも書いてある。

 すでに頭がごちゃごちゃしてきたので、いま何をしているのか最初にもどって考える。

 随伴関係というのは、圏Cから圏Dへの関手F、圏Dから圏Cの関手G、FGからidDへの自然変換ε、idCからGFへの自然変換ηからなる四つ組〈F、G、ε、η〉が三角等式をみたすときに言えることだった。

 合成関手GFは圏Cの自己関手で、ε:FG ⇒ idD から GFGF ⇒ GF という自然変換GεFが得られ、GFをひとつの関手としてみれば「2乗」を「1乗」にしているようなもので、いわば二項演算(2つの値から1つの値を得る)ととらえることができ、結合律に似た法則が成り立つ。

 GFGF ⇒ GF が「次数」を下げているとしたら、自然変換η:IdC ⇒ GF は「次数」を上げているとみなせる。

 そして、随伴関係の三角等式より、「次数」を下げる自然変換GεF:GFGF ⇒ GFと、ηをもとにつくられた「次数」を上げる自然変換をあわせた可換な図式が描ける。これが図2になる。という理解でいいのだろうか?

 図1が結合律を示しているのはわかりやすいとしても、図2が単位律を示しているというのはどういうことなのか、いまひとつわからない。もう一度、図2を。

図4


 単位元というのは、数のかけ算における1のようなものだと思うのだが、GFηもηGFも、GεFと合成させることでidGFにできるという図式になっているところがミソなのだろうか?

 ここのところがよくわからないけれど、何をしているか全体的な雰囲気はつかめた気がするので、先に進むことにする。準備ができたので、いよいよモナドに入っていく。

 モナドというのは、ひとことでいえば、「自己関手圏におけるモノイド対象」ということらしい。「モノイド対象」がいまはわからないので、とりあえずモノイドのようなものと考えればよさそう。

 『圏論の歩き方』(p.76/第5章)によると、モナドは1950年代後半ではtripleなどと呼ばれていたらしいのだけれど、よりよい名前を与えようということになり、Jean Benabou(Bのあとのeは上に^がある表記)によりモノイドを連想させる語としてmonad((モナド)という名前が発案されたとのこと。

 「モナド」というとライプニッツのモナドのことを思い浮かべるけれども(「モナドには窓がない」という言葉を知っているだけだけど)、ウィキペディアの「モナド(圏論)」にマックレーンが哲学用語を借用したと書いてあるのを読んで、「あら、あのモナドからもってきたのかしらん?」とは思っていた。が、上記の話と合わない。

 「モナド」という語がどこから来たかはわからないけれど、とりあえずモノイドを意識されてのことだというのはわかった。

 そのモノイドについて、一度ちゃんと考えておいたほうがいいのではないかとだいぶ前から思っていたのだけれど、なんだかんだであとまわしになっていた。『圏論の道案内』では「量」ともからめて語ってあるのでいよいよやっておいたほうがいいのだけれど、どういうわけだかなかなか気持ちが向かわずここまで来てしまった。

 しかし、いまの段階で、ある程度確認しておかないとこのあとの話が飲み込みにくくなるので、少しだけ見ておくことにする。

 モノイド(monoid)というのは対象を一つしか持たない圏のことで(射はいくらあっても構わない)、 射の集まりに「射の合成」という二項演算があり、 「恒等射」という単位元があって、結合律、単位律をみたしているという特徴がある。

 あら、どこかで聞いた話だぞと思う通り、『圏論の道案内』では「モノイドと群」という項目があり、「任意の射が可逆なモノイドを群(group)と呼ぶ」という定義が示されている。

 モノイドの特徴を圏論的にいうと、射の集まりをMとしたとき、合成とは射μ:M×M→M、単位元とは射u:1→Mになり、結合律は下図左が可換であること、単位律は下図右が可換であることと言い換えられる、というようなことが書いてある。

図4

M×M×Mの「×」を忘れていてあとから描き加えたので小さくなってしまった↑

 特に小さなモノイドに対してはMは集合とみなせるから、上記の二つの図式はSetにおけるものだ、と。

 図4の対象の配置は、図1、2と同じになっている。ここまでくると、モナドの定義も図がわかるようになってくる。

 というわけで、『圏論の道案内』におけるモナドの定義を見るところまでなんとかたどりつけた。

 圏CからCへの関手T、自然変換μ:TT ⇒ T および自然変換u:idC ⇒ Tが以下を可換にするとき、TをCにおけるモナド(monad)と呼ぶ。

図5


圏論 | permalink

圏論「水平合成」、モナドまで行けるか

 今回の圏論の勉強は、「随伴関係をなんとか雰囲気だけでもつかめないか」という気持ちで進めてきたものだけれども、以前より少しは雰囲気がつかめたとはいえ、「気がすんだ」感じがまだしない。

 しかし、同じところにずっといるとそれはそれで煮詰まってしまいそうなので、いっそ先をのぞくことにした。

 というのも、『圏論による論理学』(清水)の「ユニットとコユニット」で示されている事柄が、『圏論の道案内』(西郷・能美)のモナドにつながりそうな気配がしているからなのだ。無謀な気がしないでもないけれど、とりあえず少し足を踏み入れてみることにする。

 『圏論の道案内』の「随伴からモナド」は、ε:FG ⇒ IdDから、GεF:GFGF ⇒ GFという自然変換を得るところから話が始まる。左からG、右からFを合成すればそういうことになる。GFGFからGFへの自然変換なので、GFを一つの関手とみれば、「2乗」を「1乗」に戻しているようなものだと本に書いてある。

 そんなふうに、より高次なものからGFにもっていくことを考えるとき、結合律に似た法則が成り立つと話は続く。どういうことかといえば、「3乗」GFGFGFからGFに辿り着くには、以下の2通り(後ろの2組について変換する場合と、前の2組を変換する場合)が考えられるけれども、それらが等しいということ、つまり可換であるということ。

  図1


 ちなみに、本文中(Kindle位置3564あたり/第9章1節)で(GFGF)GF ⇒ GFGF の自然変換に対して「GFGεF」とあるのは「GεFGF」ではないかと思うのだが。ネット上の正誤表には該当箇所が見当たらなかった。

 で、図1が可換であることを見るには、右端のFと左端のGを取り除いた

図2


が可換であればいいとして、水平合成(horizontal composition)と垂直合成(vertical composition)の説明へと入っていく。

 水平合成とは何かについて先に定義を書いてしまうと、自然変換 α:F ⇒ G、β:S ⇒ T についてその水平合成 αβ を αβ:= αT Fβ= Gβ αS によって定める、というもの。

 αとβについては、次のような図式が描ける。左は自然変換としての図式で、これを圏Cの対象Xについての成分を考えることでCの図式になおしたのが右になる。

図3


 一方、垂直合成というのは、関手圏の射としての自然変換の合成をさすらしい。というか、水平合成と区別するためにこう呼ばれるということもあるということのよう。

 図2が可換となるのは、ε同士の水平合成を定義するものだから、ということなのだけれど、ε:FG⇒idDが二つあって、FとSがFGになり、GとTがidDとなり、αもβもεならば、確かに図2になる。

 ここでいったん、『圏論の道案内』から『圏論による論理学』にうつると、ユニットとコユニットのところの2つめの定理として次のようなものが示されている(AはBの任意の対象、BはCの任意の対象)。

図4


 なぜこういうことが言えるのかについて、(1)の 1)についてだけまとめると次のようになる。

図5


 なんというのか、うまくあてはめればいろんなことが言えちゃうんだなぁと思うことであった。

 なお、この定理の「注意」では「閉包」や「開核」という言葉につながる事柄が書いてあるのだけれど、いまは無理そうなのでとりあえずおいておく。

 図4の定理の(1)も、「2乗を1乗に」の形に見える。
圏論 | permalink

圏論「ユニットとコユニット」、書いてあることには意味がある

 『圏論による論理学』(清水)では、随伴関係について略式の定義正式な定義が示されており、その間に「ユニットとコユニット」という項目がはさまれている。

 随伴関係の定義から直ちに得られる基本的な事柄を見るために導入されている概念なのだが、なんとなく「ここはまあ、とりあえずいまはいいかな」という感じで読み飛ばしていた。

 しかし、ぱらっとページをめくってみたらGFGFという記号が目に入ったりして、ここを読むと『圏論の道案内』(西郷・能美)とつながるかもしれないと思えてきたので、少しのぞいてみたところ、εやηも出てくる。

 あらー、ここは読まんといかんところだった。

 『圏論の道案内』では三角等式による定義のあとの話ものぞいていたのに(自然同型の話につながる)、『圏論による論理学』で略式と正式の定義にはさまれている部分を読まないというのもへんな話だった。

 まあ、でも、いまが読むタイミングだったということで。

 というわけで、ユニットとコユニットについて見ていく。まずは、どういうものなのかざっくり示す。

図1


 A、Bは対象でF、Gは関手なので、ユニットとコユニットは射ということになる。FとGが随伴(FはGの左-随伴)ならば、上記のような射ηA、εBが存在するということらしいのだ。

 なぜこういうことが言えるのか、本では簡易的な仕方での証明が示されている。ひとまずηのみ図にまとめると、次のようになる。

図2


 εBのほうは、AをG(B)とすれば同じように考えることができる。

 簡易的な証明というだけあって、とてもわかりやすい。

 と、一瞬思ったのだけれど、話は逆だった。もう随伴関係は略式ながら示されていて、それをもとに考えるからわかりやすいのだ。

 実際、随伴関係からunit、counitの存在がいえるし、unit、counitが存在すれば随伴関係が成立するという、その双方向のことが定理となっている。つまり、随伴であることとunit、counitが存在することは、同じ事柄を表しているらしいのだ。

 さらに「注意」において、ηAはη:IdB→GFなる自然変換のA-成分ηAでもあることが書いてある。εについても同様に。

 これはまさに、『圏論の道案内』の三角等式に向けた旅に出てきたηとεのことではないか。

 あらー、ここはもう少しはやく読まんといかんところだった。

 ひとつ気になるのは、積関手や冪関手は出てこないこと。このことは『圏論の道案内』の随伴関係を読んだときの最終的な気になりごとのひとつでもあった。ここをどう考えたらいいのだろう?

 なお、『圏論による論理学』では、ηA、εBの図が次のようなものとして示されている。

図3
圏論 | permalink

圏論「随伴(自然同型版)」の中身、自分の解釈と疑問点

 前回、『圏論による論理学』(清水)で示されている随伴関係の正式な定義の流れを見ていった。それについて、どう理解し、何に疑問をもち、何がわからないかをまとめていきたいと思う。

 まずはもう一度、定義の式を確認する。

図1


 この式のなかで〇(□, △)という形で書かれているのは、圏〇における□から△への射の集まりのことなので、つまりはHom(□,△)と同じことだと理解した。

 式全体は自然同型を示すものになっている。自然同型については、以前、段階的に考えて、自然同値、関手の同型と同じ意味だととらえてよさそうだということを確認した。

 上記のことが、解説(1)の内容に対応する。
 
(1) C(F(A),B)、B(A,G(B))各々は、〈A,B〉に関手C(F( ), )、〈A、B〉に関手B( ,G( ))が適用されたものである。自然同型τが関手間で定義されることから。

 そして射の集まりは集合なので、Setへの関手だということが(2)で語られている。
(2) C(F( ), )、B( ,G( ))の両者とも、ある圏Dから圏Setへの関手であると考えられる。C(F(A),B)もB(A,G(B))も射の集まりであり、各々集合であることから。

 (2)で出てくるDは、(3)でB×Cだとわかる。
(3) Dは、〈A,B〉なる対を対象としており、A、B各々が圏BCの対象であることから、BC各々を対象とする圏の圏における積B×Cと考えられてくる。すなわちC(F( ), )、B( ,G( ))とも、B×CSetなる関手といえる。

 思い返せば、随伴関係にチャレンジしはじめたころから、ある圏にもともと含まれている対象と、関手で別の圏からうつされた対象との間の射を考えるということがなんだか不思議な感じがしていた。

 圏Cのなかに対象Bはもともとあるとして、圏Bから関手によってうつされた対象F(A)は、もともと圏Cにあったものなのか、それともうつされたことで生じたのか、もともとあったものがうつされたものと同じになるのか、あるいはそういう話ではまったくないのか、いまだにわからない。生じたのだとしたら、射もそのときに同時に生じたのか、ということも。

 いずれにせよ、所属している圏が異なる2つの対象A、Bについての射の集合を考えているのだから、それら2つの対象をともに含む圏であるB×Cからの関手であること、そしてその関手はhom関手のようなものであることが(3)で語られていることなのだととりあえずは理解した。

 hom関手“のようなもの”と書いたのは、第一引数も第二引数も固定されておらず、対象の対に同時に適用されているので、そのままhom関手と言うことはできないと思ったがゆえのこと。

 もしかするとhom関手間の自然変換がヒントになるかもしれないのだけれど、そういえばhom関手の段階から、射のうつしかたの意味がよくわからないまま先に進んだのだった。

 それはそうとして、(3)に対する疑問点としてあげられるのは、B×Cからの関手なのに、うつされた先の射の集合はB(〇,△)、C(●,▲)の形をしていて、圏Bにおける射、圏Cにおける射のままなのだな、ということ。

 もっとも、圏B×Cには対象A、Bというものは存在していなくて、存在しているのは〈A,B〉という対象の対だから、HomB×C(F(A),B)という書き方をするのもおかしな話だとは思う。

 さて、もやもやするところはあるけれど、とりあえずここまではよしとする。問題はこの先、B×Cでの射の対〈f,g〉がどううつされるかについて。

 圏の積では〈A,B〉→〈A´,B´〉の射が〈f,g〉と表せるとしても、もともとはf:A→A´、g:B→B´なのだから、f:B→B´となったり、g:A→B´となったりすることはなく、そこは気を遣う必要があるのだろうとは思う。そして、圏論の場合は何かと可換が大事だから、そこも気を遣わないといけないこともわかる。が、どう気を遣えばいいのかがよくわからない。

 とりあえず解説の(4)をもう一度読んでみて、図もながめてみる。
(4) 一方、C(F( ), )、B( ,G( ))が関手であることから、B×Cでの射の対〈f,g〉にも各々が適用され、適用結果を各々仮に☆1、☆2とすると、両関手間の自然変換が問題となっている以上、両者とも下図の右の四角形を可換にするようなものと考えられてくる。

図2


 図2の右の四角形が可換になるということは、C(F(A),B)からB(A´、G(B´))へ行く2通りの行き方が同じものになるということだと思うのだが、
(5) しかし、このような条件をみたす☆1、☆2は存在しない。すなわち〈f,g〉に対応する☆1、☆2をうまく定義できない。

と話は続く。なぜ定義できないのかわからないまま先を読むと、
(6) そこでDB×Cではなく、改めてB^op×Cとする必要がでてくる。実際このとき、下図のような状況となり、その右の四角形を可換とするような新しい〈f,g〉に対応する*1、*2がうまく定義できてくる。

図3


ということで双対圏が出てくるのだった。『圏論の道案内』でも双対圏や反変関手がよく出てきたので驚きはしないし、逆に話がつながって助かるのだけれど、なぜこうなると定義できるのか、その意味がわからない。

 では、
(7) 新しい〈f,g〉にC(F( ), )、B( ,G( ))を適用した結果である*1、*2は、各々具体的には次のようなものになる。

 というところの*1、*2とはいったいどんなものなのか?

 前回は図式を示すだけだったけれど、本には次のような解説も書いてある。少しだけ書き方をかえてまとめてみる。図ももう一度示す。

*1……B^op×Cのf(A´→A)とgに対してのC(F(f),g)なる*1は、h∈C(F(A),B)なるhについて、ghF(f)を対応させるSetの射。

図4

*1は、h ―→ ghF(f)


*2……B^op×Cのf(A´→A)とgに対してのB(f,G(g))なる*2は、k∈B(A,G(B))なるkについて,G(g)kfを対応させるSetの射。

図5

*2は、k ―→ G(g)kf


 いったん(5)にもどって考えると、B×Cのままで h が h´にうつされるとして、gh=h´fという条件を満たす h´と考えればよいのでは?と思って次のようなきわめて感覚的なことを考えてみたら、結果的に上記の*1と同じようなことになることはなった。

図6


 というか、これだとh´を「すでにある射の合成として示すにはどうしたらいいか」の問題であるように見えてくる。

 それにしても混乱してしまうのは、図3の四角形と図4、図5の四角形は意味が違うのに、どちらの可換性を考えているのかわからなくなるところ。*1は図3の四角形の左側の縦の線、*2は図3の四角形の右側の縦の線を表していると思うのだが。

 そもそもが「射の集まりをつくる関手間の関係」なので、矢印が何段階にも重なっており、いまどこを考えているのか、何がどうなったら可換なのかがクリアに見えていないので、(6)、(7)が何を示しているのか理解できないのだと思う。
圏論 | permalink
  
  

| 1/35PAGES | >>
サイト内検索