1 [Give recursive definition for computing the length of a list.]
3 Our fold-based implementation of lists, and Church's implementations of numbers, have a internal structure that mirrors common recursive operations we'd use lists and numbers for.
5 As we said, it takes some ingenuity to define functions like `extract-tail` or `predecessor` for these implementations, however it can be done. (And it's not *that* difficult.) Given those functions, we can go on to define other functions like numeric equality, subtraction, and so on, just by exploiting the structure already present in our implementation of lists and numbers.
7 With sufficient ingenuity, a great many functions can be defined in the same way. For example, the factorial function is straightforward. The function which returns the nth term in the Fibonacci series is a bit more difficult, but also achievable.
9 However, some computable functions are just not definable in this way. The simplest function that *simply cannot* be defined using the resources we've so far developed is the Ackermann function:
11         A(m,n) =
12                 | when m == 0 -> n + 1
13                 | else when n == 0 -> A(m-1,1)
14                 | else -> A(m-1, A(m,n-1))
16         A(0,y) = y+1
17         A(1,y) = y+2
18         A(2,y) = 2y + 3
19         A(3,y) = 2^(y+3) -3
20         A(4,y) = 2^(2^(2^...2)) [where there are y+3 2s] - 3
21         ...
23 Simpler functions always *could* be defined using the resources we've so far developed, although those definitions won't always be very efficient or easily intelligible.
25 But functions like the Ackermann function require us to develop a more general technique for doing recursion---and having developed it, it will often be easier to use it even in the cases where, in principle, we didn't have to.
27 ##How to do recursion with lower-case omega##
29 ##Generalizing##
31 In general, **fixed point** of a function f is a value *x* such that f<em>x</em> is equivalent to *x*. For example, what is a fixed point of the function from natural numbers to their squares? What is a fixed point of the successor function?
33 In the lambda calculus, we say a fixed point of an expression `f` is any formula `X` such that:
35         X <~~> f X
37 What is a fixed point of the identity combinator I?
39 It's a theorem of the lambda calculus that every formula has a fixed point. In fact, it will have infinitely many, syntactically distinct fixed points. And we don't just know that they exist: for any given formula, we can name many of them.
41 Yes, even the formula that you're using the define the successor function will have a fixed point. Isn't that weird? Think about how it might be true.
43 Well, you might think, only some of the formulas that we might give to the `successor` as arguments would really represent numbers. If we said something like:
45         successor make-pair
47 who knows what we'd get back? Perhaps there's some non-number-representing formula such that when we feed it to `successor` as an argument, we get the same formula back.
49 Yes! That's exactly right. And which formula this is will depend on the particular way you've implemented the successor function.
51 Moreover, the recipes that enable us to name fixed points for any given formula aren't *guaranteed* to give us *terminating* fixed points. They might give us formulas X such that neither `X` nor `f X` have normal forms. (Indeed, what they give us for the square function isn't any of the Church numbers, but is rather an expression with no normal form.) However, if we take care we can ensure that we *do* get terminating fixed points. And this gives us a principled, fully general strategy for doing recursion. It lets us define even functions like the Ackermann function, which were until now out of our reach. It would let us define arithmetic and list functions on the "version 1" and "version 2" implementations, where it wasn't always clear how to force the computation to "keep going."
53 [Explain in terms of an arbitrary fixed point combinator &Psi;.]
55 [Give some examples: first, versions of Y and &Theta; usable with call-by-value. Then do the internal eta-reductions and say these work for call-by-name only.]
57 [Explain how what we've done relates to the version using lower-case &omega;.]