Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
ラムダ計算入門  yingtai
自己紹介• 67回生• twitter: @_yingtai• 部誌でラムダ計算のこと書いた• Haskellerワナビ
LTの動機• ラムダ計算が人口に膾炙していない • 部誌書いたのに... • ※部誌の内容は信用しちゃだめです
流れ• ラムダ計算入門• データ型の表現
ラムダ計算入門
ラムダ計算とは• 「関数」をより抽象的に扱う
関数• 「箱」(ブラックボックス)• 入力(引数)があって、出力(結果)がある         f(x)
ラムダ記法
要するに• λ[入力].[出力]• なぜ「抽象的」と言えるのか? • = どこがええのんや
抽象化①• 無名関数 • いちいち名前を付けない       λx. x+2
抽象化②• 高階関数 • 関数そのものを入力 / 出力できる
例えば、• f(x, y) = x を考える (図はイメージ) • ラムダ記法では?             f
答えλx. (λy.x)
λx. (λy.x)      •Pythonコード      •f1 と f2 は同じ
カリー化• f(x, y) = x → f(x)(y) = x• これをカリー化と言います
ラムダ記法では• カリー化した関数を簡潔に表せる • λx.(λy.x) で事足りる
でっていう• カリー化して何が嬉しいのか• めんどいだけなのでは...
嬉しいです•   f(x, y) = x    • … x と y の両方を渡す必要がある• f(x)(y) = x • … x だけ渡す、という操作が可能• この操作を部分適用と言う
ついでに• λx. (λy. x) は λx. λy. x と表せる • どこがどの関数か自明• λx. λy. x は λxy. x と表せる • ただの省略記法
SKIコンビネータ• S = λx y z. x z (y z)• K = λx y. x• I = λx. x
I コンビネータ• λx. x• Identity combinator (恒等関数)• 取ったのをそのまま返すだけ
Kコンビネータ• λx y. x• Constant combinator• Konstant (独)• 定数関数
Sコンビネータ• λx y z. x z (y z)• Sharing combinator • z をシェアする • S (λa. M) (λb. N) = λz. M N   • ただし M = M[a:=z], N = N[b:=z]
データ型の表現
基本的な考え方• Turing: 関数をデータで表現する • → 手続き型• Church: データを関数で表現する • → 関数型
Church encoding• データ型をラムダ計算でエンコード • 自然数、真偽値、コンテナ、...etc.
自然数 (Church)• いわゆるチャーチ数• ペアノの公理系に基づいて構成• 1 := suc(0), 2 := suc(suc(0)), ...
具体的には• 0 := λs z. z• 1 := λs z. s z• 2 := λs z. s (s z)• 3 := λs z. s (s (s z))• ...
Boolean• True := λt f. t• False := λt f. f• if t1 then t2 else t3 := t1 t2 t3
Tuple• (t1, t2) := λx. x t1 t2• fst := λt. t (λf s. f)• snd := λt. t (λf s. s)
List (Church)• cons と nil で表現• [x,y,z]• = (cons x (cons y (cons z nil)))
List (Church)• Nil := λc n. n• Cons := λh t c n. c h (t c n)
List (Church)• [x,y,z]• =λc n. c x(λc n. c y(λc n. c z n))• cons が foldr 的に振る舞う! • foldr = λn c l. l c n   • tail = λl. l ...
Scott encoding• もう一つのエンコーディング• Lazy Kのリストは Scott encoding
自然数 (Scott)• 0 := λz s. z• 1 := λz s. s 0• 2 := λz s. s 1• 3 := λz s. s 2• ...
List (Scott)• Nil = λf g. f• Cons = λx xs f g. g x xs
List (Scott)• [x,y,z]• = λc. c x (λc. c y (λc. (c z) Nil)) • consはパターンマッチ的!
まとめ• Scott encoding • プログラミングが簡単 • パターンマッチ• Church encoding • 再帰が簡単、計算量
Any questions?
Upcoming SlideShare
Loading in …5
×

ラムダ計算入門

27,595 views

Published on

NPCAでLTしたスライド そのうちブログにちゃんとした解説とかを書くかも

  • Be the first to comment

