<   2014年 04月 ( 13 )   > この月の画像一覧

公案

禅では公案というものを修行者に与えるそうだ。簡単に解けないような謎をひとつ与えてそれを考え続けさせる。その謎を解いていく過程で修行者は悟りを開いていく。

例えば「隻手の声如何」というのがある。両手で手を叩くと音が出るが、片手の音を聞いてみよという問いだ。片手で音が出る訳がないので、隻手の声とは音の可能性でしかない。しかし両手がそろってたたくと音が発生する。その音を発生させるためには隻手は必須条件だ。隻手だけでは音は発生しないが、隻手がなければ音はでない。物事には個というものはなく、全ては他の条件との相互作用でしか存在しないというと仏教の因果の説明になるのかもしれない。禅風の回答をしようと思ったら、導師の前で涼しい顔でポンと両手を打てばいいのだ。涼しい顔というのがポイントだ。

上の答えが正答かどうかは禅の修行者ではないので分からない。しかし、ここで言いたかったのは、本を読むときにこの公案のように考え続けるという事が大切ではないかということだ。難解な表現に出会ったとき、そこで本を読み続けるのをやめて、数日間あるいは数週間考え続けるという事だ。

疑問に思った問題を頭の中にとどめておいて、ああでもないこうでもないと考え続ける事だ。このときに大切なのは自問自答することだ。その問題の解答や解答へのアプローチについて思いついたら、それに関して肯定的立場や、否定的立場などの色々な観点から検討する。本来は、他の人との対話で行うような作業を、自分の頭の中で行うのだ。ソクラテスの問答法を自分の頭の中でだけおこなう事になる。

こういう操作を時間をかけて行っているうちに、だんだんと難解であると思っていた本の記述の意味が分かってくる。問題を種に頭の中で発酵させていく感じだ。これには時間をかけることが必須の条件なのは、パンの発酵と同じだ。

この頭の中の発酵は、もうひとつの副次効果を発生する。それは、いろいろと考えていた事がひとつのパターンに収束して、思考のジグソーパズルが全てはめ込まれたときに、分かったという喜びが起きてくるという事だ。曖昧だった諸条件がひとつのパターンとして相互に関連し合ったときに喜びという感情が発生する。アルキメデスのエウレカだ。これも公案の効果のひとつではないだろうか。

ソクラテスの問答法を利用して、自問自答という形でアイディアを頭の中で発酵させる。このやり方に慣れてきたら、考えるということ自体が楽しくなってくる。
[PR]
by tnomura9 | 2014-04-28 08:26 | 考えるということ | Comments(2)

何となく分かる

本を読んでいて、はっきりとは分からないが、何となく分かるという気持ちになることがある。この何となく分かるという感じが気になってきた。

はっきりとは理解していないのだから、文章の全てにわたってわかっているわけではない。それでも著者の意図というか思考の流れをつかんだという確信のようなものがある。著者が何を考えて何をどう操作しようとしているかが分かったという感じだ。操作の具体的な方法は分からなくても、何をしようとしているかは見当がつくという状態だ。

知識の階層構造と言ってしまえば身も蓋もないが、それだけでは言い尽くせないものがある。知識の階層構造の最上層ではあるが、それを他の所に利用したりなど操作したり加工したりできる程度には知っている必要があるからだ。

テレビのリモコンのことを考えてみるとよい。テレビの内部構造については全く知らなくても電源を入れたり、チャンネルを選択したり、音量を調節したりするのに不便を感じることはない。また、リモコンにはめまいのするような数のボタンがあるが、その全てを知らなくても不便を感じることはない。

知識の階層構造がそれぞれのレベルで利用可能であるために、あまり細部に踏み込まなくても知識の活用ができるという。知識の構造の特徴が「何となく分かる」という便利な状況を作り出している。

気になったのは、この何となく分かるという感じを積極的に学習の戦略として使えるのではないかと思ったからだ。つまり、意図的に何となく分かるという状況を作り出すためにはどういうことに留意したらよいかということだ。

思いつきなので、これといったアイディアがあるわけでもない。まずは、いま読んでいる箇所が何となく分かっているかどうか自問自答することから始める必要があるだろう。何となく分かると感じていたら、それを自分の言葉で表現できるかどうか試してみる。さらに何となく分からないことはないだろうかと考える。

