Slide 1

Slide 1 text

ࢲΛ SKI ʹ࿈Εͯͬͯ 201x年m月d日 第3回 OUCC LT会 のつもりだったけど長すぎてボツ

Slide 2

Slide 2 text

͓લ୭ͬͯਓͷͨΊͷ すしす Twitter: @susisu2413 GitHub: susisu

Slide 3

Slide 3 text

ຊ೔ͷ༧ఆ λ計算入門 SKIコンビネータ入門 Lazy K の紹介

Slide 4

Slide 4 text

λܭࢉೖ໳

Slide 5

Slide 5 text

λܭࢉͱ͸ "計算"を関数とその適用でモデル化 したもの 関数型言語の理論的基盤 ここでは型無しλ計算を紹介します 型付きもあるんだよ

Slide 6

Slide 6 text

λࣜ 変数 a, b, c, ..., x, y, z, ... λ抽象 λx.x, λx.λy.(x y), ... 関数適用 (f x)

Slide 7

Slide 7 text

λࣜ λx.λy.* は λx y.* と略記する 関数適用の括弧は曖昧でない場合は 省略する x y = (x y) 関数適用は左結合 f x y = ((f x) y)

Slide 8

Slide 8 text

α-ม׵ λ抽象の束縛変数名は重要ではない 例えば λx.x = λy.y 束縛変数名を別の名前に置き換える 操作をα-変換と呼ぶ α-変換で同じλ式にできるなら等価

Slide 9

Slide 9 text

β-؆໿ 要はただの関数適用の評価 λ抽象内部の束縛変数を全て引数で 置き換える 例えば (λx.f x) y = f y β-簡約で同じλ式にできるなら等価

Slide 10

Slide 10 text

η-ม׵ どんな引数に対しても同じ結果にな るならば、それらは同じといっても いいよね (外延的等価性) 例えば f = λx.f x これらの間の変換をη-変換と呼ぶ η-変換で同じλ式にできるなら等価

Slide 11

Slide 11 text

Quiz 1. λx.x y = λy.y y ? 2. (λx.λx.x y) y = λy.y y ? 3. λx.x = (λx y z.x z (y z)) (λx y.x) (λx y.x) ?

Slide 12

Slide 12 text

Answer 1. No 2. No 3. Yes

Slide 13

Slide 13 text

λܭࢉ λ式と変換・簡約の規則をまとめて λ計算と呼ぶ λ計算はチューリング完全 どんな手続き (プログラム) もλ式 で表現できる

Slide 14

Slide 14 text

Q. Ͳ͏ܭࢉ͢Δͷ 入力 x が与えられるとする 手続きを表すλ式 p をうまく選べば、 例えば y = p x で出力が得られる y を変換・簡約すれば解読できそう

Slide 15

Slide 15 text

Q. ਺஋ͱ͔Ͳ͏͢Δͷ 数値がなければ、λ式を使えばいい じゃない 真理値がなければ、λ式を使えば リストがなければ、λ式を

Slide 16

Slide 16 text

Church਺ λ式で自然数を表わすひとつの方法

Slide 17

Slide 17 text

Church਺ 0 := λf x.x 1 := λf x.f x 2 := λf x.f (f x) ...

Slide 18

Slide 18 text

Church਺ 次の自然数を求める関数 Succ Succ := λn f x.f (n f x) 足し算 Add Add := λa b f x.a f (b f x) 掛け算はどうなるか考えてみよう

Slide 19

Slide 19 text

Church਺ 掛け算 Mul Mul := λa b f x.a (b f) x

Slide 20

Slide 20 text

Church਺ 前の自然数を求める関数 Pred Pred := λn f x. n (λg h.h (g f)) (λy.x) (λy.y) ただし Pred 0 = 0 キリがないのでこれ以上はやめる

Slide 21

Slide 21 text

Churchਅཧ஋ True := λx y.x False := λx y.y If := λp x y.p x y = λp.p

Slide 22

Slide 22 text

Churchਅཧ஋ AND, OR, NOT And := λp q.p q False Or := λp q.p True q Not := λp.p False True

Slide 23

Slide 23 text

ड़ޠͷྫ Church数 n が 0 かどうか調べる 0 = λf x.x だった IsZero := λn. n (λx.False) True だんだんとプログラムが書ける気が してきませんか?

