yamicha.com's Blog - Presented by yamicha.com
Blog yamicha.com's Blog - 2018/10 の記事
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31]

yamicha.com's Blog
 諸事情により、現在更新休止中。ご了承ください。もし今後ブログを再開することがあるとすれば、その際にはこのブログスクリプトではなく、新しく開発したものによるかもしれません。
 当ブログ管理者についてはこちらをご参照。
開発魔法(737)
社会問題(733)
お知らせ(11)
質問・バトン回答(15)
ゲスト出演(8)
経済・知的財産(150)
ゲーム開発(182)
[Ada] 勝手に補足
- Note
- 金配りの次の一手


- Endless Ultimate Diary
- 銃世界

漢字バトン
- うるる雑記帳
- 漢字接力棒

ツキアイゲノムバトン
- ブログ@うにうに画像倉庫
- あぶ内閣

縺イ縺セ縺、縺カ縺励ヰ繝医Φ
- 月夜のボヤキ
- 騎士サーラバトン
パスワードを使う
名無し (2012/02/27)


開発者解放裁判
yamicha.com (2010/03/14)
Winnyに関しては、私も「純白」とまでは考えておりませんし、使用し..

開発者解放裁判
通りすがり (2010/03/08)
winnyに関しては「ダウンロードソフト板」なんてところを拠点に開発..

新型インフルエンザの恐怖
いげ太 (2009/11/03)
> C#などの「int Some(int , int)」は、F#では「(int * int) ->..

時効に関する思考
yamicha.com (2009/08/31)
>いげ太さんコメントありがとうございます。手元にドキュメントが少..
Homepage
Blog Top
Normal View
List View
Search
Calendar
Comment List
Trackback List
Blog RSS
Send Trackback
Phone Mode
Administrator
yamicha.com
Blog
るううるる。
Source
法令データ提供システム
FindLaw
Development
Java2 Platform SE 6
Java EE 6 API
MySQL Developer Zone
PHP Reference
MSDN Library
Ada Reference Manual
Objective Caml
Python Documentation
Erlang
Prolog Documents
 垂オ訳ございませんが、現在このブログではトラックバックを受け入れていません。

 この記事に対してリンクされる場合には、こちらのURLをご利用ください。
http://void.yamicha.com/blog/blog.cgi?mode=view&number=641
 上記URLをトリプルクリックされますと、簡単にURL全体の選択が行えます。

