“Introduction to Lambda Calculus” メモ(その3)

2章の練習問題。

問題2.1(i)

$M_{1} ≡ y(λx.xy(λzw.yz))$

$w,x,y,z$ が出現しているので、$w \to v, x \to v', y \to v'', z \to v'''$とするとして、
$M_{1} ≡ (v''(λv'(v'(v''(λv'''(λv(v''v'''))))))).$

問題2.1(ii)

$M_{2} ≡ λv'(λv''((((λvv)v')v'')((v''(λv'''(v'v''')))v'')))$

同様に、 $w \gets v, x \gets v', y \gets v'', z \gets v'''$ とするとして、
$M_{2} ≡ λxy.((λw.w)xy(y(λz.xz)y)).$

問題2.2

まず何が問題なのか、つまり、どのように証明するのかよくわからない。そこで以下を参考にします。

考え方は、 substitution の定義から、構造的帰納法で証明する、ということらしい。解答そのものも記述があるので、それを写経します。

基底ケースの variable について左辺と右辺が等しいことを導いた後、 applicationabstraction について帰納法で証明しています。これが、この問題の証明となります。再帰関数の定義と同様な方法を用いていて証明する、ということを考えれば納得できます。この場合、どこが基底で、どこが帰納(関数でいう再帰呼び出しするところという程度の認識です)を見出すことができなかったということをもって、何が問題なのかが理解できなかったということです。

以下写経します。

まず、 $M=x$ を考えます。

$\begin{array} & \mbox{左辺} \\ = x[x:=N][y:=L] \\ = N[y:=L] \\ \mbox{右辺} \\ = x[y:=L][x:=N[y:=L]] \\ = x[x:=N[y:=L]] \\ = N[y:=L] \end{array}$

次に、 $M=y.$

$\begin{array} & \mbox{左辺} \\ = y[x:=N][y:=L] \\ = y[y:=L] \\ = L \\ \mbox{右辺} \\ = y[y:=L][x:=N[y:=L]] \\ = L[x:=N[y:=L]] \\ { x \notin FV(L) } \mbox{ ; x は L における自由変数の要素ではない、と考えます} \\ = L \end{array}$

次に考えるのが、 $M=z, z ≠ x \land z ≠ y.$これを示す必要があります。

$\begin{array} & \mbox{左辺} \\ = z[x:=N][y:=L] \\ = z[y:=L] \\ = z \\ \mbox{右辺} \\ = z[y:=L][x:=N[y:=L]] \\ = z[x:=N[y:=L]] \\ = z \\ \end{array}$

ここまで、基底ケースの variable について左辺と右辺が等しいことは導かれました。あとは、 applicationabstraction を帰納法で導いていくことになります。

$M = (M_{1}M_{2})$、 application について。

$\begin{array} & \mbox{左辺} \\ = (M_{1}M_{2})[x:=N][y:=L] \\ = (M_{1}[x:=N] M_{2}[x:=N])[y:=L] \\ = M_{1}[x:=N][y:=L] M_{2}[x:=N][y:=L] \\ \end{array}$

ここで帰納法により、 $X[x:=N][y:=L] \; = \; X[y:=L][x:=N[y:=L]]$ が正しいと仮定して、以下を導きます。

$\begin{array} & = M_{1}[y:=L][x:=N[y:=L]] M_{2}[y:=L][x:=N[y:=L]] \\ = (M_{1}[y:=L] M_{2}[y:=L])[x:=N[y:=L]] \\ = (M_{1}M_{2})[y:=L][x:=N[y:=L]] \\ \end{array}$

これは右辺と等しい。

$M = λz.M'$ つまり abstraction について。ここで、$z$ の条件として $z ≠ x \land z ≠ y$を挙げています。

$\begin{array} & \mbox{左辺} \\ = (λz.M')[x:=N][y:=L] \\ = (λz.M'[x:=N])[y:=L] \\ = λz.M'[x:=N][y:=L] \\ \end{array}$

ここで帰納法により、 $X[x:=N][y:=L] \; = \; X[y:=L][x:=N[y:=L]]$ が正しいと仮定して、以下を導きます。