こういう自分との対話を繰り返すことくらいしか今のところ思いつかない。いずれにせよ、何となく分かるということに意識的になってみるのも面白いだろう。

追記

この記事の最初の原稿はスマホで書いてブログに送信した。画面の小ささのためかパソコンで読むと段落が細切れになっていたので修正したが、手書きで入力するのにあまりストレスは感じなかった。XPERIA に搭載されている手書き入力は優れものだ。これでひらがなだけでなくデジタル速記でも入力できれば完璧なような気がする。
[PR]
by tnomura9 | 2014-04-25 22:23 | 考えるということ | Comments(0)

スマホでメモ

ガラケーをスマホに変えた。SONYのXPERlAだ。手書き入力と言うのがあったので試して見たら、快適だった。ひらがなで入力して漢字変換する方式だが、認識もはやく、変換効率が良いのでストレスを感じない。自分にメールしたら、パソコンにも出先からでも取り込めた。

何だかコマーシャルの文章のようになってしまったが、メモ帳がいらなくなってしまった。

ITの進歩のお陰で理想のダイナブックが近づいてきている。(まだほど遠い状態だが、そういう時代も近いのではと感じさせるようになってきた。)
[PR]
by tnomura9 | 2014-04-24 07:44 | 話のネタ | Comments(0)

サブオブジェクト・クラシファイアー subobject classifier

今回の記事で圏論シリーズは一応終わりだ。その先のことは管理人が理解できていないのと、これまでの記事でも、圏論は全てのことを射 morphism, arrow で表現すると考えれば圏論で何のことを論じているのかがわかりやすい(かもしれない)ということを示すことができたと思うからだ。

さて、最終回はサブオブジェクト・クラシファイアー subobjict classifier についてだ。classifier の意味をネットで調べてみたが、選別機というのがいちばんぴったりする感じがした。subobject classifier だから部分対象(集合の圏 Set の場合は部分集合)を選別する機械だ。集合Bの部分集合をいろいろと調べた時に、その部分集合が一定の条件をみたすかどうかを選別する機械だ。

集合 B の部分集合を指定するためには、圏論のお約束で部分集合を指定する別の集合 A から集合 B への mono 射 f で表すことになる。圏論には射しかないのでこんな面倒くさいことをする。

f : A >--> B

これを選別するためにはどうしたらいいだろうか。これは、ある対象 Ω の要素が選別の結果を反映するような特性射 xf を定義して、部分集合を表す f との結合を作ればいいのだ。つまり、

xf : B -> Ω

をつくれば、射の合成

xf . f : A -> Ω

は Ω に選別結果を反映させることができる。これで無事に対象 B の部分集合の選別を行う射を設計することができた。しかし、これは概念設計ができたというだけのことで、この特性射 xf がどのように働くかはこれだけではわからない。特性射の動作設計を行わなければならないのだ。

それが次のサブオブジェクト・クラシファイアーの定義になる。

定義:
圏 C に終対象 terminal object である 1 が存在する場合、次の条件 「#」を満たす射 t : 1 -> Ω を伴った対象 Ω は、C の「サブオブジェクト・クラシファイアー」 subobject classifier と呼ばれる。
条件「#」:任意の mono f : A >--> B について、次の射の配置図がプルバック pullback になるような射 xf が一意的に存在する。

f : A >--> B
! : A -> 1
t : 1 -> Ω
xf : B -> Ω

なおこの xf は mono f (i.e. 対象 B の部分対象 A) の特性射 character と呼ばれる。

xf . f については上で述べた。対象 B の部分集合 f を選別する射だ。! は対象 A から終対象への唯一の射だ。また t は終対象から Ω の特定の1個の要素を指定する射だ。

上の射の配置図が pullback になるというのだから xf . f と t . ! は可換だ。すなわち、

xf . f = t . !

だ。右項の射がこの可換な射は対象 A から対象 Ω のただひとつの要素への射であることがわかる。またこの可換な射の図式がプルバックになることから、A は圏C の Ω の特定の要素に対応する対象のうち最も大きいもの limit であることがわかる。

