😸
ラムダ計算と自然数の演算
自然数の表現
基本構成子
Python での実装例:
zero = lambda s: lambda z: z
one = lambda s: lambda z: s(z)
two = lambda s: lambda z: s(s(z))
three = lambda s: lambda z: s(s(s(z)))
確認用に、ラムダ式で表された自然数を int に変換して表示する関数を定義しておく。
def print_nat(nat):
print(nat(lambda n: n+1)(0))
print_nat(zero)
# 0
print_nat(three)
# 3
足し算
自然数
plus = lambda m: lambda n: lambda s: lambda z: m(s)(n(s)(z))
print_nat(plus(two)(three))
# 5
かけ算
自然数
mult = lambda m: lambda n: n(plus(m))(zero)
print_nat(mult(two)(three))
# 6
べき乗
自然数
exp = lambda m: lambda n: n(mult(m))(one)
print_nat(exp(two)(three))
# 8
引き算
準備として、まずラムダ計算で「組」を表すことを考える。組は
このように表す。つまり、組の要素にアクセスする関数
組からの要素の取り出しは
となる。
以上を実際にプログラミング言語で実装してみよう。
fst = lambda p: p (lambda x: lambda y: x)
snd = lambda p: p (lambda x: lambda y: y)
example_pair = lambda f: f(2)(3)
fst (example_pair)
# 2
snd (example_pair)
# 3
さて、この組に対して、
というような、組を引数にとって組を返す関数
このとき、
となる。よって
とすれば、
自然数
以上を実際にプログラミング言語で実装してみよう。
# next は予約語なので nex にする
nex = lambda p: lambda f: f( plus(fst(p))(one) )(fst(p))
# (0, 0)
zero_zero = lambda f: f(zero)(zero)
pred = lambda n: snd(n(nex)(zero_zero))
minus = lambda m: lambda n: n(pred)(m)
print_nat(minus(three)(one))
# 2
print_nat(minus(three)(two))
# 1
Discussion