Y 조합
f n = if n > 1 then n * f (n-1) else 1
자연수 n의 곱셈을 요구하려면
f n
만 호출하면 상기 코드는 하나의 부수문장을 포함할 수 있다. 그러나 순수한 lambda표현식은 부수문장이 없다. 그러면 순수한 lambda표현식으로 귀속을 실현할 수 있을까?곱셈을 구할 수 있는 함수는 여러 개가 있다고 추측할 수 있다. 예를 들어
f n = foldl (*) [1..n]
가 그 중의 하나이다.그래서 우리는 곱셈을 구할 수 있는 함수f
를 변수로 삼아 곱셈을 정의하면 구f
의 값이 된다.정의
g f =
-> if n > 1 then n * f (n-1) else 1
먼저 결론을 내린다. f가 계승을 구할 수 있는 충분한 필요조건은
g f == f
(==
의 등효 표시, 아래와 같다)다음은 엄격하지 않게 증명해 보겠습니다.
f
이 곱셈을 계산할 수 있다면 g
을 f
에 응용하면 새로운 함수g f
, 즉
-> if n > 1 then n * f (n-1) else 1
f
를 얻을 수 있다. g f
는 곱셈을 계산할 수 있고 곱셈의 정의에 의하면g f == f
도 반드시 곱셈을 계산할 수 있다. 즉g f == f
f ==
-> if n > 1 then n * f (n-1) else 1
이라면 대환을 통해 얻을 수 있다g f == f
. 이것이 바로 우리가 위에서 제시한 곱셈의 귀속 정의 형식이다. 이런 f가 곱셈을 계산할 수 있다는 것을 확정할 수 있고 수학 귀납법을 통해 증명할 수 있다g f == f
는 f가 곱셈을 계산할 수 있는 충분한 필요조건이다그러면 문제는'방정식
f == Y g
의 해를 구하는 것'으로 바뀌었다.분명히 f는 g에 관한 함수일 것이다. 그러면 Y조합자는 사실 이 함수이다.
f
하지만 구체적으로 어떻게 이 해답을 구하기는 너무 어려워요. 민과인 저는 선배들이 남긴 결론을 이용해서 천천히 모을 수밖에 없어요.gen gen
이런 형식으로gen
만족해야 한다gen = \x -> g (x x)
그리하여
gen gen = g gen gen
이렇게 해서 g의 움직임을 찾았어요.지금부터 Y조합자 구성: 위에서 논의한 바와 같이 알 수 있다
Y g == f == gen gen == g gen gen
칙Y g = g gen gen
즉
Y g = gen gen
즉
Y g = (\x -> g (x x)) (\x -> g (x x))
이로부터 Y 조합을 얻었다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.