2023-02-05 21:02:05 -08:00
|
|
|
\section{Challenges}
|
2022-11-13 13:02:25 -08:00
|
|
|
|
2023-10-04 09:42:09 -07:00
|
|
|
Do \ref{Yfac} first, then finish the rest in any order.
|
2022-11-13 13:02:25 -08:00
|
|
|
|
2023-02-05 21:02:05 -08:00
|
|
|
\problem{}<Yfac>
|
2023-10-04 09:42:09 -07:00
|
|
|
Design a recursive factorial function using $Y$.
|
2022-11-13 13:02:25 -08:00
|
|
|
|
2023-10-16 15:06:51 -07:00
|
|
|
\begin{solution}
|
|
|
|
$\text{FAC} = \lm yn.[Z~n][1][\text{MULT}~n~(y~(\text{D}~n))]$
|
|
|
|
|
|
|
|
To compute the factorial of 5, evaluate $(\text{Y}~\text{FAC}~5)$.
|
|
|
|
\end{solution}
|
|
|
|
|
2023-02-05 21:02:05 -08:00
|
|
|
\vfill
|
2022-11-13 13:02:25 -08:00
|
|
|
|
2023-02-05 21:02:05 -08:00
|
|
|
\problem{}
|
2023-10-04 09:42:09 -07:00
|
|
|
Design a non-recursive factorial function. \par
|
2023-10-05 11:23:03 -07:00
|
|
|
\note{This one is easier than \ref{Yfac}, but I don't think it will help you solve it.}
|
2022-11-13 13:02:25 -08:00
|
|
|
|
2023-02-05 21:02:05 -08:00
|
|
|
\begin{solution}
|
|
|
|
$\text{FAC}_0 = \lm p .
|
|
|
|
\Bigl\langle~~
|
|
|
|
\Bigl[D~(p~t)\Bigr]
|
|
|
|
~,~
|
|
|
|
\Bigl[\text{MULT}~(p~T)~(p~F)\Bigr]
|
|
|
|
~~\Bigr\rangle
|
|
|
|
$
|
2022-11-13 13:02:25 -08:00
|
|
|
|
2023-02-05 21:02:05 -08:00
|
|
|
\vspace{2ex}
|
2022-11-13 13:02:25 -08:00
|
|
|
|
2023-02-05 21:02:05 -08:00
|
|
|
$
|
|
|
|
\text{FAC} = \lm n .
|
|
|
|
\bigl( n~\text{FAC}_0~\langle n, 1 \rangle \bigr)
|
|
|
|
$
|
2023-10-16 15:06:51 -07:00
|
|
|
\end{solution}
|
|
|
|
|
|
|
|
\vfill
|
|
|
|
|
2022-11-13 13:02:25 -08:00
|
|
|
|
|
|
|
|
2023-10-16 15:06:51 -07:00
|
|
|
\problem{}
|
2023-10-16 18:54:37 -07:00
|
|
|
Solve \ref{decrement} without using $H$. \par
|
|
|
|
In \ref{decrement}, we created the \say{decrement} function.
|
2023-10-16 15:06:51 -07:00
|
|
|
|
|
|
|
\begin{solution}
|
|
|
|
One solution is below. Can you figure out how it works? \par
|
2022-11-13 13:02:25 -08:00
|
|
|
|
2023-10-16 15:06:51 -07:00
|
|
|
\vspace{1ex}
|
|
|
|
|
|
|
|
$
|
|
|
|
D_0 =
|
|
|
|
\lm p . \Bigl[p~T\Bigr]
|
|
|
|
\Bigl\langle
|
|
|
|
F ~,~ p~F
|
|
|
|
\Bigr\rangle
|
|
|
|
\Bigl\langle
|
|
|
|
F
|
|
|
|
~,~
|
|
|
|
\bigl\langle
|
|
|
|
p~F~T ~,~ ( (p~F~T)~(P~F~F) )
|
|
|
|
\bigr\rangle
|
|
|
|
\Bigr\rangle
|
|
|
|
$
|
|
|
|
|
|
|
|
\vspace{1ex}
|
|
|
|
|
|
|
|
$
|
|
|
|
D = \lm nfa .
|
|
|
|
\Bigl(
|
|
|
|
n D_0 \Bigl\langle T, \langle f, a \rangle \Bigr\rangle
|
|
|
|
\Bigr)~F~F
|
|
|
|
$
|
|
|
|
\end{solution}
|
|
|
|
|
|
|
|
\vfill
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
\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.
|
|
|
|
$\text{GET}~L~0$ should give the first item in the list, and $\text{GET}~L~1$, the \textit{second}. \par
|
|
|
|
Lists have a defined length, so you should be able to tell when you're on the last element.
|
|
|
|
|
|
|
|
\begin{solution}
|
2023-02-05 21:02:05 -08:00
|
|
|
One possible implementation is
|
|
|
|
$\Bigl\langle
|
|
|
|
\langle \text{is last} ~,~ \text{item} \rangle
|
|
|
|
~,~
|
|
|
|
\text{next}...
|
|
|
|
\Bigr\rangle$, where:
|
2022-11-13 13:02:25 -08:00
|
|
|
|
2023-02-05 21:02:05 -08:00
|
|
|
\vspace{1ex}
|
2022-11-13 13:02:25 -08:00
|
|
|
|
2023-10-04 09:42:09 -07:00
|
|
|
\say{is last} is a boolean, true iff this is the last item in the list. \par
|
|
|
|
\say{item} is the thing you're storing \par
|
|
|
|
\say{next...} is another one of these list fragments.
|
2022-11-13 13:02:25 -08:00
|
|
|
|
2023-10-05 11:23:03 -07:00
|
|
|
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.
|
2022-11-13 13:02:25 -08:00
|
|
|
|
2023-02-05 21:02:05 -08:00
|
|
|
\vspace{1ex}
|
2022-11-13 13:02:25 -08:00
|
|
|
|
2023-10-04 09:42:09 -07:00
|
|
|
Here, $\text{GET} = \lm nL.[(n~L~F)~T~F$]
|
2022-11-13 13:02:25 -08:00
|
|
|
|
2023-02-05 21:02:05 -08:00
|
|
|
This will break if $n$ is out of range.
|
|
|
|
\end{solution}
|
2022-11-13 13:02:25 -08:00
|
|
|
|
2023-10-16 15:06:51 -07:00
|
|
|
\vfill
|
|
|
|
\pagebreak
|
|
|
|
|
|
|
|
\problem{}
|
|
|
|
Write a lambda expression that represents the Fibonacci function: \par
|
|
|
|
$f(0) = 1$, $f(1) = 1$, $f(n + 2) = f(n + 1) + f(n)$.
|
|
|
|
|
|
|
|
\vfill
|
|
|
|
|
|
|
|
\problem{}
|
|
|
|
Write a lambda expression that evaluates to $T$ if a number $n$ is prime, and to $F$ otherwise.
|
|
|
|
|
|
|
|
\vfill
|
|
|
|
|
|
|
|
\problem{}
|
2023-10-16 18:54:37 -07:00
|
|
|
Write a function MOD so that $(\text{MOD}~a~b)$ reduces to the remainder of $a \div b$.
|
2023-10-16 15:06:51 -07:00
|
|
|
|
2023-02-05 21:02:05 -08:00
|
|
|
\vfill
|
2022-11-13 13:02:25 -08:00
|
|
|
|
2023-02-05 21:02:05 -08:00
|
|
|
\problem{Bonus}
|
2023-10-04 09:42:09 -07:00
|
|
|
Play with \textit{Lamb}, an automatic lambda expression evaluator. \par
|
2023-10-16 15:06:51 -07:00
|
|
|
\url{https://git.betalupi.com/Mark/lamb}
|
|
|
|
|
|
|
|
\pagebreak
|