From Lambda calculus to Combinator Calculus
After yesterdays description of the Y combinator in lambda calculus, I thought it would be fun to show some fun and useful stuff that you can do using combinators.
Let's take three simple combinators:
But there's a reason. Watch this: each line in the following is one step of reduction:
Poof! We don't need I at all. We just created the equivalent of I using nothing but S and K. But that's just the start: in fact, we can create the equivalent of any lambda calculus expression using nothing but the S and K combinators with no variables.
For example, the Y combinator is:
Before we go any further, there's one important thing to point out. Note that above, I said that with S K K we created the equivalent of I. It does not reduce to
So far in lambda calculus, we've said that "x = y" if and only if x and y are either identical, or can be made identical through alpha conversion. (So
From now on, when we use "=", it will be for extensional equality. We can translate any lambda expression into an extensionally equivalent combinator term. We'll define a transform function C from lambda terms to combinator terms:
Let's take three simple combinators:
- S: S is a function application combinator:
S = lambda x y z . (x z (y z)). - K: K generates functions that return a specific constant value:
K = lambda x . (lambda y . x). - I: I is the identity function:
I = lambda x . x
But there's a reason. Watch this: each line in the following is one step of reduction:
S K K x =
(K x) (K x) =
xPoof! We don't need I at all. We just created the equivalent of I using nothing but S and K. But that's just the start: in fact, we can create the equivalent of any lambda calculus expression using nothing but the S and K combinators with no variables.
For example, the Y combinator is:
Y = S S K (S (K (S S (S (S S K)))) K)
Before we go any further, there's one important thing to point out. Note that above, I said that with S K K we created the equivalent of I. It does not reduce to
lambda x . x.So far in lambda calculus, we've said that "x = y" if and only if x and y are either identical, or can be made identical through alpha conversion. (So
lambda x y . x + y is equal to lambda a b . a + b, but not equal to lambda x y . y + x.) This is called intensional equivalence. But it's extremely useful to have another idea of equality, which is called extensional equivalence or extensional equality. In extensional equality, an expression X equals an expression Y if/f either X is identical to Y (modulo alphas), or for all a . X a = Y a.From now on, when we use "=", it will be for extensional equality. We can translate any lambda expression into an extensionally equivalent combinator term. We'll define a transform function C from lambda terms to combinator terms:
- (1)
C{x} = x - (2)
C{E1 E2} = C{E1} C{E2} - (3)
C{lambda x . E} = K C{E}if x is not free in E. - (4)
C{lambda x . x} = I - (5)
C{lambda x. E1 E2} = (S C{lambda x.E1} C{lambda x.E2}) - (6)
C{lambda x.(lambda y. E)} = C{lambda x. C{lambda y.E}}, if x is free in E.
-
C{lambda x y . y x} - Curry the function:
C{lambda x . (lambda y . y x)} - By rule 6:
C{lambda x . C{lambda y . y x}} - By rule 5:
C{lambda x . S C{lambda y. y} C{lambda y . x}} - By rule 4:
C{lambda x . S I C{lambda y . x}} - By rule 3:
C{lambda x . S I (K C{x})} - By rule 1:
C{lambda x . S I (K x)} - By rule 5:
S C{lambda x . S I} C{lambda x . (K x)} - By rule 3:
S (K (S I)) C{lambda x . K x} - By rule 5:
S (K (S I)) (S C{lambda x . K} C{lambda x . x}) - By rule 1:
S (K (S I)) (S C{lambda x . K} I) - By rule 3:
S (K (S I)) (S (K K) I)
-
S (K (S I)) (S (K K) I) x y - Let's create some aliases, to make things easier to read:
A=(K (S I)), B = (S (K K) I), so our expression is now:S A B x y - Expand S:
(A x (B x)) y - Let's unalias B:
(A x ((S (K K) I) x)) y - Now, let's get rid of the S:
(A x ((K K) x (I x))) y - And get rid of the I:
(A x ((K K) x x)) y - Reduce
(K K) x:(A x (K x)) y - Expand out the A alias:
((K (S I)) x (K x)) y - Reduce
(K (S I)) x, giving:((S I) (K x)) y - Reduce S:
I y (K x) y - Reduce I:
y (K x) y - And finally reduce
(K x) yleaving:y x

RSS
0 Comments:
Post a Comment
<< Home