厳密なところは参考書にまかせるとして、要するにサブオブジェクト・クラシファイアー Ω の要素は、対象 B の部分集合が特定の条件を満たしているかどうかの選別機の出力を表している事がわかる。また、対象 B の部分集合は f で代表することができるし、f の選別結果は xf . f という合成射の値である Ω の要素で表される。

こういう選別機が登場するのは論理学の場合だ。すなわち集合 B が真理集合で、特性射 xf は命題関数、サブオブジェクト・クラシファイアー Ω は真理値の集合になる。

また、論理学でなくても、判別関数はいろいろな分野でお目にかかる。圏論の面白いところはこのようないろいろな分野で現れる判別関数の構造を

xf . f = t . !

という射を用いた簡潔な表現できちんと表現できることだ。

圏論というとなにか抽象的で近寄りがたい印象を持っていたが、要するに「全ての構造を射のみで表すこと」がその目的だという視点で見ると、結構プログラミングにも応用できることが多いのではないという気になってきた。

追記

このシリーズの記事の参考書の表題は『圏論による論理学 高階論理とトポス』だ。高階論理は読んでみればわかるがほとんど Haskell そのものだ。また、トポスは、終対象、対象の積、冪対象、サブオブジェクト・クラシファイアーを備えた圏のことだ。これも Haskell だ。
[PR]
by tnomura9 | 2014-04-20 10:21 | 圏論 | Comments(0)

声帯を横に広げる発声法

高い音を楽に出す方法を思いついた。

感覚的なものなので伝わるかどうかは分からないが、声帯を横に引っ張ると良いようだ。高い音を出すためには声帯にテンションをかける必要がある。しかし、縦にテンションをかけると息の通り道が塞がって苦しい音になる。

声帯を閉じて発生する地声と、声帯を開けて音をだす裏声を試してみるうちに、息の通り道を確保しながら声帯にテンションをかけるには、声帯を横に引っ張ればいいのではないかと思いついた。

そこで、高い音を出すときには、のどを横に開くような感じで声を出したら、あら不思議、高い音がのどを詰まらせずに楽に出るようになった。

こんな文章で伝わるかどうか分からないが、試してみてください。のどを開けながら横に広げる感じだ。

東京キッドが声が裏返らずに歌えた。

参考動画 : 声帯振動
声帯を閉じて発生する場合と、声帯を開いて発生する場合の声帯の様子を記録した動画。高い音を出す場合声帯はやや開いている感じにするとよい。

もう一つ高い声を楽に出す方法を見つけた。それは息を吸いながら声をだす方法だ。

息を吸いながら声をだすことは実際にはできないので、腹筋の下の方を引っ込めて、胸郭は息を吸う時のようにふくらませながら声をだすのだ。最初にそういう動きで息を何回か吸ったあと、吸気の最初の方で声を出すとよい。吸気の時の胸の動きを妨げないようにしてそのまま声を出す。このとき喉の力はできるだけ抜くようにするのがコツだ。声を飲み込むようなイメージも有効だ。

変な方法だが、この方法でも高い音を出すのが楽になる。

まだ他にもいろいろな方法があるかもしれない。声を作るのは面白い。
[PR]
by tnomura9 | 2014-04-18 00:59 | ボーカロイド | Comments(0)

冪対象 mapping object, exponentiation

1. 関数を要素とする集合(対象)

対象 A から B への射のひとつが f : A -> B だったとする。しかし、対象 A から B への射はひとつだけではない事が普通だろう。g : A -> B もあるかもしれない。このような対象 A から対象 B への射を全て集めたものを冪対象 BA と言う。

しかし、射の集合のようなものをどうやって射のみであらわせるのだろう。そこで、射そのものを対象で表すのは難しそうなので、先ず射の名前を集めた対象(集合)を考えてみる。このような射の名前を集めた集合をかりに BA と呼ぶ事にしよう。

つぎに、射の名前と値の集合 A の直積集合を考えてみる、これは BA × A で表す事ができる。この集合の要素は、BA の要素である射の「名前」fi と A の要素である aj のペア (fi, aj) である。

このペアは fi という名前の射を aj に関数適用した値 b ij に対応しているはずである。そこで射の名前のペアと射の値を対応させる射 ev を考えることにする。すなわち、

