This is the derivation of the applicative-order Y-combinator from scratch, in Scheme. The following derivation is similar in flavor to the derivation found in The Little LISPer by Friedman/Felleisen, but uses a slightly different starting approach (for one thing, I begin with the "length" function). Maybe this version will be a little easier to follow.
((lambda (l)
(if (null? l)
0
(add1 (??? (cdr l)))))
'(any old list you like))
The problem, of course, is that we can't plug in the function expression
itself directly in place of the ??? because that immediately leads to an
infinite regress. It's like trying to quote an entire sentence inside the
sentence itself.
((lambda (l f)
(if (null? l)
0
(add1 (f (cdr l) f))))
'(any old list you like)
(lambda (l f)
(if (null? l)
0
(add1 (f (cdr l) f)))))
((lambda (f l)
(if (null? l)
0
(add1 (f f (cdr l)))))
(lambda (f l)
(if (null? l)
0
(add1 (f f (cdr l)))))
'(any old list you like))
(((lambda (f)
(lambda (l)
(if (null? l)
0
(add1 ((f f) (cdr l))))))
(lambda (f)
(lambda (l)
(if (null? l)
0
(add1 ((f f) (cdr l)))))))
'(any old list you like))
((lambda (f)
(lambda (l)
(if (null? l)
0
(add1 ((f f) (cdr l))))))
(lambda (f)
(lambda (l)
(if (null? l)
0
(add1 ((f f) (cdr l)))))))
((lambda (f)
(lambda (l)
(if (null? l)
0
(add1 ((lambda (a) ((f f) a)) (cdr l))))))
(lambda (f)
(lambda (l)
(if (null? l)
0
(add1 ((lambda (a) ((f f) a)) (cdr l)))))))
((lambda (f)
(let ([r (lambda (a) ((f f) a))])
(lambda (l)
(if (null? l)
0
(add1 (r (cdr l)))))))
(lambda (f)
(let ([r (lambda (a) ((f f) a))])
(lambda (l)
(if (null? l)
0
(add1 (r (cdr l))))))))
((lambda (f)
((lambda (r)
(lambda (l)
(if (null? l)
0
(add1 (r (cdr l))))))
(lambda (a) ((f f) a))))
(lambda (f)
((lambda (r)
(lambda (l)
(if (null? l)
0
(add1 (r (cdr l))))))
(lambda (a) ((f f) a)))))
(let ([m (lambda (r)
(lambda (l)
(if (null? l)
0
(add1 (r (cdr l))))))])
((lambda (f)
(m (lambda (a) ((f f) a))))
(lambda (f)
(m (lambda (a) ((f f) a))))))
((lambda (m)
((lambda (f) (m (lambda (a) ((f f) a))))
(lambda (f) (m (lambda (a) ((f f) a))))))
(lambda (r)
(lambda (l)
(if (null? l)
0
(add1 (r (cdr l)))))))
(define Y
(lambda (m)
((lambda (f) (m (lambda (a) ((f f) a))))
(lambda (f) (m (lambda (a) ((f f) a)))))))
(Y (lambda (r)
(lambda (l)
(if (null? l)
0
(add1 (r (cdr l)))))))
Return to Main Page