$\begin{array} & \\ = λz.M'[y:=L][x:=N[y:=L]] \\ = (λz.M'[x:=N[y:=L]])[y:=L] \\ = (λz.M')[y:=L][x:=N[y:=L]] \\ \end{array}$

これは右辺と等しい。

以上により $M[x:=N][y:=L] \; ≡ \; M[y:=L][x:=N[y:=L]]$ が証明されました。もう一度書くと、 substitution の定義から、 variable, application, と abstraction についてそれぞれ証明されたわけです。

問題2.3

(i) 2.2を用いて、と書いてある、ということは取り合えず脇に置いておいて、問うていることを自分なりに冗長に記述していきます。

$λ\vdash M_{1} = M_{2}$

これが意味しているのは、例で示されているものを見ると、 ある式$M$について、式$M$中に現れる$M_{1}$を$M_{2}$で置き換えても、置き換えられたそれぞれの式は=の関係になる、ということのようなので、$(λx.M)M_{1} = (λx.M)M_{2}$ つまり、

$\mbox{(a) } M[x:=M_{1}] = M[x:=M_{2}]$

が成り立つ、ということのようなのだけれども、ここで言っている $λ\vdash$ や $=$ が意味している所が今の所の説明では厳密ではないと思うので、後続の章の後に考えることにします。!

問題2.4

こちらは 前回の記事で。

問題2.5

これ S を使えそうな気がします。 S を使って表すことを simplify と呼ぶのだろうか?という疑問はありまけれども…

$\begin{array} & B ≡ λxyz.x(yz) \\ K ≡ λxy.x \\ S ≡ λxyz.xz(yz) \\ \end{array}$

$S$ で、この $x$ に渡る所の $z$ をどうにかできれば、 $B$ は $S$ で表すことができます、ということらしい。

$\begin{array} & M ≡ BXYZ \\ = X(YZ) \\ \\ B' ≡ S(KS)K \\ = (λxyz.xz(yz))(KS)K \\ = (λyz.KSz(yz))K \\ = (λyz.S(yz))K \\ = λz.S(Kz) \\ \\ N ≡ B'XYZ \\ = (λz.S(Kz))XYZ \\ = S(KX)YZ \\ = (λxyz.xz(yz))(KX)YZ \\ = (λyz.KXz(yz))YZ \\ = (λyz.X(yz))YZ \\ = X(YZ) \\ \end{array}$

$K$ を上手に使って、いわゆる二つ目の引数となる項を無視しています。成程、よく思い付くなこれ。

$\begin{array} & N ≡ B'XYZ = S(KS)KXYZ \\ \therefore λ\vdash M = N. \\ \end{array}$

※ここで $λ\vdash$ と $=$ は、 applicationabstraction を書き換えていくと、結局、 $M = X(YZ) = N$ という、字面が同じ λ-term になる、という程の意味で使っています。

問題2.6

ここでも simplify というのだけれども、この意味がいまいちわからない…

$\begin{array} & \mbox{(i) } M ≡ (λxyz.zyx)aa(λpq.q) \\ = (λyz.zya)a(λpq.q) \\ = (λz.zaa)(λpq.q) \\ = (λpq.q)aa \\ = a \\ \\ \mbox{(ii) } M ≡ (λzy.yz)((λx.xxx)(λx.xxx))(λw.I) \\ = (λy.y((λx.xxx)(λx.xxx)))(λw.I) \\ = (λw.I)((λx.xxx)(λx.xxx)) \\ = I \\ \\ \mbox{(iii) } M ≡ SKSKSK \\ = (λxyz.xz(yz))KSKSK \\ = (λyz.Kz(yz))SKSK \\ = (λz.Kz(Sz))KSK \\ = (λz.Kz)KSK \\ = KKSK \\ = KK \\ \end{array}$

問題2.7

$\mbox{(i) } λ\vdash KI = K_{*}$

$\begin{array} & I ≡ λx.x \\ K ≡ λxy.x \\ K_{*} ≡ λxy.y \\ \end{array}$

左辺を考えると、

$\begin{array} & KI \\ = (λxy.x)I \\ = λy.I \\ = λy.(λx.x) \\ \mbox{略記にします} \\ = λyx.x \\ \mbox{値を入れ替えます} \\ = λxy.y \\ \\ \mbox{これは、} K_{*} \mbox{と同じです。} \\ \therefore λ\vdash KI = K_{*}. \end{array}$

$\mbox{(ii) } λ\vdash SKK = I$

$\begin{array} & S ≡ λxyz.xz(yz) \\ K ≡ λxy.x \\ I ≡ λx.x \\ \end{array}$

左辺を考えると、

$\begin{array} & SKK \\ = (λxyz.xz(yz))KK \\ = (λyz.Kz(yz))K \\ = λz.Kz(Kz) \\ = λz.(λxy.x)z(Kz) \\ = λz.(λy.z)(Kz) \\ = λz.z \\ \mbox{値をxに置き換えます} \\ = λx.x \\ \\ \mbox{これは、 I と同じです。} \\ \therefore λ\vdash SKK = I. \end{array}$