私を SKI に連れてって

Susisu
私を SKI に連れてって
201x年m月d日 第3回 OUCC LT会
のつもりだったけど長すぎてボツ
お前誰って人のための
すしす
Twitter: @susisu2413
GitHub: susisu
本日の予定
λ計算入門
SKIコンビネータ入門
Lazy K の紹介
λ計算入門
λ計算とは
"計算"を関数とその適用でモデル化
したもの
関数型言語の理論的基盤
ここでは型無しλ計算を紹介します
型付きもあるんだよ
λ式
変数 a, b, c, ..., x, y, z, ...
λ抽象 λx.x, λx.λy.(x y), ...
関数適用 (f x)
λ式
λx.λy.* は λx y.* と略記する
関数適用の括弧は曖昧でない場合は
省略する
x y = (x y)
関数適用は左結合
f x y = ((f x) y)
α-変換
λ抽象の束縛変数名は重要ではない
例えば λx.x = λy.y
束縛変数名を別の名前に置き換える
操作をα-変換と呼ぶ
α-変換で同じλ式にできるなら等価
β-簡約
要はただの関数適用の評価
λ抽象内部の束縛変数を全て引数で
置き換える
例えば (λx.f x) y = f y
β-簡約で同じλ式にできるなら等価
η-変換
どんな引数に対しても同じ結果にな
るならば、それらは同じといっても
いいよね (外延的等価性)
例えば f = λx.f x
これらの間の変換をη-変換と呼ぶ
η-変換で同じλ式にできるなら等価
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) ?
Answer
1. No
2. No
3. Yes
λ計算
λ式と変換・簡約の規則をまとめて
λ計算と呼ぶ
λ計算はチューリング完全
どんな手続き (プログラム) もλ式
で表現できる
Q. どう計算するの
入力 x が与えられるとする
手続きを表すλ式 p をうまく選べば、
例えば y = p x で出力が得られる
y を変換・簡約すれば解読できそう
Q. 数値とかどうするの
数値がなければ、λ式を使えばいい
じゃない
真理値がなければ、λ式を使えば
リストがなければ、λ式を
Church数
λ式で自然数を表わすひとつの方法
Church数
0 := λf x.x
1 := λf x.f x
2 := λf x.f (f x)
...
Church数
次の自然数を求める関数 Succ
Succ := λn f x.f (n f x)
足し算 Add
Add := λa b f x.a f (b f x)
掛け算はどうなるか考えてみよう
Church数
掛け算 Mul
Mul := λa b f x.a (b f) x
Church数
前の自然数を求める関数 Pred
Pred := λn f x.
n (λg h.h (g f))
(λy.x) (λy.y)
ただし Pred 0 = 0
キリがないのでこれ以上はやめる
Church真理値
True := λx y.x
False := λx y.y
If := λp x y.p x y = λp.p
Church真理値
AND, OR, NOT
And := λp q.p q False
Or := λp q.p True q
Not := λp.p False True
述語の例
Church数 n が 0 かどうか調べる
0 = λf x.x だった
IsZero := λn.
n (λx.False) True
だんだんとプログラムが書ける気が
してきませんか?
Church対
リストや木構造は対 (pair) の連鎖
で表現できる
[1, 2, 3] = (1, (2, (3, 空)))
対をλ式で表現できればいいよね
Church対
対をつくる関数 Cons
Cons := λx y c.c x y
かんたん!べんり!
Church対
対の前後を取り出す関数 Car, Cdr
Car := λp.p (λx y.x)
Cdr := λp.p (λx y.y)
Church対
空 (リストの終端) は?
好きなものを使えば良い
False が一般的っぽい?
Quiz
入力 x が 2 つのChurch数 a, b の
Church対で与えられる
出力 y = p x が、a = 0 なら y = b、
それ以外なら y = a * b となる p
を書いてみよう
Succ などこれまでに定義したものは
使ってもよい
Answer
例: λx.IsZero (Car x) (Cdr x)
(Mul (Car x) (Cdr x))
繰り返し処理
繰り返し処理を関数で表現したい時
は、再帰的な関数を書けばいい
f(0) = 1, f(n) = n * f(n - 1)
けれどλ計算では"再帰的な定義"が
できないので、単純には書けない
関数の不動点
関数 f に対して、f x = x となる
ような x を f の不動点と呼ぶ
Fix
関数 f を引数にとり、その不動点を
返す関数 Fix が存在したとする
Fix f = f (Fix f)
f = λx n.
IsZero n True (x (Pred n))
Fix f n は n 回の空ループになる
Fix
Fix があれば、繰り返し処理を表現
することが出来る
このような関数 Fix をなんとかλ式
だけで表現できないか?
Fix
できる!
Fix := λf.(λx.f (x x))
(λx.f (x x))
実際に Fix f = f (Fix f) となるか
確かめてみるとよいです
λ計算のまとめ
λ計算は、計算を関数とその適用で
モデル化したもの
チューリング完全
数値も真理値もリストもλ式で表現
できる
繰り返し処理だってできちゃう
SKIコンビネータ入門
コンビネータ計算とは
!
高階関数 (コンビネータ) を用いて計算
を行う
λ計算と同じく、簡約が存在
(P x y z ...) = E
簡約の結果 E は、コンビネータ P の
定義による
コンビネータの例
B x y z = x (y z)
C x y z = x z y
W x y = x y y
コンビネータの例
S x y z = x z (y z)
K x y = x
I x = x
実は I = S K K とも書ける
SKIコンビネータ計算
S、K、I の 3 つのコンビネータを、
"基底"として用いる
他のコンビネータは S、K、I の組み
合わせで表現する
スキーとは関係がない
SKI で何ができるか
SKIコンビネータ計算はチューリング
完全
λ抽象と相互に変換することができる
SKI→λ は自明
λ→SKI については Wikipedia の
「コンビネータ論理」のページを
見るとよいかも
SKI でChurch数
0 := KI
1 := I
2 := S(S(KS)K)I
...
Succ := S(S(KS)K)
SKI でChurch真理値
True := K
False := KI
If := I
SKI でChurch対
Cons := S(S(KS)(S(KK)(S(KS)
(S(K(SI))K))))(KK)
笑っちゃうよね
SKI で Fix (Y)
Fix よりも、不動点コンビネータ Y
と呼ぶことが多い (きがする)
Y := SSK(S(K(SS(S(SSK))))K)
Quiz
Church数の掛け算、足し算を SKI で
書いてみよう
足し算の方が難しくなるはず
Answer
Mul = S(KS)K
Add = S(KS)(S(K(S(KS)))
(S(KK)))
SKI のまとめ
S, K, I という 3 つのコンビネータ
と適用だけで計算をする
チューリング完全
λ抽象と相互に変換できる
データも表せるし、繰り返し処理も
できる
だんだん自分の SKI 力がどれほどのものか
確かめたくなってきましたよね?
Lazy K
こころ
夏目漱石
精神的に向上心のないものは馬鹿だ
精神的に向上心のないものは馬鹿だ
Eager K
Lazy K とは
SKIコンビネータ計算をベースにした
言語
遅延評価、故に Lazy
対義語: Eager, Strict
こころの K とは関係がない
遅延評価
結果に必要のない部分を評価 (計算)
しないための仕組み
例えば K x y = x の y は必要ない
ので、評価を省略したい
遅延評価
ほとんどのプログラミング言語では、
引数は適用の前に評価される
Lazy K では、引数はそれ自身が関数
として適用に使われるまで評価が遅延
される (使わなければ評価されない)
これによって、Yコンビネータによる
停止するループや、無限の長さをもつ
リストが実現できる
入力
入力は文字コードをChurch数で表現
したものの、Church対によるリスト
で与えられる
入力の終端はChurch数 256
256 = SII(SII(S(S(KS)K)I))
ただし"リストの終端"ではない
出力
入力 X とプログラム P に対して、
出力は Y = P X
出力も文字コードをChurch数で表現
したものの、Church対によるリスト
出力の終端も 256 以上のChurch数
記法
Lazy K には 4 つの記法がある
コンビネータ計算 …… S(KI)I
unlambda …… ``s`kii
Iota …… * と i だけ
Jot …… 0 と 1 だけ
記法 (その他)
空白、改行は無視される
# の後は改行までコメント
空ファイルは I
Lazy K 処理系
http://esoteric.sange.fi/essie2/
download/lazy-k.zip
Windows 用のバイナリ同梱
GCC でコンパイルするときは
lazy.cpp にパッチを当てる
https://gist.github.com/
susisu/831e06af2ddee14938c8
Lazy K 処理系
実行はファイルから、または -e で
直接プログラムを指定
$ lazy <file>
$ lazy -e <program>
Lazy K 処理系
ためしになにか動かしてみる
$ lazy eg/calc.lazy
$ lazy -e SKK
中身を見るともっとたのしい
SKI を組み合わせて、君だけの最強
プログラムを作ろう!
Lazy K の闇は深い
参考文献
大体 Wikipedia を読めばいいと思う
ラムダ計算
コンビネータ論理
SKIコンビネータ計算
不動点コンビネータ
参考文献
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
1 de 66

Recomendados

Coqチュートリアル por
CoqチュートリアルCoqチュートリアル
CoqチュートリアルYoshihiro Mizoguchi
3.1K vistas36 diapositivas
コサインクラスタリング por
コサインクラスタリングコサインクラスタリング
コサインクラスタリングosamu morimoto
2.8K vistas8 diapositivas
Monad tutorial por
Monad tutorialMonad tutorial
Monad tutorialHideyuki Tanaka
13.3K vistas79 diapositivas
[DL輪読会] Hybrid computing using a neural network with dynamic external memory por
[DL輪読会] Hybrid computing using a neural network with dynamic external memory[DL輪読会] Hybrid computing using a neural network with dynamic external memory
[DL輪読会] Hybrid computing using a neural network with dynamic external memoryYusuke Iwasawa
2.8K vistas50 diapositivas
ラムダ計算入門 por
ラムダ計算入門ラムダ計算入門
ラムダ計算入門Eita Sugimoto
33.7K vistas39 diapositivas
明日使えないすごいビット演算 por
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算京大 マイコンクラブ
63.4K vistas60 diapositivas

Más contenido relacionado

La actualidad más candente

音楽波形データからコードを推定してみる por
音楽波形データからコードを推定してみる音楽波形データからコードを推定してみる
音楽波形データからコードを推定してみるKen'ichi Matsui
2.2K vistas40 diapositivas
3次元の凸包を求める por
3次元の凸包を求める3次元の凸包を求める
3次元の凸包を求めるabc3141
4.8K vistas24 diapositivas
異常検知と変化検知 第4章 近傍法による異常検知 por
異常検知と変化検知 第4章 近傍法による異常検知異常検知と変化検知 第4章 近傍法による異常検知
異常検知と変化検知 第4章 近傍法による異常検知Ken'ichi Matsui
19.3K vistas55 diapositivas
[Tokyor08] Rによるデータサイエンス 第2部 第3章 対応分析 por
[Tokyor08] Rによるデータサイエンス第2部 第3章 対応分析[Tokyor08] Rによるデータサイエンス第2部 第3章 対応分析
[Tokyor08] Rによるデータサイエンス 第2部 第3章 対応分析Yohei Sato
3.7K vistas64 diapositivas
高度に最適化された移植可能なメモリマネージャ por
高度に最適化された移植可能なメモリマネージャ高度に最適化された移植可能なメモリマネージャ
高度に最適化された移植可能なメモリマネージャDADA246
8K vistas31 diapositivas
グラフデータの機械学習における特徴表現の設計と学習 por
グラフデータの機械学習における特徴表現の設計と学習グラフデータの機械学習における特徴表現の設計と学習
グラフデータの機械学習における特徴表現の設計と学習Ichigaku Takigawa
8.8K vistas32 diapositivas

La actualidad más candente(20)

音楽波形データからコードを推定してみる por Ken'ichi Matsui
音楽波形データからコードを推定してみる音楽波形データからコードを推定してみる
音楽波形データからコードを推定してみる
Ken'ichi Matsui2.2K vistas
3次元の凸包を求める por abc3141
3次元の凸包を求める3次元の凸包を求める
3次元の凸包を求める
abc31414.8K vistas
異常検知と変化検知 第4章 近傍法による異常検知 por Ken'ichi Matsui
異常検知と変化検知 第4章 近傍法による異常検知異常検知と変化検知 第4章 近傍法による異常検知
異常検知と変化検知 第4章 近傍法による異常検知
Ken'ichi Matsui19.3K vistas
[Tokyor08] Rによるデータサイエンス 第2部 第3章 対応分析 por Yohei Sato
[Tokyor08] Rによるデータサイエンス第2部 第3章 対応分析[Tokyor08] Rによるデータサイエンス第2部 第3章 対応分析
[Tokyor08] Rによるデータサイエンス 第2部 第3章 対応分析
Yohei Sato3.7K vistas
高度に最適化された移植可能なメモリマネージャ por DADA246
高度に最適化された移植可能なメモリマネージャ高度に最適化された移植可能なメモリマネージャ
高度に最適化された移植可能なメモリマネージャ
DADA2468K vistas
グラフデータの機械学習における特徴表現の設計と学習 por Ichigaku Takigawa
グラフデータの機械学習における特徴表現の設計と学習グラフデータの機械学習における特徴表現の設計と学習
グラフデータの機械学習における特徴表現の設計と学習
Ichigaku Takigawa8.8K vistas
純粋関数型アルゴリズム入門 por Kimikazu Kato
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
Kimikazu Kato6.6K vistas
OCaml-MPST / Global Protocol Combinators por Keigo Imai
OCaml-MPST / Global Protocol CombinatorsOCaml-MPST / Global Protocol Combinators
OCaml-MPST / Global Protocol Combinators
Keigo Imai475 vistas
[DL輪読会]Discriminative Learning for Monaural Speech Separation Using Deep Embe... por Deep Learning JP
[DL輪読会]Discriminative Learning for Monaural Speech Separation Using Deep Embe...[DL輪読会]Discriminative Learning for Monaural Speech Separation Using Deep Embe...
[DL輪読会]Discriminative Learning for Monaural Speech Separation Using Deep Embe...
Deep Learning JP923 vistas
代数的データ型をラムダ計算の中で表現する方法 por syamino
代数的データ型をラムダ計算の中で表現する方法代数的データ型をラムダ計算の中で表現する方法
代数的データ型をラムダ計算の中で表現する方法
syamino7.6K vistas
Linuxのsemaphoreとmutexを見る  por wata2ki
Linuxのsemaphoreとmutexを見る Linuxのsemaphoreとmutexを見る 
Linuxのsemaphoreとmutexを見る 
wata2ki3K vistas
第8回Language and Robotics研究会20221010_AkiraTaniguchi por Akira Taniguchi
第8回Language and Robotics研究会20221010_AkiraTaniguchi第8回Language and Robotics研究会20221010_AkiraTaniguchi
第8回Language and Robotics研究会20221010_AkiraTaniguchi
Akira Taniguchi256 vistas
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた- por Deep Learning JP
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-
Deep Learning JP36.2K vistas
単純ベイズ法による異常検知 #ml-professional por Ai Makabi
単純ベイズ法による異常検知  #ml-professional単純ベイズ法による異常検知  #ml-professional
単純ベイズ法による異常検知 #ml-professional
Ai Makabi7.1K vistas
サポートベクトルデータ記述法による異常検知 in 機械学習プロフェッショナルシリーズ輪読会 por Shotaro Sano
サポートベクトルデータ記述法による異常検知 in 機械学習プロフェッショナルシリーズ輪読会サポートベクトルデータ記述法による異常検知 in 機械学習プロフェッショナルシリーズ輪読会
サポートベクトルデータ記述法による異常検知 in 機械学習プロフェッショナルシリーズ輪読会
Shotaro Sano5.4K vistas
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介 por Preferred Networks
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
Preferred Networks10K vistas
深層学習の判断根拠を理解するための 研究とその意義 @PRMU 2017熊本 por Takahiro Kubo
深層学習の判断根拠を理解するための 研究とその意義 @PRMU 2017熊本深層学習の判断根拠を理解するための 研究とその意義 @PRMU 2017熊本
深層学習の判断根拠を理解するための 研究とその意義 @PRMU 2017熊本
Takahiro Kubo14.9K vistas
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料 por Ken'ichi Matsui
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料 「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
Ken'ichi Matsui96K vistas

Destacado

Anajae's Networking presentation por
Anajae's Networking presentationAnajae's Networking presentation
Anajae's Networking presentationAnajae Lamb
197 vistas20 diapositivas
Dip IT por
Dip ITDip IT
Dip ITYongHan Lim
122 vistas1 diapositiva
Exposición capitulo II por
Exposición capitulo IIExposición capitulo II
Exposición capitulo IIVerito Aldana D'Garcia
341 vistas16 diapositivas
Cd por
CdCd
CdMattR298
138 vistas1 diapositiva
RACT 2 Review - ALL4 por
RACT 2 Review - ALL4RACT 2 Review - ALL4
RACT 2 Review - ALL4All4 Inc.
408 vistas4 diapositivas
How to package github softwares por
How to package github softwaresHow to package github softwares
How to package github softwaresRyo ONODERA
502 vistas8 diapositivas

Destacado(13)

Anajae's Networking presentation por Anajae Lamb
Anajae's Networking presentationAnajae's Networking presentation
Anajae's Networking presentation
Anajae Lamb197 vistas
RACT 2 Review - ALL4 por All4 Inc.
RACT 2 Review - ALL4RACT 2 Review - ALL4
RACT 2 Review - ALL4
All4 Inc.408 vistas
How to package github softwares por Ryo ONODERA
How to package github softwaresHow to package github softwares
How to package github softwares
Ryo ONODERA502 vistas
Presentacion de un producto al mMercado por Jaime Guallan
Presentacion de un producto al mMercadoPresentacion de un producto al mMercado
Presentacion de un producto al mMercado
Jaime Guallan213 vistas
NetBSD on Google Compute Engine (en) por Ryo ONODERA
NetBSD on Google Compute Engine (en)NetBSD on Google Compute Engine (en)
NetBSD on Google Compute Engine (en)
Ryo ONODERA871 vistas
新生Lagopus2017(仮称) por Masaru Oki
新生Lagopus2017(仮称)新生Lagopus2017(仮称)
新生Lagopus2017(仮称)
Masaru Oki1.5K vistas
Onieで遊んでみようとした話 por Masaru Oki
Onieで遊んでみようとした話Onieで遊んでみようとした話
Onieで遊んでみようとした話
Masaru Oki3.7K vistas

Similar a 私を SKI に連れてって

Introduction to Categorical Programming (Revised) por
Introduction to Categorical Programming (Revised)Introduction to Categorical Programming (Revised)
Introduction to Categorical Programming (Revised)Masahiro Sakai
6.4K vistas53 diapositivas
Introduction to Categorical Programming por
Introduction to Categorical ProgrammingIntroduction to Categorical Programming
Introduction to Categorical ProgrammingMasahiro Sakai
1.7K vistas33 diapositivas
たのしい関数型 por
たのしい関数型たのしい関数型
たのしい関数型Shinichi Kozake
6.2K vistas94 diapositivas
yieldとreturnの話 por
yieldとreturnの話yieldとreturnの話
yieldとreturnの話bleis tift
7.4K vistas72 diapositivas
Ekmett勉強会発表資料 por
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
948 vistas68 diapositivas
F#で関数型言語に触れてみよう por
F#で関数型言語に触れてみようF#で関数型言語に触れてみよう
F#で関数型言語に触れてみようwof moriguchi
8.1K vistas46 diapositivas

Similar a 私を SKI に連れてって(20)

Introduction to Categorical Programming (Revised) por Masahiro Sakai
Introduction to Categorical Programming (Revised)Introduction to Categorical Programming (Revised)
Introduction to Categorical Programming (Revised)
Masahiro Sakai6.4K vistas
Introduction to Categorical Programming por Masahiro Sakai
Introduction to Categorical ProgrammingIntroduction to Categorical Programming
Introduction to Categorical Programming
Masahiro Sakai1.7K vistas
yieldとreturnの話 por bleis tift
yieldとreturnの話yieldとreturnの話
yieldとreturnの話
bleis tift7.4K vistas
Ekmett勉強会発表資料 por 時響 逢坂
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
時響 逢坂948 vistas
F#で関数型言語に触れてみよう por wof moriguchi
F#で関数型言語に触れてみようF#で関数型言語に触れてみよう
F#で関数型言語に触れてみよう
wof moriguchi8.1K vistas
虚数は作れる!Swift で学ぶ複素数 por Taketo Sano
虚数は作れる!Swift で学ぶ複素数虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数
Taketo Sano42.2K vistas
モナドハンズオン前座 por bleis tift
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
bleis tift5.7K vistas
命令プログラミングから関数プログラミングへ por Naoki Kitora
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
Naoki Kitora3.8K vistas
関数プログラミング入門 por Hideyuki Tanaka
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
Hideyuki Tanaka21.8K vistas
(define)なしで再帰関数を定義する por blackenedgold
(define)なしで再帰関数を定義する(define)なしで再帰関数を定義する
(define)なしで再帰関数を定義する
blackenedgold2.4K vistas
Ekmett勉強会発表資料 por 時響 逢坂
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
時響 逢坂16.7K vistas
言語処理系入門€5 por Kenta Hattori
言語処理系入門€5言語処理系入門€5
言語処理系入門€5
Kenta Hattori427 vistas
Haskell勉強会 in ie por maeken2010
Haskell勉強会 in ieHaskell勉強会 in ie
Haskell勉強会 in ie
maeken20101.4K vistas
Scala 初心者が米田の補題を Scala で考えてみた por Kazuyuki TAKASE
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
Kazuyuki TAKASE5.7K vistas
化学科自主ゼミ1 por Hiroki Sato
化学科自主ゼミ1化学科自主ゼミ1
化学科自主ゼミ1
Hiroki Sato693 vistas

私を SKI に連れてって