技術ブログ 関数型プログラミング入門 3(ラムダ計算編)
関数型プログラミング入門 3(ラムダ計算編)

関数型プログラミング入門 3(ラムダ計算編)

今回は、関数型プログラミングに関する内容だね!

関数型プログラミングの理論的背景について一緒に学んでいきましょう!

本記事で学べること

・ラムダ計算

はじめに

関数型プログラミング入門 2 では、関数型プログラミングの機能面について見ていきました。そこで今回から、関数型プログラミングの理論的背景を学んでいこうと思います。目標は、型付ラムダ計算を理解することですが、その前にラムダ計算について学習することから始めましょう。型付ラムダ計算は、関数型プログラム言語の基盤であるため、これを理解することができれば、関数型プログラムの扱いが格段に上達すると思います。

ラムダ計算

基本

変数 a, b, c, … が与えられたとき、次のような表現をラムダ項といいます。

a (λa.M) (MN)

ただし、M, N もそれ自体ラムダ項とします。 (λa.M) の形のラムダ項を抽象、(MN) の形のラムダ項を適用といいます。(MN) は、関数 M を入力 N に対して使うことに相当します。また、λ の横にある変数は束縛変数といい、それ以外の変数を自由変数といいます。例えば、(λa.ab) の中で a は束縛変数、b は自由変数です。λa は述語論理の ∃x や ∀x と同じようなものだと理解して構いません。
ラムダ項で使われるカッコは適宜省略することにしましょう。例えば、MNK は (MN)K を意味します。また、λa.λb は λab と表記することにします。
 

計算のルール

計算は次のように行われます。

(λa.M(a))N →β M(N)

λa から始まるラムダ抽象に値 N が適用されたら、変数 a に N を代入します。ここで、左側の項を β 基といい、これを右側に書き換えることを β 簡約といい、→β で表します。 β 基をどんどん簡約していくことが、ラムダ項の計算法です。

 

具体例

ここからは、色々な計算の具体例を見ていって、ラムダ計算に慣れていきましょう。
まず、ラムダ計算における真偽の表し方を紹介します。

T := λab.a F : = λab.b

最初の引数である a を返すのが T で、後の引数である b を返すのが F です。具体的には、

T M N ≡ (λab.a) M N →β (λb.M) N →β M
F M N ≡ (λab.b) M N →β (λb.b) N →β N

(λb.M) N →β M では、変数 b が M に含まれないとして、単に N を消去しています。
次に、関数の合成を見ていきましょう。M と N を関数として見ると、N の出力を M に渡せばいいから、

M ○ N := λa.M(Na)

と表せます。3つの関数の合成ならば、

M ○ N ○ K := λa.M(N(Ka))

となります。
次に、自然数の表現について説明します。ラムダ計算では、自然数 0, 1, 2, 3, … を

λfa.a, λfa.fa, λfa.f(fa), λfa.f(f(fa)), …

を表します。これらをチャーチ数項といいます。省略表現として、

0, 1, 2, 3, …

として表すこともあります。チャーチ数項 n を用いれば、「P から出発して Q を n 回繰り返すこと」を n P Q で表すことができます。例えば n が 3 の場合は、次のようになります。

3 Q P ≡ λfa.f(f(fa)) Q P →β λa.Q(Q(Qa)) →β Q(Q(Q P))

合成の記号 ○ を用いれば、チャーチ数項 n は

λf. f ○ ・・・ ○f (n回)

と書くこともできます。つまり、「与えられた関数を n 回合成すること」として 自然数 n を表しています。
また、足し算や掛け算は次のように定義できます。

M + N := λg.Mg ○Ng
M・N := λg.M Ng

足し算では、M と N がチャーチ数項の場合、「g を M 回繰り返した関数」と 「g を N 回繰り返した関数」の合成であるため、全体は「g を M + N 回繰り返した関数」となっています。掛け算では、掛け算では 関数が M・N 回出てくることがわかります。一応、具体例を見ておきましょう。

2 + 3 ≡ λg.(λf.f ○ f)g ○ (λf.f ○ f ○ f)g →β λg.(g ○ g) ○ (g ○ g ○ g) →β λg. g ○ g ○ g ○ g ○ g ≡ 5

2・3 ≡ λg.(λf.f ○ f)((λf.f ○ f ○ f)g) →β λg.(λf.f ○ f)(g ○ g ○ g ) →β λg.(g ○ g ○ g ) ○ (g ○ g ○ g ) →β λg.g ○ g ○ g ○ g ○ g ○ g ≡ 6

まとめ

本記事では、ラムダ計算について解説しました。これで型付ラムダ計算の説明に入る準備ができたと思います。ということで、次回は型付ラムダ計算の仕組みについて書いていきます。お楽しみに!

SNSでシェアする

各種お問い合わせ

お問い合わせ・ご相談


開発に関することならお気軽にご相談ください。
お見積もり依頼も可能です。

お問い合わせする

私たちは一緒に働く
メンバーを探しています。


私たちはミッション・価値観への共感を何よりも大切に考え、
一緒に働くメンバーを探しています。

採用情報をみる