Slide 24

Slide 24 text

Churchର リストや木構造は対 (pair) の連鎖 で表現できる [1, 2, 3] = (1, (2, (3, 空))) 対をλ式で表現できればいいよね

Slide 25

Slide 25 text

Churchର 対をつくる関数 Cons Cons := λx y c.c x y かんたん!べんり!

Slide 26

Slide 26 text

Churchର 対の前後を取り出す関数 Car, Cdr Car := λp.p (λx y.x) Cdr := λp.p (λx y.y)

Slide 27

Slide 27 text

Churchର 空 (リストの終端) は? 好きなものを使えば良い False が一般的っぽい?

Slide 28

Slide 28 text

Quiz 入力 x が 2 つのChurch数 a, b の Church対で与えられる 出力 y = p x が、a = 0 なら y = b、 それ以外なら y = a * b となる p を書いてみよう Succ などこれまでに定義したものは 使ってもよい

Slide 29

Slide 29 text

Answer 例: λx.IsZero (Car x) (Cdr x) (Mul (Car x) (Cdr x))

Slide 30

Slide 30 text

܁Γฦ͠ॲཧ 繰り返し処理を関数で表現したい時 は、再帰的な関数を書けばいい f(0) = 1, f(n) = n * f(n - 1) けれどλ計算では"再帰的な定義"が できないので、単純には書けない

Slide 31

Slide 31 text

ؔ਺ͷෆಈ఺ 関数 f に対して、f x = x となる ような x を f の不動点と呼ぶ

Slide 32

Slide 32 text

Fix 関数 f を引数にとり、その不動点を 返す関数 Fix が存在したとする Fix f = f (Fix f) f = λx n. IsZero n True (x (Pred n)) Fix f n は n 回の空ループになる

Slide 33

Slide 33 text

Fix Fix があれば、繰り返し処理を表現 することが出来る このような関数 Fix をなんとかλ式 だけで表現できないか?

Slide 34

Slide 34 text

Fix できる! Fix := λf.(λx.f (x x)) (λx.f (x x)) 実際に Fix f = f (Fix f) となるか 確かめてみるとよいです

Slide 35

Slide 35 text

λܭࢉͷ·ͱΊ λ計算は、計算を関数とその適用で モデル化したもの チューリング完全 数値も真理値もリストもλ式で表現 できる 繰り返し処理だってできちゃう

Slide 36

Slide 36 text

SKIίϯϏωʔλೖ໳

Slide 37

Slide 37 text

ίϯϏωʔλܭࢉͱ͸ ! 高階関数 (コンビネータ) を用いて計算 を行う λ計算と同じく、簡約が存在 (P x y z ...) = E 簡約の結果 E は、コンビネータ P の 定義による

Slide 38

Slide 38 text

ίϯϏωʔλͷྫ B x y z = x (y z) C x y z = x z y W x y = x y y

Slide 39

Slide 39 text

ίϯϏωʔλͷྫ S x y z = x z (y z) K x y = x I x = x 実は I = S K K とも書ける

Slide 40

Slide 40 text

SKIίϯϏωʔλܭࢉ S、K、I の 3 つのコンビネータを、 "基底"として用いる 他のコンビネータは S、K、I の組み 合わせで表現する スキーとは関係がない

Slide 41

Slide 41 text

SKI ͰԿ͕Ͱ͖Δ͔ SKIコンビネータ計算はチューリング 完全 λ抽象と相互に変換することができる SKI→λ は自明 λ→SKI については Wikipedia の 「コンビネータ論理」のページを 見るとよいかも

Slide 42

Slide 42 text

SKI ͰChurch਺ 0 := KI 1 := I 2 := S(S(KS)K)I ... Succ := S(S(KS)K)

Slide 43

Slide 43 text

SKI ͰChurchਅཧ஋ True := K False := KI If := I

Slide 44

Slide 44 text

SKI ͰChurchର Cons := S(S(KS)(S(KK)(S(KS) (S(K(SI))K))))(KK) 笑っちゃうよね

Slide 45

Slide 45 text

SKI ͰFix (Y) Fix よりも、不動点コンビネータ Y と呼ぶことが多い (きがする) Y := SSK(S(K(SS(S(SSK))))K)