※以下の記事がトラックバックされます。
イス取りゲーム
2008/04/08(Tue)23:30:04
 日銀の総裁問題で、民主党は白川氏の総裁格上げを容認したものの、渡辺氏が副総裁となることについては不同意を決定しました。与党が白川人事のみを受け入れれば、とりあえず総裁空席の状態は回避されることになります。
 日銀の人事に関しては、最近は「たすきがけ人事」(財務省と日銀出身者が交互に総裁ポストに就任する習慣)の事実もちらほら報道されるようになってきており、おそらく「日銀の独立性」の重要性も以前に比べれば多少は認識されてきたことでしょう。世論調査を見ても、日銀総裁問題について「政府に責任がある」と考える人は非常に多く、民主党に全責任を押し付けた上で財政と金融の分離に疑念のある人事を通そうという政府や一部マスコミの目論見が完全に失敗していることが分かります。
 無論、民主党の対応も100点満点とはいきません。日銀の独立性が重要であることはここでも繰り返し述べていますが、民主党の反対は日銀の独立性を担保するためというより、小沢氏による「反対のための反対」の道具に使われた印象は否めません。反対の理由はどうあれ、主張自体は決して間違ったものではありませんが、あまり良い印象を持たれていないことは明らかです。
 経済の問題は非常に難しいため、インサイダーや証券などの犯罪にせよ、金融と財政の分離にせよ、一見すると何が問題であるのか分からない例が多いのですが、だからこそ民主党は反対の説明責任を十分に果たす必要がありました。現状でなされている説明はとても十分なものとはいえず、問題はあまり深く理解されていません。また、今回の例でも党内から渡辺副総裁人事に賛成する声が出るなど、民主党が一枚岩ではない印象も受け、党内がガタガタなせいで迷走振りがさらに印象付けられています。
 今回、民主党が白川氏格上げを了承したのは妥当な決定でしょう。白川氏には民主党が主張するような問題がない以上、これに同意しないのは単なる反対のための反対であって、それをする正当性は全くありませんので、おそらく世論の支持は全く得られなかったでしょう。また、実際に白川氏は財務(大蔵)官であるなどということはなく、独立性の点からも妥当な人事です。さらに総裁の空席も回避できます。
 一方、政府側の行動にも非常に多くの疑問があります。あえて民主党に反対される可能性が高い人事をあてつけのようにぶつけてきており、民主党が「反対のための反対」であるなら、政府は「反対されるための行動」を取っています。前述の通り経済の問題は難しい上、民主党は十分な説明を行っておらず、しかもマスコミの多くも日銀の独立性の重要さについて切り込んでいませんので、民主党の反対行動を印象付ければ世論の批判をかわせるとの魂胆なのでしょうが、このような行動を取っても混乱が深まるばかりです。
 実際にこれまでの人事案を見ても、武藤氏、田波氏、渡辺氏とすべて財務(大蔵)人事です。政府が彼らを純粋に適任者であると考えたのか、財務省出身であるためコントロールまたは「たすきがけ人事」ができるという民主党が指摘しているような下心があったのかは分かりませんが、政府としてはこれらの人事を通したかったのであろうことは明らかです。しかし、民主党が基準を示して反対している以上、次善の策として財務省以外から優秀な人材を連れてくるのが混乱回避のために最も適切な手段であったことは言うまでもありません。政府・与党にはそれができたにもかかわらず、あえてそれをしなかったのです。
 しかし、これでとりあえず総裁の空席は埋まりましたし、副総裁についても政府はそろそろ現実的な人事を出してくるころでしょう。民主党としても問題のない人事であればほぼ確実に通すはずですから、この程度の混乱で日銀の独立性が担保できるのであれば十分な収穫でしょう。
 日銀の独立性が侵される危険は、渡辺氏の所信聴取時の民主党議員の質問にも表れています。同党の議員が国債に対する質問をしたところ、渡辺氏は「国債のために金利を下げる政策運営はしない」と言い切りましたが、つまり国としては金利が上がって国債の利払いが増えれば苦しくなり、際限なく国債を発行するのも難しくなるため、政府としては金利の上昇を嫌う場合がありますが、日銀には政府のそのような干渉を跳ね除ける力が要求されるわけです。
 また、以前の記事で述べたことをもう1度取り上げておくなら、先に量的緩和やゼロ金利が解除となった際、政府・与党の一部はこれに対して強い反発を表明し、「法案を提出する」ことまで口にして日銀を恫喝しました。財務(大蔵)省出身では圧力を退けられないと言い切ることはできませんが、このような恫喝にも屈しないことを担保できる人事といえば、やはり財務省出身でないことが望ましいのです。
 今回の総裁騒動について、諸外国からの日本の信頼が失墜し、日本の金融が意外にもろいことが明らかになったと評する向きもありますが、むしろこの程度の混乱で日銀の独立性が話題に上り、しかもそれがより強く担保されるような人事がなされ、さらに「たすきがけ人事」が一掃されたのは大きな成果であると考えるべきでしょう。

 このところHaskell、COBOL、F#、Scheme、Lispに挑戦してみていますが、とりあえずモナドからParsecまでおおむね使えるようになったHaskellを。私にとっては初めての関数型言語です。
 関数型言語には色々ありますが、その中からあえてHaskellを選んだのは、Perl 6のインタプリタであるPugsがHaskellで書かれているらしいことが分かったためです。Pugsは不完全なインタプリタではありますが、Perl 6の構文はそこそこ動作します。どうせ関数型言語を学ぶなら、それなりのものが書けるという実績のある言語を選ぶ方が良いに決まっています。
 Haskellの特徴は以下の通りです。

・参照透過的である
 関数に同じ引数を与えると、その関数は必ず同じ値を返すことが保証されています。CやPerlなどの一般的な言語では変数にデータを代入しますが、参照透過的な言語においては値の代入は許されません。1度生成された物の値が変わることは許されないのです。したがって、例えばC++やJavaでよくある
