ラムダ計算をやろうぜ☆m9(^~^)<その1>

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 結局 ラムダ計算って 何をやってんの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 計算ができるための 最低限のルールが説明されている☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 どこに説明されているんだぜ☆?」

20191007comp29a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ このつまらない四則演算を使って 例えてみよう☆」

20191007comp29a2b1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 二項演算は 二分木 に例えることができる☆」

20191007comp29a2b2.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 枝になっているところに 演算子 があると思うが、これを消すことを Evaluation(エヴァーユエイション; 評価)と呼ぶ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 もう Evaluation できないところまで Evaluation し続けていけば最終的に 計算ドリルの答えのようなものが 1個 残るな☆
数学から見れば それは答えなのか……、なんだが☆ 慣れてくると それは 評価 と呼ぶようになる☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 じゃあ全部 二分木 でやればいいだろ☆ ラムダ計算の出番は無い☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ラムダ計算が対象にしているのは 四則演算 ではなくて 関数 だぜ☆ 説明しよう☆」

20191007comp29a4.png

KIFUWARABE_80x100x8_01_Futu.gif
「 何だぜ これは☆?」

20191013comp32a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 二分木だぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 じゃあ全部 二分木 でやればいいじゃない!」

20191007comp29a6.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 計算の優先順序を表す丸かっこと、関数の引数を表す丸かっこが 同じ記号を使うのが混乱の元だと思うんだが、
もう このルールを変えずに、それでいて 混乱を無くす良い知恵がある☆」

20191007comp29a7.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 引数をそのまま返す関数があるとしよう☆ 名前は仮に I としよう☆」

20191007comp29a8.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 これで すべての丸かっこは 関数の引数となった☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 わがまま わらう☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 でも おかしいじゃない、だって!」

20191007comp29a9.png

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 多変数関数 だってあるのよ! その気になれば 3分木 でも 4分木でも N分木が可能よ!」

20191013comp32a2.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 複数の関数が 入れ子になって 1つの関数になっていると考えれば 二分木 にすることが可能☆
これを Curried(カリー化)と呼ぶ☆」

20191007comp29a12.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 中学数学のノッテイション(Notation; 表記法)では いい書き方がないんだが……、気分的には 関数から 関数が返ってきている感じだぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 i って何だぜ☆? ナンバーなのか、関数なのか……☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 トラウマになってるの わらう☆」

20191007comp30a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ こういう計算式を 二分木 で表してみよう☆」

20191013comp32a3.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 いけるな☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 なんで 二分木 大好きなんだぜ☆? 意地っ張り わらう☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 いろいろ 面白いので 寄り道して 1つ1つ見ていこう☆」

20191008comp31a1b1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 四則演算は こういう形をしているが……☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 シルエットが ディズニーマウスのようだぜ☆」

20191013comp32a4.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 First-order function(一階関数)は こういう形をしているぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 でも!」

20191013comp32a5b1.png

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 四則演算は 扇の要(かなめ)に演算子があるのに対し!
関数は 左の肩に 名前、あるいは 働きの本体 があるのは 非対称じゃない?! 関数は 単項演算子と言えるのではないかしら!」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 強(し)いていえば……☆」

20191013comp32a5b2.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 関数は Call(コール; 呼び出し) という演算子だぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 無いわよ そんなん!」

20191013comp32a6.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 左肩と 右肩の両方が 関数のときは、評価すると 子も関数になる☆
この理屈は 見えるかだぜ☆?」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 ナンバーが出てくることも ありそうな気がするけどなあ!」

20191013comp33a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 右肩に ナンバー や ヴェリアボー が乗っていると 子は ナンバー、ヴェリアボー、ファンクション になるが☆、」

20191013comp33a2.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 右肩に ファンクション が乗っていると、自動的に 左肩には ファンクション、その子もファンクションが
決まると思ってくれだぜ☆
また、関数コールは まだしていないぐらいの気分でいてくれだぜ☆」

20191013comp33a3.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 関数コールとは、 右肩に ナンバーか ヴェリアボー が乗っているときのことを言う☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 しかし 右肩に関数を乗せると 子どもは 関数になるのは、何が起こっているんだぜ☆?」

20191013comp33a4b1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 全貌として こういうパターンになるわけだが、
見えやすいように、左肩をヨコ系、右肩をタテ系にした図で 描き直してみよう☆」

