고정 소수점 콤비 네이터 (Y 콤비 네이터)의 명확하고 직관적 인 파생?


28

(형식화되지 않은) 람다 미적분 ( ) 의 고정 소수점 조합기 FIX (일명 Y )는 다음과 같이 정의됩니다.λ

FIXλ에프.(λ엑스.에프 (λ와이.엑스 엑스 와이)) (λ엑스.에프 (λ와이.엑스 엑스 와이))

나는 그 목적을 이해하고 응용 프로그램의 실행을 완벽하게 추적 할 수 있습니다. 첫 번째 원칙에서 FIX를 도출하는 방법을 이해하고 싶습니다 .

내가 직접 파생하려고 할 때 얻을 수있는 한 다음과 같습니다.

  1. FIX는 함수입니다. FIX λ
  2. FIX는 재귀를 만들기 위해 에프 라는 다른 함수 를 사용합니다. FIX λ에프.
  3. 함수 f 의 첫 번째 인수는 함수 에프의 "이름"이며 재귀 적 응용 프로그램이 사용되는 곳에서 사용됩니다. 따라서 f 에 대한 첫 번째 인수의 모든 모양은 에프함수로 대체되어야하며,이 함수는 f 의 나머지 인수를 예상해야합니다 에프( 에프 는 하나의 인수를 가정합니다 ) : FIX λ에프.에프 (λ와이.와이)

이것은 내가 추론에서 "걸음을 내딛는 방법"을 모르는 곳입니다. 작은 타원은 내 FIX에 무언가 빠진 부분을 나타냅니다 (하지만 "실제"FIX와 비교하면 알 수 있습니다).

나는 이미 Types and Programming Languages를 읽었으며 , 직접 유도하려고 시도하지 않고 독자를 유도하기 위해 The Little Schemer 를 참조합니다. 나는 그것을 읽었으며 그것의 "유도"는 그다지 도움이되지 않았다. 또한 직접 파생이 아니며 매우 구체적인 예를 사용하고 \ lambda 에 적절한 재귀 함수를 작성하려는 임시 시도가 더 많습니다 λ.


1
이 게시물 이 도움 될 수 있습니다. 일반적으로, 콤비 네이터를 여러 번 반복하여 계산하는 것이 왜 작동하는지 알아내는 데 도움이된다고 생각합니다.
Xodarap

2
여러 가지 고정 소수점 결합기가 있습니다. 아마도 사람들은 그들이 넘어 질 때까지 콤비 네이터를 가지고 놀았을 것입니다.
Yuval Filmus

@ YuvalFilmus, 그것이 저의 연구 와이 질문에 대한 응답으로 저를 생각하게합니다. 그러나 나는 여전히 콤비 네이터가 어떻게 논리적으로 형성되는지, "예를 들어, 새로운 콤비 네이터를 만들려고 할 때 특히 도움이되는 기술"을 보는 것이 유익하다고 생각한다.
BlueBomber

Daniel P. Friedman (또는 "The Little Schemer")의 "The Little Lisper"의 9 장을 읽으십시오.
user18199

2
OP는 이미 읽은 것으로 나타납니다.
Raphael

답변:


29

나는 이것을 어디서도 읽지 못했지만 이것이 가 파생 될 수 있다고 믿는 방법입니다 .Y

재귀 함수 , 아마도 계승 또는 이와 유사한 것을 갖도록합시다 . 비공식적으로, 우리는 정의합니다 의사 람다 용어로 자신의 정의에 발생합니다 :f ffff

에프=에프에프

먼저 재귀 호출을 매개 변수로 고려할 수 있습니다.

에프=(λ아르 자형.(아르 자형아르 자형))에프

를 자신에게 인수로 전달하는 방법 만 있다면 정의 할 수 있습니다. 물론 우리는 를 가지고 있지 않기 때문에 불가능합니다 . 우리가 가진 것은 입니다. 이후 우리가 정의하는 데 필요한 모든 기능이 포함되어 , 우리는 통과를 시도 할 수 있습니다 대신 인수로 및 재구성을 시도 나중에 내부 그것에서. 첫 번째 시도는 다음과 같습니다.f M M f M f f에프에프에프에프에프

에프=(λ아르 자형.(아르 자형아르 자형))(λ아르 자형.(아르 자형아르 자형))