Slide 46

Slide 46 text

Quiz Church数の掛け算、足し算を SKI で 書いてみよう 足し算の方が難しくなるはず

Slide 47

Slide 47 text

Answer Mul = S(KS)K Add = S(KS)(S(K(S(KS))) (S(KK)))

Slide 48

Slide 48 text

SKI ͷ·ͱΊ S, K, I という 3 つのコンビネータ と適用だけで計算をする チューリング完全 λ抽象と相互に変換できる データも表せるし、繰り返し処理も できる

Slide 49

Slide 49 text

ͩΜͩΜࣗ෼ͷ SKI ྗ͕ͲΕ΄Ͳͷ΋ͷ͔ ͔֬Ίͨ͘ͳ͖ͬͯ·ͨ͠ΑͶʁ

Slide 50

Slide 50 text

Lazy K

Slide 51

Slide 51 text

͜͜Ζ Ն໨ᕸੴ

Slide 52

Slide 52 text

lਫ਼ਆతʹ޲্৺ͷͳ͍΋ͷ͸അࣛͩz

Slide 53

Slide 53 text

lਫ਼ਆతʹ޲্৺ͷͳ͍΋ͷ͸അࣛͩz Eager K

Slide 54

Slide 54 text

Lazy K ͱ͸ SKIコンビネータ計算をベースにした 言語 遅延評価、故に Lazy 対義語: Eager, Strict こころの K とは関係がない

Slide 55

Slide 55 text

஗ԆධՁ 結果に必要のない部分を評価 (計算) しないための仕組み 例えば K x y = x の y は必要ない ので、評価を省略したい

Slide 56

Slide 56 text

஗ԆධՁ ほとんどのプログラミング言語では、 引数は適用の前に評価される Lazy K では、引数はそれ自身が関数 として適用に使われるまで評価が遅延 される (使わなければ評価されない) これによって、Yコンビネータによる 停止するループや、無限の長さをもつ リストが実現できる

Slide 57

Slide 57 text

ೖྗ 入力は文字コードをChurch数で表現 したものの、Church対によるリスト で与えられる 入力の終端はChurch数 256 256 = SII(SII(S(S(KS)K)I)) ただし"リストの終端"ではない

Slide 58

Slide 58 text

ग़ྗ 入力 X とプログラム P に対して、 出力は Y = P X 出力も文字コードをChurch数で表現 したものの、Church対によるリスト 出力の終端も 256 以上のChurch数

Slide 59

Slide 59 text

ه๏ Lazy K には 4 つの記法がある コンビネータ計算 …… S(KI)I unlambda …… ``s`kii Iota …… * と i だけ Jot …… 0 と 1 だけ

Slide 60

Slide 60 text

ه๏ ͦͷଞ 空白、改行は無視される # の後は改行までコメント 空ファイルは I

Slide 61

Slide 61 text

Lazy K ॲཧܥ http://esoteric.sange.fi/essie2/ download/lazy-k.zip Windows 用のバイナリ同梱 GCC でコンパイルするときは lazy.cpp にパッチを当てる https://gist.github.com/ susisu/831e06af2ddee14938c8

Slide 62

Slide 62 text

Lazy K ॲཧܥ 実行はファイルから、または -e で 直接プログラムを指定 $ lazy $ lazy -e

Slide 63

Slide 63 text

Lazy K ॲཧܥ ためしになにか動かしてみる $ lazy eg/calc.lazy $ lazy -e SKK 中身を見るともっとたのしい SKI を組み合わせて、君だけの最強 プログラムを作ろう!

Slide 64

Slide 64 text

Lazy K ͷҋ͸ਂ͍

Slide 65

Slide 65 text

ࢀߟจݙ 大体 Wikipedia を読めばいいと思う ラムダ計算 コンビネータ論理 SKIコンビネータ計算 不動点コンビネータ

Slide 66

Slide 66 text

ࢀߟจݙ The Lazy K Programming Language https://tromp.github.io/cl/lazy- k.html ↑の日本語訳 http://legacy.e.tir.jp/wiliki?%CB %DD%CC%F5%3A%A5%D7%A5%ED %A5%B0%A5%E9%A5%DF %A5%F3%A5%B0%B8%C0%B8%ECLazy_K