Віднімання церкви
Обчислення лямбда завжди було захопленням моїм, і виникаюча поведінка передачі функцій одне одному надзвичайно складна. Церковні цифри - це зображення природних чисел, що виникають при повторному застосуванні функції (як правило, одинарне додавання константи). Наприклад, число нуль повертає x і "ігнорує" функцію введення, один є f(x)
, два є 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, а потім застосування другої функції до x:
add = lambda m: lambda n: lambda f: lambda x: n(f)(m(f)(x))
print(to_int(add(one)(two)))
>>> 3
Доповнення зрозуміти досить легко. Однак для новачків може бути немислимо думати, як виглядає віднімання у кодованій Церквою системі числення. Що може означати скасування функції?
Виклик
Реалізуйте функцію віднімання у кодованій Церквою системі числення. Якщо віднімання виконує операцію монуса і не застосовує функції функції, n
якщо результат буде більшим за нуль або нуль, інакше. Це код-гольф, тому виграє найкоротший код.
Вхідні дані
Дві церковні цифри, які були закодовані у вашому виборі мови. Вхід може бути позиційним або кривим. Щоб довести, що це справжні церковні цифри, їм доведеться виконувати будь-яку функцію та застосовувати їх неодноразово ( add1
наведено в прикладах, але це може бути add25
,mult7
або будь-який інший одномісний функція) .
Вихідні дані
Церковна цифра. Слід зазначити, що якщо m < n
тоді, m - n
це завжди те саме, що ідентичність функції.
Приклади:
minus(two)(one) = one
minus(one)(two) = zero
...
також прийнятно:
minus(two, one) = one
minus(one, two) = zero
Кредит:
Ця суть github за те, що я дав мені питонську реалізацію церковних чисел.
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:...
? Або це просто стосується двох входів m
і n
?
m
і n
в іншому порядку? Це допомогло б при завивці.
exp(m, n)
обчислюєm^n
звичайно.)