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.
Lazy K  1	            S
注意S  ⾔言語の⼊入⾨門に⾒見見せかけたλ計算⼊入⾨門S  λの国の住⼈人にはつまらないかもS  知ってる⼈人は我慢しててください                    2	  
Lazy KとはS  純粋関数型⾔言語 S  遅延評価 S  カリー化 S  参照透過性 S  ガベージコレクション S  全てが関数                  3	  
コード例例K(SII(S(K(S(K(S(K(S(SI(K(S(S(KS)K)(S(S(S(KS)K))(SII)(S(S(KS)K)I)))))))K))(S(K(S(SI(K(S(S(KS)K)(S(S(KS)K)(S(S(S(KS)K))...
Brainf*ck?S  いいえ、違います S  れっきとした関数型⾔言語です S  Brainf*ckよりも更更にシンプルです S  Brainf*ckと同様、Turing complete                      ...
Lazy Kの特徴S  純粋関数型難読プログラミング⾔言語 S  関数以外何も存在しない S  数値すらない S  組み込み関数はS, K, Iの3つだけ S  関数定義もできない S  変数?なにそれおいしいの?         ...
組み込み関数 SS  3つの引数f, g, xをとり、((f x) (g x))を計算するS  Schemeで書くと、 (define S   (lambda (f)     (lambda (g)       (lambda (x)   ...
組み込み関数 KS  2つ引数をとり、第1引数をそのまま返すS  Schemeで書くと、 (define K   (lambda (x)     (lambda (y)       x)))                   8	  
組み込み関数 IS  1つ引数をとり、それをそのまま返すS  Schemeで書くと、 (define I   (lambda (x)     x))                  9	  
前掲のコード例例K(SII(S(K(S(K(S(K(S(SI(K(S(S(KS)K)(S(S(S(KS)K))(SII)(S(S(KS)K)I)))))))K))(S(K(S(SI(K(S(S(KS)K)(S(S(KS)K)(S(S(S(KS)...
ちょっと⼤大変すぎるのでK(SII(S(K(S(K(S(K(S(SI(K(S(S(KS)K)(S(S(S(KS)K))(SII)(S(S(KS)K)I)))))))K))(S(K(S(SI(K(S(S(KS)K)(S(S(KS)K)(S(S(S...
(S(KS)K)S  Schemeで書いてみる ((lambda (f) (lambda (g) (lambda (x) ((f x) (g x)))))  ((lambda (x) (lambda (y) x))   (lambda ((f...
(KS)S  まずは(KS)だけ ((lambda (x) (lambda (y) x)) S) -> (lambda (y) S) -> (lambda (y)      (lambda (f)        (lambda (g)    ...
S(KS)((lambda (f) (lambda (g) (lambda (x) ((f x) (g x))))) (KS))-> (lambda (g) (lambda (x) (((K S) x) (g x))))-> (lambda (...
(S(KS)K)((lambda (g) (lambda (x) (lambda (g2) (lambda (x2)  (((g x) x2) (g2 x2)))))) K)-> (lambda (x) (lambda (g2) (lambda...
(S(KS)K)S  結論論  S  (lambda (x) (lambda (y) (lambda (z) (x (y z)))))S  とりあえずこれをAと書くことにする                             16	  
こうなったK(SII(S(K(S(K(S(K(S(SI(K(SA(S(SA)(SII)(SAI)))))))K))(S(K(S(SI(K(SA(SA(S(SA)(SII)(SAI))))))))K)))(SII)))              ...
もう1つK(SII(S(K(S(K(S(K(S(SI(K(SA(S(SA)(SII)(SAI)))))))K))(S(K(S(SI(K(SA(SA(S(SA)(SII)(SAI))))))))K)))(SII)))Ø  この辺をやってみよう ...
そのまえにS  lambdaだらけはもう嫌S  (lambda (a) b)をa.bと書くことにする S  (lambda (f) (lambda (g) (lambda (x) ((f x) (g x))))) は S  f.g.x....
SIIS  先程の記法で書くと、 (f.g.x.fx(gx))(x.x)(x.x) -> (g.x.(x.x)x(gx))(x.x) -> (g.x.x(gx))(x.x) -> x.x((x.x)x) -> x.xx            ...
SIIS  SII = x.xxS  これをBと書くことにすると、K(B(S(K(S(K(S(K(S(SI(K(SA(S(SA)B(SAI)))))))K))(S(K(S(SI(K(SA(SA(S(SA)B(SAI))))))))K)))B...
λS  先程のを使う記法がλ式 S  普通はf.g.x.fx(gx)は更更に省省略略してfgx.fx(gx)と書くS  ⽮矢印で表されていた変換がβ簡約                       22	  
更更にもう1つK(B(S(K(S(K(S(K(S(SI(K(SA(S(SA)B(SAI)))))))K))(S(K(S(SI(K(SA(SA(S(SA)B(SAI))))))))K)))B))Ø  λ式を使ってみる              ...
SASA -> (fgx.fx(gx))(xyz.x(yz))   -> gx.(xyz.x(yz))x(gx)   -> gx.z.x(gxz)   -> xyz.y(xyz)Ø  最後の変換(⽂文字の付け替え)がα変換Ø  SAをCと書...
きりがないのでK(B(S(K(S(K(S(K(S(SI(K(C(SCB(CI)))))))K))          (S(K(S(SI(K(C(C(SCB(CI))))))))K)))B))ü  これ以上はやめるü  ちなみにこれはABAB...
Lazy K の書き⽅方S  数値もないのにどうすれば  つ  チャーチ数S  条件分岐はどう(ry  つ  チャーチ真理理値S  再帰とか(ry  つ Yコンビネータ                 26	  
チャーチ数S  ZERO = fx.xS  ONE = fx.fxS  TWO = fx.f(fx)S  SUCC = nfx.f(nfx)S  例例) SUCC ONE -> (nfx.f(nfx))(fx.fx)         ...
Lazy K ではS  ZERO = (K I)  S  (K I) -> (xy.x)(x.x) -> y.x.x -> fx.xS  SUCC = (S (S (K S) K))  S  (S (S (K S) K)) -> (S ...
チャーチ真理理値S  IF = xyz.xyzS  TRUE = xy.xS  FALSE = xy.yS  例例) IF TRUE A B -> (xyz.xyz)(xy.x)AB                    -> (xy....
Lazy K ではS  IF = (S (K (S (K I))))  (S   (K (S (K I)))) -> (S (K ((fgx.fx(gx))(fx.x))))  ->   (S (K (gx.gx))) -> (S ((xy....
YコンビネータS  Y = f.(x.f(xx))(x.f(xx))S  例例) Yg -> (f.(x.f(xx))(x.f(xx)))g         -> (x.g(xx))(x.g(xx))         -> g((x.g(x...
Lazy K ではS  Y = (S S (S (S (K S) K)) (K (S I I)))  (S S (S (S (K S) K)) (K (S I I))) -> (S S SUCC (K B))  -> (S S SUCC ((...
任意のλ式をSKIに変換S  T[x] -> xS  T[AB] -> (T[A] T[B])S  T[x.E] -> (K T(E))S  T[x.x] -> IS  T[x.y.E] -> T[x.T[y.E]]S  T[x.A...
実はIも必要ないS  I = (S K K)  (S K K) -> (fgx.fx(gx))(xy.x)(xy.x)          -> x.(xy.x)x((xy.x)x)          -> x.(xy.x)x(y.x)    ...
ιS  ι = x.xSK とすると、  S  ιι -> (x.xSK)(x.xSK) -> (x.xSK)SK -> SSKK    -> (fgx.fx(gx))SKK -> SK(KK) -> (fgx.fx(gx))K(KK)  ...
Lazy K と愉快な仲間たちS  iota : iと*だけで記述S  jot   : 0と1だけS  ()    : ()だけS  []    : []だけS  {}    : {}だけ                      3...
Upcoming SlideShare
Loading in …5
×

Lazyk

1,373 views

Published on

プログラミング言語LazyKの入門に見せかけたλ計算入門です。
Schemeを知らないとちょっとキツイかもしれません。

  • Be the first to comment

Lazyk

  1. 1. Lazy K 1   S
  2. 2. 注意S  ⾔言語の⼊入⾨門に⾒見見せかけたλ計算⼊入⾨門S  λの国の住⼈人にはつまらないかもS  知ってる⼈人は我慢しててください 2  
  3. 3. Lazy KとはS  純粋関数型⾔言語 S  遅延評価 S  カリー化 S  参照透過性 S  ガベージコレクション S  全てが関数 3  
  4. 4. コード例例K(SII(S(K(S(K(S(K(S(SI(K(S(S(KS)K)(S(S(S(KS)K))(SII)(S(S(KS)K)I)))))))K))(S(K(S(SI(K(S(S(KS)K)(S(S(KS)K)(S(S(S(KS)K))(SII)(S(S(KS)K)I))))))))K)))(SII))) 4  
  5. 5. Brainf*ck?S  いいえ、違います S  れっきとした関数型⾔言語です S  Brainf*ckよりも更更にシンプルです S  Brainf*ckと同様、Turing complete 5  
  6. 6. Lazy Kの特徴S  純粋関数型難読プログラミング⾔言語 S  関数以外何も存在しない S  数値すらない S  組み込み関数はS, K, Iの3つだけ S  関数定義もできない S  変数?なにそれおいしいの? 6  
  7. 7. 組み込み関数 SS  3つの引数f, g, xをとり、((f x) (g x))を計算するS  Schemeで書くと、 (define S (lambda (f) (lambda (g) (lambda (x) ((f x) (g x)))))) 7  
  8. 8. 組み込み関数 KS  2つ引数をとり、第1引数をそのまま返すS  Schemeで書くと、 (define K (lambda (x) (lambda (y) x))) 8  
  9. 9. 組み込み関数 IS  1つ引数をとり、それをそのまま返すS  Schemeで書くと、 (define I (lambda (x) x)) 9  
  10. 10. 前掲のコード例例K(SII(S(K(S(K(S(K(S(SI(K(S(S(KS)K)(S(S(S(KS)K))(SII)(S(S(KS)K)I)))))))K))(S(K(S(SI(K(S(S(KS)K)(S(S(KS)K)(S(S(S(KS)K))(SII)(S(S(KS)K)I))))))))K)))(SII)))Ø  これを解析してみよう! 10  
  11. 11. ちょっと⼤大変すぎるのでK(SII(S(K(S(K(S(K(S(SI(K(S(S(KS)K)(S(S(S(KS)K))(SII)(S(S(KS)K)I)))))))K))(S(K(S(SI(K(S(S(KS)K)(S(S(KS)K)(S(S(S(KS)K))(SII)(S(S(KS)K)I))))))))K)))(SII)))Ø  まずはここだけやってみる 11  
  12. 12. (S(KS)K)S  Schemeで書いてみる ((lambda (f) (lambda (g) (lambda (x) ((f x) (g x))))) ((lambda (x) (lambda (y) x)) (lambda ((f) (lambda (g) (lambda (x) ((f x) (g x))))))) (lambda (x) (lambda (y) x)))Ø  なるほど、わからん 12  
  13. 13. (KS)S  まずは(KS)だけ ((lambda (x) (lambda (y) x)) S) -> (lambda (y) S) -> (lambda (y) (lambda (f) (lambda (g) (lambda (x) ((f x) (g x)))))) 13  
  14. 14. S(KS)((lambda (f) (lambda (g) (lambda (x) ((f x) (g x))))) (KS))-> (lambda (g) (lambda (x) (((K S) x) (g x))))-> (lambda (g) (lambda (x) (((lambda (y) (lambda (f) (lambda (g2) (lambda (x2) ((f x2) (g2 x2)))))) x) (g x))))-> (lambda (g) (lambda (x) ((lambda (f) (lambda (g2) (lambda (x2) ((f x2) (g2 x2))))) (g x)))-> (lambda (g) (lambda (x) (lambda (g2) (lambda (x2) (((g x) x2) (g2 x2)))))) 14  
  15. 15. (S(KS)K)((lambda (g) (lambda (x) (lambda (g2) (lambda (x2) (((g x) x2) (g2 x2)))))) K)-> (lambda (x) (lambda (g2) (lambda (x2) (((K x) x2) (g2 x2)))))-> (lambda (x) (lambda (g2) (lambda (x2) ((((lambda (x) (lambda (y) x)) x) x2) (g2 x2)))))-> (lambda (x) (lambda (g2) (lambda (x2) (((lambda (y) x) x2) (g2 x2)))))-> (lambda (x) (lambda (g2) (lambda (x2) (x (g2 x2))))) 15  
  16. 16. (S(KS)K)S  結論論 S  (lambda (x) (lambda (y) (lambda (z) (x (y z)))))S  とりあえずこれをAと書くことにする 16  
  17. 17. こうなったK(SII(S(K(S(K(S(K(S(SI(K(SA(S(SA)(SII)(SAI)))))))K))(S(K(S(SI(K(SA(SA(S(SA)(SII)(SAI))))))))K)))(SII))) 17  
  18. 18. もう1つK(SII(S(K(S(K(S(K(S(SI(K(SA(S(SA)(SII)(SAI)))))))K))(S(K(S(SI(K(SA(SA(S(SA)(SII)(SAI))))))))K)))(SII)))Ø  この辺をやってみよう 18  
  19. 19. そのまえにS  lambdaだらけはもう嫌S  (lambda (a) b)をa.bと書くことにする S  (lambda (f) (lambda (g) (lambda (x) ((f x) (g x))))) は S  f.g.x.((f x) (g x)) S  括弧とかもできるだけ省省略略して、f.g.x.fx(gx)と書く 19  
  20. 20. SIIS  先程の記法で書くと、 (f.g.x.fx(gx))(x.x)(x.x) -> (g.x.(x.x)x(gx))(x.x) -> (g.x.x(gx))(x.x) -> x.x((x.x)x) -> x.xx 20  
  21. 21. SIIS  SII = x.xxS  これをBと書くことにすると、K(B(S(K(S(K(S(K(S(SI(K(SA(S(SA)B(SAI)))))))K))(S(K(S(SI(K(SA(SA(S(SA)B(SAI))))))))K)))B)) 21  
  22. 22. λS  先程のを使う記法がλ式 S  普通はf.g.x.fx(gx)は更更に省省略略してfgx.fx(gx)と書くS  ⽮矢印で表されていた変換がβ簡約 22  
  23. 23. 更更にもう1つK(B(S(K(S(K(S(K(S(SI(K(SA(S(SA)B(SAI)))))))K))(S(K(S(SI(K(SA(SA(S(SA)B(SAI))))))))K)))B))Ø  λ式を使ってみる 23  
  24. 24. SASA -> (fgx.fx(gx))(xyz.x(yz)) -> gx.(xyz.x(yz))x(gx) -> gx.z.x(gxz) -> xyz.y(xyz)Ø  最後の変換(⽂文字の付け替え)がα変換Ø  SAをCと書くことにする 24  
  25. 25. きりがないのでK(B(S(K(S(K(S(K(S(SI(K(C(SCB(CI)))))))K)) (S(K(S(SI(K(C(C(SCB(CI))))))))K)))B))ü  これ以上はやめるü  ちなみにこれはABAB...と無限に出⼒力力するプログラム 25  
  26. 26. Lazy K の書き⽅方S  数値もないのにどうすれば つ  チャーチ数S  条件分岐はどう(ry つ  チャーチ真理理値S  再帰とか(ry つ Yコンビネータ 26  
  27. 27. チャーチ数S  ZERO = fx.xS  ONE = fx.fxS  TWO = fx.f(fx)S  SUCC = nfx.f(nfx)S  例例) SUCC ONE -> (nfx.f(nfx))(fx.fx) -> fx.f((fx.fx)fx) -> fx.f(fx) 27  
  28. 28. Lazy K ではS  ZERO = (K I) S  (K I) -> (xy.x)(x.x) -> y.x.x -> fx.xS  SUCC = (S (S (K S) K)) S  (S (S (K S) K)) -> (S A) -> (fgx.fx(gx))(xyz.x(yz)) -> gx.(xyz.x(yz))x(gx) -> gx.z.x(gxz) -> nfx.f(nfx) 28  
  29. 29. チャーチ真理理値S  IF = xyz.xyzS  TRUE = xy.xS  FALSE = xy.yS  例例) IF TRUE A B -> (xyz.xyz)(xy.x)AB -> (xy.x)AB -> A 29  
  30. 30. Lazy K ではS  IF = (S (K (S (K I)))) (S (K (S (K I)))) -> (S (K ((fgx.fx(gx))(fx.x)))) -> (S (K (gx.gx))) -> (S ((xy.x)(gx.gx))) -> (S (ygx.gx)) -> (fgx.fx(gx))(ygx.gx) -> gx.(ygx.gx)x(gx) -> xyz.xyzS  TRUE = KS  FALSE = (K I) 30  
  31. 31. YコンビネータS  Y = f.(x.f(xx))(x.f(xx))S  例例) Yg -> (f.(x.f(xx))(x.f(xx)))g -> (x.g(xx))(x.g(xx)) -> g((x.g(xx))(x.g(xx))) -> g(Yg) 31  
  32. 32. Lazy K ではS  Y = (S S (S (S (K S) K)) (K (S I I))) (S S (S (S (K S) K)) (K (S I I))) -> (S S SUCC (K B)) -> (S S SUCC ((xy.x)(x.xx))) -> (S S SUCC (yx.xx)) -> (fgx.fx(gx))(fgx.fx(gx))(nfx.f(nfx))(yx.xx) -> (fgx.fx(gx))(yx.xx)((nfx.f(nfx))(yx.xx)) -> (fgx.fx(gx))(yx.xx)(fx.f(xx)) -> x.(yx.xx)x((fx.f(xx))x) -> x.(yx.xx)x(y.x(yy)) -> x.(y.x(yy))(y.x(yy)) 32  
  33. 33. 任意のλ式をSKIに変換S  T[x] -> xS  T[AB] -> (T[A] T[B])S  T[x.E] -> (K T(E))S  T[x.x] -> IS  T[x.y.E] -> T[x.T[y.E]]S  T[x.AB] -> (S T[x.A] T[x.B]) 33  
  34. 34. 実はIも必要ないS  I = (S K K) (S K K) -> (fgx.fx(gx))(xy.x)(xy.x) -> x.(xy.x)x((xy.x)x) -> x.(xy.x)x(y.x) -> x.x 34  
  35. 35. ιS  ι = x.xSK とすると、 S  ιι -> (x.xSK)(x.xSK) -> (x.xSK)SK -> SSKK -> (fgx.fx(gx))SKK -> SK(KK) -> (fgx.fx(gx))K(KK) -> x.Kx(KKx) -> x.(xy.x)x(KKx) -> x.x -> I S  ι(ι(ιι)) -> ι((x.xSK)(x.x)) -> ι(SK) -> ι((fgx.fx(gx))K) -> ι(gx.Kx(gx)) -> ι(gx.x) -> (x.xSK)(gx.x) -> (gx.x)SK -> K S  ι(ι(ι(ιι))) -> ιK -> (x.xSK)(xy.x) -> S 35  
  36. 36. Lazy K と愉快な仲間たちS  iota : iと*だけで記述S  jot : 0と1だけS  () : ()だけS  [] : []だけS  {} : {}だけ 36  

×