Вычитание церкви
Лямбда-исчисление всегда было моим увлечением, и возникающее поведение передачи функций друг другу восхитительно сложно. Церковные цифры - это представления натуральных чисел, полученные из многократного применения функции (обычно это одинарное сложение константы). Например, нулевое число возвращает x и «игнорирует» входную функцию, one is f(x)
, two is 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
Дополнение относительно легко понять. Однако для новичка было бы немыслимо подумать о том, как выглядит вычитание в зашифрованной церковной системе счисления. Что это может означать, чтобы не применять функцию?
Вызов
Реализуйте функцию вычитания в системе счисления, закодированной Церковью. Где вычитание выполняет операцию monus и отменяет функцию 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 суть для того, чтобы дать мне реализацию Python церковных цифр.
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
конечно.)