그러나 이것은 완전히 정확하지 않습니다. 전에, 는 내부의 대체되었습니다 . 그러나 이제 우리는 대신 을 전달 합니다. 을 사용하는 모든 장소를 어떻게 든 수정 하여 에서 를 재구성해야합니다 . 실제로 이것은 전혀 어렵지 않습니다. 이제 이라는 것을 알았 으므로 을 사용하는 모든 곳에서 단순히 을 대체합니다 .r M M r f M f = M M r ( r r )에프아르 자형아르 자형에프에프=아르 자형(아르 자형아르 자형)

f=(λr.((rr)(rr)))M(λr.((rr)(rr)))M

이 솔루션은 좋지만 내부에서 을 변경해야했습니다 . 이것은 매우 편리하지 않습니다. 우리는 수정할 필요없이 더 우아하게이 작업을 수행 할 수 있습니다 다른 도입하여 로 전송 표현 작성자 : 인수 자체에 적용을 같이 우리가 얻을M λ M M ' λ x . M ( x x )MMλMMλx.M(xx)

f=(λx.(λr.(rr))M(xx))(λx.(λr.(rr))M(xx))

이 경우의 방법은, 대입 , 대입 과 동일하게 정의이고, . 이것은 유효한 람다 항으로 표현 되는 비 재귀 정의를 제공합니다 !MxMMrff

로의 전환 이 쉬워졌습니다. 대신 임의의 람다 항을 사용 하여이 절차를 수행 할 수 있습니다. 그래서 우리는 빼고 정의 할 수 있습니다YMM

Y=λm.(λx.m(xx))(λx.m(xx))

실제로 은 정의한대로 로 줄입니다.YMf


참고 : 나는 문헌에 정의 된대로 를 파생 했습니다. 위에서 설명한 조합기는 값별로 호출되는 언어를 위한 의 변형이며 때로는 라고도 합니다. 참조 이 위키 백과 문서를 .YYZ


1
탁월한 응답이 나에게 잃어 버렸지 만 겉보기에 명백한 직감은 재귀 함수가 인수로 필요하다는 것이므로 함수는 일부 X에 대해 형식을 가질 것이라는 가정부터 시작합니다 . 그런 다음 X 를 구성 할 때 fX 내부에 무언가를 적용하는 것으로 정의 된다는 주장을 사용합니다 . 예를 들어, 응답에 xx 에 적용 하는 것은 f와 동일합니다 . 매혹적인! f=X(X)XX에프엑스엑스엑스에프
BlueBomber

11

Yuval이 지적했듯이 고정 소수점 연산자는 하나뿐이 아닙니다. 그들 중 많은 것이 있습니다. 다시 말해, 고정 소수 정리에 대한 방정식에는 단일 답변이 없습니다. 그래서 당신은 그들로부터 연산자를 파생시킬 수 없습니다.

사람들 이 x = y에 대한 해답으로 을 도출하는 방법을 묻는 것과 같습니다 . 그들은하지 않습니다! 이 방정식에는 고유 한 해가 없습니다.(엑스,와이)=(0,0)엑스=와이


당신이 알고 싶은 것은 첫 번째 고정 소수점 정리가 어떻게 발견되었는지입니다. 고정 점 / 재귀 정리를 처음봤을 때 어떻게되는지 궁금했습니다. 너무 독창적 인 것 같습니다. 특히 계산 성 이론 형태. 유발의 말과 달리 사람들이 무언가를 발견 할 때까지 놀았 던 것은 아닙니다. 내가 찾은 것은 다음과 같습니다.

내가 기억하는 한, 정리는 원래 SC Kleene 때문입니다. Kleene은 교회의 람다 미적분학의 불일치에 대한 증거를 구해 원래의 고정 소수점 정리를 생각해 냈습니다. 교회의 람다 미적분학은 러셀 형식의 역설로 고통 받았다. 수정 된 람다 미적분은 문제를 피했다. Kleene은 수정 된 람다 미적분이 유사한 문제를 겪고 어떻게 불일치의 증거가 수정 된 람다 미적분의 유용한 정리로 바뀌 었는지 확인하기 위해 불일치의 증거를 연구했을 것입니다. 람다 미적분학의 다른 계산 모델 (투어링 머신, 재귀 함수 등)에 대한 그의 작업을 통해 그는 다른 계산 모델로 옮겼습니다.


당신이 요청할 수있는 운영자를 파생시키는 방법? 다음은 내가 염두에 두는 방법입니다. 고정 소수점 정리는 자체 참조 제거에 관한 것입니다.

누구나 거짓말 쟁이 역설을 알고 있습니다.

나는 은신처입니다.

또는보다 언어적인 형태로 :

이 문장은 거짓입니다.

