diff --git a/Advanced/Lambda Calculus/parts/00 intro.tex b/Advanced/Lambda Calculus/parts/00 intro.tex index 1406b2e..1da2e2f 100755 --- a/Advanced/Lambda Calculus/parts/00 intro.tex +++ b/Advanced/Lambda Calculus/parts/00 intro.tex @@ -29,7 +29,7 @@ $$ Functions are left-associative: If $A$ and $B$ are functions, $(A~B~\star)$ is equivalent to $((A~B)~\star)$. As usual, we'll use parentheses to group terms if we want to override this order: $(A~(B~\star)) \neq (A~B~\star)$ \par -In this handout, all types of parentheses ( $(), [],$ etc ) are equivalent. +In this handout, all types of parentheses ( $(), [~],$ etc ) are equivalent. \vfill diff --git a/Advanced/Lambda Calculus/parts/02 boolean.tex b/Advanced/Lambda Calculus/parts/02 boolean.tex index 20cef48..cca5457 100755 --- a/Advanced/Lambda Calculus/parts/02 boolean.tex +++ b/Advanced/Lambda Calculus/parts/02 boolean.tex @@ -38,20 +38,20 @@ Write functions $\text{AND}$, $\text{OR}$, and $\text{XOR}$ that satisfy the fol \end{center} \begin{solution} - There's more than one way to do this, of course, but make sure the kids understand how the solutions below work. + There's more than one way to do this, of course. \begin{align*} \text{AND} &= \lm ab . (a~b~F) = \lm ab . aba \\ \text{OR} &= \lm ab . (a~T~b) = \lm ab . aab \\ \text{XOR} &= \lm ab . (a~ (\text{NOT}~b) ~b) \end{align*} - It may be worth mentioning that OR $= \lm ab.(M~a~b)$ is also a solution. + Another clever solution is $\text{OR} = \lm ab.(M~a~b)$ \end{solution} \vfill \problem{} -To complete our boolean algebra, write the boolean equality check EQ. \par +To complete our boolean algebra, construct the boolean equality check EQ. \par What inputs should it take? What outputs should it produce? \begin{solution} diff --git a/Advanced/Lambda Calculus/parts/03 numbers.tex b/Advanced/Lambda Calculus/parts/03 numbers.tex index f8ae170..d8fcb38 100755 --- a/Advanced/Lambda Calculus/parts/03 numbers.tex +++ b/Advanced/Lambda Calculus/parts/03 numbers.tex @@ -1,6 +1,6 @@ \section{Numbers} -Since the only objects we have in $\lm$-calculus are functions, it's natural to think of quantities as \textit{adverbs} (once, twice, thrice,...) rather than \textit{nouns} (one, two, three ...) +Since the only objects we have in $\lm$ calculus are functions, it's natural to think of quantities as \textit{adverbs} (once, twice, thrice,...) rather than \textit{nouns} (one, two, three ...) \vspace{1ex} @@ -9,7 +9,7 @@ Here's our \textit{don't} function: given a function and an input, don't apply t $$ 0 = \lm fa.a $$ -If you look closely, you'll find that $0$ is $\alpha$-equivalent to the false function $F$. +If you look closely, you'll find that $0$ is equivalent to the false function $F$. \problem{} Write $1$, $2$, and $3$. We will call these \textit{Church numerals}.\hspace{-0.5ex}\footnotemark{} \\ @@ -29,16 +29,8 @@ Write $1$, $2$, and $3$. We will call these \textit{Church numerals}.\hspace{-0. \vspace{1ex} - The round parentheses are \textit{essential}. Our lambda calculus is left-associative! - - \vspace{2ex} - - Also, notice that $1$ is very similar to $I$: - $$ - I~\heartsuit~\star = 1~\heartsuit~\star - $$ - - Zero is false, and one is the identity. Isn't that wonderful? + The round parentheses are \textit{essential}. Our lambda calculus is left-associative! \par + Also, note that zero is false and one is the (two-variable) identity. \end{solution} \vfill @@ -111,7 +103,6 @@ Define a function ADD that adds two Church numerals. \vfill \problem{} -Adding is nice, but we can do better. \par Design a function MULT that multiplies two numbers. \par \hint{The easy solution uses ADD, the elegant one doesn't. Find both!} @@ -139,10 +130,9 @@ $NZ$ does the opposite. $Z$ and $NZ$ should look fairly similar. \vfill \problem{} -Data structures will be useful. Design an expression PAIR that constructs two-value tuples. \par +Design an expression PAIR that constructs two-value tuples. \par For example, say $A = \text{PAIR}~1~2$. Then, \par -$(A~T)$ should reduce to $1$ \par -$(A~F)$ should reduce to $2$ +$(A~T)$ should reduce to $1$ and $(A~F)$ should reduce to $2$. \begin{solution} $\text{PAIR} = \lm ab . \lm i . (i~a~b) = \lm abi.iab$ @@ -150,7 +140,7 @@ $(A~F)$ should reduce to $2$ \vfill From now on, I'll write (PAIR $A$ $B$) as $\langle A,B \rangle$. \par -Like currying, this is only notation. The underlying $\lm$ logic remains the same. +Like currying, this is only notation. The underlying logic remains the same. \pagebreak @@ -160,7 +150,7 @@ It does exactly what it says on the tin: \vspace{1ex} -Given an input pair, it should shift its right argument left, then add one. \par +Given an input pair, it should shift its second argument left, then add one. \par $H~\langle 0, 1 \rangle$ should reduce to $\langle 1, 2\rangle$ \par $H~\langle 1, 2 \rangle$ should reduce to $\langle 2, 3\rangle$ \par $H~\langle 10, 4 \rangle$ should reduce to $\langle 4, 5\rangle$ @@ -176,7 +166,7 @@ $H~\langle 10, 4 \rangle$ should reduce to $\langle 4, 5\rangle$ \vfill -\problem{} +\problem{} Design a function $D$ that un-does $S$. That means \par $D(1) = 0$, $D(2) = 1$, etc. $D(0)$ should be zero. \par \hint{$H$ will help you make an elegant solution.} diff --git a/Advanced/Lambda Calculus/parts/04 recursion.tex b/Advanced/Lambda Calculus/parts/04 recursion.tex index a868072..e569402 100755 --- a/Advanced/Lambda Calculus/parts/04 recursion.tex +++ b/Advanced/Lambda Calculus/parts/04 recursion.tex @@ -8,12 +8,13 @@ $$ \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. +We cannot re-create this in lambda calculus, since we aren't given a way to recursively call functions. -\vspace{1ex} +\vspace{2mm} -As an example, consider the statement $A = \lm a. A~a$ \par -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! +One could think that $A = \lm a. A~a$ is a recursive function. In fact, it is not. \par +Remember that such \say{definitions} aren't formal structures in lambda calculus. \par +They're just shorthand that simplifies notation. \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:} @@ -29,12 +30,12 @@ This means \say{write $(\lm a.A~a)$ whenever you see $A$.} However, $A$ is \text \problem{} Write an expression that resolves to itself. \par -\note{Your answer should be short and sweet.} +\note{Your answer should be quite short.} \vspace{1ex} This expression is often called $\Omega$, after the last letter of the Greek alphabet. \par -$\Omega$ useless on its own, but gives us a starting point for recursion. +$\Omega$ useless on its own, but it gives us a starting point for recursion. \begin{solution} $\Omega = M~M = (\lm x . xx) (\lm x . xx)$ diff --git a/Advanced/Lambda Calculus/parts/05 challenges.tex b/Advanced/Lambda Calculus/parts/05 challenges.tex index 6ce505d..4ed4382 100755 --- a/Advanced/Lambda Calculus/parts/05 challenges.tex +++ b/Advanced/Lambda Calculus/parts/05 challenges.tex @@ -9,7 +9,7 @@ Design a recursive factorial function using $Y$. \problem{} Design a non-recursive factorial function. \par -\note{This one is a lot easier than \ref{Yfac}, but I don't think it will help you solve it.} +\note{This one is easier than \ref{Yfac}, but I don't think it will help you solve it.} \problem{} Using pairs, make a \say{list} data structure. Define a GET function, so that $\text{GET}~L~n$ reduces to the nth item in the list. @@ -17,7 +17,7 @@ $\text{GET}~L~0$ should give the first item in the list, and $\text{GET}~L~1$, t Lists have a defined length, so you should be able to tell when you're on the last element. \problem{} -Write POW $a$ $b$, which raises $b$ to the $a$th power. +Solve \ref{decrement} without using $H$. \problem{} Write a MOD $a$ $b$ function that reduces to the remainder of $a \div b$. @@ -66,7 +66,7 @@ Write a MOD $a$ $b$ function that reduces to the remainder of $a \div b$. \say{item} is the thing you're storing \par \say{next...} is another one of these list fragments. - It doesn't matter what \say{next} is in the last list fragment. A dedicated \say{is last} slot allows us to store ANY function in this list. + It doesn't matter what \say{next} is in the last list fragment. A dedicated \say{is last} slot allows us to store arbitrary functions in this list. \vspace{1ex}