λ 미적분 또는 람다 계산법 익명 함수에 기초하여 논리 시스템이다. 예를 들어, 이것은 λ- 표현식입니다 :
λf.(λx.xx)(λx.f(xx))
그러나이 과제의 목적을 위해 다음과 같은 표기법을 단순화합니다.
- 변경
λ
하려면\
(쉽게 입력 할 수 있도록하기 위해) :\f.(\x.xx)(\x.f(xx))
.
우리가 그것을 놓을 수 있도록 람다 헤더는, 불필요 :\f(\xxx)(\xf(xx))
- 두 함수를 함께 작성하는 대신 Unlambda 스타일 접두사 표기법
`
을 응용 프로그램에 사용하십시오 (이 작업을 수행하는 방법에 대한 자세한 설명은 Lambda 미적분 표기법 사이 변환 참조 ).\f`\x`xx\x`f`xx
- 이것은 가장 복잡한 대체입니다. 각 변수를 변수가 속한 람다 헤더에 얼마나 깊이 중첩되어 있는지에 따라 괄호 안의 숫자로 바꿉니다 (예 : 0 기반 De Bruijn 인덱싱 사용 ). 예를 들어,
\xx
(identity 함수)에서x
in[0]
은 변수에서 끝으로 표현식을 탐색 할 때 발생하는 첫 번째 (0 기반) 헤더에 속하기 때문에 body로 대체됩니다 .\x\y``\x`xxxy
로 변환됩니다\x\y``\x`[0][0][1][0]
. 이제 헤더에 변수를 삭제하고을 남겨 둘 수\\``\`[0][0][1][0]
있습니다.
조합 논리는 기본적으로 λ- 미적분으로 만들어진 튜링 타르 핏입니다 (실제로 먼저 나왔지만 여기서는 관련이 없습니다).
"조합 논리는 람다 미적분의 변형으로 볼 수 있는데, 여기서 람다 식 (기능적 추상화를 나타냄)은 한정된 결합 자 (결합 된 변수가없는 원시 함수)로 대체됩니다."1
가장 일반적인 유형의 조합 논리는 다음과 같은 기본 요소를 사용하는 SK 결합기 미적분입니다 .
K = λx.λy.x
S = λx.λy.λz.xz(yz)
때로는 콤비는 I = λx.x
추가이지만, 같이 중복 SKK
(또는 실제로 SKx
어떤을위한 x
)에 해당합니다 I
.
K, S 및 응용 프로그램 만 있으면 λ- 미적분의 표현을 인코딩 할 수 있습니다. 예를 들어, 함수 λf.(λx.xx)(λx.f(xx))
에서 조합 논리로 의 변환은 다음과 같습니다.
λf.(λx.xx)(λx.f(xx)) = S(K(λx.xx))(λf.λx.f(xx))
λx.f(xx) = S(Kf)(S(SKK)(SKK))
λf.λx.f(xx) = λf.S(Kf)(S(SKK)(SKK))
λf.S(Sf)(S(SKK)(SKK)) = S(λf.S(Sf))(K(S(SKK)(SKK)))
λf.S(Sf) = S(KS)S
λf.λx.f(xx) = S(S(KS)S)(K(S(SKK)(SKK)))
λx.xx = S(SKK)(SKK)
λf.(λx.xx)(λx.f(xx)) = S(K(S(SKK)(SKK)))(S(S(KS)S)(K(S(SKK)(SKK))))
접두사 표기법을 사용하고 있기 때문에 이것은입니다 ```S`K``S``SKK``SKK``S``S`KSS`K``SKK`
.
1 출처 : Wikipedia
도전
지금까지는 무엇인지 짐작 하셨을 것입니다 : 위에서 설명한 표기법으로 유효한 λ- 표현식을 SK 컴비 네이터 미적분학으로 다시 작성된 동일한 함수로 입력 및 출력 (또는 리턴)하는 프로그램을 작성하십시오. 이것을 다시 작성하는 방법에는 무한한 방법이 있습니다. 무한한 방법 중 하나만 출력하면됩니다.
이것은 코드 골프입니다 이므로 가장 짧은 유효한 제출 (바이트 단위로 측정)이 이깁니다.
테스트 사례
각 테스트 사례는 하나의 가능한 출력을 보여줍니다. 맨 위에있는 표현식은 동등한 λ- 미적분 표현식입니다.
λx.x:
\[0] -> ``SKK
λx.xx:
\`[0][0] -> ```SKK``SKK
λx.λy.y:
\\[0] -> `SK
λx.λy.x:
\\[1] -> K
λx.λy.λz.xz(yz):
\\\``[2][0]`[1][0] -> S
λw.w(λx.λy.λz.xz(yz))(λx.λy.x):
\``[0]\\[1]\\\``[2][0]`[1][0] -> ``S``SI`KS`KK
λx.f(xx) = S(Kf)(SKK)
습니까? 오히려 그렇지 λx.f(xx) = S(Kf)(SII) = S(Kf)(S(SKK)(SKK))
않습니까? 변환 할 때 λx.f(xx)
, 나는 수 S {λx.f} {λx.xx}
를 줄일 S (Kf) {λx.xx}
하고 괄호 안의 표현식이 아무것도 다른 사람보다하지 ω=λx.xx
, 우리는 다음과 같이 표현된다 알고있는 SII = S(SKK)(SKK)
, 맞죠?
SII
하지 SKK
. 그건 실수 였어