이제 대부분의 사람들은이 문장의 문제가 자기 참조에 있다고 생각합니다. 그렇지 않습니다! 자기 참조는 제거 될 수있다 (문제는 진실이다. 언어는 일반적으로 자신의 문장의 진실에 대해 말할 수 없다. 타르 스키의 진리 정리의 정의 불가 참조 ). 자체 참조가 제거되는 형식은 다음과 같습니다.

따옴표 안에 두 번째로 다음 인용문을 두 번 쓰면 결과 문장이 거짓입니다. "두 번째로 따옴표 안에 다음 인용문을 두 번 쓰면 결과 문장이 거짓입니다."

자체 참조가 없으므로 문장을 구성하고 무언가를 수행하는 방법에 대한 지침이 있습니다. 그리고 구성되는 문장은 지시와 같습니다. 에 있습니다 데이터와 명령어 사이에 차이가 없기 때문에 우리는 따옴표가 필요하지 않습니다 -calculus.λ

이제 이것을 분석하면 여기서 M xx x 를 구성 하고 무언가를 수행 하는 명령 입니다.엑스엑스엑스

엑스=에프(엑스엑스)

따라서 λ x 입니다. f ( x x ) 이고 우리는λ엑스.에프(엑스엑스)

MM=(λx.f(xx))(λx.f(xx))

이것은 고정 된 입니다. 연산자로 만들고 싶다면 λ f 만 추가 하면 Y가됩니다 .fλfY

Y=λf.(MM)=λf.((λx.f(xx))(λx.f(xx)))

그래서 나는 자체 참조없이 역설을 염두에두고 가 무엇인지 이해하는 데 도움이됩니다 .Y


3

따라서 고정 소수점 조합기를 정의해야합니다

fix f = f (fix f)
      = f (f (fix f))
      = f (f (f ... ))

그러나 명시적인 재귀가 없습니다. 가장 간단한 환원 불가능한 결합기로 시작합시다

omega = (\x. x x) (\x. x x)
      = (\x. x x) (\x. x x)
      = ...

x제 람다 반복적 제 람다로 치환된다. 간단한 알파 변환은이 과정을보다 명확하게합니다.

omega =  (\x. x x) (\x. x x)
      =α (\x. x x) (\y. y y)
      =β (\y. y y) (\y. y y)
      =α (\y. y y) (\z. z z)
      =β (\z. z z) (\z. z z)

즉, 첫 번째 람다의 변수는 항상 사라집니다. 우리는 추가 그래서 만약 f첫 번째 람다에

(\x. f (x x)) (\y. y y)

f의지 밥까지

f ((\y. y y) (\y. y y))

우리는 우리를 omega다시 얻었다 . 이제 f두 번째 람다에를 추가 f하면 첫 번째 람다에가 표시되고 튀어 나옵니다.

Y f = (\x. x x)     (\x. f (x x))
      (\x. f (x x)) (\x. f (x x)) -- the classical definition of Y

이후

(\x. s t) z = s ((\x. t) z), if `x' doesn't occur free in `s'

식을 다음과 같이 다시 작성할 수 있습니다.

f ((\x. x x) (\x. f (x x))

그냥

f (Y f)

그리고 우리는 방정식을 얻었습니다 Y f = f (Y f). 따라서 Y결합기는 본질적으로

  1. 두 배 f
  2. f밥을 만들어
  3. 반복

2

일반적인 형태가없는 공식의 전형적인 예를 보았을 것입니다.

(λ엑스.엑스엑스)(λ엑스.엑스엑스)(λ엑스.엑스엑스)(λ엑스.엑스엑스)

일반적인 재귀에 대해서도 비슷한 방정식이 제안됩니다.

(에이)(λ엑스.아르 자형(엑스엑스))(λ엑스.아르 자형(엑스엑스)) 아르 자형( (λ엑스.아르 자형(엑스엑스))(λ엑스.아르 자형(엑스엑스)) )아르 자형(아르 자형( (λ엑스.아르 자형(엑스엑스))(λ엑스.아르 자형(엑스엑스)) ))

(A) 는 람다 미적분학 (원시 재귀를 넘어서)으로 일반적인 재귀 방정식을 쓰는 방법입니다. 그러면 방정식 어떻게 풀 수 있습니까? 플러그 FR 얻을 상기 식에서 :와이에프=에프(와이에프)에프아르 자형

Y = λ F . ( λ x . f ( x x ) ) ( λ x . f ( x x ) )

와이에프=(λ엑스.에프(엑스엑스))(λ엑스.에프(엑스엑스))
와이=λ에프.(λ엑스.에프(엑스엑스))(λ엑스.에프(엑스엑스))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.