2019-10-07に更新

みんな大好きラムダ計算☆m9(^~^)

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 みんな大好き ラムダ計算 の辞書編だぜ☆
そこらへんの知らん人が書いた ブログ記事 を読むときに 索引引きできるように アルファベット順に書くぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 お父んが 自分の記事を ぐちゃぐちゃに してしまったからな☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 ぱーっ と 項目に飛べるようにしなさいよ。 ここは ハイパーテキストなのよ?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 なんで ぐちゃぐちゃになったんだろな☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 お父んの頭が ぐちゃぐちゃ だからだぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 項目で 関連 の内容に触れてはいけないの! 読者が嫌がっても たらい回し にリンクで 別項 に飛ばしなさい!」

https://crieit.net/posts/504fe6cd1464cf678c942c45ef473f45#alpha-conversion

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 しかし記事のタイトルを みんな大好きラムダ計算☆m9(^~^) にしてしまったので
URL が むちゃくちゃ で Base64 だか ランダム16進数 みたいになってしまったぜ☆
わたしは こんな世界が嫌いだぜ☆ 宇宙を滅ぼして歴史を作り直そうぜ☆?」

abstraction

lambda abstraction、ラムダ抽象、アブストラクション

20191006comp25a1.png

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 ↑上式でいうと、どこを指して アブストラクション って言ってるの?」

20191006comp25a2.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ここだな☆
丸かっこは 付けたり省いたり するので、 含めないと考えた方が すっきりするだろう☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 どうやって見分けるの?」

20191006comp25a3.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 左の隅っこに ペンギン みたいなやつがいるだろ☆
こいつは ギリシャ文字の11番目の文字 ラムダ だぜ☆」

20191006comp25a4b1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ペンギンの左隣に 開き丸かっこ があれば、それに対応する 閉じ丸かっこ までの中身が アブストラクション だぜ☆
ペンギンの左隣に 開き丸かっこ がなければ、全体が アブストラクション だろう☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 もう少し 要点を伝えると☆、」

20191006comp25a5.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 アブストラクションの真ん中には ドット が置いてあって、左側と右側を分けているぜ☆」

20191006comp25a6b1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 今どきよく見かけるプログラム言語の用語で表すと、
ドットの左側は パラメーター・リスト(Parameter list; 仮引数リスト)、
ドットの右側は 返り値(Returns a value; 戻り値) だぜ☆」

20191006comp25a7.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ラムダ計算の用語で表すと、
ドットの左側は 変数(Variable; バリアブル)、
ドットの右側は M(エム) だぜ☆」

alpha-conversion

α-conversion、α変換、アルファ変換

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 式の答えを変えずに、評価しやすいように 式の見た目を変えることを conversion(変換) とか redex(簡約) と呼んでいる☆
つまり アルファ変換 は 評価ではなく 式の整理だぜ☆ 詳しく見ていこう☆」

20191006comp22a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ、 x を z に アルファ変換 してみようぜ☆?」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 z なんて どこにあるの? 上図には x と y しか見えないけど?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 z が あるつもりで☆」

20191006comp22a3b1.png

= (λx.x)y
= (λz.z)y
    ^ ^

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 仮引数  x を z に変えたのなら、アブストラクションの x も z に変えるのよね」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 そうだぜ☆ プログラム中の ここらへんの x は y に置き換える、ぐらいの感じだぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 まるで 文字列置換ね」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 まったく 文字列置換だぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 なんで こんなこと するの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 変数のアルファベットは 26個しかないのに、使い回すからな☆
名前が衝突するのを 防ぐだけ だぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 これは 計算 なの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 筆算で間違えないためにプロセスで行われるテクニック は 計算の本質 だぜ☆
答えだけ欲しけりゃ 答えだけ書いて中間・期末試験で正解し続けて 受験で間違えろだぜ☆」

application

アプリケーション、適用

20191006comp26a1.png

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 ↑上式でいうと、どこを指して アプリケーション って言ってるの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 これはもう アプリケーション されてるなあ☆」

20191006comp27a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑2つのラムダ項を 1つの式にするのが アプリケーション(Application; 適用) だぜ☆」

  ((λx.x+1)(y*2))
!=((y*2)(λx.x+1))

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 右にくっついている方が 左のパラメーターに渡されるんで、 逆にすると 評価の結果は変わってくるぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 本当か☆? やってみろだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 評価は めんどくさいのに……☆」

=((λx.    x+1)(y*2))
 ((λ_.(y*2)+1)_____)
    ^ ^^^^^   ^^^^^  # β-redex
 ((λ .(y*2)+1)     )
 ((λy.(y*2)+1)     )
    ^                # Bind the variable
 ((λy.(y*2)+1)     )
= (λy.(y*2)+1)     
 ^                 ^ # Erase paren
=((   y*2)(λx.x+1))
 ((λy.y*2)(λx.x+1))
   ^^^                 # Bind the variable
 ((λy.    y*2)(λx.x+1))
 ((λ_.(x+1)*2)________)
    ^ ^^^^^   ^^^^^^^^ # β-redex
 ((λ .(x+1)*2))
 ((λx.(x+1)*2))
    ^                  # Bind the variable
 ((λx.(x+1)*2))
= (λx.(x+1)*2)
 ^            ^        # Erase paren

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 例えば 変数に3を入れてみろだぜ☆ 7と 8、違うぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 先に+1 するのと、 後で+1 するのとじゃ 結果が違うのよ!」

beta-redex

