교회 빼기
람다 미적분학은 항상 내 마음에 매료되어 왔으며 함수를 서로에게 전달하는 출현 행동은 유쾌하게 복잡합니다. 교회 숫자 는 함수의 반복적 인 적용 (일반적으로 상수의 단항 추가)으로 구성된 자연수의 표현입니다. 예를 들어, 숫자 0은 x를 반환하고 입력 함수는 "무시"합니다. 하나는 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에 첫 번째 함수를 적용한 다음 x에 두 번째 함수를 적용하여 추가가 달성되었음을 쉽게 알 수 있습니다.
add = lambda m: lambda n: lambda f: lambda x: n(f)(m(f)(x))
print(to_int(add(one)(two)))
>>> 3
덧셈은 비교적 이해하기 쉽다. 그러나 새로 온 사람에게는 교회에서 인코딩 된 숫자 시스템에서 빼기가 어떻게 보이는지 생각할 수 없습니다. 함수를 적용 취소한다는 것은 무엇을 의미 할 수 있습니까?
도전
교회 인코딩 숫자 시스템에서 빼기 기능을 구현하십시오. 빼기가 monus 연산을 수행하고 n결과가 0보다 크면 함수 시간을 적용 하지 않으면 그렇지 않습니다. 이것은 코드 골프이므로 가장 짧은 코드가 승리합니다.
입력
선택한 언어로 인코딩 된 두 교회 숫자. 입력은 위치 또는 커리가 될 수 있습니다. 이들은 참된 교회의 숫자를 증명하기 위해 그들은 어떤 기능에 걸릴 반복적으로 적용해야합니다 ( add1예제에 나와 있지만, 수 add25, mult7또는 다른 단항 기능.)
산출
교회 숫자. m < n그렇다면 m - n항상 항등 함수와 동일 하다는 점에 유의해야합니다 .
예 :
minus(two)(one) = one
minus(one)(two) = zero
...
또한 허용 :
minus(two, one) = one
minus(one, two) = zero
신용:
이 github 는 Church Numerals의 파이썬 구현을 제공합니다.
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합니다.)