真偽値(2)
真が λtf.t、偽が λtf.fだったとして、
if cond then x else y を、cond x y とする
cond に真を入れてみる
((λtf.t) x) y
(λf.x) y
x
cond に偽を入れてみる
((λtf.f) x) y
(λf.f) y
y
真偽値として働いている!
足し算してみる
.
add 関数
..
.λmn.λsz.m s(n s z)
1. 自然数 m は λsz.s (s (. . . (s z) . . . )) の形を
している (s は m 個)
2. 自然数 n は λsz.t の形をしている
(t には n 個の s が含まれる)
3. 自然数 m の z 部分を n の t 部分に入れ替え
れば、足し算ができる!
27.
2 + 3
1.(λmn.λsz.m s (n s z)) (λsz.s (s z)) (λsz.s (s (s z)))
2. (λn.λsz.(λsz.s (s z)) s (n s z)) (λsz.s (s (s z)))
3. λsz.(λsz.s (s z)) s ((λsz.s (s (s z))) s z)
4. λsz.(λz.s (s z)) ((λsz.s (s (s z))) s z)
5. λsz.(λz.s (s z)) ((λz.s (s (s z))) z)
6. λsz.(λz.s (s z)) ((s (s (s z))))
7. λsz.(λz.s (s z)) (s (s (s z)))
8. λsz.(s (s (s (s (s z)))))
s が 5 個あるので、2 + 3 できました!
28.
掛け算してみる
.
mul 関数
..
.λmn.λsz.m (ns) z
1. 自然数 n は λsz.s (s (. . . (s z) . . . )) の形をし
ている (s は n 個)
2. 自然数 n に s だけ適用したものは、引数に s
を n 回適用する関数になる
3. それを自然数 m の s として渡すので、s を
n 回適用したものが m 個作られる
4. それに z を渡してあげれば、
m と n を掛け合わせた結果の自然数になる!
29.
2 × 3
1.(λmn.λsz.m (n s) z) (λsz.s (s z)) (λsz.s (s (s z)))
2. (λn.λsz.(λsz.s (s z)) (n s) z) (λsz.s (s (s z)))
3. λsz.(λsz.s (s z)) ((λsz.s (s (s z))) s) z
4. λsz.(λsz.s (s z)) (λz.s (s (s z))) z
5. λsz.(λz.(λz.s (s (s z))) ((λz.s (s (s z))) z)) z
6. λsz.(λz.(λz.s (s (s z))) (s (s (s z)))) z
7. λsz.(λz.(s (s (s (s (s (s z))))))) z
8. λsz.(s (s (s (s (s (s z))))))
s が 6 個あるので、2 × 3 できました!
記法の拡張
2 + 3を計算するだけで、
.
2 + 3
..
.(λmn.λsz.m s (n s z)) (λsz. s (s z)) (λsz.s (s (s z))))
つらい・・・
34.
数値の導入
数詞 (0 とか1 とかそういうやつ) と関数で作った
自然数を対応付けることができる。
2 に対して λsz.s (s z)) を対応付けるようにすれ
ば、人間にとってよりわかりやすい!
ついでに、+ も λmn.λsz.m s (n s z) に対応付け
てしまえば、2 + 3 はそのまま、
.
.2 + 3
と記述できる! n に 2 を足す関数なら、
.
.λn.n + 2
分かりやすい!
35.
真偽値の導入
ついでに真偽値も導入しましょう。
true と λtf.tを、false と λtf.f を対応付けます。
if-then-else も導入しましょう。
とりあえず、if cond then x else y を、cond x y
に対応付けましょう。
.
if-then-else を使った例
..
.λbmn.if b then m + n else m ∗ n
b が真なら m + n を、偽なら m ∗ n を計算する
関数