SlideShare a Scribd company logo
Introduction to lambda
calculation
by elipmoc
ラムダ計算入門
らいパン粉
ところで、ラムダ式って
知ってる?
ラムダ式とは
プログラミング言語で関数を第一級オブジェクト(first-class
object)として扱えるようにするために、
関数を式として生成できる言語機能である。
生成された式はクロージャなどと呼ばれる。
何を言ってるかさっぱりわか
らん・・・・・
関数を変数に保存できるって
知ってる?
C言語
void plus(int a, int b){
printf( "a+b=%d" , a+b );
}
int main(){
void(*hoge)(int,int); //変数宣言(関数ポインタ)
hoge = plus;
hoge(4, 5);
}
JavaScript
function plus(a, b){
alert( a+b );
}
var hoge=plus;
hoge(4, 5);
JavaScript(ラムダ式)
var hoge=(a,b)=>alert(a+b);
hoge(4, 5);
べつにラムダ式を紹介したか
ったわけではない
じゃあなぜラムダ式を紹介したのか?
ラムダ式はラムダ計算のアイデアから生
まれたものだから(小並感)
ラムダ計算文法1(C言語で比較)
int hoge(int x){
return x+4;
}
λx.x+4
ラムダ計算文法1(JavaScriptで比較)
function hoge(x){
return x+4;
}
λx.x+4
ラムダ計算文法2(C言語で比較)
int plus(int x,int
y){
return x+y;
}
λx.λy.x+y
ラムダ計算文法2(JavaScriptで比較)
function plus(x,y){
return x+y;
}
λx.λy.x+y
ラムダ計算文法分解1
λx.x+4
関数の引数
式
ラムダ計算文法分解2
λx.λy.x+y
関数の引数
式
えっ!?λyも関数の引数じゃないのか?
β簡約
β簡約とは、記号の置き換え操作。
プログラミング的に言うと、関数に引数を渡して呼び出すこ
とを言う。
もっと意識高く言うと、
関数適応(Function application)
(λx.x+4) 8 を例にしてやってみる
β簡約
(λx.x+4) 8 λx.x+4に8を適応する
↓
8+4 xが8に置き換えられ
る
↓
12 +演算子が一般的なも
のと同じと考えるとこう
β簡約分解
(λx.x+4) 8
式
適応する式
なんらかの式に式を適応する操作である
ラムダ計算の形式的な文法定義
e(式) := x (変数)
| λx.e (関数)
| e e (関数適応)
β簡約2
(λx.λy.x+y) 4 5 → (λx.λy.x+y) 4 5 → (λy.4+y) 5
(λy.4+y) 5 → 4+5 → 9
必ず、引数はひとつひとつ適応される。
関数が関数を式として返しているという点に注目
カリー化
このように、関数に引数を一つ渡し、返ってきた関数に二個
目の引数を渡しさらに返ってきた(略)
という風に引数を渡す事を、数学者ハスケル・カリーのカリ
ーを取って、カリー化という。
ちなみにハスケルもプログラミング言語Ha(略)
本当のラムダ計算
今まで、+演算子を例に使っていたが、そもそ
もラムダ計算には+なんてない。
あるのは、λと.と任意の識別子(変数)だけである。
ラムダ計算はチューリング完全
しかし、ラムダ計算はプログラミング言
語と同様の計算能力を保持している。
純粋なラムダ計算だけで足し算ができる
ことを示そう。
チャーチ数(ペアノの公理)
0=λf.λx.x
1=λf.λx.f x
2=λf.λx.f (f x)
3=λf.λx.f (f (f x))
4=λf.λx.f (f (f (f x)))
n=λf.λx.f (...(f x)...) (n>0)
このようにfを何回適応したかで数を数えるよう
に決める
足し算関数の定義
Plus = λm.λn.λf.λx. m f (n f x)
は?
1+2をしてみよう
Plus 1 2
1+2をしてみよう
Plus = λm.λn.λf.λx. m f (n f x)なので
Plus 1 2
→ (λm.λn.λf.λx. m f (n f x)) 1 2
1+2をしてみよう
1をmに適応する
(λm.λn.λf.λx. m f (n f x)) 1 2
→(λn.λf.λx.1 f (n f x)) 2
1+2をしてみよう
2をnに適応する
(λn.λf.λx.1 f (n f x)) 2
→λf.λx.1 f (2 f x)
1+2をしてみよう
1=λf.λx.f x
2=λf.λx.f (f x)なので
λf.λx.1 f (2 f x)
→λf.λx.(λf.λx.f x) f ((λf.λx.f (f x)) f x)
1+2をしてみよう
さらに適応して整理する
λf.λx.(λf.λx.f x) f ((λf.λx.f (f x)) f x)
→λf.λx.(λx.f x) ((λf.λx.f (f x)) f x)
→λf.λx.f ((λf.λx.f (f x)) f x)
1+2をしてみよう
さらに適応して整理する2
λf.λx.f ((λf.λx.f (f x)) f x)
→λf.λx.f ((λx.f (f x)) x)
→λf.λx.f ((λx.f (f x)) x)
→λf.λx.f (f (f x))
1+2をしてみよう
Plus 1 2 → λf.λx.f (f (f x)) → 3
チャーチ数の考え方
λf.λx.f (f (f x)) → 3
ピンとこない。なんでこれで3なん
だ・・・
チャーチ数の考え方 例
fを1+、xを0に置き換えると・・・
λf.λx.f (f (f x)) 1+ 0
→λx.1+(1+(1+x)) 0
→1+(1+(1+0)) → 3
ね?数を表現できてるでしょ?
まとめ
・ラムダ計算はシンプルな文法のプログラミング言語
・ラムダ計算は現在のプログラミング言語の発展に貢
献している
・ラムダ計算は奥が深い
・Haskellは素晴らしい言語

