教会の減算
ラムダ計算は常に私の魅力であり、関数を相互に渡す緊急行動は非常に複雑です。教会の数字は、関数の繰り返しの適用(通常は定数の単項加算)から構築された自然数の表現です。たとえば、数値ゼロはxを返し、入力関数を「無視」します。1つはf(x)
、2つは次のf(f(x))
ようになります。
ident = lambda x: x
zero = lambda f: ident
succ = lambda n: lambda f: lambda x: f(n(f)(x))
one = succ(zero)
add1 = lambda x: x + 1
to_int = lambda f: f(add1)(0)
print(to_int(one))
>>> 1
このことから、最初の関数をxに適用し、次に2番目の関数をxに適用することで加算が達成されることが簡単にわかります。
add = lambda m: lambda n: lambda f: lambda x: n(f)(m(f)(x))
print(to_int(add(one)(two)))
>>> 3
追加は比較的簡単です。しかし、新参者にとって、教会で符号化された数値システムで減算がどのように見えるかを考えることは考えられないかもしれません。関数の適用を解除するとどうなりますか?
チャレンジ
教会でエンコードされた数字システムに減算機能を実装します。減算がmonus操作を実行しn
、結果がゼロまたはゼロより大きい場合、関数時間を適用しない場合。これはコードゴルフなので、最短のコードが優先されます。
入力
選択した言語でエンコードされた2つの教会の数字。入力は定位置またはカリー化できます。これらは真の教会の数字を証明するために、彼らは、任意の機能を取り込み、繰り返しそれらを適用する必要があります(add1
例に示されているが、それは可能性がありadd25
、mult7
または任意の他の単項機能。)
出力
教会の数字。m < n
then m - n
が恒等関数と常に同じであることに注意してください。
例:
minus(two)(one) = one
minus(one)(two) = zero
...
許容範囲:
minus(two, one) = one
minus(one, two) = zero
クレジット:
lambda m,n,f:apply f m-n times
(lambda m,n,f,x:apply f m-n times to x
ではなく)として定義しても大丈夫lambda m,n:lambda f:...
ですか?それともこれは単に2つの入力に適用されないm
とn
?
m
をn
他の順序で取りますか?これはカレーに役立ちます。
exp(m, n)
計算m^n
します。)