コンピュータ・サイエンス入門 ラムダ計算第 3 回目資料
勝股 審也
2011
年6
月9
日1 ラムダ項による数学的対象の表現
ラムダ項で種々の数学的対象を表現することができる。
1.1
真偽値定義
1.1
次のラムダ項を定義する。T = λ xy . x( = K) , F = λ xy . y ,
また、ifL then M else N
をLMN
というラムダ項の略記とする。T , F
はそれぞれ真、偽を表現するラムダ項であり、ifM then L else N
はM
がT
にβ
簡約されたな らばL
を、F
に簡約されたならばN
を返すラムダ項である。プログラミング言語のC
やJava
で言 えば丁度e 1 ?e 2 : e 3
という式に相当する。補題
1.2
次が成立する。if T then M else N → ∗ β M , if F then M else N → ∗ β N
問題1.3
以下を満たすラムダ項を与えよ。1. T
とF
に対して否定として振る舞うラムダ項Not:
Not T → ∗ β F , Not F → ∗ β T
2. T
とF
に対して論理積として振る舞うラムダ項And:
And T T → ∗ β T And F T → ∗ β F And T F → ∗ β F And F F → ∗ β F
3. T
とF
に対して論理和として振る舞うラムダ項Or:
Or T T → ∗ β T Or F T → ∗ β T
Or T F → ∗ β T Or F F → ∗ β F
1.2
組定義
1.4 2
つのラムダ項M , N
に対しh M , N i
をλ x . x M N
というラムダ項の略記とする。また、ラ ムダ項Fst , Snd
を以下で定義する。Fst = λ x . x T , Snd = λ x . x F
これらは組と射影のラムダ項による表現を与える。補題
1.5
以下が成立する。Fst h M , N i = ( λ x . x T) ( λ x . x M N) → ∗ β M Snd h M , N i = ( λ x . x F) ( λ x . x M N ) → ∗ β N
一般に
n
個のラムダ項M 1 , · · · , M n
の組をλ x . x M 1 · · · M n
と定義し、h M 1 , · · · , M n i
と書くことにする。問題
1.6 n
個の組から第i
成分(1 ≤ i ≤ n)
を取り出すラムダ項Proj n i
を定義せよ。つまりProj n i h M 1 , · · · , M n i → ∗ β M i
を満たす
Proj n i
を定義せよ。1.3
自然数定義
1.7
自然数n
に対しラムダ項d n e
を再帰的に定義する。1. d 0 e = I
2. d n + 1 e = h F , d n ei
補題
1.8
以下を満たすラムダ項Succ, Pred, Zero?
が存在する。Succ d n e → ∗ β d n + 1 e, Pred d n + 1 e → ∗ β d n e, Zero? d 0 e → ∗ β T , Zero? d n + 1 e → ∗ β F
証明 以下の通りにすればよい。Succ = λ x .h F , x i, Pred = Snd , Zero? = Fst
組を使った自然数の表現の他、以下の直接的な自然数の表現も存在する。定義
1.9 (
チャーチ数)
自然数n
に対してラムダ項c n
を以下で定義する。c n = λ sz . z }| { n
s ( · · · (s z) · · · )
補題1.10
以下を満たすラムダ項Succ 0 , Zero 0 ?
が存在する。Succ 0 c n → ∗ β c n + 1 , Zero 0 ? c n + 1 → ∗ β F , Zero 0 ? c 0 → ∗ β T ,
証明 以下の通りにすればよい。Succ 0 = λ nsz . s (n s z) , Zero 0 ? = λ n . n ( λ x . F) T
問題
1.11
ラムダ項Add 0 , Mul 0 , Exp 0
を以下で定義する。Add 0 = λ nm . m Succ 0 n , Mul 0 = λ nm . m (Add 0 n) c 0 , Exp 0 = λ nm . m (Mul 0 n) c 1
これらが以下を満たすことを示せ。
Add 0 c n c m → ∗ β c n + m , Mul 0 c n c m → ∗ β c n × m , Exp 0 c n c m → ∗ β c n
m問題
1.12
以下を満たすラムダ項Pred 0
を定義せよ。Pred 0 c 0 → ∗ β c 0 , Pred 0 c n + 1 → ∗ β c n
(ヒント:
自然数上の関数f ∈ N 2 → N 2
をf (n , m) = (n + 1 , n)
と定義してz }| { k
f ( · · · f (0 , 0))
を計算すると、結果の第二成分はどうなるか
?)
以下では自然数を定義
1.7
に従って表現する。定義
1.13
自然数上の全域関数f ∈ N n → N
とラムダ項F
に対して以下が成立する時、Fはf
をラ ムダ定義すると言う。∀ x 1 , · · · , x n ∈ N . F d x 1 e · · · d x n e → ∗ β d f (x 1 , · · · , x n ) e. (1)
また、自然数上の全域関数f ∈ N n → N
に対しあるラムダ項F
が存在してF
がf
をラムダ定義す る時、f
はラムダ定義可能であると言う。補題
1.8
から、f (x) = x + 1
という関数はラムダ定義可能である。また以下の関数f (x) =
x − 1 (x > 0)
0 (その他)
は、
λ x . if Zero? x then d 0 e else Pred x
によりラムダ定義される。これらの単純な関数の他、どのような関数がラムダ定義可能なのであろうか?次の節で、ラムダ 計算の持つ「任意のラムダ項の不動点を計算できる」という不思議な性質を用いて、再帰的に定義 された自然数上の関数をラムダ定義する方法を紹介する。この方法を用いれば、足し算、掛け算、
巾、といった基本的な演算や、アッカーマン関数のような、再帰的関数として定義するのは難しい 関数を自然にラムダ定義することができる。さらに、3節では任意の全域再帰的関数がラムダ定義 可能であることを示す。
2 不動点コンビネータによる関数の再帰的定義
ラムダ計算の興味深い対象の一つに不動点コンビネータがある。一般に、関数
f ∈ A → A
の不 動点とはf (x) = x
を満たす元x
のことであった。定義
2.1
以下のラムダ項Θ
をTuring
の不動点コンビネータと呼ぶ。Θ = ( λ x f . f (x x f )) ( λ x f . f (x x f ))
命題2.2
任意のラムダF
項に対しΘ F → ∗ β F ( Θ F)
が成立する。ラムダ項
X = Θ F
をβ
簡約するとF X
を得ることから、XはF
の不動点を与えていると考える事 ができる。しかもこの不動点はΘ
がF
から作り出したものなので、Θ
は不動点コンビネータと呼 ばれる。不動点コンビネータはラムダ計算の中で再帰的に定義された関数を表現するのに非常に有 用である。以下ではその方法の一例を紹介する。例
2.3
この例ではadd n (x) = x + n
をラムダ定義するラムダ項Add n
を与える。まずadd n
は以下の 再帰的な等式を満たすものとして定義できることに気づく。add n = λ x ∈ N .
n (x = 0)
1 + add n (x − 1) (x > 0) (2)
ここで、ラムダ計算にならって
λ x ∈ N . · · ·
という記法を関数を表現するために用いた。次に、以 下の関数b n
を考える。b n ( f ) = λ x ∈ N .
n (x = 0)
1 + f (x − 1) (x > 0)
これは
add n
の再帰的定義(2)
の右辺のadd n
の部分をf
でパラメータ化することで得られる関数である
(値域と定義域は何か?)。この b n
を使うと、再帰的な等式(2)
は単にadd n = b n (add n )
という式になる。このことから、
add n
を再帰的な等式(2)
を満たすものとして定義することと、add n
を
b n
の不動点として定義することは同値であることがわかる。さて、ラムダ計算ではラムダ項
F
で表現されたラムダ項上の関数の不動点をΘ F
によって与え る事ができるのであった。このことから、b n
をラムダ項B n
で表現し、Add n
をB n
の不動点、つま りAdd n = Θ B n
とすれば良いのではないかと考える。関数
b n
に対応したラムダ項B n
を考えると、以下になる。B n = λ f x . if Zero? x then d n e else Succ ( f (Pred x))
これを用いて、Add n
を以下で定義しよう。Add n = Θ B n = Θ ( λ f x . if Zero? x then d n e else Succ ( f (Pred x)))
さらに定数
d n e
をパラメータ化することで、2つの自然数の和を計算する関数add(n , y) = y + n
を ラムダ定義するラムダ項Add
を得る。Add = λ n .Θ ( λ f x . if Zero? x then n else Succ ( f (Pred x)))
命題2.4
ラムダ項Add n , Add
はadd n , add
をラムダ定義している。問題
2.5
上の議論を真似て、2つの自然数の積を計算する関数mul(x , y) = x × y
をラムダ定義する ラムダ項を与えよ。問題
2.6
アッカーマン関数とは以下の再帰的な等式を満たす関数として定義される関数a ∈ N × N → N
であった。a(x , y) = if x = 0 then y − 1 else (if y = 0 then a(x − 1 , 1) else a(x − 1 , a(x , y − 1)))
1.
アッカーマン関数a
に対して、a = A(a)
を満たす関数A
を定義せよ。2. A
に対応するラムダ項A
を作成せよ。3. Θ A
がa
をラムダ定義している事を示せ。例
2.7
任意のラムダ項M
に対して以下を満たすラムダ項K ∞
はあるだろうか? K ∞ M → ∗ β K ∞
このラムダ項
K ∞
は一つラムダ項を受けとった後、その結果を捨てて直ちに自分自身を返すものと 考えられるので、K ∞
が以下を満たせば、上のβ
簡約を得ることができる。K ∞ → ∗ β λ x . K ∞
さらに、
K ∞
をくくり出し、以下が成立すれば十分であることが分かる。K ∞ → ∗ β ( λ kx . k) K ∞
これから、K ∞ = Θ K
とすれば良い。3 再帰的関数のラムダ定義可能性
前節では再帰的に定義された自然数上の関数を不動点コンビネータ
Θ
を用いてラムダ定義する 方法を見た。この方法を用いればアッカーマン関数も簡単にラムダ定義できてしまう。それではど のぐらいの関数をラムダ定義できるのだろうか?この問に対する答えの一つとして、この節では再 帰的関数は全てラムダ定義できることを示す。再帰的関数の定義を簡単におさらいしよう。まず以下の
4
つの規則を考える: 1.
ゼロ関数、射影関数、後続者関数は再帰的関数である。2.
再帰的関数f ∈ N m → N , g 1 , · · · , g m ∈ N n → N
の合成関数h(x 1 , · · · , x n ) = f (g 1 (x 1 , · · · , x n ) , · · · , g m (x 1 , · · · , x n ))
は再帰的関数である。3.
再帰的関数φ ∈ N n → N , ψ ∈ N n + 2 → N
から原始再帰法により得られる関数f ∈ N n + 1 → N
は 再帰的関数である。f ( ~ x , 0) = φ ( ~ x)
f ( ~ x , k + 1) = ψ ( ~ x , k , f ( ~ x , k)) 4. φ ∈ N n + 1 → N
が再帰的関数であり、さらに∀ x 1 , · · · , x n ∈ N n . ∃ y ∈ N . φ (x 1 , · · · , x n , y) = 0
が成立するとき、最小解関数µ ( φ ) ∈ N n → N
は再帰的関数である。これらのみを有限回用いて「再帰的関数である」と結論された関数こそが再帰的関数であった。
定理
3.1
任意のn
引数再帰的関数はラムダ定義可能である。証明 ベクトル記法
~ x
は適切な長さの変数の列x 1 , · · · , x n
の略記とする(コンマは文脈に応じて無視
せよ)
。f
は規則1-4
のみを有限回用いて構成されたと仮定してよい。従ってf
の構成手順に関する帰納 法で証明する。1. f
がゼロ関数、射影関数、後続者関数の場合。練習問題とする。2. f
が再帰的関数同士の合成の場合。練習問題とする。3. f
がφ ∈ N n → N , ψ ∈ N n + 2 → N
という再帰的関数に以下の原始再帰法を施して得られた関数 の場合。f ( ~ x , 0) = φ ( ~ x)
f ( ~ x , k + 1) = ψ ( ~ x , k , f ( ~ x , k))
帰納法の仮定は
φ, ψ
はラムダ定義可能という主張である。よってそれらをラムダ定義するラ ムダ項Φ, Ψ
を取り、ラムダ項F
を以下で定義する。F = λ~ x . Θ ( λ hy . if Zero? y then Φ ~ x else Ψ ~ x (Pred y) (h (Pred y)))
ここでΦ ~ x
は( · · · ( Φ x 1 ) · · · x n )
の略記とする( Ψ ~ x
についても同様)
。以下では
F
がf
をラムダ定義していることをn = 1
の場合で見てみる。証明するべき事柄は∀ x , y ∈ N. F d x e d y e → ∗ β d f (x , y) e
であるので、これをy
に関する帰納法で証明する。(a) y = 0
の場合。x∈ N
を一つ取る。最初に以下の1
ステップβ
簡約を行い、得られたラ ムダ項で下線の引いてある部分をW x
と略記することにする。F d x e d 0 e → β Θ ( λ hy . if Zero? y then Φ d x e else Ψ d x e (Pred y) (h (Pred y))) d 0 e
以下、β
簡約を進める。Θ W x d 0 e → ∗ β W x ( Θ W x ) d 0 e
→ ∗ β if Zero? d 0 e then Φ d x e else Ψ d x e (Pred d 0 e ) ( Θ W x (Pred d 0 e ))
→ ∗ β Φ d x e
→ ∗ β dφ (x) e = d f (x , 0) e.
(b) y = k + 1
の場合。x ∈ N
を一つ取る。帰納法の仮定としてF d x e d k e → ∗ β d f (x , k) e
を仮定 する。このこととChurch-Rosser
の定理からΘ W x d k e → ∗ β d f (x , k) e
が導かれる。よってF d x e d k + 1 e → ∗ β W x ( Θ W x ) d k + 1 e
→ ∗ β if Zero? d k + 1 e then Φ d x e
else Ψ d x e (Pred d k + 1 e ) ( Θ W x (Pred d k + 1 e ))
→ ∗ β Ψ d x e (Pred d k + 1 e ) ( Θ W x (Pred d k + 1 e ))
→ ∗ β Ψ d x e d k e ( Θ W x d k e )
→ ∗ β Ψ d x e d k e d f (x , k) e
→ ∗ β dψ (x , k , f (x , k)) e = d f (x , k + 1) e
よって帰納法より
F
はf
をラムダ定義している。4. f
が∀~ x ∈ N n + 1 . ∃ y ∈ N . φ ( ~ x , y) = 0
を満たす再帰的関数φ
の最小解関数µ ( φ )
として定義され た場合。帰納法の仮定はφ
がラムダ定義可能という主張である。よってφ
をラムダ定義する ラムダ項Φ
を取り、ラムダ項F
を以下で定義する。F = λ~ x . Θ ( λ hy . if Zero? ( Φ ~ x y) then y else h (Succ y)) d 0 e
以下では
F
がf
をラムダ定義していることをn = 1
の場合で見てみる。y0 = f (x)
とおくと、φ (x , y 0 ) = 0
であり、かつ任意の0 ≤ k < y 0
に対してφ (x , k) > 0
が成立する。まず以下の1
ステップβ
簡約を行い、得られたラムダ項の下線の引いてある部分をZ x
と略記することに する。F d x e → β Θ ( λ hy . if Zero? ( Φ d x e y) then y else h (Succ y)) d 0 e (3)
するとΘ Z x d y 0 e → ∗ β d y 0 e (4)
が成立し、また任意の0 ≤ k < y 0
においてΘ Z x d k e → ∗ β Θ Z x d k + 1 e (5)
が成立する(
証明せよ)
。従って(3,4,5)
からF d x e → β Θ Z x d 0 e → ∗ β Θ Z x d 1 e → ∗ β · · · → ∗ β Θ Z x d y 0 e → ∗ β d y 0 e = d f (x) e
よってF
はf
をラムダ定義している。1-4.
から帰納法より再帰的関数はラムダ定義可能であることが示された。部分関数のラムダ定義可能性を適切に定義することで、再帰的関数に限らず、部分再帰的関数に 関しても同様の結果が成立する。
定理
3.2 (Kleene)
部分再帰的関数はラムダ定義可能である。証明のあらすじは定理
3.1
と同じであるが、証明中で与えたラムダ項を「未定義」の概念を正確に 扱えるようにやや変更しなければならない。詳細はBarendregt
の本の8.4
節を参照のこと。4 第 1 回目資料の問題の答え
問題
3.2-1
されている、されていない、されている、されていない問題
3.2-2 { x }, { x }, ∅, { z }
問題
3.3-1 FV(MN) = FV(M) ∪ FV(N)
問題3.3-2 FV( λ x . M) = FV(M) \{ x }
問題
5.2
N = λ y . x N = λ x . y x
M = x y ( λ y . x) y ( λ x . y x) y
M = λ y . x λ y 0 y . x λ zx . y x
問題
6.6-1 (授業で説明しました)
問題6.6-2
X X X → β X K S K X → β K K S K S K X → β K K S K X
→ β K K X → β K
X (X X) → β X X K S K → β X K S K K S K → β K K S K S K K S K
→ β K K S K K S K → β K K K S K → β K S K → β S .
問題
6.9 (授業で説明しました)
問題