SlideShare a Scribd company logo
1 of 36
Download to read offline
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))(SII)(S(S(KS)K)I))))))))K)))(SII)))




                          4	
  
Brainf*ck?


S  いいえ、違います

 S  れっきとした関数型⾔言語です

 S  Brainf*ckよりも更更にシンプルです

 S  Brainf*ckと同様、Turing complete




                         5	
  
Lazy Kの特徴


S  純粋関数型難読プログラミング⾔言語

 S  関数以外何も存在しない

 S  数値すらない

 S  組み込み関数はS, K, Iの3つだけ

 S  関数定義もできない

 S  変数?なにそれおいしいの?


                   6	
  
組み込み関数 S


S  3つの引数f, g, xをとり、((f x) (g x))を計算する

S  Schemeで書くと、
 (define S
   (lambda (f)
     (lambda (g)
       (lambda (x)
         ((f x) (g x))))))


                             7	
  
組み込み関数 K


S  2つ引数をとり、第1引数をそのまま返す

S  Schemeで書くと、
 (define K
   (lambda (x)
     (lambda (y)
       x)))



                   8	
  
組み込み関数 I


S  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(S(KS)K)I))))))))K)))(SII)))




Ø  これを解析してみよう!


                          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)))




Ø  まずはここだけやってみる


                          11	
  
(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	
  
(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	
  
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	
  
(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	
  
(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)))




                          17	
  
もう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	
  
そのまえに


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	
  
SII


S  先程の記法で書くと、

 (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	
  
SII


S  SII = x.xx

S  これを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	
  
λ


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))




Ø  λ式を使ってみる




                          23	
  
SA


SA -> (fgx.fx(gx))(xyz.x(yz))

   -> gx.(xyz.x(yz))x(gx)

   -> gx.z.x(gxz)

   -> xyz.y(xyz)

Ø  最後の変換(⽂文字の付け替え)がα変換


Ø  SAをCと書くことにする
                          24	
  
きりがないので


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	
  
Lazy K の書き⽅方


S  数値もないのにどうすれば

  つ  チャーチ数

S  条件分岐はどう(ry

  つ  チャーチ真理理値

S  再帰とか(ry

  つ Yコンビネータ
                 26	
  
チャーチ数


S  ZERO = fx.x

S  ONE = fx.fx

S  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	
  
Lazy K では


S  ZERO = (K I)

  S  (K I) -> (xy.x)(x.x) -> y.x.x -> fx.x


S  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	
  
チャーチ真理理値


S  IF = xyz.xyz

S  TRUE = xy.x

S  FALSE = xy.y



S  例例) IF TRUE A B -> (xyz.xyz)(xy.x)AB
                    -> (xy.x)AB
                    -> A
                           29	
  
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.xyz

S  TRUE = K


S  FALSE = (K I)
                              30	
  
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	
  
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	
  
任意のλ式をSKIに変換


S  T[x] -> x

S  T[AB] -> (T[A] T[B])

S  T[x.E] -> (K T(E))

S  T[x.x] -> I

S  T[x.y.E] -> T[x.T[y.E]]

S  T[x.AB] -> (S T[x.A] T[x.B])

                           33	
  
実は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	
  
ι

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	
  
Lazy K と愉快な仲間たち


S  iota : iと*だけで記述

S  jot   : 0と1だけ

S  ()    : ()だけ

S  []    : []だけ

S  {}    : {}だけ
                      36	
  

More Related Content

What's hot

マルチコア時代の並列プログラミング
マルチコア時代の並列プログラミングマルチコア時代の並列プログラミング
マルチコア時代の並列プログラミング
Akihiko Matuura
 
2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)
2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)
2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)
智啓 出川
 
文字列検索のいろいろ
文字列検索のいろいろ文字列検索のいろいろ
文字列検索のいろいろ
Kazuma Mikami
 
CUDA 6の話@関西GPGPU勉強会#5
CUDA 6の話@関西GPGPU勉強会#5CUDA 6の話@関西GPGPU勉強会#5
CUDA 6の話@関西GPGPU勉強会#5
Yosuke Onoue
 

What's hot (20)

量子アニーリングマシンのプログラミング
量子アニーリングマシンのプログラミング量子アニーリングマシンのプログラミング
量子アニーリングマシンのプログラミング
 
マルチコア時代の並列プログラミング
マルチコア時代の並列プログラミングマルチコア時代の並列プログラミング
マルチコア時代の並列プログラミング
 
Deep Dive into the Linux Kernel - メモリ管理におけるCompaction機能について
Deep Dive into the Linux Kernel - メモリ管理におけるCompaction機能についてDeep Dive into the Linux Kernel - メモリ管理におけるCompaction機能について
Deep Dive into the Linux Kernel - メモリ管理におけるCompaction機能について
 
NGINXセミナー(基本編)~いまさら聞けないNGINXコンフィグなど基本がわかる!
NGINXセミナー(基本編)~いまさら聞けないNGINXコンフィグなど基本がわかる!NGINXセミナー(基本編)~いまさら聞けないNGINXコンフィグなど基本がわかる!
NGINXセミナー(基本編)~いまさら聞けないNGINXコンフィグなど基本がわかる!
 
Java8でRDBMS作ったよ
Java8でRDBMS作ったよJava8でRDBMS作ったよ
Java8でRDBMS作ったよ
 
株式会社フィックスターズの会社説明資料(抜粋)
株式会社フィックスターズの会社説明資料(抜粋)株式会社フィックスターズの会社説明資料(抜粋)
株式会社フィックスターズの会社説明資料(抜粋)
 
