4.4 람다 항(Lambda Term)의 구조: 변수, 추상화, 적용
1. 람다 항의 세 구성 요소
람다 대수(Lambda Calculus)의 모든 표현은 세 가지 기본 구성 형태—변수(Variable), 추상화(Abstraction), 적용(Application)—의 재귀적 조합으로 구성된다. 이 세 형태만으로 튜링 완전한 계산 체계가 구축되며, 이 극도의 단순성이 람다 대수의 이론적 위력의 기반이다.
2. 변수(Variable)
2.1 정의와 역할
변수 x \in \mathcal{V}는 람다 대수의 가장 기본적인 원자 표현(Atomic Expression)이다. 변수는 아직 결정되지 않은 값의 이름(Name)을 나타내며, 다른 람다 항으로 대체(Substitution)될 수 있는 자리표시자(Placeholder)로 기능한다.
변수의 집합 \mathcal{V}는 가산 무한(Countably Infinite)이며, 관례적으로 x, y, z, u, v, w, x_1, x_2, \ldots 등의 기호를 사용한다.
2.2 프로그래밍 언어와의 대응
람다 대수의 변수는 프로그래밍 언어에서의 변수(Variable) 개념의 원형이다. 다만, 순수 람다 대수에서 변수는 재할당(Reassignment)이 불가능한 불변(Immutable) 바인딩이며, 이는 함수형 프로그래밍의 불변성(Immutability) 원칙에 대응한다.
3. 추상화(Abstraction)
3.1 정의
추상화(Lambda Abstraction) \lambda x. M은 함수의 정의를 나타낸다. \lambda는 함수 정의를 도입하는 기호이고, x는 함수의 매개변수(Parameter)이며, M은 함수의 본체(Body)이다.
형식적으로, M이 람다 항이고 x가 변수이면, \lambda x. M은 람다 항이다.
3.2 의미론적 해석
\lambda x. M은 “입력값 x를 받으면 본체 M을 평가한 결과를 반환하는 함수“를 나타낸다. M 내에서 x가 출현하는 위치에 실제 인자 값이 대입되어 함수의 결과가 결정된다.
예시:
- \lambda x. x: 입력을 그대로 반환하는 항등 함수(Identity Function)
- \lambda x. x \; x: 입력을 자기 자신에 적용하는 자기 적용 함수(Self-Application)
- \lambda f. \lambda x. f \; (f \; x): 함수 f를 두 번 적용하는 함수
3.3 다중 매개변수의 처리: 커링(Currying)
람다 대수에서 함수는 정확히 하나의 매개변수만을 받는다. 다중 매개변수 함수는 커링(Currying)에 의해 단일 매개변수 함수의 연쇄로 표현된다.
이항 함수 f(x, y) = M은 다음과 같이 표현된다:
\lambda x. \lambda y. M
이 표현은 “x를 받아, ’y를 받아 M을 반환하는 함수’를 반환하는 함수“이다. 관례적으로 \lambda x. \lambda y. M을 \lambda xy. M으로 축약한다.
커링이라는 명칭은 하스켈 커리(Haskell Curry)에게서 유래하였으나, 이 기법을 최초로 사용한 것은 쇤핑켈(Moses Schönfinkel, 1924)이다.
매개변수 속박(Parameter Binding)
추상화 \lambda x. M에서 x는 본체 M 내에서 속박(Bound)된다. 속박된 변수는 함수의 매개변수와 같은 역할을 하며, 함수 외부에서 동일한 이름의 변수와는 독립적이다. 이는 프로그래밍 언어에서 지역 변수(Local Variable)의 유효 범위(Scope)와 동일한 개념이다.
속박의 유효 범위는 본체 M 전체이다. 예를 들어, \lambda x. (x \; (\lambda x. x))에서 외부의 \lambda x는 본체 전체에서 유효하지만, 내부의 \lambda x가 안쪽 x를 다시 속박하므로, 가장 안쪽의 x는 내부 \lambda x에 속박된다. 이를 변수 가림(Variable Shadowing)이라 한다.
적용(Application)
정의
적용(Application) (M \; N)은 함수 M에 인자 N을 적용하는 것을 나타낸다. M과 N이 람다 항이면, (M \; N)도 람다 항이다.
의미론적 해석
(M \; N)은 “M이 나타내는 함수를 인자 N에 적용한 결과“이다. M이 추상화 \lambda x. P인 경우, (\lambda x. P) \; N의 결과는 P 내의 x를 N으로 대입한 P[x := N]이다. 이 대입이 베타 축약(Beta Reduction)이다.
좌결합성
적용은 좌결합적(Left Associative)이다:
M \; N \; P = ((M \; N) \; P)
이 관례는 커링된 다중 인자 함수의 적용을 자연스럽게 표현한다. f \; a \; b는 “f에 a를 적용한 결과에 다시 b를 적용“을 의미한다.
3.4 고차 적용(Higher-Order Application)
람다 대수에서 함수는 일급 시민(First-Class Citizen)이다. 함수가 다른 함수를 인자로 받거나, 함수를 반환값으로 산출할 수 있다. 이를 고차 함수(Higher-Order Function)라 한다.
예시:
- (\lambda f. f \; a) \; (\lambda x. x): 함수를 인자로 받아 a에 적용. 결과: a.
- \lambda f. \lambda g. \lambda x. f \; (g \; x): 함수 합성(Function Composition). f \circ g에 대응.
4. 세 구성 요소의 상호작용
변수, 추상화, 적용의 상호작용에 의해 임의로 복잡한 계산이 구성된다.
4.1 재귀적 구조
람다 항의 정의는 재귀적이므로, 임의의 깊이로 중첩(Nesting)된 표현이 가능하다. 이 재귀적 구조가 람다 대수의 표현력(Expressiveness)의 원천이다.
4.2 데이터의 함수적 인코딩
순수 람다 대수에는 자연수, 불 값 등의 기본 데이터 유형이 존재하지 않으나, 이들을 함수로 인코딩할 수 있다.
처치 수(Church Numeral): 자연수 n을 함수를 n번 적용하는 것으로 인코딩한다.
- \overline{0} = \lambda f. \lambda x. x
- \overline{1} = \lambda f. \lambda x. f \; x
- \overline{2} = \lambda f. \lambda x. f \; (f \; x)
- \overline{n} = \lambda f. \lambda x. f^n \; x
처치 불(Church Boolean): 불 값을 두 인자 중 하나를 선택하는 함수로 인코딩한다.
- \text{TRUE} = \lambda x. \lambda y. x
- \text{FALSE} = \lambda x. \lambda y. y
이 인코딩은 순수 함수만으로 데이터와 제어 구조를 표현할 수 있음을 보여주며, 변수, 추상화, 적용이라는 세 구성 요소의 충분성을 실증한다.
5. 세 구성 요소와 프로그래밍의 대응
| 람다 대수 | 프로그래밍 언어 대응 |
|---|---|
| 변수 x | 변수, 식별자(Identifier) |
| 추상화 \lambda x. M | 함수 정의, 익명 함수(Anonymous Function) |
| 적용 (M \; N) | 함수 호출(Function Call) |
현대 프로그래밍 언어에서의 람다 식(Lambda Expression)—Python의 lambda x: M, JavaScript의 (x) => M, Haskell의 \x -> M—은 람다 대수의 추상화를 직접적으로 구현한 것이다. 이는 80여 년 전 처치가 도입한 추상적 수학 체계가 현대 소프트웨어 개발의 일상적 도구로 활용되고 있음을 보여준다.