for(int i = 0; i < size; i++){
	...
}
 このようなコードはあり得ません。iの値が変更され、参照透過性を破壊しているためです。

・遅延評価である
 関数やリストは評価が必要になった時に評価されます。評価が不要なものは最後まで評価されません。遅延評価の弱点として、何がどのような順番で実際に評価されるのかが分からないことがありますが、Haskellは参照透過的な言語であるため、同じ引数を与えた関数は必ず同じ値を返すことが保証されており、何がどの順番で評価されようと関係ありません。
 したがって、次のようなコードは動作します。
inflist = [1..]	-- 1から始まる無限の長さを持つリスト
main = take 5 inflist	-- リストの頭から5個の値を取り出す
 また、関数は必要になるまで評価されないため、
f a = 10	-- 引数を1つ取って10を返す関数 f
main = f someFunction	-- someFunction は何らかの関数であるものとする
 someFunctionは評価されません。仮にsomeFunctionが必ずエラーを投げて処理を終了するようなものであったとしても、関数f内ではこれを評価する必要がないため評価しません。

・モナド
 上記2つはHaskellの長所でも短所でもあります。代入ができなければ変数の変化を追うことは困難ですし、色々と不便もあります。また、IO処理は参照透過や遅延評価と相性が悪いものとされています。

1.参照透過性とIO処理
 C言語のgetsやscanf、C++のcin、JavaのSystem.in.read、C#のConsole.ReadLineなどはユーザーの文字入力を促し、何らかの方法でその文字列を返します。つまり、同じ関数を同じ引数で呼び出したとしても、ユーザーの入力によって動作が違ってしまうのです。これは参照透過性を破壊します。同じように参照透過性を破壊するものとして、ファイルの入力や日時の取得、ランダム処理などがあります。

