diff --git a/09/tut09.md b/09/tut09.md new file mode 100644 index 0000000000000000000000000000000000000000..86d4959703b32b681c2bff971fd0bcb91fbb7160 --- /dev/null +++ b/09/tut09.md @@ -0,0 +1,15 @@ +--- +theme: metropolis +aspectratio: 169 +--- + +# Tutorium 9 + +Bäume, Instanzen von Typklassen + +# Instanzen von Typklassen + +```Haskell +instance Show Datentyp where + show x = ... +``` diff --git a/09/tut09.pdf b/09/tut09.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9837480d63b4d48edbee1ea3ca6b7574e77caa5f Binary files /dev/null and b/09/tut09.pdf differ diff --git a/09/tut09_en.md b/09/tut09_en.md new file mode 100644 index 0000000000000000000000000000000000000000..470ec465a2e66051b6116384f8d471596f510226 --- /dev/null +++ b/09/tut09_en.md @@ -0,0 +1,15 @@ +--- +theme: metropolis +aspectratio: 169 +--- + +# Tutorial 9 + +Trees, instances of typeclasses + +# Instances of Typeclasses + +```Haskell +instance Show Datatype where + show x = ... +``` diff --git a/09/tut09_en.pdf b/09/tut09_en.pdf new file mode 100644 index 0000000000000000000000000000000000000000..677deebdbf2b98ce6ebf7c2c0c53d7013d3cffbf Binary files /dev/null and b/09/tut09_en.pdf differ diff --git a/09/tut9.pdf b/09/uebungen09.pdf similarity index 79% rename from 09/tut9.pdf rename to 09/uebungen09.pdf index b3f6df23e9c15e06a1758a5aba512404d4a4b45c..7aba9542e3546010e02894e54bab02b9d4682fae 100644 Binary files a/09/tut9.pdf and b/09/uebungen09.pdf differ diff --git a/09/tut9.tex b/09/uebungen09.tex similarity index 92% rename from 09/tut9.tex rename to 09/uebungen09.tex index 51ccaea2f91c97646aa587e0701eeed0ea569f83..4695aebe26546a69ea301c89bc9ace5272617d8f 100644 --- a/09/tut9.tex +++ b/09/uebungen09.tex @@ -279,17 +279,17 @@ insert q t@(Node x lt rt) | q < x = Node x (insert q lt) rt | otherwise = Node x lt (insert q rt) -delete :: (Ord a) = > a -> BTree a -> BTree a +delete ::( Ord a ) = > a -> BTree a -> BTree a delete q Nil = Nil -delete q node@( Node x lt rt) - | q < x = delete q lt - | q > x = delete q rt +delete q node@ ( Node x lt rt ) + | q < x = ( Node ( delete q lt ) rt ) + | q > x = ( Node lt ( delete q rt ) ) | otherwise = delete' node - where - delete' (Node x Nil rt) = rt - delete' (Node x lt Nil) = lt - delete' (Node x lt rt) = Node maxE (delete maxE lt) rt - maxE = maxElem lt + where + delete' ( Node x Nil rt ) = rt + delete' ( Node x lt Nil ) = lt + delete' ( Node x lt rt ) = Node maxE ( delete maxE lt ) rt + maxE = maxElem lt \end{lstlisting} \begin{figure}[h] \centering @@ -302,8 +302,8 @@ delete q node@( Node x lt rt) child {node {5} child {node {2} } - child {node{6} - child {node {4}} + child {node{7} + child {node {6}} child [missing] } } @@ -326,7 +326,7 @@ Boolesche Ausdrücke können als Syntaxbaum dargestellt werden, in dem alle Oper \begin{enumerate}[label=\alph*)] \item Implementieren Sie einen Algebraischen Datentyp, der einen Booleschen Ausdruck speichern kann. Der Ausdruck soll mindestens die Verknüpfungen und, oder und die Negation enthalten können. \item Implementieren Sie eine Funktion, die einen Syntaxbaum zu einem Ergebnis vom Typ \texttt{Bool} auswertet. - \item Machen sie ihren Algebraischen Datentyp zu einer Instannz der Typklasse Show. + \item Machen sie ihren Algebraischen Datentyp zu einer Instanz der Typklasse Show. \end{enumerate} % ///////////////////// Aufgabe 2 /////////////////// @@ -339,10 +339,10 @@ data BHeightTree a = HNil | HNode a Int ( BHeightTree a ) ( BHeightTree a ) deriving Show \end{lstlisting} -Jeder Knoten, eines Baumes, ist die Wurzel eines Teilbaums. -Jeder Knoten, eines \texttt{BHeightTree}, speichert, die Höhe seines Teilbaums. +Jeder Knoten eines Baumes ist die Wurzel eines Teilbaums. +Jeder Knoten eines \texttt{BHeightTree} speichert die Höhe seines Teilbaums. -\begin{lstlisting}[caption={\texttt{Beispiel Baum}}, language=Haskell] +\begin{lstlisting}[caption={\texttt{Beispielbaum}}, language=Haskell] bHeightTreeBsp = HNode 5 3 (HNode 3 2 @@ -357,8 +357,8 @@ bHeightTreeBsp = \begin{enumerate} \item - Schreiben Sie, \texttt{heightTInsert :: a -> BHeightTree a -> BHeightTree a } . - Eingaben: ein Element x und ein Suchbaum t. + Schreiben Sie \texttt{heightTInsert :: a -> BHeightTree a -> BHeightTree a }. \\ + Eingaben: ein Element x und ein Suchbaum t. \\ Ergebnis: Ein Suchbaum, mit t's Elementen und x. \item Welche Teilbaumhöhen verändern sich, bei \texttt{delete}? diff --git a/09/uebungen09_en.pdf b/09/uebungen09_en.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3734f590bf8cc7f9ec84a2f7ca77a5b0160f77b2 Binary files /dev/null and b/09/uebungen09_en.pdf differ diff --git a/09/uebungen09_en.tex b/09/uebungen09_en.tex new file mode 100644 index 0000000000000000000000000000000000000000..9c3eebabf0f21be3dbbc2b900b153ad03c9491c1 --- /dev/null +++ b/09/uebungen09_en.tex @@ -0,0 +1,373 @@ +%Original Template von Nicolas Lehman, angepasst von Wolfgang Mulzer und Katharina Klost + + % Dokumentenklasse +\documentclass[ +% globale Schriftgröße + 10pt, +% setzt Absatzabstand hoch + parskip=half-, +% Format + paper=a4, +% lädt Sprachpakete + english,ngerman, +]{scrartcl} + +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} + +% //////////////////// Pakete laden //////////////////// +\usepackage{amsmath} +% modifiziert amsmath +\usepackage{mathtools} +% mathematische Symbole, für \ceckmarks +\usepackage{amssymb} +% für proof +\usepackage{amsthm} +% für \mathscr +\usepackage{mathrsfs} +\usepackage{latexsym} +% für bessere Worttrennung +\usepackage{microtype} +% Spracheinstellung +\usepackage[ngerman]{babel} +% für Quellcode +\usepackage{verbatim} +\usepackage{listings} +% für Umlaute und Sonderzeichen in der Tex-Datei +\usepackage[utf8]{inputenc} +\usepackage{graphicx} +% für Tabellen mit gleicher Spaltenbreite und automatischen Umbrüchen +\usepackage{tabularx} +\usepackage{fullpage} +% für multirow in tabulars +\usepackage{multirow} +\usepackage{rotate} +% um Farben zu benutzen, kann mehr als das Paket color +\usepackage[cmyk,table]{xcolor} +% Verlinkungen +\usepackage[ +% farbige Schrift, statt farbiger Rahmen + colorlinks, +% verlinkt im Abb.Verzeichnis Seitenzahl statt Bildunterschrift + linktocpage, +% setzt Farbe der Links auf blau + linkcolor=blue +]{hyperref} +% nur für digitale Anwendungen, url = "http://www.example.com" +% für Webadressen wie e-mail usw.: "\url{http://www.example.com}" +\usepackage{url} +% für versch. Aufzählungezeichen wie z.B. a) +\usepackage{enumitem} +% folgt ein Leerzeichen nach einem \Befehl, wird es nicht verschluckt +\usepackage{xspace} +% für das Durchstreichen u.a. in Matheformeln mit \cancel +\usepackage{cancel} +% für \forloop und \whiledo +\usepackage{ifthen} + +% //////////////////// Syntaxhervorhebung //////////////////// +\lstloadlanguages{Python, Haskell, [LaTeX]TeX, Java} +\lstset{% +% \scriptsize: die Fontgröße für den Quelltext + basicstyle=\footnotesize\ttfamily, +% legt Farbe der Box fest + backgroundcolor = \color{bgcolour}, +% automatische Umbrüche nur nach Leerzeichen? + breakatwhitespace=false, +% automatische Zeilenumbrüche? + breaklines=true, +% die Überschrift steht oben, t = top + captionpos=t, +% Formatierung der Kommentare + commentstyle=\color{codeblue}\ttfamily, +% einfacher Rahmen um den Quelltext + frame=single, +% Behalte Leerzeichen im Quelltext. Nützlich, um +% Einrückungen zu erhalten (benötigt eventuell columns=flexible) + keepspaces=true, +% Formatierung der Schlüsselwörter + keywordstyle=\bfseries\ttfamily\color{codepurple}, +% Wohin mit den Zeilennummern? +% mögliche Werte sind: none, left, right + numbers=left, +% Formatierung der Zeilennummern + numberstyle=\tiny\color{codegreen}, +% Abstand zwischen Zeilennummern und Quelltext + numbersep=5pt, +% nummeriert nur jede i-te Zeile + stepnumber=1, +% Zeige alle Leerzeichen mit Hilfe von speziellen Unterstrichen; +% überschreibt 'showstringspaces' + showspaces=false, +% unterstreiche Leerzeichen nur in Zeichenketten + showstringspaces=false, +% Zeige Tabulatoren in Zeichenketten mit Hilfe von speziellen +% Unterstrichen + showtabs=false, + flexiblecolumns=false, +% Schrittweite zwischen Zeilennummern. +% Der Wert 1 bedeutet, dass jede Zeile nummeriert wird. + tabsize=1, +% Formatierung der Zeichenketten. + stringstyle=\color{orange}\ttfamily, +% leere Zeilen werden nicht nummeriert + numberblanklines=false, +% Abstand zum linken Seitenrand + xleftmargin=1.2em, +% Abstand zum rechten Seitenrand + xrightmargin=0.4em, + aboveskip=2ex, +} + +\lstdefinestyle{py}{% + language=Python, +} +\lstdefinestyle{hs}{% + language=Haskell, +} +\lstdefinestyle{tex}{% + language=[LaTeX]TeX, +% Um LaTex im Quelltext einzufügen + escapeinside={\%*}{*)}, +% Hervorhebung der TeX-Schlüsselwörter + texcsstyle=*\bfseries\color{blue}, + morekeywords={*,$,\{,\},\[,\],lstinputlisting,includegraphics, + rowcolor,columncolor,listoffigures,lstlistoflistings, + subsection,subsubsection,textcolor,tableofcontents,colorbox, + fcolorbox,definecolor,cellcolor,url,linktocpage,subtitle, + subject,maketitle,usetikzlibrary,node,path,addbibresource, + printbibliography}, + numbers=none, + numbersep=0pt, + xleftmargin=0.4em, +} + +\lstdefinestyle{java}{% + language=Java, + extendedchars=true, +} + +% füge einen x64-Assembler Dialekt hinzu +\lstdefinelanguage[x64]{Assembler} +% basiert auf dem "x86masm" Dialekt + [x86masm]{Assembler} + % zusätzliche Schlüsselwörter + {morekeywords={CDQE,CQO,CMPSQ,CMPXCHG16B,JRCXZ,LODSQ,MOVSXD, % + POPFQ,PUSHFQ,SCASQ,STOSQ,IRETQ,RDTSCP,SWAPGS, % + rax,rdx,rcx,rbx,rsi,rdi,rsp,rbp, % + r8,r8d,r8w,r8b,r9,r9d,r9w,r9b} +} + +\lstdefinestyle{c}{ + language=c, + extendedchars=true, +} + +% //////////////////// eigene Anweisungen //////////////////// +% benötigt package xspace +\newcommand\FU{Freie Universität Berlin\xspace} +\newcommand\gdw{g.\,d.\,w.\xspace} +\newcommand\oBdA{o.\,B.\,d.\,A.\xspace} +\newcommand\N{\mathbb{N}\xspace} +\newcommand\Q{\mathbb{Q}\xspace} +\newcommand\R{\mathbb{R}\xspace} +\newcommand\Z{\mathbb{Z}\xspace} +\newcommand\ohneNull{\ensuremath{\backslash\lbrace 0\rbrace}}% \{0} +% Schreibt Befehl \dh in \dhALT um +\let\dhALT\dh +%renew überschreibt command \dh +\renewcommand\dh{d.\,h.\xspace} +\newcommand{\from}{\ensuremath{\colon}} +\newcommand{\floor}[1]{\lfloor{#1}\rfloor} +\newcommand{\ceil}[1]{\lceil{#1}\rceil} +\newcommand{\abbrev}[2]{\expandafter\newcommand\csname + #1\endcsname{#2\xspace}} +\newcommand{\cclasss}[2]{\abbrev{#1}{\textsf{#2}}} +\newcommand{\cclass}[1]{\cclasss{#1}{#1}} +\cclasss{ccP}{P} +\cclass{NP} +\cclass{LOGSPACE} +\cclass{NL} + +% //////////////// mathematische Funktionen //////////////////// +\DeclareMathOperator{\True}{True} +\DeclareMathOperator{\False}{False} + +% //////////////////// eigene Theoreme //////////////////// +\newtheorem{theorem}{Satz} +\newtheorem{corollary}[theorem]{Korollar} +\newtheorem{lemma}[theorem]{Lemma} +\newtheorem{observation}[theorem]{Beobachtung} +\newtheorem{definition}[theorem]{Definition} +\newtheorem{Literatur}[theorem]{Literatur} + +% konfiguriert proof +\makeatletter +\newenvironment{Proof}[1][\proofname]{\par + \pushQED{\qed}% + \normalfont \topsep6\p@\@plus6\p@\relax + \trivlist + \item[\hskip\labelsep + \bfseries + #1\@addpunct{.}]\ignorespaces +}{% + \popQED\endtrivlist\@endpefalse +} +\makeatother + +% //////////////////// eigene Farben //////////////////// +\let\definecolor=\xdefinecolor +\definecolor{FUgreen}{RGB}{153,204,0} +\definecolor{FUblue}{RGB}{0,51,102} + +\definecolor{middlegray}{rgb}{0.5,0.5,0.5} +\definecolor{lightgray}{rgb}{0.8,0.8,0.8} +\definecolor{orange}{rgb}{0.8,0.3,0.3} +\definecolor{azur}{rgb}{0,0.7,1} +\definecolor{yac}{rgb}{0.6,0.6,0.1} +\definecolor{Pink}{rgb}{1,0,0.6} + +\definecolor{bgcolour}{rgb}{0.97,0.97,0.97} +\definecolor{codegreen}{rgb}{0,0.6,0} +\definecolor{codegray}{rgb}{0.35,0.35,0.35} +\definecolor{codepurple}{rgb}{0.58,0,0.82} +\definecolor{codeblue}{rgb}{0.4,0.5,1} + +% //////////////////// eigene Einstellungen //////////////////// + +% verhindert Einrückung der 1. Zeile eines Absatzes +\parindent 0pt +% <-- Nummer des Übungszettels +\newcommand{\ubungNo}{9} +% <-- Name der Lehrveranstaltung eintragen +\newcommand{\veranstaltung}{Functional Programming} +% <-- z.B. SoSo 17, WiSe 17/18 +\newcommand{\semester}{WiSe 23/24} +% % <-- Hier Anzahl der Aufgaben eintragen +\newcommand{\aufgNo}{3} + +% https://tex.stackexchange.com/a/117538 +\renewcommand\lstlistingname{Example} + +\usepackage{tikz} + +% /////////////////////// BEGIN DOKUMENT ///////////////////////// +\begin{document} + +\setkomafont{section}{\large} + +% ////////////// Daten ////////////// +\begin{center} + +{\veranstaltung, \semester}\par +{\Large Tutorial Tasks \ubungNo}\par +\end{center} +\vspace{-3ex} % Abstand +\rule{\linewidth}{0.8pt} % horizontale Linie +\vspace{-3ex} % Abstand + +% /////////////////////// Aufgabe 1 ///////////////////////// +%alter Zettel 8 Bäume zeichnen +%einfügen löschen, kleinstes Elem +\section*{Task 1: Binary Search Trees I} + +\begin{lstlisting}[caption={\texttt{BTree Operations}}, language=Haskell] +insert :: (Ord a) = > a -> BTree a -> BTree a +insert q Nil = Node q Nil Nil +insert q t@(Node x lt rt) + | q == x = t + | q < x = Node x (insert q lt) rt + | otherwise = Node x lt (insert q rt) + +delete ::( Ord a ) = > a -> BTree a -> BTree a +delete q Nil = Nil +delete q node@ ( Node x lt rt ) + | q < x = ( Node ( delete q lt ) rt ) + | q > x = ( Node lt ( delete q rt ) ) + | otherwise = delete' node + where + delete' ( Node x Nil rt ) = rt + delete' ( Node x lt Nil ) = lt + delete' ( Node x lt rt ) = Node maxE ( delete maxE lt ) rt + maxE = maxElem lt +\end{lstlisting} +\begin{figure}[h] + \centering + \begin{tikzpicture}[ + level distance=10mm, + level 1/.style={sibling distance=20mm}, + level 2/.style={sibling distance=10mm}, + level 3/.style={sibling distance=5mm}] + \node {8} + child {node {5} + child {node {2} + } + child {node{7} + child {node {6}} + child [missing] + } + } + child {node {20} + child {node {11} + } + child [missing] + }; + \end{tikzpicture} + \caption{BSearchTree Example} + \label{fig:figure2} +\end{figure} + +Do the following changes to the tree. Write down each step. + +\texttt{insert 7, insert 21, delete 2, delete 5, insert 12, insert 15, insert 14, delete 20} + +\section*{Task 2: Syntax Tree} + +Boolean expressions can be represented in a syntax tree. To create a syntax tree, add all possible parantheses to an expression without changing the meaning. Then, the operator that is applied last is the root, and its operands the subtrees. + +\begin{enumerate}[label=\alph*)] + \item Implement an algebraic datatype that can store a boolean expression. At least the operators ``and'', ``or'' and ``not'' should be representable. + \item Implement a function, that evaluates a syntax tree into a result of type \texttt{Bool}. + \item Make your data type an instance of the typeclass Show, without using \texttt{deriving}. +\end{enumerate} + +% ///////////////////// Aufgabe 2 /////////////////// +\section*{Task 3: Binary Search Trees II} +\begin{lstlisting}[caption={\texttt{algebraic data types}}, language=Haskell] +-- from lecture +data BTree a = Nil | Node a ( BTree a ) ( BTree a ) deriving Show +-- new +data BHeightTree a = HNil | HNode a Int + ( BHeightTree a ) ( BHeightTree a ) deriving Show +\end{lstlisting} + +Every node in a tree is the root of two subtrees. +Every node of a \texttt{BHeightTree} stores the height of its subtree + +\begin{lstlisting}[caption={\texttt{Example Tree}}, language=Haskell] +bHeightTreeBsp = + HNode 5 3 + (HNode 3 2 + (HNode 2 1 + HNil + HNil) + HNil) + (HNode 5 1 + HNil + HNil) +\end{lstlisting} + +\begin{enumerate} + \item + Write a function \texttt{heightTInsert :: a -> BHeightTree a -> BHeightTree a }. \\ + Input: an element x and a search tree t. \\ + Result: A search tree, with t's elements and x. + \item + Which subtree heights change when using \texttt{delete}? + \item + What is the difference in runtime complexity between a normal tree and a search tree? +\end{enumerate} + + +% /////////////////////// END DOKUMENT ///////////////////////// +\end{document}