\documentclass[../main.tex]{subfiles}

\begin{document}

	\section{Challenges}

	Do \ref{Yfac} first, then finish the rest in any order. \\
	Have fun!

	\problem{}<Yfac>
	Design a recursive factorial function using $Y$. \\

	\vfill

	\problem{}
	Design a non-recursive factorial function. \\
	\note{This one is a lot 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. $\text{GET}~L~0$ should give the first item in the list, and $\text{GET}~L~1$, the \textit{second}. \\
	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.

	\problem{}
	Write a MOD $a$ $b$ function that reduces to the remainder of $a \div b$.

	\begin{solution}
		\textbf{Factorial with recursion:}
		\vspace{3ex}

		$\text{FAC} = \lm yn.[Z~n][1][\text{MULT}~n~(y~(\text{D}~n))]$

		\linehack{}

		\textbf{Factorial without recursion:}
		\vspace{3ex}

		$\text{FAC}_0 = \lm p .
		\Bigl\langle~~
		\Bigl[D~(p~t)\Bigr]
		~,~
		\Bigl[\text{MULT}~(p~T)~(p~F)\Bigr]
		~~\Bigr\rangle
		$

		\vspace{2ex}

		$
		\text{FAC} = \lm n .
		\bigl( n~\text{FAC}_0~\langle n, 1 \rangle \bigr)
		$

		\linehack{}

		\textbf{Lists:}
		\vspace{3ex}

		One possible implementation is
		$\Bigl\langle
			\langle \text{is last} ~,~ \text{item} \rangle
			~,~
			\text{next}...
		\Bigr\rangle$, where:

		\vspace{1ex}

		\say{is last} is a boolean, true iff this is the last item in the list. \\
		\say{item} is the thing you're storing \\
		\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.

		\vspace{1ex}

		Here, $\text{GET} = \lm nL.[(n~L~F)~T~F$] \\

		This will break if $n$ is out of range.
	\end{solution}

	\vfill

	\problem{Bonus}
	Play with \textit{Lamb}, an automatic lambda expression evaluator. \\
	\url{https://git.betalupi.com/Mark/lamb}
\end{document}