2.遅延評価とIO処理
 参照透過性が守られている限り、関数はいつ評価しようと同じでした。しかし、IO処理で処理の順番が分からないのは困ります。順番にメッセージを表示するはずが、表示順が逆転してしまうかもしれません。また、ユーザーの入力を受け取って何らかの出力処理を行うような場合、出力が入力の前に来るのは非常に困ります。

 これを解消するのがモナドです。モナドは今のところHaskellにしか見られない特徴です(WikipediaによればF#にもあるらしいのですが、詳細や事実は不明です)。しかし、このモナドがまたHaskellの鬼門と呼ばれているもので、嫌になることうけあいです。

 以上がHaskellの特徴です。Haskellといえばモナド、モナドといえばHaskellなのですが、これを最初から扱うのは厳しすぎますので、ごく基本的な構文の覚え書きを。
 ひとまず基本の関数定義から。
f = 10
 これで「10を返す関数」を定義します。決してfに10を代入するのではありません。Haskellには代入がないため、=記号は関数定義に用いられます。
 関数を書くのであれば、プロトタイプ宣言を書いておく方が分かりやすいでしょう。
f :: Integer
f = 10
 関数は引数を取ることができます。
f :: Integer -> Integer
f x = x
 これは整数を取ってその整数を返す関数です。
 しかし、このような関数は整数以外にも使えるはずです。C++なら
template<class T> T f(T x){
	return x;
}
 などと書くところでしょう。何とも恐ろしいことに、Haskellはこのような機構を標準装備しています。
f :: a -> a
f x = x
 これだけです。aが何型であるかは分かりませんが、何らかの型を取って同じ型を返す関数になります。
 ちなみに、このプロトタイプを
f :: a -> b
 このように書くと、何らかの型を取って違う型を返す関数になります。ただし、aとbが同じ型を表す(この場合は何らかの型を取って同じ型を返す)ことも許されています。
 関数は2つ以上の引数を取るように表記できます。
plus :: Integer -> Integer -> Integer
plus a b = a + b
main = plus 2 3
 しかし、2つ以上の引数を取る関数というものは存在しません。2つ以上の引数を取る構文は、上記なら「Integerを取って「Integerを取ってIntegerを返す関数」を返す関数」を実行した後に「Integerを取ってIntegerを返す関数」を実行する糖衣構文に過ぎません。
 ここで重要になるのが「カリー化」の概念です。Haskell自体が論理学者「ハスケル・ブルックス・カリー」にちなんで名づけられたもので、「カリー化」の名称もこの人にちなんだものです。カリー化を使うと「関数の一部に引数を与えた新しい関数を返す」ことができます。
 方法は簡単、関数に一部だけ引数を与えるだけです。
-- 2つの引数を取って値を返す関数
plus :: Integer -> Integer -> Integer
plus a b = a + b

-- plus の最初の引数に 10 を与えてカリー化
-- これで Integer を取って Integer を返す関数のできあがり
plus10 :: Integer -> Integer
plus10 = plus 10

-- このように書ける
main = plus10 5

-- または plus10 の定義を省略して
main = (plus 10) 5
 Haskellの関数はファーストクラスであるため、変数であるかのように引数として渡したり返り値にしたりすることができます。そればかりか、変数自体が「変数に見えるもの」であって、その実体は特定の値を返す関数です。
 その時にしか使わない関数を用いるには、ラムダがよく用いられます。
-- 整数と(整数を取って整数を返す関数)を取って整数を返す関数
-- 何らかの整数に対してユーザー定義の計算を実行できる
userDefinedCalc :: Integer -> (Integer -> Integer) -> Integer
userDefinedCalc a f = f a

-- (\x -> ...) がラムダ記法
-- 引数を1つ取って何らかの値を返す匿名関数が作られる
-- ここでは2乗の処理をしていることが分かる
main = userDefinedCalc 20 (\x -> x * x)
 関数を取る関数を「高階関数」と呼ぶそうです。
 後はクラス(C++などのクラスとは全く概念が違う存在)やリスト内包、letやwhereによる局所関数、タプルなど取り上げるべき概念は山のようにありますが、今後取り上げるかは不明です。これらを覚え書きするにしては他に優れた解説が山のようにありますし、Haskellといえばモナドですから、覚え書きならこれを中心にする方が適当でしょう。
 以下、数学の分野である「圏論」のモナドについての解説です。

 数学には「圏論」(カテゴリー・セオリー)なる学問があります。Haskellのモナドを学ぶために圏論及びそのモナドを学ぶ必要は必ずしもありませんが、Haskellで用いられるモナドは圏論のモナドから拝借したものであるため、圏論が分かればHaskellの理解も深まることは間違いありません。ちなみに、「モナド」は「モノイド」と「トライアド」の組み合わせであって、ライプニッツのモナドとは関係ありません。
 まずはWikipediaの圏論モナドを調べてみましょう。曰く、モナドとは「関連する2つの自然変換を伴う(自己)関手」とのことです。以下、恒等関手だの恒等変換だのと意味不明なことがひたすら書いてあります。このような文章を見て意味が理解できる人は存在するのでしょうか
 残念ながら、Googleでインターネットを検索してみても、分かりやすい日本語の資料はほとんど存在しないのが実情です。かといって、Wikipediaに代表されるような数学者向けの高等な説明は理解できませんし、圏論の本となると敷居が高すぎます。しかし、「理系ではないのでモナドの習得はあきらめます」などと称して全部放り出すのも面白くありません。
 そこで、私が独自に習得した圏論についてまとめておくことにします。例によって正確性は保証しませんが、雰囲気はつかめるでしょう。

騎士サーラ「さて、イリアスさん。突然ですが、カテゴリーとは何でしょう」
魔道士イリアス「カテゴリー?えーと、ブログの記事の分類なんかでよく見かけるわね。開発記とか、社会問題とか、徒然(トゼン)日記とかに分けてあって・・・」
騎士サーラ「はい、確かにそれもカテゴリーなのですが、カテゴリー論の意味はもう少しスケールが大きいものです」
魔道士イリアス「どういう意味?」
騎士サーラ「イリアスさん、開発言語はご存知ですね?」
魔道士イリアス「C、C++、Java、Perl、PHP、SQL、XQuery辺りの魔法は飛ばせるけど?」
騎士サーラ「そうした言語はすべて、プログラム言語のカテゴリに入ります」
魔道士イリアス「当たり前じゃないの?」
騎士サーラ「そればかりか、世の物事の多くはカテゴリーなのです。1や64は整数のカテゴリーのメンバーとなりますし、文字であればアルファベット、ひらがな、漢字などのカテゴリーに入るでしょう」
魔道士イリアス「それがカテゴリー論?」
騎士サーラ「ここまでは前提です。カテゴリーには関係が重要なのです。例えば私がこうしてイリアスさんに弓矢を放ったなら・・・」
魔道士イリアス「えっ!?あっ、ちょっ・・・きゃあっ!」
騎士サーラ「私がイリアスさんに弓矢を放ったという関係が成立します。矢印のようなものと考えれば簡単ですね。これをといいます」
魔道士イリアス「だからって本当にやらなくても・・・」
騎士サーラ「また、影響を与えた側をドメイン、受けた側をコドメインといいます」
魔道士イリアス「それで、攻撃された私の立場はどうなるのよ!」
騎士サーラ「双対(そうつい)においては、矢印が逆転します。すなわち、影響を受ける側と与える側の関係が逆転し、私がイリアスさんに弓を放ったのではなく、イリアスさんが私に弓を放たれたことになります」
魔道士イリアス「立場って、そういう意味じゃなくて・・・。あれ?この弓矢ってアマンダの・・・」
弓兵アマンダ「げっ・・・」
魔道士イリアス「さてはあなたの差し金ね!C++/CLI魔法・スターダストアロー!」

 「射」を簡単に説明すればこれだけです。単に「a -> b」の関係を少々気取って表現してみただけのものですから、さほど理解は難しくありません。「a -> b」という原則が守られてさえいれば、aとbの関係は何でも構わず、「aはbを友人と考えている」でも「aはbを持っている」でも「aがb言語を習得した」でも構いません。しかし、射はあくまで「a -> b」なのですから、「bはaを友人とは考えていない」かもしれません。

騎士サーラ「ところで、スターダストアローとは何なのでしょう」
魔道士イリアス「*pがあって、p->...とやれば、スターとアローね」
騎士サーラ「ではダストとは何でしょう」
魔道士イリアス「int^とかobject^とか書けば、ダストはGCしてくれるわね」
騎士サーラ「ああ、そうですか・・・。さて、ここでもう1つ重要なことがあります」
魔道士イリアス「今度は何よ?」
騎士サーラ「私がイリアスさんに矢を放ち、イリアスさんがアマンダさんに矢を放ったとすれば、両方とも射の関係になります。それでは、私とアマンダさんにはどのような関係があるのでしょう」
魔道士イリアス「関係も何も、自分の友達の友達は大統領の知り合いだとか、テロリストだとか言うのと変わらないんじゃないの?」
騎士サーラ「射においては、これを射の合成として表すことができます」
魔道士イリアス「なにそれ・・・。意味不明なんだけど・・・」
騎士サーラ「そう難しく考えないでください。イリアスさん、3乗はご存知ですね?」
魔道士イリアス「いくら私でもそれくらい知ってるわよ」
騎士サーラ「では、2^3を暗算で計算するにはどのようなプロセスになりますか?」
魔道士イリアス「そりゃ、まず2*2を計算して、答えの4に2を掛けて・・・」
騎士サーラ「やっていることはそれと同じです。数字に対して2を掛けて、さらに2を掛けるという2つの射を持つのが3乗とするなら、3乗とはこの2つの射を合成したものといえます」
魔道士イリアス「1+2+3とか、5*4*6とかでも成り立ちそうね」
騎士サーラ「はい。そして、実はこの概念こそがモナドに通じるのです」
魔道士イリアス「どういうこと?」
騎士サーラ「射の合成にもいくつか種類があるのですが・・・Haskellにおけるモナドを考えるなら、モナドは合成に用いるものとみて問題はないでしょう」
魔道士イリアス「なるほどねえ・・・」
騎士サーラ「ただし、モナドには制限があります」
・条件1
合成を >>= という記号で表すなら、
(a >>= b) >>= c
a >>= (b >>= c)
この2つは等しくなければならない
魔道士イリアス「じゃ、10-4-5とかは等しくならないわね」
騎士サーラ「はい。それから、これはHaskellでは特に意識されませんが、恒等射というものも必要です」
魔道士イリアス「何それ?聞いたことないけど」
・条件2
a を渡すと a を返す関数 f が存在しなくてはならない
f(a) == a
騎士サーラ「関数型言語においては、例えば10を評価すれば10を返すように、自分を評価すれば自分を返すものが多いですから、自動的に恒等射は存在することになります」
魔道士イリアス「良く分からないけど、変な条件もあったものね」
騎士サーラ「圏論とモナドの基本はこれだけです。簡単ですね」

 以上、圏論とモナドの基礎知識でした。
 しかし、これで抽象的な射とモナド(AとBはどのような関係にあるか)はご理解いただけたことでしょうが、これが現実の計算にどのように結びつくかはまだ不明瞭です。そこで、以下にこの知識をどのように計算に結びつけるかを書いておきます。
 次の例を考えてみましょう。
a -> b -> c
 これの意味は簡単でしょう。しかし、aだのbだのと書いていても具体的な計算に移れませんので、整数を与えてみます。
1 -> 2 -> 3
 とりあえず整数にしてはみましたが、「->」とは一体何なのでしょう。射は何でも構わないのですから、ここでは足し算にしてみましょう。
1 + 2 + 3
 これで一目瞭然でしょう。モナドとは要するにこれだけのことです。「射の合成」を考えれば、
f = 1 -> 2 -> 3
 このような関数が必要になりますが、このfの実体は
f = 1 + 2 + 3
 これなのですから、合成した結果も明らかです。

 それからもう1つ。モナドには「モノイド」と呼ばれるものが存在します。ちなみに、HaskellのMonoidはリスト構造ですが、MonadPlusというクラスで同じ概念が実装されていますので、HaskellにおいてはMonadPlusであるものと考えてください。
 それでは、モノイドとは何か。まずモノイドには二項演算子(「1 + 2」や「5 * 6」のように2つの項目を取る演算子)が定義されていなくてはなりません。その上で、
-> を二項演算子として

・条件1
(a -> b) -> c
a -> (b -> c)
この両者が等しい

・条件2
演算しても結果が変わらない任意の値 mzero が必要
a -> mzero = a
mzero -> a = a
mzero -> mzero = mzero
 この条件を満たさなければなりません。条件1はモナドと同じとして、ここで問題となるのが条件2です。mzeroの値は演算によって異なる値を取りますので、単純にどのような値かを決めることはできません。ちなみに、mzeroのことを単位元と呼びます。
 例えば足し算の場合を考えてみましょう。足し算は任意の数字に0を足せば任意の数字がそのまま返ります。
16 + 0 = 16
0 + 16 = 16
0 + 0 = 0
 したがって、足し算はモノイドの条件を満たすもので、mzeroは0であることが分かります。
 では掛け算はどうでしょう。掛け算においては、1を掛ければ任意の数が返ってきますから、mzeroは1であることが分かります。
32 * 1 = 32
1 * 32 = 32
1 * 1 = 1
 mzeroがゼロではないことに注意が必要です。もしmzeroにゼロを入れて計算してみると、モノイド則を守れないことが分かります。
 また、圏論におけるカテゴリーは何でも取れる非常に抽象的な存在ですから、何も整数だけを演算対象とする必要はありません。マトリックスの乗算を考えてみましょう。
a , mzero はいずれもマトリックス
-> はマトリックスの乗算
a -> mzero = a
mzero -> a = a
mzero -> mzero = mzero
 この場合のmzeroには一体何が入るのでしょう。もしマトリックスが3次元なら
1	0	0
0	1	0
0	0	1
 これです。いかなるマトリックスに対しても、これを乗算すれば同じ値が返りますから、マトリックスの乗算はモノイドであり、mzeroは上記のマトリックスであることが分かります。
 ベクトルも考えてみましょう。ベクトルの足し算の場合は零ベクトルがmzeroであることは容易に想像できます。
(1 , 2 , 3) + (0 , 0 , 0) = (1 , 2 , 3)
(0 , 0 , 0) + (0 , 0 , 0) = (0 , 0 , 0)
 したがって、ベクトルの足し算はモノイドであり、零ベクトルがmzeroであることが分かります。
 これがモノイドの基本的性質です。HaskellにおいてはMonadPlusでモノイドを使用し、mplusが任意の二項演算、mzeroがそのままmzero(単位元)を表します。1度実際に試してみれば、より理解も深まることでしょう。
 さて、ここからはHaskellのモナドを使用する場合には余談ですが、特定の性質を持つ演算にはモノイド以外にも様々な種類があります。Wikipediaのen:Monoidには極めて分かりやすい表(Group-like structures)が記載されているため、興味のある方にはそちらをご覧いただくとして、足し算や掛け算、マトリックス乗算などは「群」(Group)と呼ばれる性質に分類されることが分かります。群はモノイドより結びつきが強いもので、モノイドの性質をいずれも満たした上、逆元がなくてはなりません。
 逆元とは要するに逆算に用いるもので、圏論的に言えば「双対」とでもなるでしょうか。
a -> b = mzero
 まず足し算の場合を考えてみましょう。
a が 5 なら
5 + -5 = 0
 法則を満たすことが分かります。法則といえば難しく聞こえますが、小学校の算数で「5 + x = 11」を「11 - 5 = 6」と習ったのと同じことです。この計算の場合、「6 + 5 = 11」という射を逆転させる演算を検討し、単に「11 + -5 = 6」あるいは「11 - 5 = 6」としただけのことです。
 次に掛け算です。掛け算の逆元は大変有名ですが、一応書いておきましょう。
a が 4 なら
4 * 1/4 = 4 * 0.25 = mzero
 これも単なる逆算に過ぎません。「4 * x = 20」を「20 / 4 = 5」、または分数で「20 * (1/4) = 5」、あるいは小数点を使って「20 * (1 / 4) = 20 * 0.25 = 5」とできるのと全く同じです。
 マトリックスの乗算も考えてみましょう。逆行列を作るのはなかなか難しいのですが、全く数学の知識や習得経験を持たない私でも、この通り作れてしまいました。この逆行列を任意の行列に対して乗算すれば、例えば3次元なら
1	0	0
0	1	0
0	0	1
 このような単位元が得られることが分かります。したがって、マトリックスの乗算にも逆元があります。これもやはり逆算と同じで、「A x B = C」というマトリックスがあるなら、「C x iB = A」(ただしiBはBの逆行列)が得られます。
 ついでですから、英語版Wikipediaの表について少々。

・Closure
 これは資料不足で良く分かりませんでしたが、Haskell風に書いて「a -> a -> a」ということでしょうか。もしこの考え方が当たっているなら、例えば整数というカテゴリーがあるとして、「1 + 2 = 3」の+演算子は整数を取って整数を返す演算ですから、Closureの条件を満たす、と考えることができます。一方、「2 * Vector(3 , 4 , 5)」(数とベクトルの演算)や「Vector(1 , 2) . Vector(3 , 4)」(ドット積。二項はどちらもベクトルだが、ベクトルではなく数を返す)などはこれに当たりません。

・Associativity
 「(a -> b) -> c」と「a -> (b -> c)」を同じとする法則です。足し算や掛け算がこれに当てはまります。

・Identity element
 単位元です。演算に対してmzeroが存在することを表します。なお、「a -> mzero = a」のみを満たすものを「右単位元」、「mzero -> a = a」のみを満たすものを「左単位元」、両方を満たすものを英語で「two-sided identity」または単に「identity」と呼び、日本語ではこれを「単位元」と呼ぶようです。足し算は「10 + 0 = 0 + 10 = 10」で単位元ですが、引き算は「10 - 0 = 10」ではあるものの、「0 - 10 = -10」であって0にならないため、右単位元ではあっても単位元ではありません。

・Inverse
 逆元の存在を表します。要するに逆算ができるかどうかです。

 以上が圏論の基本的な性質です。さほど難しくないことが分かります。
カテゴリ [開発魔法][社会問題][経済・知的財産] [トラックバック 0][コメント 0]
<- 前の記事を参照 次の記事を参照 ->

- Blog by yamicha.com -