「 みんな大好き ラムダ計算 の辞書編だぜ☆
そこらへんの知らん人が書いた ブログ記事 を読むときに 索引引きできるように アルファベット順に書くぜ☆」
「 お父んが 自分の記事を ぐちゃぐちゃに してしまったからな☆」
「 ぱーっ と 項目に飛べるようにしなさいよ。 ここは ハイパーテキストなのよ?」
「 項目で 関連 の内容に触れてはいけないの! 読者が嫌がっても たらい回し にリンクで 別項 に飛ばしなさい!」
https://crieit.net/posts/504fe6cd1464cf678c942c45ef473f45#alpha-conversion
「 しかし記事のタイトルを みんな大好きラムダ計算☆m9(^~^)
にしてしまったので
URL が むちゃくちゃ で Base64 だか ランダム16進数 みたいになってしまったぜ☆
わたしは こんな世界が嫌いだぜ☆ 宇宙を滅ぼして歴史を作り直そうぜ☆?」
lambda abstraction、ラムダ抽象、アブストラクション
「 ↑上式でいうと、どこを指して アブストラクション って言ってるの?」
「 ここだな☆
丸かっこは 付けたり省いたり するので、 含めないと考えた方が すっきりするだろう☆」
「 左の隅っこに ペンギン みたいなやつがいるだろ☆
こいつは ギリシャ文字の11番目の文字 ラムダ だぜ☆」
「 ペンギンの左隣に 開き丸かっこ があれば、それに対応する 閉じ丸かっこ までの中身が アブストラクション だぜ☆
ペンギンの左隣に 開き丸かっこ がなければ、全体が アブストラクション だろう☆」
「 アブストラクションの真ん中には ドット が置いてあって、左側と右側を分けているぜ☆」
「 今どきよく見かけるプログラム言語の用語で表すと、
ドットの左側は パラメーター・リスト(Parameter list; 仮引数リスト)、
ドットの右側は 返り値(Returns a value; 戻り値) だぜ☆」
「 ラムダ計算の用語で表すと、
ドットの左側は 変数(Variable; バリアブル)、
ドットの右側は M(エム) だぜ☆」
α-conversion、α変換、アルファ変換
「 式の答えを変えずに、評価しやすいように 式の見た目を変えることを conversion(変換) とか redex(簡約) と呼んでいる☆
つまり アルファ変換 は 評価ではなく 式の整理だぜ☆ 詳しく見ていこう☆」
「 じゃあ、 x を z に アルファ変換 してみようぜ☆?」
「 z なんて どこにあるの? 上図には x と y しか見えないけど?」
= (λx.x)y
= (λz.z)y
^ ^
「 仮引数 x を z に変えたのなら、アブストラクションの x も z に変えるのよね」
「 そうだぜ☆ プログラム中の ここらへんの x は y に置き換える、ぐらいの感じだぜ☆」
「 変数のアルファベットは 26個しかないのに、使い回すからな☆
名前が衝突するのを 防ぐだけ だぜ☆」
「 筆算で間違えないためにプロセスで行われるテクニック は 計算の本質 だぜ☆
答えだけ欲しけりゃ 答えだけ書いて中間・期末試験で正解し続けて 受験で間違えろだぜ☆」
アプリケーション、適用
「 ↑上式でいうと、どこを指して アプリケーション って言ってるの?」
「 ↑2つのラムダ項を 1つの式にするのが アプリケーション(Application; 適用) だぜ☆」
((λx.x+1)(y*2))
!=((y*2)(λx.x+1))
「 右にくっついている方が 左のパラメーターに渡されるんで、 逆にすると 評価の結果は変わってくるぜ☆」
=((λ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
「 例えば 変数に3を入れてみろだぜ☆ 7と 8、違うぜ☆」
「 先に+1 するのと、 後で+1 するのとじゃ 結果が違うのよ!」
β-redex、β簡約、ベータ簡約
「 式の答えを変えずに、評価しやすいように 式の見た目を変えることを conversion(変換) とか redex(簡約) と呼んでいる☆
つまり ベータ簡約 は 評価ではなく 式の整理だぜ☆ 詳しく見ていこう☆」
「 じゃあ、 とりあえず λx を ベータ簡約 してみようぜ☆?」
= (λx. x+1)(y*2)3
(λ_.(y*2)+1)_____3
^ ^^^^^ ^^^^^
= (λx. x+1)(y*2)3
(λ_.(y*2)+1)_____3
= (λy.(y*2)+1) 3
^
= (λx. x+1)(y*2)3
(λ_.(y*2)+1)_____3
= (λy.(y*2)+1) 3
(λ_.(3*2)+1) _
^ ^ ^
= (λx. x+1)(y*2)3
(λ_.(y*2)+1)_____3
= (λy.(y*2)+1) 3
(λ_.(3*2)+1) _
= (_ _(3*2)+1)
^ ^
= (λ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
^ ^^
η-conversion、η変換、イータ変換
「 式の答えを変えずに、評価しやすいように 式の見た目を変えることを conversion(変換) とか redex(簡約) と呼んでいる☆
つまり イータ変換 は 評価ではなく 式の整理だぜ☆ 詳しく見ていこう☆」
「 じゃあ、 y+0 は イータ変換 できるんで、やってくれだぜ☆」
「 イータ変換できることが分かってるのなら この イータ変換 の項目なんか 要らないんだけどな☆」
= (λx.x+1)(y+0)3
^^^
= (λx.x+1)(y+0)3
= (λx.x+1)_____3
^^^^^
「 ベータ簡約するのも しちめんどうくさい から消しちゃいましょう」
= (λx.x+1)(y+0)3
= (λx.x+1)_____3
= (λx.x+1)3
^^^^^^
「 式の整理 は、計算の本質だぜ☆
1+1=2
とか 誰かが立てた式の評価 ばかりしていては 寿命が尽きてしまう……☆
式を立てろだぜ☆」
「 なんの働きもしない というのが 何のことか分かっていない読者もいるだろ☆ 説明がいるのでは☆?」
= (λx. x+1)(y+0)3
(λ_.(y+0)+1) 3
^ ^^^^^ ^^^^^
= (λx. x+1)(y+0)3
(λ_.(y+0)+1) 3
= (λy.(y+0)+1) 3
^
= (λ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
^^^^
= (λx.x+1)(y+0)3
= (λy.y+1) 3
「 この2つの式は同値だけど、 y を x に α変換 しましょう」
= (λx.x+1)(y+0)3
= (λy.y+1) 3
^ ^
= (λx.x+1) 3
= (λx.x+1)(y+0)3
= (λx.x+1) 3
「 基本的に パラメーター(Parameter; 仮引数)のことを Variable と呼んでいるが、
仮引数以外のところにも Variable はいる☆」
「 例えば Returns a value(返り値; M)のところにいる x☆
仮引数に並んでいるので Bounds variable(束縛変数)だぜ☆」
「 ↑上図で Returns a value(返り値; M)のところに y がいるとしよう☆
仮引数には並んでいないし、 特にyがローカル変数と宣言はしていないので Free variable(自由変数)だぜ☆」
「 例えば グローバル変数 かも知れないな☆
この式の中に yとは何か、が書かれていない 本当の引数、本当の変数だぜ☆」
「 式をたどっていけば どこかに x に入る数や 関数があるかもしれない☆」
<おわり>
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント