mirror of
https://github.com/janishutz/eth-summaries.git
synced 2026-07-27 21:29:09 +02:00
[FMFP] Notes on exercises from exams
This commit is contained in:
Binary file not shown.
@@ -187,5 +187,7 @@ as well as being mentioned a few times in the rest of the summary.
|
|||||||
% \input{parts/06_exercises/02_fm/}
|
% \input{parts/06_exercises/02_fm/}
|
||||||
% \input{parts/06_exercises/}
|
% \input{parts/06_exercises/}
|
||||||
|
|
||||||
|
\input{parts/06_exercises/03_checklist.tex}
|
||||||
|
|
||||||
|
|
||||||
\end{document}
|
\end{document}
|
||||||
|
|||||||
@@ -1,10 +1,59 @@
|
|||||||
\subsubsection{Evaluation strategies}
|
\subsubsection{Evaluation strategies}
|
||||||
|
\begin{examdetails}
|
||||||
|
It is likely that one such task will appear.
|
||||||
|
\end{examdetails}
|
||||||
Evaluation strategies formalize how programming languages evaluate the code.
|
Evaluation strategies formalize how programming languages evaluate the code.
|
||||||
Most of the commonly used programming languages use \textit{eager evaluation}, whereas functional programming languages tend to prefer \textit{lazy evaluation}
|
Most of the commonly used programming languages use \textit{eager evaluation}, whereas functional programming languages tend to prefer \textit{lazy evaluation}
|
||||||
|
|
||||||
|
Tasks typically involve doing the compiler / interpreter's work, evaluating a given statement.
|
||||||
|
This can either be full haskell code, or in the mini-Haskell, often with lambda functions instead of pattern matching and recursion,
|
||||||
|
as that \textit{tends} to be more challenging due to the possibility of losing track of what you expanded or not.
|
||||||
|
An easy way around that is to use different colour highlighters.
|
||||||
|
|
||||||
|
|
||||||
\paragraph{Lazy Evaluation}
|
\paragraph{Lazy Evaluation}
|
||||||
In Lazy Evaluation, expressions are substituted until all possible values are substituted and the expression is then evaluated.
|
In Lazy Evaluation, expressions are substituted until all possible values are substituted and the expression is then evaluated.
|
||||||
|
|
||||||
At the exam, it is likely that one such task will appear.
|
\subparagraph{Lambda functions}
|
||||||
|
For expressions of form \texttt{t1 t2}, \texttt{t1} is evaluated by substituting every occurrence of the function arguments by \texttt{t2}, without evaluation \texttt{t2},
|
||||||
|
e.g. \verb|(\x -> x y) (\x -> x)|, the evaluation will lead to \verb|(\x -> x) y|
|
||||||
|
Below a more complicated example, highlighted with colours for you to track what goes where:
|
||||||
|
|
||||||
|
\begin{enumerate}
|
||||||
|
\item \texttt{{\color{red} ($\backslash$x ->} {\color{ForestGreen} x ($\backslash$y -> x y)}{\color{red})} {\color{orange} ($\backslash$x -> ($\backslash$y -> y) x)}}
|
||||||
|
\item Substitute \texttt{t2} into \texttt{t1} (no eval):
|
||||||
|
\texttt{{\color{orange} ($\backslash$x -> ($\backslash$y -> y) x)} {\color{ForestGreen}($\backslash$y -> {\color{orange} ($\backslash$x -> ($\backslash$y -> y) x)} y)}}
|
||||||
|
\item Recolour for next changes:
|
||||||
|
\texttt{{\color{orange} ($\backslash$x -> {\color{purple}($\backslash$y -> y)} x)} {\color{ForestGreen}($\backslash$y ->
|
||||||
|
{\color{Aquamarine} ($\backslash$x -> ($\backslash$y -> y) x)} y)}}
|
||||||
|
\item Substitute again:
|
||||||
|
\texttt{{\color{purple}($\backslash$y -> y)} {\color{ForestGreen}($\backslash$y ->
|
||||||
|
{\color{Aquamarine} ($\backslash$x -> ($\backslash$y -> y) x)} y)}}
|
||||||
|
\item And again:
|
||||||
|
\texttt{{\color{ForestGreen}($\backslash$y ->
|
||||||
|
{\color{Aquamarine} ($\backslash$x -> ($\backslash$y -> y) x)} y)}}
|
||||||
|
\end{enumerate}
|
||||||
|
Now, evaluation stops, because there is nothing left to apply. In some cases, this can go on until you get a final result, but \textit{not always}.
|
||||||
|
This evaluation example also makes it evident why using colours can be very handy.
|
||||||
|
|
||||||
|
\subparagraph{Pattern Matching}
|
||||||
|
Pattern matching is fairly straight forward, however, conditional evaluation requires evaluation to the smallest extent possible to determine the option to pick from.
|
||||||
|
|
||||||
|
|
||||||
\paragraph{Eager Evaluation}
|
\paragraph{Eager Evaluation}
|
||||||
|
For expressions of form \texttt{t1 t2}, \texttt{t1} is evaluated by substituting every occurrence of the function arguments by an \textit{evaluated} \texttt{t2},
|
||||||
|
i.e. \texttt{t2} is evaluated \textit{before} substituting it.
|
||||||
|
Coming back to the short example from above \verb|(\x -> x y) (\x -> x)| is evaluated to the same \verb|(\x -> x) y|.
|
||||||
|
The difference only becomes evident with a more complicated example. We'll use the same example again as above, again highlighted.
|
||||||
|
\begin{enumerate}
|
||||||
|
\item \texttt{{\color{red} ($\backslash$x ->} {\color{ForestGreen} x ($\backslash$y -> x y)}{\color{red})} {\color{orange} ($\backslash$x -> ($\backslash$y -> y) x)}}
|
||||||
|
\item Evaluate {\color{orange} orange parts} (now {\color{purple} purple}):
|
||||||
|
\texttt{{\color{red} ($\backslash$x ->} {\color{ForestGreen} x ($\backslash$y -> x y)}{\color{red})} {\color{purple} ($\backslash$x -> x)}}
|
||||||
|
\item Substitute {\color{purple} purple}:
|
||||||
|
\texttt{{\color{ForestGreen} {\color{purple} ($\backslash$x -> x)} ($\backslash$y -> {\color{purple} ($\backslash$x -> x)} y)}}
|
||||||
|
\item Evaluate {\color{ForestGreen} green} parts (now {\color{cyan} cyan}):
|
||||||
|
\texttt{{\color{purple} ($\backslash$x -> x)} {\color{cyan}($\backslash$y -> y)}}
|
||||||
|
\item Substitute {\color{cyan} cyan}:
|
||||||
|
\texttt{{\color{cyan}($\backslash$y -> y)}}
|
||||||
|
\end{enumerate}
|
||||||
|
As you can clearly see, both strategies don't result in the same evaluation.
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
\subsubsection{Haskell}
|
||||||
|
\begin{examdetails}
|
||||||
|
typically either short coding task or proof of program
|
||||||
|
\end{examdetails}
|
||||||
|
|
||||||
|
\paragraph{Programming}
|
||||||
|
The best tip here is to read the Haskell book, and to solve the exercises during the semester.
|
||||||
|
|
||||||
|
\subparagraph{Fold}
|
||||||
|
One of the most important functions to understand is \texttt{foldr} (and \texttt{foldl}).
|
||||||
|
If you have used \texttt{reduce} functions before, in e.g. JavaScript / TypeScript,
|
||||||
|
they are similar to a \texttt{map} combined with a \texttt{reduce}.
|
||||||
|
|
||||||
|
For instance, in TypeScript, the \texttt{reduce} function has the type signature
|
||||||
|
\mint{typescript}|array.reduce( ( accumulator: A, current: A, idx: number, array: A[] ) => A, initialValue: A )|
|
||||||
|
|
||||||
|
In the Haskell prelude, they are defined as follows:
|
||||||
|
\begin{code}{haskell}
|
||||||
|
foldr :: (a -> b -> b) -> b -> [a] -> b
|
||||||
|
foldr f z [] = z
|
||||||
|
foldr f z (x:xs) = f x (foldr f z xs)
|
||||||
|
|
||||||
|
foldl :: (a -> b -> a) -> a -> [b] -> a
|
||||||
|
foldl f z [] = z
|
||||||
|
foldl f z (x:xs) = foldl f (f v x) xs
|
||||||
|
\end{code}
|
||||||
|
|
||||||
|
\subparagraph{zipWith}
|
||||||
|
To combine a \texttt{map} and a \texttt{zip} function, use \texttt{zipWith}, type:
|
||||||
|
\mint{haskell}|zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]|
|
||||||
|
|
||||||
|
\TODO Add more remarks
|
||||||
|
|
||||||
|
\paragraph{Proofs}
|
||||||
|
These proofs use structural induction, see Section~\ref{sec:induction-proofs} for that.
|
||||||
|
|||||||
@@ -0,0 +1,52 @@
|
|||||||
|
\subsubsection{Natural Deduction}
|
||||||
|
\paragraph{Parenthesis}
|
||||||
|
This task (if it were to even ever appear in the exams) is simply applying precedences, as well as remembering associativity.
|
||||||
|
The precedences are as follows:
|
||||||
|
\[
|
||||||
|
\neg > \land > \lor > \rightarrow
|
||||||
|
\]
|
||||||
|
The associativities are right for $\land$ and $\lor$, whereas $\rightarrow$ is left associative. This means that
|
||||||
|
\[
|
||||||
|
A \rightarrow B \rightarrow C \text{ is parenthesized as } A \rightarrow (B \rightarrow C)
|
||||||
|
\]
|
||||||
|
|
||||||
|
|
||||||
|
\paragraph{Derivation trees}
|
||||||
|
The most important tip here is to write as little as possible, by defining variables (such as $\Gamma$, $\Gamma'$, etc) for each step,
|
||||||
|
so you can simply write that instead of all the content.
|
||||||
|
|
||||||
|
|
||||||
|
\paragraph{Defining rules}
|
||||||
|
This is often the hardest type of task. First state the obvious cases, the basic introduction and elimination rules according to the given definition.
|
||||||
|
Remember that the rules are defined top-down, so, for introducing $A \leftrightarrow B$, defined as $(A \rightarrow B) \land (B \rightarrow A)$, we define the rules as follows:
|
||||||
|
\[
|
||||||
|
\begin{prooftree}
|
||||||
|
\hypo{\Gamma \vdash (A \rightarrow B) \land (B \rightarrow A)}
|
||||||
|
\infer1[$\leftrightarrow$-intro]{\Gamma \vdash A \leftrightarrow B}
|
||||||
|
\end{prooftree}
|
||||||
|
\qquad
|
||||||
|
\begin{prooftree}
|
||||||
|
\hypo{\Gamma \vdash A \leftrightarrow B}
|
||||||
|
\infer1[$\leftrightarrow$-elim]{\Gamma \vdash (A \rightarrow B) \land (B \rightarrow A)}
|
||||||
|
\end{prooftree}
|
||||||
|
\]
|
||||||
|
The hard part is coming up with useful extra rules. Here, and with all rules defined by an AND, we can also define it slightly differently:
|
||||||
|
\[
|
||||||
|
\begin{prooftree}
|
||||||
|
\hypo{\Gamma \vdash A \rightarrow B}
|
||||||
|
\hypo{\Gamma \vdash B \rightarrow A}
|
||||||
|
\infer2[$\leftrightarrow$-I]{\Gamma \vdash A \leftrightarrow B}
|
||||||
|
\end{prooftree}
|
||||||
|
\]
|
||||||
|
Similarly, we can also provide elimination rules for the left or right:
|
||||||
|
\[
|
||||||
|
\begin{prooftree}
|
||||||
|
\hypo{\Gamma \vdash A \leftrightarrow B}
|
||||||
|
\infer1[$\leftrightarrow$-EL]{\Gamma \vdash (A \rightarrow B)}
|
||||||
|
\end{prooftree}
|
||||||
|
\qquad
|
||||||
|
\begin{prooftree}
|
||||||
|
\hypo{\Gamma \vdash A \leftrightarrow B}
|
||||||
|
\infer1[$\leftrightarrow$-ER]{\Gamma \vdash (B \rightarrow A)}
|
||||||
|
\end{prooftree}
|
||||||
|
\]
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
\subsubsection{Type Inference}
|
||||||
|
\begin{enumerate}
|
||||||
|
\item
|
||||||
|
\end{enumerate}
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
\subsection{Checklist}
|
||||||
|
\subsubsection{Learning}
|
||||||
|
|
||||||
|
\subsubsection{For the exam}
|
||||||
|
\begin{itemize}[label=$\square$]
|
||||||
|
\item Multiple colours of highlighters (for eval tasks)
|
||||||
|
\end{itemize}
|
||||||
Reference in New Issue
Block a user