ラムダ計算入門

  1. 1. ラムダ計算入門 yingtai
  2. 2. 自己紹介• 67回生• twitter: @_yingtai• 部誌でラムダ計算のこと書いた• Haskellerワナビ
  3. 3. LTの動機• ラムダ計算が人口に膾炙していない • 部誌書いたのに... • ※部誌の内容は信用しちゃだめです
  4. 4. 流れ• ラムダ計算入門• データ型の表現
  5. 5. ラムダ計算入門
  6. 6. ラムダ計算とは• 「関数」をより抽象的に扱う
  7. 7. 関数• 「箱」(ブラックボックス)• 入力(引数)があって、出力(結果)がある f(x)
  8. 8. ラムダ記法
  9. 9. 要するに• λ[入力].[出力]• なぜ「抽象的」と言えるのか? • = どこがええのんや
  10. 10. 抽象化①• 無名関数 • いちいち名前を付けない λx. x+2
  11. 11. 抽象化②• 高階関数 • 関数そのものを入力 / 出力できる
  12. 12. 例えば、• f(x, y) = x を考える (図はイメージ) • ラムダ記法では? f
  13. 13. 答えλx. (λy.x)
  14. 14. λx. (λy.x) •Pythonコード •f1 と f2 は同じ
  15. 15. カリー化• f(x, y) = x → f(x)(y) = x• これをカリー化と言います
  16. 16. ラムダ記法では• カリー化した関数を簡潔に表せる • λx.(λy.x) で事足りる
  17. 17. でっていう• カリー化して何が嬉しいのか• めんどいだけなのでは...
  18. 18. 嬉しいです• f(x, y) = x • … x と y の両方を渡す必要がある• f(x)(y) = x • … x だけ渡す、という操作が可能• この操作を部分適用と言う
  19. 19. ついでに• λx. (λy. x) は λx. λy. x と表せる • どこがどの関数か自明• λx. λy. x は λxy. x と表せる • ただの省略記法
  20. 20. SKIコンビネータ• S = λx y z. x z (y z)• K = λx y. x• I = λx. x
  21. 21. I コンビネータ• λx. x• Identity combinator (恒等関数)• 取ったのをそのまま返すだけ
  22. 22. Kコンビネータ• λx y. x• Constant combinator• Konstant (独)• 定数関数
  23. 23. Sコンビネータ• λx y z. x z (y z)• Sharing combinator • z をシェアする • S (λa. M) (λb. N) = λz. M N • ただし M = M[a:=z], N = N[b:=z]
  24. 24. データ型の表現
  25. 25. 基本的な考え方• Turing: 関数をデータで表現する • → 手続き型• Church: データを関数で表現する • → 関数型
  26. 26. Church encoding• データ型をラムダ計算でエンコード • 自然数、真偽値、コンテナ、...etc.
  27. 27. 自然数 (Church)• いわゆるチャーチ数• ペアノの公理系に基づいて構成• 1 := suc(0), 2 := suc(suc(0)), ...
  28. 28. 具体的には• 0 := λs z. z• 1 := λs z. s z• 2 := λs z. s (s z)• 3 := λs z. s (s (s z))• ...
  29. 29. Boolean• True := λt f. t• False := λt f. f• if t1 then t2 else t3 := t1 t2 t3
  30. 30. Tuple• (t1, t2) := λx. x t1 t2• fst := λt. t (λf s. f)• snd := λt. t (λf s. s)
  31. 31. List (Church)• cons と nil で表現• [x,y,z]• = (cons x (cons y (cons z nil)))
  32. 32. List (Church)• Nil := λc n. n• Cons := λh t c n. c h (t c n)
  33. 33. List (Church)• [x,y,z]• =λc n. c x(λc n. c y(λc n. c z n))• cons が foldr 的に振る舞う! • foldr = λn c l. l c n • tail = λl. l (λx xs. xs) Nil
  34. 34. Scott encoding• もう一つのエンコーディング• Lazy Kのリストは Scott encoding
  35. 35. 自然数 (Scott)• 0 := λz s. z• 1 := λz s. s 0• 2 := λz s. s 1• 3 := λz s. s 2• ...
  36. 36. List (Scott)• Nil = λf g. f• Cons = λx xs f g. g x xs
  37. 37. List (Scott)• [x,y,z]• = λc. c x (λc. c y (λc. (c z) Nil)) • consはパターンマッチ的!
  38. 38. まとめ• Scott encoding • プログラミングが簡単 • パターンマッチ• Church encoding • 再帰が簡単、計算量
  39. 39. Any questions?

×