Pengurangan Gereja
Kalkulus Lambda selalu menjadi daya tarik saya dan perilaku yang muncul dari fungsi saling melintas sangat menyenangkan. Angka Gereja adalah representasi dari bilangan asli yang dibangun dari penerapan fungsi berulang (biasanya penambahan konstanta unary). Sebagai contoh, angka nol mengembalikan x dan "mengabaikan" fungsi input, satu adalah f(x)
, dua adalah f(f(x))
dan seterusnya:
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
Dari sini kita dapat dengan mudah melihat bahwa penambahan dilakukan dengan menerapkan fungsi pertama ke x kemudian menerapkan fungsi kedua ke x:
add = lambda m: lambda n: lambda f: lambda x: n(f)(m(f)(x))
print(to_int(add(one)(two)))
>>> 3
Selain itu relatif mudah dimengerti. Namun, bagi pendatang baru, mungkin tidak masuk akal untuk memikirkan seperti apa pengurangan dalam sistem angka Gereja yang dikodekan. Apa yang mungkin berarti membatalkan penerapan suatu fungsi?
Tantangan
Menerapkan fungsi pengurangan dalam sistem angka Gereja yang dikodekan. Di mana pengurangan melakukan operasi monus dan membatalkan penerapan fungsi n
kali jika hasilnya akan lebih besar dari nol atau nol sebaliknya. Ini adalah kode-golf sehingga kode terpendek menang.
Memasukkan
Dua angka Gereja yang telah dikodekan dalam pilihan bahasa Anda. Input dapat berupa posisi atau kari. Untuk membuktikan ini angka Gereja yang benar mereka akan harus mengambil di setiap fungsi dan menerapkannya berulang kali ( add1
diberikan dalam contoh tapi bisa add25
, mult7
, atau fungsi unary lainnya.)
Keluaran
Angka Gereja. Perlu dicatat bahwa jika m < n
demikian m - n
selalu sama dengan fungsi identitas.
Contoh:
minus(two)(one) = one
minus(one)(two) = zero
...
juga dapat diterima:
minus(two, one) = one
minus(one, two) = zero
Kredit:
Intisari github ini untuk memberi saya implementasi python Angka Gereja.
lambda m,n,f:apply f m-n times
(atau bahkan lambda m,n,f,x:apply f m-n times to x
), bukan lambda m,n:lambda f:...
? Atau apakah ini hanya berlaku untuk dua input m
dan n
?
m
dan n
dalam urutan lain? Ini akan membantu dengan kari.
exp(m, n)
menghitungm^n
.)