20191013comp33a5.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ぜんぜん見やすくならなかったな……☆ ここで☆、」

20191013comp34a1b1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 関数というのは、 穴が空いている二分木 がそこに省略されてる、ぐらいに思ってほしい☆」

20191013comp34a2b1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 例えば こういうやつだな☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 ラムダ計算では、 x に ナンバーの代わりに ファンクション を入れることもできるんだろ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 そうそう……、絵を描くのが めんどくさいんで 練習として、
x に f関数の自分自身 を入れてみるとしよう☆」

20191013comp34a3b1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 一見 うまいように くっついたように感じるが、これは無限ループする☆
x に 永遠に f を入れるので、 永遠に枝は伸び続け、計算に使えない☆」

20191013comp34a4b1.png

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 f関数 と まったく同型の g関数 のx引数に、 f関数を入れた、ということにしましょう。
これなら 無限ループ しないわよ」

KIFUWARABE_80x100x8_01_Futu.gif
「 こだわりだな☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ここで、頭に入れておいてほしいことがあるぜ☆」

20191013comp35a1b1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 引数x は、複数個所 で 使われていても いいわけだぜ☆
じゃあ、 f関数と g関数 は同型として、 g(x)のxに fを入れてくれだぜ☆」

20191013comp35a2b1.png

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 見たくもないほど ぐちゃーって 増殖したんだけど?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ラムダ計算の効能は その逆だな☆
みたくもないほど ぐちゃー っとした二分木を、見やすい二分木に変えてくれるわけだぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 (g(f))(x) の x引数に ナンバーを入れたら、
4か所に ナンバーが入ることにならないか☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 かしこいな おまえ☆」

20191013comp35a2b1c1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 このとき 別世界を見てみよう☆
f関数 を ずばっ と切ってしまって☆、
あるいは 非表示 にしてしまって☆、」

20191013comp35a2b1c2.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 g関数は もともと ぐちゃっとした関数なんだ、と言い張ってもいいわけだぜ☆
g(x) ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 同じ部分を 何回も書く のは めんどくさいな☆ 関数を 関数に入れたいぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 関数を入れると 引数の穴1個 塞いじゃうの 納得いかないわよね」

20191013comp36a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 二分木は もともと 引数が2つなんだ、ということに 着目してほしい☆」

20191013comp36a2.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 左肩の方を増やす分には、引数が どんどん増えていくので、引数の穴は塞がないことに着目だぜ☆
これは カリー化(Curried) という☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 なぜ 左肩と右肩で 違いがでてくるんだぜ☆?
左肩に乗せると 引数は増えていき、
右肩に乗せると 引数は1つのまま☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ノッテイション(Notation)と、演算子の優先順位(Order of operations) のせいだな☆
f(x) のように 関数名を左側、引数を右側に書く習慣があるんだぜ☆
数学の教育を受けた人類は (x)f と書かれたものは読みにくい☆
例えば (x)f(y)g(z)h とか 読む順番が分からない☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 無くてもいいんだが、有った方が便利なんで、左肩と右肩には 違いがあり、
だから偏りがあるわけだぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 左肩を伸ばしていくと、 複数個所 で関数呼び出しされて 増殖 するの?」

20191013comp36a2b1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 そんな使い方をすれば、そんな使い方ができる☆
重要なのは、二分木の図は、 正面から見て二分木 ということだぜ☆
思っているより分岐していることにまで、 頭を回せだぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 関数呼び出しする方は、中で 何回使われているか 知ることはできないし、知らなくていいからな☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 しかし それでも、どこまでいっても、二分木に違いないことは お分かり頂けたと思う☆
葉の先に延長してるだけなんで☆
あるいは、別の言い方をすれば、どこでも 2つに分けれるんで☆ もちろん、計算順序に縛りはあるが……☆」

<書きかけ>

何度でもクリック!→

むずでょ@きふわらべ第29回世界コンピューター将棋選手権一次予選36位

光速のアカウント凍結されちゃったんで……。ゲームプログラムを独習中なんだぜ☆電王戦IIに出た棋士もコンピューターもみんな好きだぜ☆▲(パソコン将棋)WCSC29一次予選36位、SDT5予選42位▲(パソコン囲碁)AI竜星戦予選16位

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

むずでょ@きふわらべ第29回世界コンピューター将棋選手権一次予選36位 の最近の記事