\section{Recursion} Say we want a function that computes the factorial of a positive integer. Here's one way we could define it: $$ x! = \begin{cases} x \times (x-1)! & x \neq 0 \\ 1 & x = 0 \end{cases} $$ We cannot re-create this in lambda notation. Functions in lambda calculus are \textit{anonymous}, which means we can't call them before they've been fully defined. \vspace{1ex} As an example, consider the statement $A = \lm a. A~a$ \\ This means \say{write $(\lm a.A~a)$ whenever you see $A$.} However, $A$ is \textit{inside} what we're rewriting. We'd fall into infinite recursion before even starting our $\beta$-reduction! \begin{instructornote} We're talking about recursion, and \textit{computability} isn't far away. At one point or another, it may be good to give the class a precise definition of \say{computable by lambda calculus:} \vspace{4ex} Say we have a device that reduces a $\lm$ expression to $\beta$-normal form. We give it an expression, and the machine simplifies it as much as it can and spits out the result. \\ \vspace{1ex} An algorithm is \say{computable by lambda calculus} if we can encode its input in an expression that resolves to the algorithm's output. \end{instructornote} \problem{} Write an expression that resolves to itself. \\ \note{Your answer should be short and sweet.} \vspace{1ex} This expression is often called $\Omega$, after the last letter of the Greek alphabet. \\ $\Omega$ useless on its own, but gives us a starting point for recursion. \begin{solution} $\Omega = M~M = (\lm x . xx) (\lm x . xx)$ \vspace{1ex} An uninspired mathematician might call the Mockingbird $\omega$, \say{little omega}. \\ \end{solution} \vfill \definition{} This is the \textit{Y-combinator}, easily the most famous $\lm$ expression. \\ You may notice that it's just $\Omega$, put to work. $$ Y = \lm f . (\lm x . f(x~x))(\lm x . f(x~x)) $$ \problem{} What does this thing do? \\ Evaluate $Y f$. \vfill \pagebreak