람다 대수 인자 이름이 같을 때

박준규·2023년 3월 22일
1

이 글은 책 The implementation of functional programming languages에서 2.2.2.2 Naming을 읽고 정리한 것이다.

Naming

여러 형식 인자 이름이 같을 때 주의를 해야 한다. 예를 들어 다음과 같은 식이 있다고 하자.

(λx.  (λx.  +  (  x  1))  x  3)  9(λx.  +  (  x  1)  9  3+  (  9  1)  311\begin{aligned} &(\lambda x.\;(\lambda x.\;+\;(-\;x\;1))\;x\;3)\;9\\ \rightarrow\quad&(\lambda x.\;+\;(-\;x\;1)\;9\;3\\ \rightarrow\quad&+\;(-\;9\;1)\;3\\ \rightarrow\quad&11 \end{aligned}

첫 번째 축약에서 안쪽에 있는 xx를 바꾸지 않았는데, 그 이유는 안쪽에 있는 xxλx\lambda x로 감싸져 있기 때문이다. 안쪽에 있는 xx는 바깥쪽 λx\lambda x 추상의 본문(body)에서 자유 변수가 아니다.

람다 추상화 (λx.E)(\lambda x.E)에서 정확히 어떤 xx를 바꿀지 어떻게 알 수 있을까? 방법은 의외로 쉬운데 (아님)EE에서 자유 변수인 것을 바꾸면 된다. 만약 어떤 변수가 식 EE에서 자유 변수라면 그 변수는 λx\lambda x 추상화 (λx.E)(\lambda x.E)에서 종속 변수가 된다. 그래서 위 예제에서 바깥쪽 λx\lambda x 추상화를 적용할 때 먼저 본문을 확인한다.

(λx.  +  (  x  1)  x  3(\lambda x.\;+\;(-\;x\;1)\;x\;3

두 번째 xx만 자유 변수이므로 인자로 바꿔 쓴다.

이게 바로 본문에서 자유 변수만 바꾸면 된다고 했던 이유이다. 블록으로 구분해서 변수의 범위를 중첩하는 언어에서도 비슷한 규칙을 따른다.

아래는 비슷한 종류의 다른 예시이다.

(λx.  λy.  +  x  ((λx.    x  3)  y))  5  6(λy.  +  5  ((λx.    x  3)  y))  6+  5  ((λx.    x  3)  6)+  5  (  6  3)8\begin{aligned} &(\lambda x.\;\lambda y.\;+\;x\;((\lambda x.\;-\;x\;3)\;y))\;5\;6\\ &\rightarrow\quad(\lambda y.\;+\;5\;((\lambda x.\;-\;x\;3)\;y))\;6\\ &\rightarrow\quad+\;5\;((\lambda x.\;-\;x\;3)\;6)\\ &\rightarrow\quad+\;5\;(-\;6\;3)\\ &\rightarrow\quad8 \end{aligned}

다시 한번 해보면, 첫 번째 축약에서 안쪽에 있는 xx는 바깥쪽 λx\lambda x 추상의 본문에서 자유 변수가 아니기 때문에 안쪽에 있는 xx는 바꿔 쓰지 않았다.

참고

profile
코딩하는 물총새

0개의 댓글