교회 빼기
람다 미적분학은 항상 내 마음에 매료되어 왔으며 함수를 서로에게 전달하는 출현 행동은 유쾌하게 복잡합니다. 교회 숫자 는 함수의 반복적 인 적용 (일반적으로 상수의 단항 추가)으로 구성된 자연수의 표현입니다. 예를 들어, 숫자 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
합니다.)