β-redex、β簡約、ベータ簡約

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 式の答えを変えずに、評価しやすいように 式の見た目を変えることを conversion(変換) とか redex(簡約) と呼んでいる☆
つまり ベータ簡約 は 評価ではなく 式の整理だぜ☆ 詳しく見ていこう☆」

20191006comp23a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ、 とりあえず λx を ベータ簡約 してみようぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 この 電池 みたいな図は 何なのか……☆?」

20191006comp23a2b1.png

= (λx.    x+1)(y*2)3
  (λ_.(y*2)+1)_____3
    ^ ^^^^^   ^^^^^

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 仮引数xを消して、第一実引数に置き換えましょう」

= (λx.    x+1)(y*2)3
  (λ_.(y*2)+1)_____3
= (λy.(y*2)+1)     3
    ^

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 このとき、自由変数yは 束縛されるわね」

= (λx.    x+1)(y*2)3
  (λ_.(y*2)+1)_____3
= (λy.(y*2)+1)     3
  (λ_.(3*2)+1)     _
    ^  ^           ^

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 仮引数yを消して、第二実引数に置き換えましょう」

= (λx.    x+1)(y*2)3
  (λ_.(y*2)+1)_____3
= (λy.(y*2)+1)     3
  (λ_.(3*2)+1)     _
= (_ _(3*2)+1)
   ^ ^

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 実引数が無くなったので ラムダ式 は消えるわね」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ 答えは 6 だな☆」

= (λx.    x+1)(y*2)3
  (λ_.(y*2)+1)_____3
= (λy.(y*2)+1)     3
  (λ_.(3*2)+1)     _
= (_ _(3*2)+1)
= (   (  6)+1)
       ^^^
= (         7)
      ^  ^^^^
=            7
  ^         ^^

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 7ね」

eta-conversion

η-conversion、η変換、イータ変換

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 式の答えを変えずに、評価しやすいように 式の見た目を変えることを conversion(変換) とか redex(簡約) と呼んでいる☆
つまり イータ変換 は 評価ではなく 式の整理だぜ☆ 詳しく見ていこう☆」

20191006comp24a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ、 y+0 は イータ変換 できるんで、やってくれだぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 イータ変換できることが分かってるのなら この イータ変換 の項目なんか 要らないんだけどな☆」

= (λx.x+1)(y+0)3
           ^^^

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 y+0 って、なんの働きもしなくない!?」

= (λx.x+1)(y+0)3
= (λx.x+1)_____3
          ^^^^^

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 ベータ簡約するのも しちめんどうくさい から消しちゃいましょう」

= (λx.x+1)(y+0)3
= (λx.x+1)_____3
= (λx.x+1)3
          ^^^^^^

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 これでも何も結果は変わらないのよ!」

KIFUWARABE_80x100x8_01_Futu.gif
「 これは 計算 なのかだぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 式の整理 は、計算の本質だぜ☆
1+1=2 とか 誰かが立てた式の評価 ばかりしていては 寿命が尽きてしまう……☆
式を立てろだぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 なんの働きもしない というのが 何のことか分かっていない読者もいるだろ☆ 説明がいるのでは☆?」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 しちめんどくさいわね!」

= (λx.    x+1)(y+0)3
  (λ_.(y+0)+1)     3
    ^ ^^^^^   ^^^^^

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 xをベータ簡約しましょう」

= (λx.    x+1)(y+0)3
  (λ_.(y+0)+1)     3
= (λy.(y+0)+1)     3
    ^

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 yを束縛しましょう」

= (λx.    x+1)(y+0)3
  (λ_.(y+0)+1)     3
= (λy.(y+0)+1)     3
= (λy._y+0_+1)     3
      ^   ^
= (λy. y__ +1)     3
        ^^
= (λy. ___y+1)     3
       ^^^^

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 丸かっこを整理して 四則演算を評価しましょう」

= (λx.x+1)(y+0)3
= (λy.y+1)     3

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 この2つの式は同値だけど、 y を x に α変換 しましょう」

= (λx.x+1)(y+0)3
= (λy.y+1)     3
    ^ ^
= (λx.x+1)     3

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 ということは」

= (λx.x+1)(y+0)3
= (λx.x+1)     3

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 y+0 は 有っても無くても 同じなのよ!」

KIFUWARABE_80x100x8_01_Futu.gif
「 何でだぜ☆?

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 ぬぎぎぎぎぎ!」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 α変換 してんのと同じなら 省いていいだろ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 そうなのよ!」

KIFUWARABE_80x100x8_01_Futu.gif
「 分かったぜ☆」

variable

KIFUWARABE_80x100x8_01_Futu.gif
「 ヴェリアボー って何だぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 そんな棒はない☆」

20191007comp28a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 基本的に パラメーター(Parameter; 仮引数)のことを Variable と呼んでいるが、
仮引数以外のところにも Variable はいる☆」

20191007comp28a2.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 例えば Returns a value(返り値; M)のところにいる x☆
仮引数に並んでいるので Bounds variable(束縛変数)だぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 例を少し変えよう☆」

20191007comp28a3.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑上図で Returns a value(返り値; M)のところに y がいるとしよう☆
仮引数には並んでいないし、 特にyがローカル変数と宣言はしていないので Free variable(自由変数)だぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 このyは何なの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 例えば グローバル変数 かも知れないな☆
この式の中に yとは何か、が書かれていない 本当の引数、本当の変数だぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 じゃあ 束縛変数は ウソの変数か☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 式をたどっていけば どこかに x に入る数や 関数があるかもしれない☆」

<おわり>

ツイッターでシェア
みんなに共有、忘れないようにメモ

むずでょ

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

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

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

有料記事を販売できるようになりました!

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

コメント