More Related Content

PDF
C言語講習会1
PDF
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
PDF
C言語講習会2
PDF
C言語講習会4
PDF
C言語講習会3
PPTX
C++ tips 3 カンマ演算子編
PDF
C++ tips2 インクリメント編
PPTX
第3章 型とクラス
C言語講習会1
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
C言語講習会2
C言語講習会4
C言語講習会3
C++ tips 3 カンマ演算子編
C++ tips2 インクリメント編
第3章 型とクラス

What's hot (20)

PPTX
C++ tips4 cv修飾編
PPTX
第3章 型とクラス
PPTX
定理証明言語によるハードウェア検証
PPTX
C++ tips1 #include編
PPTX
Yokohama6 epi
PDF
[Basic 10] 形式言語 / 字句解析
PDF
C#勉強会
PDF
やさしく知りたいC言語
PDF
関数型都市忘年会『はじめての函数型プログラミング』
PDF
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング
PPTX
Rのコードをキレイに見せたい
PDF
F#によるFunctional Programming入門
PDF
たのしい関数型
PDF
.NET系開発者から見たJava
PPT
オブジェクト指向入門7
PPT
言語処理系入門€7
PDF
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
PDF
TypeScript & 関数型講座 第3回 関数型入門
PDF
現実(えくせる)と戦う話
PDF
D言語にまだ入っていない新機能 (Dの日#2)
C++ tips4 cv修飾編
第3章 型とクラス
定理証明言語によるハードウェア検証
C++ tips1 #include編
Yokohama6 epi
[Basic 10] 形式言語 / 字句解析
C#勉強会
やさしく知りたいC言語
関数型都市忘年会『はじめての函数型プログラミング』
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング
Rのコードをキレイに見せたい
F#によるFunctional Programming入門
たのしい関数型
.NET系開発者から見たJava
オブジェクト指向入門7
言語処理系入門€7
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
TypeScript & 関数型講座 第3回 関数型入門
現実(えくせる)と戦う話
D言語にまだ入っていない新機能 (Dの日#2)
Ad

Similar to Introduction to lambda calculation (20)

PDF
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
PDF
Java8 lambdas chapter1_2
PDF
名前重要 超重要
PPTX
Visual C++で使えるC++11
PPTX
Java8から始める関数型プログラミング
PDF
プログラマ講習第2回
ODP
Haskell
PDF
初心者向けGo言語勉強会
PDF
ちょっと詳しくJavaScript 第2回【関数と引数】
PDF
[Basic 12] 関数型言語 / 型理論
PDF
PHP 入門
PDF
関数型志向Python - LLまつり2013
PDF
普通のプログラミング言語R
PPTX
Matlab講習2021
PDF
MP in Scala
PDF
TypeScript 1.0 オーバービュー
PPT
Scala on Hadoop
PDF
Haxeについて
PDF
関数型プログラミング入門 for Matlab ユーザー
PPTX
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
Java8 lambdas chapter1_2
名前重要 超重要
Visual C++で使えるC++11
Java8から始める関数型プログラミング
プログラマ講習第2回
Haskell
初心者向けGo言語勉強会
ちょっと詳しくJavaScript 第2回【関数と引数】
[Basic 12] 関数型言語 / 型理論
PHP 入門
関数型志向Python - LLまつり2013
普通のプログラミング言語R
Matlab講習2021
MP in Scala
TypeScript 1.0 オーバービュー
Scala on Hadoop
Haxeについて
関数型プログラミング入門 for Matlab ユーザー
Ad

Introduction to lambda calculation