Kilise Çıkarma
Lambda hesabı her zaman benim bir büyüleme olmuştur ve işlevleri birbirine geçirmenin ortaya çıkan davranışları son derece karmaşıktır. Kilise rakamları , bir fonksiyonun tekrarlanan uygulamasından (normalde bir sabitin tekli eklenmesi) oluşturulan doğal sayıların temsilidir. Örneğin, sıfır sayısı x değerini döndürür ve giriş işlevini "yok sayar", biri f(x)
, iki, f(f(x))
vb.:
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
Buradan, ilk fonksiyonun x'e ilk fonksiyonunun ardından x'e ikinci fonksiyonun uygulanmasıyla gerçekleştirildiğini kolayca görebiliriz:
add = lambda m: lambda n: lambda f: lambda x: n(f)(m(f)(x))
print(to_int(add(one)(two)))
>>> 3
Toplamanın anlaşılması nispeten kolaydır. Ancak, yeni gelen biri için Kilise kodlu bir sayı sisteminde çıkartmanın nasıl göründüğünü düşünmek akıl almaz olabilir. Bir işlevi uygulamaktan vazgeçmek ne anlama gelir?
Meydan okuma
Çıkarma işlevini Kilise kodlu bir sayı sisteminde uygulayın. Çıkarma işleminin monus işlemini gerçekleştirmesi ve n
sonuç sıfırdan büyük veya sıfırdan büyükse bir işlev süresinin kaldırılması. Bu kod golf çok kısa kod kazanır.
Giriş
Dil seçiminize göre kodlanmış iki Kilise rakamı. Giriş konumsal veya curried olabilir. Bunlar gerçek Kilise rakamlarını kanıtlamak için herhangi bir işlev alıp defalarca uygulamak zorunda kalacak ( add1
örneklerde verilmiştir ama olabilir add25
, mult7
ya da başka herhangi tekli fonksiyonu.)
Çıktı
Kilise sayısı. Eğer m < n
o m - n
zaman kimlik fonksiyonu ile her zaman aynı olduğu unutulmamalıdır .
Örnekler:
minus(two)(one) = one
minus(one)(two) = zero
...
ayrıca kabul edilebilir:
minus(two, one) = one
minus(one, two) = zero
Kredi:
Bu github bana Kilise Rakamlarının python uygulamasını verdi.
lambda m,n,f:apply f m-n times
(veya çift lambda m,n,f,x:apply f m-n times to x
) olarak tanımlamak uygun lambda m,n:lambda f:...
mudur? Ya da bu sadece iki girişine geçerlidir m
ve n
?
m
ve n
diğer sırayla alabilir miyiz? Bu köriliğe yardımcı olur.
exp(m, n)
hesaplarm^n
.)