ev : BA × A -> B

だ。ところで圏論では対象 A の要素は終対象 1 から対象 A への射 f : 1 -> A で表す事ができる。そこで、

f : 1 -> BA

という終対象から射の集合への射を考えると f は BA の1個の射の名前を指し示す事になる。

同様に終対象 1 から値の対象 A への射 a を考えると、

a : 1 -> A

射 a は値の対象 A の特定の値を指し示す。これと前回述べた射の積を利用して、

f × a : 1 × 1 -> BA × A

という射を作ると。f × a は対象 BA のひとつの射の名前と対象 A のひとつの値の要素とでつくられたペアである BA × A の要素を指し示す事になる。したがって、これに上に述べた関数の名前と値のペアを評価する関数 ev を適用するとその値である B の要素を指し示す事ができる。つまり、

ev . (f × a) : 1 × 1 -> B

である。射 ev は始対象2つの積を domain とし、値 B の特定の要素を指し示す関数である。これでめでたく、関数を値に関数適用したときの値を、ev . (f × a) のように射のみを使って表現できた。

上の例は1個の関数を1個の値に関数適用した場合だったが、1個の関数を A の全ての要素の値に関数適用する方法も考える事ができる。この場合の射は a ではなく idA (identity) を使って次のようにする。

ev . (f × idA) : 1 × A -> B

この場合射 ev . (f × idA) は全ての対象 A の要素を関数 f によって対象 B の要素に対応付ける。

最後に BA の部分集合について考えてみる。任意の対象 C から BA への射

g : C -> BA

の像 g( C ) は BA の部分集合を定める。したがって次のような射

ev . (g × idA) : C × A -> B

は複数の A -> B の射のそれぞれの対象 A の値についての対象 B の値を定める。これで、次の冪対象の定義を理解する準備ができた。

2. 冪対象の定義

冪対象の定義はつぎのようになる。

