[plt-scheme] Y Combinator Exercise

From: Paulo Jorge Matos (pocmatos at gmail.com)
Date: Thu Nov 17 04:16:27 EST 2005

Thanks all for the tips and suggestions on the Y combinator.
I'll be giving some references to my students a couple of exercises.

Thanks once again,

Paulo Matos

On 16/11/05, Matthias Felleisen <matthias at ccs.neu.edu> wrote:
>
> On Nov 16, 2005, at 6:20 PM, John Clements wrote:
>
> >
> > On Nov 16, 2005, at 12:59 PM, Matthias Felleisen wrote:
> >
> >> In the monograph on reduction semantics [Felleisen & Flatt], we had
> >> some sample calculations using the Y combinator along the lines of
> >> what John points out. Use reductions to show ((Y mk-!) 2) is 2. Then
> >> show them that the fixpoint equation helps. Reprove the first one and
> >> wow it all gets easier. Then show them that you need a calculus (=)
> >> and that reductions (->) are no longer enough for this. Puzzle: can
> >> you design a cbv Y-like combinator that doesn't use 'backwards'
> >> reductions. -- Matthias
> >
> > <humility>
> > Okay, now I'm confused.  Isn't cbv Y _itself_ a Y-like combinator that
> > doesn't use 'backwards' reductions?
> > </humility>
>
> Watch below. Y doesn't show up anymore after you start reducing. The
> terms get bigger and bigger.
>
> More succicently:
>
>   \-v |- Y (\f\.xM) = ((\f.\x.M) (Y (\f\.xM)))
>
> but not
>
>   \-v |- Y (\f\.xM) ->* ((\f.\x.M) (Y (\f\.xM)))
>
> Of course all of the below is easier to calculate out if you use the
> unrolling/fixpoint equation. See monograph -- Matthias
>
>
> (define -> '->)
>
> (define Y
>    (lambda (f)
>      ((lambda (g) (f (lambda (x) ((g g) x))))
>       (lambda (g) (f (lambda (x) ((g g) x)))))))
>
> (define !!
>    (lambda (!)
>      (lambda (n)
>        (if (zero? n) 1 (* n (! (- n 1)))))))
>
> ((Y !!) 0)
> ->
> (((lambda (f)
>      ((lambda (g) (f (lambda (x) ((g g) x))))
>       (lambda (g) (f (lambda (x) ((g g) x))))))
>    (lambda (!)
>      (lambda (n)
>        (if (zero? n) 1 (* n (! (- n 1)))))))
>   0)
> ->
> (((lambda (g) ((lambda (!)
>                   (lambda (n)
>                     (if (zero? n) 1 (* n (! (- n 1))))))
>                 (lambda (x) ((g g) x))))
>    (lambda (g) ((lambda (!)
>                   (lambda (n)
>                     (if (zero? n) 1 (* n (! (- n 1))))))
>                 (lambda (x) ((g g) x)))))
>   0)
> ->
> ((lambda (n)
>     (if (zero? n)
>         1
>         (* n ((lambda (x)
>                 (((lambda (g) ((lambda (!)
>                                  (lambda (n)
>                                    (if (zero? n) 1 (* n (! (- n 1))))))
>                                (lambda (x) ((g g) x))))
>                   (lambda (g) ((lambda (!)
>                                  (lambda (n)
>                                    (if (zero? n) 1 (* n (! (- n 1))))))
>                                (lambda (x) ((g g) x)))))
>                  x))
>               (- n 1)))))
>   0)
> ->
> (if (zero? 0)
>      1
>      (* 0 ((lambda (x)
>              (((lambda (g) ((lambda (!)
>                               (lambda (n)
>                                 (if (zero? n) 1 (* n (! (- n 1))))))
>                             (lambda (x) ((g g) x))))
>                (lambda (g) ((lambda (!)
>                               (lambda (n)
>                                 (if (zero? n) 1 (* n (! (- n 1))))))
>                             (lambda (x) ((g g) x)))))
>               x))
>            (- 0 1))))
> ->
> ->
> 1
>
>


--
Paulo Jorge Matos - pocm at sat inesc-id pt
Web: http://sat.inesc-id.pt/~pocm
Computer and Software Engineering
INESC-ID - SAT Group


Posted on the users mailing list.