C#, C/CLI と CUDAによる画像処理ことはじめ
C#, C/CLI と CUDAによる画像処理ことはじめC#, C/CLI と CUDAによる画像処理ことはじめ
C#, C/CLI と CUDAによる画像処理ことはじめ
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
CuPyでAx=bを解きたかった話
CuPyでAx=bを解きたかった話CuPyでAx=bを解きたかった話
CuPyでAx=bを解きたかった話
 
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるDSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
 
汎化性能測定
汎化性能測定汎化性能測定
汎化性能測定
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみた
 
2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)
2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)
2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)
 
ACRi HLSチャレンジ 高速化テクニック紹介
ACRi HLSチャレンジ 高速化テクニック紹介ACRi HLSチャレンジ 高速化テクニック紹介
ACRi HLSチャレンジ 高速化テクニック紹介
 
Node.jsで使えるファイルDB"NeDB"のススメ
Node.jsで使えるファイルDB"NeDB"のススメNode.jsで使えるファイルDB"NeDB"のススメ
Node.jsで使えるファイルDB"NeDB"のススメ
 
グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜
 
文字列検索のいろいろ
文字列検索のいろいろ文字列検索のいろいろ
文字列検索のいろいろ
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
CUDA 6の話@関西GPGPU勉強会#5
CUDA 6の話@関西GPGPU勉強会#5CUDA 6の話@関西GPGPU勉強会#5
CUDA 6の話@関西GPGPU勉強会#5
 
Intellectual Highway/貞末様 講演資料
Intellectual Highway/貞末様 講演資料Intellectual Highway/貞末様 講演資料
Intellectual Highway/貞末様 講演資料
 

Similar to Lazyk

ガンマ分布族のなす空間の曲率
ガンマ分布族のなす空間の曲率ガンマ分布族のなす空間の曲率
ガンマ分布族のなす空間の曲率
Masaki Asano
 
130604 fpgax kibayos
130604 fpgax kibayos130604 fpgax kibayos
130604 fpgax kibayos
Mikio Yoshida
 
公開鍵暗号7: 楕円曲線の数理
公開鍵暗号7: 楕円曲線の数理公開鍵暗号7: 楕円曲線の数理
公開鍵暗号7: 楕円曲線の数理
Joe Suzuki
 

Similar to Lazyk (15)

Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
 
半正定値計画問題と最大カット Sedemifinite Programming and Approximation Algorithm for Maxcu...
半正定値計画問題と最大カット Sedemifinite Programming and Approximation Algorithm for Maxcu...半正定値計画問題と最大カット Sedemifinite Programming and Approximation Algorithm for Maxcu...
半正定値計画問題と最大カット Sedemifinite Programming and Approximation Algorithm for Maxcu...
 
2018年度秋学期 画像情報処理 第11回 逆投影法による再構成 (2018. 12. 21)
2018年度秋学期 画像情報処理 第11回 逆投影法による再構成 (2018. 12. 21)2018年度秋学期 画像情報処理 第11回 逆投影法による再構成 (2018. 12. 21)
2018年度秋学期 画像情報処理 第11回 逆投影法による再構成 (2018. 12. 21)
 
M-expr
M-exprM-expr
M-expr
 
ガンマ分布族のなす空間の曲率
ガンマ分布族のなす空間の曲率ガンマ分布族のなす空間の曲率
ガンマ分布族のなす空間の曲率
 
Topic model
Topic modelTopic model
Topic model
 
代数的実数とCADの実装紹介
代数的実数とCADの実装紹介代数的実数とCADの実装紹介
代数的実数とCADの実装紹介
 
130604 fpgax kibayos
130604 fpgax kibayos130604 fpgax kibayos
130604 fpgax kibayos
 
公開鍵暗号7: 楕円曲線の数理
公開鍵暗号7: 楕円曲線の数理公開鍵暗号7: 楕円曲線の数理
公開鍵暗号7: 楕円曲線の数理
 
2019年度秋学期 画像情報処理 第12回 逆投影法による再構成 (2019. 12. 20)
2019年度秋学期 画像情報処理 第12回 逆投影法による再構成 (2019. 12. 20)2019年度秋学期 画像情報処理 第12回 逆投影法による再構成 (2019. 12. 20)
2019年度秋学期 画像情報処理 第12回 逆投影法による再構成 (2019. 12. 20)
 
Stochastic complexities of reduced rank regression証明概略
 Stochastic complexities of reduced rank regression証明概略 Stochastic complexities of reduced rank regression証明概略
Stochastic complexities of reduced rank regression証明概略
 
有限オートマトンとスティッカー系に関するCoqによる形式証明について
有限オートマトンとスティッカー系に関するCoqによる形式証明について有限オートマトンとスティッカー系に関するCoqによる形式証明について
有限オートマトンとスティッカー系に関するCoqによる形式証明について
 
SICP
SICPSICP
SICP
 
2020年度秋学期 画像情報処理 第11回 Radon変換と投影定理 (2020. 12. 4)
2020年度秋学期 画像情報処理 第11回 Radon変換と投影定理 (2020. 12. 4)2020年度秋学期 画像情報処理 第11回 Radon変換と投影定理 (2020. 12. 4)
2020年度秋学期 画像情報処理 第11回 Radon変換と投影定理 (2020. 12. 4)
 
Fractional cascading
Fractional cascadingFractional cascading
Fractional cascading
 

Lazyk