定義
C において下記の (1) (2) が成立するとき、C は冪 exponentiation を持つと呼ばれる。
(1) C の任意の対象には、その積が存在する。
(2) C の任意の対象 A, B について、次の条件 [#] をみたす対象 BA と射 ev : BA × A -> B が存在する。
条件 [#] : 任意の対象 C と射 g : C × A -> B について、ev . (^g × idA) = g をみたす ^g が一意的に存在する。ただし、
g : C × A -> B
^g × idA : C × A -> BA × A
ev : BA × A -> B

この定義の条件が束縛しているのは対象 BA と射 ev の性質だ。対象 BA が冪対象であるためには、BA と射 ev が上述の条件を満たしていなければならない。

前述のセクションで述べたように、射 ev . (^g × idA) は複数個の A -> B の射の対象 A の全ての要素に対する値を指し示している。これが上の定義を満たしているとき、どんな

g : C × A -> B

に対しても ^g : C -> BA を見つける事ができる。この場合 C は A -> B の全ての射のうちのいくつかを指定する添数と考える事ができる。すなわち、

fc : A -> B, c ∈ C

である。

これで圏に関数を要素とする対象を導入する事ができた。いままでの経過を振り返ってみると、圏の性質が、だんだん Haskell のプログラムに似てくる。射を表す形式は関数の type signature そのままなので親しみがわく。Haskell のプログラムは圏のひとつなのだからそれは当然なのだが、Haskell のプログラムの構造が射のネットワークで抽象化できるのが分かる。圏論にもっと詳しくなれば、Haskell のプログラムのデザインパターンのようなものを射の図式で表現できるようになるのかもしれない。

特に射で表現する圏論の表現力の簡潔さは素晴らしい。上で述べたように複数の関数の全ての値のようなものも

ev . (^g × idA)

のようにさらりと表現してしまえる。これを集合の言葉や手続き型のプログラムで表現したらどれだけ長い記述になってしまうだろうと思ってしまう。

そのうち、圏論の学習が IO モナドを理解するためだけにあるのではない事が分かってくる気がする。

『圏論による論理学 高階論理とトポス』清水義夫著を参考書にして、圏論で何を表現したいのかということについて思いついた事を書き散らしてきたが、そろそろ理解の限界に近づいているようだ。圏論について語るためにはもっともっと理解しないと行けないことが多い。それにはたくさんの時間がかかりそうなのでこの記事のシリーズもそろそろ終わりにしたい。

次回の記事でサブオブジェクト・クラシファイアーについて挑戦するが、そこまで分かるとトポスの定義にたどり着くのでそこでこの圏論シリーズを終わりにするつもりだ。

ただ、圏論の勉強が単に IO モナドの理解のためだけではなく、Haskell のプログラミングの本質にも関わってきそうな事が分かって少しやる気が出てきた。そのうち出てくるだろうけれど Haskell のプログラマーの立場からの圏論の参考書が待ち遠しい。
[PR]
by tnomura9 | 2014-04-17 08:15 | 圏論 | Comments(0)

射の積 product of arrows

射の積 product of arrows とは domain も codomain も異なる2つの射 f : A -> B, g : C -> D の積だ。

この2つの射の積となる射をもとめるのに、どんな方法でも構わないのだろうが、圏論では次の定義のように A と C の積 A × C から、B と D の積 B × D への射を定義し f × g で表す。つまり、射 f と g の domain 同士の積から codomain 同士の積への射を f と g の積として定義している。

定義
f : A -> B, g : C -> D とする。このとき <f . π1, g . π2> : A × C -> B × D は、f と g との 「射の積」 product of arrows と呼ばれ、記号 f × g で表される。

上の定義を集合の言葉で表してみる。集合 A と集合 B の直積集合 A × C の要素を (a, c)、B × D の要素を (b, d) とすると、

b = f (a), d = g(c)

という関係がある。また、直積集合の要素で表すと、

(b, d) = (f × g) ((a, b)) = (f(a), g(b))

となる。射の積 f × g は射 f と射 g の性質を保存したまま、直積集合と直積集合の間の射にまとめ上げているとも言える。

また、射の積の図式には、対象の積の図式が隠れている。射の積の図式は次のようになっている。

f : A -> B
g: C -> D
π1 : A × C -> A, B × D -> B
π2 : A × C -> C, B × D -> D

したがって、

f . π1 : A × C -> B
g . π2 : A × C -> D

これは、A × C = E とおくと、次のような図式になる。

f . π1 : E -> B
g . π2 : E -> D

これは、B × D という対象の積を定義するときの図式だから、

f × g : A × C -> B × D



<f . π1, g . π2> : E -> B × D

と同じものであることがわかる。

射の積 f × g がどのような目的で定義されているのかは、参考書には書かれていない。しかし、これは、射(関数)の集合を扱うときには便利な道具としての機能を発揮する。

いま、A -> B の関数(射)全てを集めた集合 BA を考える。そうすると、関数の集合 BA と値の集合 A との直積は、全ての関数と全ての値の組み合わせのペアの集合になる。

このとき特定の関数すなわち、BA の要素と全ての値の要素との組み合わせを取り出すにはどうしたら良いだろうか。

圏論では対象の要素を表す言葉がないので、終対象 1 から対象 C への射 e : 1 -> C で要素を表現する。したがって、全ての A -> B の関数の集合 BA の中から1つの関数を取り出すには、

f : 1 -> BA

という射で表現しなくてはならない。しかし、この場合でも BA × A という対象から特定の関数とそれを関数適用させる全ての値 A とのペアを取り出すにはどうすればいいだろうか。

その答えは 1 × A を domain とし、BA × A を codomain とする射 f × idA で表現すればよい。つまり、

f × idA : 1 × A -> BA × A

である。この例では BA の要素を指定するのに終対象 1 を用いたが、これは任意の対象 C をとってもよい。この場合射 g で指定される要素は複数になる。

g × idA : C × A -> BA × A

これで射のネットワークを解析するための道具がまたひとつ増えた。しかし、どんな道具も構造を全て射で表現するという圏の大方針を頭においておくと、その抽象性に当惑せずに使い方を考えることができる。

また、射の積 f × g にしても、簡単な対象と射の図式にずいぶん複雑なものを詰め込めるものだと感心する。射の表現がどんなに簡潔かは、同じことを集合の言葉で表現してみるとわかる。圏論を数学者に独り占めさせるのはもったいないのかもしれない。
[PR]
by tnomura9 | 2014-04-16 01:09 | 圏論 | Comments(0)

プルバック pullback

プルバック pullback の定義は次のようになる。

定義
A -- f -> C <- g -- B について、A <- g' -- D -- f' -> B が次の条件(1)(2)をみたすとき、A <- g' -- D -- f' -> B は A -- f -> C <- g -- B の「プルバック」pullback と呼ばれる。
(1)f . g' = g . f' である。
(2)任意の E について f . h = g . k であるような射 h : E -> A, k : E -> B があるとき、h = g' . l, k = f' . l となるような射 l : E -> D が一意的に存在する。

まず(1)について見てみる。

pullback という意味は、うしろに引っ張るとか、弓を引くとか、軍隊を撤退させるとかいう意味らしい。数学の他の領域で使い始められたらしいがその説明を読んでも意味がわからなかった。したがって、何を後ろに引っ張るのかは謎のままだ。

名前の意味はともかく、元になっているのは f : A -> C, g : B -> C という2つの射で、それの pullback が g' : D -> A, f' : D -> B という2つの射であるようだ。

f : A -> C, g : B -> C については何の制限もない。codomain が同じ C である2つの射について考えているだけだ。したがって、問題は g' : D -> A, f' : D -> B がどのような射であるかということになる。それらの射は次の条件をみたしていなければならない。

f . g' = g . f'

これは D -> A -> C というルートと、D -> B -> C というルートが可換である、つまりどちらのルートをとっても上の合成関数が同じ値になるということだ。射 f と g の間には特に関連性はないが、g', f' をとることで上のような可換性が見られることになる。

こういう任意の射について、特定の射をとることによって、合成関数が可換になるというパターンは圏論にはよく出てくるようだ。前に述べた equalizer の場合も適当に選んだ f : A -> B, g : A -> B について適当な e : C -> A をとることで f . e = g . e となることを示していた。

(2)についても圏論の定義にはよく見られるパターンだ。

プルバックの場合 f . g' = g . f' が可換だが、f . h = f . k が可換になるような射の組 h : E -> A, k : E -> B は g', f' に限らない。しかし g', f' はその domain D と h, k の domain E の間で l : E -> D があり、h = g' . l, k = f' . l が可換になるというところが h, k と一線を画している。

こういう言い方をしていいのかわからないが、g', f' はそういう h, k の中で最大の規模の射であるといえるかもしれない。

equalizer にしろ pullback にしろ、射のみで構成された圏論の部品の1つだ。この部品を使うことによってさらに複雑なネットワークをもつ圏の構造を解析していくことになる。
[PR]
by tnomura9 | 2014-04-14 07:39 | 圏論 | Comments(0)

積 product

圏論を勉強するときのコツが掴めてきた。要するに集合で表現できる事を射のみで表現するにはどうすればいいのかと考えればいいのだ。逆に、射のみを用いた定義や定理の意味が分からないときは、集合の言葉ではどういうものかを考えればいい。

集合の圏である Set だけが圏ではないが、Set も確かに圏な訳でこれで圏の考え方に慣れてから、論理学や群やトポロジーに挑戦すればいいのではないか。

最近のこのブログの圏論の記事の参考書は清水義夫著『圏論による論理学 高階論理とトポス』だ。この本では関数型高階論理と圏論のうちでもトポスについて、それらの基礎を解説するとともに、関数型高階論理とトポスの対応関係について述べている。そうして、トポスこそが人間の知的認識に置ける普遍論理であろうと主張している。

普遍論理が何かということはまだよく理解できないが、とにかく、このブログではこの本に書かれている圏論の定義や定理について、これを集合の言葉で解釈するというアプローチで挑戦してみたい。

1. 積 product

圏論の対象の積とは集合ではカルテシアン積のことだ。カルテシアン積とは集合 A と集合 B の要素のペアの集合の事だ。すなわち、次のような直積集合のことだ。

A × B = {(a, b) | a ∈ A ∧ b ∈ B}

これを対象の中を見ないで射だけで定義すると次の定義のようになる。

定義(積)
次の条件(1)、(2)を満たす対象 A × B が圏 C の中に存在するとき、 A × B は A と B との「積」product と呼ばれる。
(1)A <- π1 -- A × B -- π2 -> B なる2つの矢 π1、π2 が存在する。
(2)任意の C, f : C -> A, g : C -> B について f = π1 . h かつ g = π2 . h を満たす射 h : C -> A × B が一意的に存在する。

(1)は射 π1 と π2 が直積の射影 projection であることを示している。
(2)では任意の対象 C からの射を使って対象 A, B の積 A × B を定義しているが、圏論では対象の要素を直接に扱う事ができないので、対象 C からの射によって A, B, A × B の要素を指し示している。A と B の直積なので対象 C が余計のような気がするが、これがないと射で要素を指定できない。

射 f, g, h が対象の要素を指し示しているのは、C が要素1個だけの集合 singleton の場合を考えてみれば分かる。このときには f, g, h ははっきりとそれぞれ1個の要素を指し示している。そうしてこのような singleton C は、やはり射だけを用いて終対象として定義できる。実際は対象の要素について述べる場合もこういう工夫で射のみを用いて記述することができる。

面倒なことをしているようだが、全ての議論が射で行われれば、対象の要素については語る必要がなくなるので、集合でなくても圏の構造を持っている数学的構造については、射についての議論で同じように論じる事ができる。たとえば、集合と論理学の構成要素はずいぶん異なっているが、どちらも圏を形作ることができるので等しく対象と射の定理を適用できる。

さて、Set の場合 h はどのような関数になるだろうか。対象 C の要素 x にf を関数適用させたときの値は A の要素 f(x) で g を関数適用した値は B の要素 g(x) であるとき、それに対応する A × B の要素の値は (f(x), g(x)) という順序対になる。したがって h(x) = (f(x), g(x)) とすると上で述べた条件の、

f = π1 . h かつ g = π2 . h

が満たされる。また、この h は A × B の射影が π1, π2 という条件下では一意的である。この h は f, g を用いて <f, g> で表される。

このように、集合の圏 Set における概念を射に翻訳すると、見た目面倒な定義になってしまうが、対象の要素について言及しないようにしまえるので (external の立場) 、圏論における推論は集合の圏 Set 以外にも成立することになる。

2. 積 product を利用する利点

オブジェクトの積を定義する射の複雑なネットワークは、カルテシアン積を射で表現するために必須だが、それ以外にもメリットがある。それはドメインが同じ C である2つの射 f : C -> A, g : C -> B があるときに、ほぼ自動的にそれらを統合した射 <f, g> : C -> A × B や射影 π1, π2 の存在を考える事ができるということだ。

射 f と g があったとき、自動的にそれらを統合した <f, g> を考える事ができるというのは、脳のエネルギーのかなりな節約になる。2つの射があったときにそのことから生じる射の構造が自動的に思い浮かぶからだ。それによって、個々の射(関数)の性質を離れて、射全体の構造に目がいくことになる。

圏論の抽象性は、現実世界の出来事の「構造」に焦点を当てるとき、非常に便利な道具になる。現象の中の構造を把握するという事は、数学に限らずプログラムを作成する上でも大切になってくる。将来は、圏論が数学者の手を離れて、プログラムの設計を圏論の言葉で行うというような時代が来るかもしれない。
[PR]
by tnomura9 | 2014-04-13 07:19 | 圏論 | Comments(0)

イコライザー equalizer

音響機器のイコライザーの働きは、周波数特性の違うマイクやスピーカーやレコーダーの周波数特性を調節して均一化 equalize するものだ。

圏論のイコライザーにも似たような均一化のはたらきがある。f, g という2つの異なる A -> B の射があるとき、対象 A における f, g の定義域をその部分集合に制限することによって、その定義域では f(x) = g(x) になるようにする射 e : C -> A を f と g のイコライザー equalizer という。e : C -> A の像は必ず A の部分集合になることに注目するとその意味が分かる。

圏論のイコライザーの定義は次のようになる。

射 f, g : A -> B において、射 e : C -> A が存在して、次の条件 (1), (2) を満たす時、e は f と g との『イコライザー」 equalizer と呼ばれる。

(1) f . e = g . e
(2) 任意の h : D -> A について、f . h = g . h であるなら、h = e . k である k : D -> C が一意的に存在する。

上の条件のうち (1) は、 e で規定される A の部分集合が始域となるとき f = g であることを示している。つまり f と g の始域 A をその部分集合に制限すると f と g が同じ関数になってしまうということだ。関数 f と g の共通部分と言ってもいい。

(2) は e で指定するような A の部分集合はたくさん考えることができるが、そのどれもが e が指示する A の部分集合のそのまた部分集合になるということだ。言い換えると、e は f = g を満たす A の部分集合のうちの最も大きい部分集合を指定しているということだ。

(2) の定義の h はそのような A の部分集合を像とする関数だ。また、k は C の部分集合を像とするので h = e . k は C の部分集合から A の部分集合を定める射になる。

e が equalizer であるためには h = e . k となる k は一意的でなければならない。これは後で述べる論証で重要な性質となる。集合の圏 Set の場合 k が一意的であるための条件はなんだろうか。h : D -> A, e : C -> A, k : D -> C で h = e . k となるとき、D = {d1, d2, d3} で C = {c1, c2}, A = {a1, a2, a3, a4} であったとする。このとき各射(写像)が次のようになっていれば、h = e . k が成立する。

h : d1 -> a1, d2 -> a1, d3 -> a2
e : c1 -> a1, c2 -> a2
k : d1 -> c1, d2 -> c1, d3 -> c2

この場合 h, e に対して k はひと通りしか考えられない。それでは、次のような場合はどうだろうか。

h : d1 -> a1, d2 -> a1, d3 -> a1
e : c1 -> a1, c2 -> a1
k : d1 -> c1, d2 -> c1, d3 -> c2

この場合も確かに h = e . k は成立する。しかし、この場合は次のような k' の場合も h = e . k' となって、k : D -> C が一意的とは言えなくなってしまう。

k' : d1 -> c1, d2 -> c2, d3 -> c2

したがって、どのような h : D -> A に対しても k : D -> C が h = e . k かつ k が一意的であるためには e が特別な性質を持っている必要があることがわかる。

equalizer について長々と書いてきたが、実は、この記事ではそれが主眼ではなく e の性質を論証するのに射と射の関係を考えるだけでよいということを示したかったのだ。mono や epi のような射が射の関係だけで定義されていれば、あとの論証はその射と射の関係を利用して、射の間の構造を調べるだけで論証を勧めることができる。

それでは本題である次の定理について考えてみよう。

定理:
圏 C において、e : C -> A が f, g : A -> B なる f と g との equalizer であるなら、e は mono である。

e が mono であることを証明するためには、適当な対象 D を考えて、h, k : D -> C について e . h = e . k ならば h = k であることを論証すればいい。そこで仮に e . h = e . k であると仮定してみる。このときどのようなことが起きるだろうか。

まず、利用できそうな射と射の関係を列挙してみる。

1) e . h = e . k (仮定から)
2) f . e = g . e (e が equalizer だから)
3) y = e . x のとき x は一意的 (e が equalizer だから)

上の関係を利用すると次のような射の合成の性質がわかる。

f . (e . h) = (f . e) . h

これは圏では射の合成が結合的であることからわかる。推論を先に進めてみる。

f . (e . h) = (f . e) . h = (g . e) . h = g . (e . h)

つまり、

f . (e . h) = g (e. h)

このことは、(e . h) が equalizer の定義で述べた h (左の h とは異なるので注意!)に (e . h) が相当していることがわかる。したがって、e が equalizer であることから、

(e . h) = e . h

であれば h は一意的である事がわかる。同じような推論が k についても行われるので、次の2つの式を見比べることによって h = k であることがわかる。

(e. h) = e . h (ただし、(e . h) : D -> A)
(e. k) = e . k (ただし、(e . k) : D -> A)

したがって、e . h = e . k のとき h = k だから、e は mono であることがわかる。

このように、圏論では射と射の間の関係について論証するだけで、上で述べたような対象の要素に対する検討をしなくても射 e の性質を調べる事ができる。

圏論についての記事は当分これで終わりだ。まだ、それ以上のことを理解していないからだ。しかし、これで、圏論が射のみを用いて推論を行うことや、圏論で常に現れる図式の意味がわかった気がする。
[PR]
by tnomura9 | 2014-04-10 18:51 | 圏論 | Comments(0)