Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zu Übung 4 -
|
|
- Johannes Ackermann
- vor 5 Jahren
- Abrufe
Transkript
1 Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zu Übung 4 - Dozent: Prof. Dr. G. Rote Tutoren: J. Fleischer, T. Haimberger, N. Lehmann, C. Pockrandt, A. Steen Ziele dieser Übung Mit Funktionen höherer Ordnung sicher in Haskell umgehen und die Idee der strukturellen Induktion verstehen. In dieser Übung sollte man folgende Konzepte geübt und verstanden haben: ˆ Funktionen höherer Ordnung map takewhile foldr ˆ Strukturelle Induktion ohne Fallunterscheidung mit Fallunterscheidung ˆ Lauflängencodierung als Beispiel Aufgabe 19: Funktionen höherer Ordnung Drücken Sie die Funktion length mit Hilfe von sum und map und geeigneten selbst denierten Funktionen aus. (Eine Zeile sollte für die Denition reichen.) Lösung zu Aufgabe 19: mylength :: [a] -> Int mylength xs = sum ( map (\x -> 1) xs ) mylength' :: [a] -> Int mylength' = sum. map (\x -> 1) mylength ist äquivalent zu mylength' und zu length. 1
2 Aufgabe 0: Listenfunktionen Denieren Sie die Funktionen: takewhile :: (a -> Bool) -> [a] -> [a] splitat :: Int -> [a] -> ([a],[a]) Der Ausdruck takewhile p x erzeugt das Anfangsstück einer Liste x, solange die Elemente das Prädikat p erfüllen. splitat n x spaltet die Liste x nach den ersten n Elementen in zwei Teile auf. (Diese Funktionen sind in Haskell schon deniert. Zum Testen müssen Sie daher andere Funktionsnamen wählen.) Lösung zu Aufgabe 0: mysplitat :: Int -> [a] -> ([a],[a]) mysplitat 0 l = ([],l) mysplitat n [] = ([],[]) mysplitat n (x:xs) n > 0 = (x:xs1,xs) where (xs1,xs) = mysplitat (n-1) xs -- splitat n liste = (take n liste, drop n liste) mytakewhile :: (a -> Bool) -> [a] -> [a] mytakewhile _ [] = [] mytakewhile p (x:xs) p x = x : mytakewhile p xs otherwise = [] Aufgabe 1: Gemapte Zinsen Welchen Typ hat der Ausdruck map ( zinsen.5) im Zusammenhang von Aufgabe 4? Was bewirkt diese Funktion? Lösung zu Aufgabe 1: Die Funktion hat den Typ [Double] -> [Double], generiert also eine Funktion die eine Liste von Double-Werten als einziges Argument erwartet und eine Liste von Double-Werten zurückgibt. Diese Funktion berechnet für jedes Element der Eingabeliste die Zinsen bei einer Verzinsung von,5 %. Erklärung: Durch die Verwendung von map wird die partiell angewandte Funktion zinsen auf jedes Element in der Liste angewandt und eine neue Liste mit den Ergebnissen erstellt. Durch die Verwendung des Backticks (`) wird die Funktion als Inx-Operator verwendet, das rechte (zweite) Argument wird mit.5 belegt (den selben Eekt kann man übrigens auch mit der Funktion flip erzielen). Da das linke (erste) Argument ausgelassen wird, entsteht somit eine Funktion die das linke (erste) Argument der Funktion zinsen als einziges Argument erwartet (also das zu verzinsende Kapital).
3 Aufgabe : Nicht-assoziative Faltung von Listen Beschreiben Sie das Ergebnis der Funktion differenzen:: Integer -> Integer -> Integer -> Integer differenzen a b c = foldr (-) a [b..c] durch eine explizite Formel in den Gröÿen a, b, c (oder mehrere Formeln). Beweisen Sie Ihre Formel (zum Beispiel durch vollständige Induktion nach c b, oder auch direkt). Lösung zu Aufgabe : c-b = 0: b-a c-b = 1: b-((b+1)-a) c-b = : b-((b+1)-((b+)-a)) c-b = 3:... c-b = 4:... c-b = 5:... c-b = 6: = 0+b-a = -1+a = 1+b-a = -+a = +b-a = -3+a = 3+b-a differenzen' a b c c<b = a even (c-b) = (div (b+c) ) - a odd (c-b) = (div (b-c-1) ) + a a, falls c < b b + c f(a, b, c) = a, falls c b 0 und gerade b c 1 + a, falls c b 0 und ungerade Falls c < b ist, ist die Liste [b.. c] leer; damit folgt unmittelbar, dass das Ergebnis a ist. Es folgt ein Beweis für den Fall c b 0 mit vollständiger Induktion über c b. b + c a, falls (c b) gerade zu zeigen: a, b, c : foldr (-) a [b..c] = f(a, b, c) := b c 1 + a, falls (c b) ungerade Induktionsbasis: Für c b = 0 (d. h. c = b) gilt: foldr (-) a [b] = b - (foldr (-) a []) -- foldr. = b - a -- foldr.1 = (b+b)/ - a = f(a,b,b) Induktionsvoraussetzung: Für c b = k (d. h. c = b + k) und beliebiges a gilt: b + (b + k) a, falls k gerade foldr (-) a [b..(b+k)] = f(a, b, b + k) = b (b + k) 1 + a, falls k ungerade 3
4 Induktionsschritt: Für c b = k + 1 (d. h. c = b + k + 1) gilt: foldr (-) a [b..(b+k+1)] = foldr (-) a ([b..(b+k)] ++ [b+k+1]) = foldr (-) (foldr (-) a [b+k+1]) [b..(b+k)] -- Aufg. 3b = foldr (-) (b+k+1-a) [b..(b+k)] -- foldr.1/ Fall 1: k gerade foldr (-) a [b..(b+k+1)] = foldr (-) (b+k+1-a) [b..(b+k)] = (b+(b+k))/ - (b+k+1-a) -- IV = (b-(b+k+1)-1)/ + a = f(a,b,b+k+1) Fall : k ungerade foldr (-) a [b..(b+k+1)] = foldr (-) (b+k+1-a) [b..(b+k)] = (b-(b+k)-1)/ + (b+k+1-a) -- IV = (b+(b+k+1))/ - a = f(a,b,b+k+1) Es wurde mit vollständiger Induktion gezeigt, dass die angegebene Formel stimmt. Aufgabe 3: Strukturelle Induktion Aufgabe 3a: Beweisen Sie: map f (a ++ b) = map f a ++ map f b Lösung zu Aufgabe 3a: Folgende Funktionsdenitionen werden benötigt: map, ++ map::(a -> b) -> [a] -> [b] map _ [] = [] -- map.1 map f (x:xs) = (f x) : map f xs -- map. (++) :: [a] -> [a] -> [a] (++) [] ys = ys (++) (x:xs) ys = x : ((++) xs ys) Es folgt ein Beweis mit struktureller Induktion über xs. zu zeigen: map f (xs ++ ys) = map f xs ++ map f ys Induktionsbasis: xs == [] map f ([] ++ ys) = map f [] ++ map f ys [++.1] map f ys = map f [] ++ map f ys [map.1] map f ys = [] ++ map f ys [++.1] map f ys = map f ys 4
5 Induktionsschritt: xs (x:xs) Induktionsvoraussetzung: (IV) map f (xs ++ ys) = map f xs ++ map f ys Induktionsbehauptung: map f ((x:xs) ++ ys) = map f (x:xs) ++ map f ys [++.] map f (x:(xs ++ ys)) = map f (x:xs) ++ map f ys [map.] map f (x:(xs ++ ys)) = f x : (map f xs) ++ map f ys [++.] map f (x:(xs ++ ys)) = f x : (map f xs ++ map f ys) [map.] f x : map f (xs ++ ys) = f x : (map f xs ++ map f ys) [IV ] f x : (map f xs ++ map f ys) = f x : (map f xs ++ map f ys) Aufgabe 3b: Wie kann man foldr g z (a ++ b) durch foldr auf den Listen a und b ausdrücken? Beweisen Sie Ihre Formel. Lösung zu Aufgabe 3b: Folgende Funktionsdenitionen werden benötigt: foldr, ++ foldr :: (a -> b -> b) -> b -> [a] -> b foldr f z [] = z -- foldr.1 foldr f z (x:xs) = f x (foldr f z xs) -- foldr. (++) :: [a] -> [a] -> [a] (++) [] ys = ys (++) (x:xs) ys = x : ((++) xs ys) Behauptung: foldr g z (a ++ b) = foldr g (foldr g z b) a Es folgt ein Beweis mit struktureller Induktion über xs. zu zeigen: foldr op n (xs ++ ys) = foldr op (foldr op n ys) xs Induktionsbasis: xs == [] foldr op n ([] ++ ys) = foldr op (foldr op n ys) [] [++.1] foldr op n ys = foldr op (foldr op n ys) [] [foldr.1] foldr op n ys = foldr op n ys Induktionsschritt: xs (x:xs) Induktionsvoraussetzung: foldr op n (xs ++ ys) = foldr op (foldr op n ys) xs Induktionsbehauptung: foldr op n ((x:xs) ++ ys) = foldr op (foldr op n ys) (x:xs) [++.] foldr op n (x:(xs ++ ys)) = foldr op (foldr op n ys) (x:xs) [foldr.] op x foldr op n (xs ++ ys) = foldr op (foldr op n ys) (x:xs) [foldr.] op x foldr op n (xs ++ ys) = op x foldr op (foldr op n ys) xs [IV ] op x foldr op n (xs ++ ys) = op x foldr op n (xs ++ ys) xs 5
6 Aufgabe 3c: Drücken Sie elem x l durch map und foldr aus, und beweisen Sie damit indem Sie Aufgabe (a) und (b) verwenden. elem x (a ++ b) = elem x a elem x b, Lösung zu Aufgabe 3c: Folgende Funktionsdenitionen werden benötigt: map, ++, foldr map::(a -> b) -> [a] -> [b] map _ [] = [] -- map.1 map f (x:xs) = (f x) : map f xs -- map. (++) :: [a] -> [a] -> [a] (++) [] ys = ys (++) (x:xs) ys = x : ((++) xs ys) foldr :: (a -> b -> b) -> b -> [a] -> b foldr f z [] = z -- foldr.1 foldr f z (x:xs) = f x (foldr f z xs) -- foldr. Es gilt: elem n xs = foldr ( ) False (map (==n) xs) (1) zu zeigen: elem n (xs ++ ys) = elem n xs elem n ys Beweis: linke Seite = elem n (xs ++ ys) = (1) foldr ( ) False (map (==n) (xs++ys) = [3a] foldr ( ) False (map (==n) xs ++ map (==n) (xs++ys)) = [3b] foldr ( ) (foldr ( ) False (map (==n) ys)) (map (==n) xs) = (1) foldr ( ) (elem n ys)) (map (==n) xs) rechte Seite = elem n xs elem n ys = (1) foldr ( ) False (map (==n) xs) elem n ys = (), siehe unten foldr ( ) (elem n ys)) (map (==n) xs) Um die Behauptung zu zeigen, benötigen wir als Abschluss folgende Hilfsaussage: foldr ( ) z xs = z foldr ( ) False xs z () Beweis durch Induktion nach xs. Induktionsbasis: xs = []. zu zeigen: foldr ( ) z [] = foldr ( ) False [] z [foldr.1] z = False z Das ist gültig (einfach z=true und z=false einsetzen). 6
7 Induktionsschritt: von xs auf x:xs. Induktionsvoraussetzung: foldr ( ) z xs = foldr ( ) False xs z Induktionsbehauptung: foldr ( ) z (x:xs) = foldr ( ) False (x:xs) z linke Seite = foldr ( ) z (x:xs) = [foldr.] x foldr ( ) z xs = [I.V.] x (foldr ( ) False xs z) = [Der Operator ist assoziativ] (x foldr ( ) False xs) z = [foldr.] foldr ( ) False (x:xs) z = rechte Seite Aufgabe 3d: Beweisen Sie (take k). (take l) = take (min k l) Lösung zu Aufgabe 3d: Folgende Funktionsdenitionen werden benötigt: take, min, (.) take :: Int -> [a] -> [a] take _ [] = [] -- take.1 take n _ n<=0 = [] -- take. take n (x:xs) = x:(take (n-1) xs) -- take.3 min :: (Ord a) => a -> a -> a min x y x <= y = x -- min.1 otherwise = y -- min. (.) :: (a -> b) -> (c -> a) -> c -> b (.) f g x = f (g x) -- compose.1 Es folgt ein Beweis mit struktureller Induktion über xs. zu zeigen: (take k. take l) xs = take (min k l) xs Induktionsbasis: xs == [] (take k. take l) [] = take (min k l) [] [take.1] (take k. take l) [] = [] [compose.1] (take k (take l [])) = [] [take.1] take k [] = [] [take.1] [] = [] 7
8 Induktionsschritt: xs (x:xs) Induktionsvoraussetzung: (take u. take v) xs = take (min u v) xs, für alle u, v. Induktionsbehauptung: (take k. take l) (x:xs) = take (min k l) (x:xs) Fall 1: 0 < k l (take k. take l) (x:xs) = take (min k l) (x:xs) [compose.1] take k (take l (x:xs)) = take k (x:xs) [take.3] take k (x:(take (l-1) xs)) = x:(take (k-1) xs) take.3 x:(take (k-1) (take (l-1) xs)) = x:(take (k-1) xs) compose.1 x:((take (k-1)). (take (l-1)) xs) = x:(take (k-1) xs) IV x:(take (k-1) xs) = x:(take (k-1) xs) Fall : k > l > 0 (take k. take l) (x:xs) = take l (x:xs) comp.1 take k (take l (x:xs)) = take l (x:xs) take.3 take k (x:(take (l-1) xs)) = x:(take (l-1) xs) take.3 x:(take (k-1) (take (l-1) xs)) = x:(take (l-1) xs) compose.1 x:((take (k-1)). ((take (l-1) xs)) = x:(take (l-1) xs) IV x:(take (l-1) xs) = x:(take (l-1) xs) Fall 3: k 0. Es folgt daraus min k l <= 0. linke Seite = (take k. take l) (x:xs) = compose.1 take k ((take l) (x:xs)) = take. [] rechte Seite = take (min k l) (x:xs) = take. [] Fall 4: l 0. Daraus folgt min k l <= 0. linke Seite = (take k. take l) (x:xs) = compose.1 take k ((take l) (x:xs)) = take. take k [] = take.1 [] rechte Seite = take (min k l) (x:xs) = [] wie bei Fall 3. 8
9 Aufgabe 4: Lauflängenkodierung Aufgabe 4a: Bei der Lauflängenkodierung (run-length coding) wird eine Kette "aaaabbaaa" mit vielen wiederholten Zeichen komprimiert, indem man die Länge jedes Laufes (engl. run) von gleichen Zeichen nimmt: [(4,'a'), (,'b'), (3,'a')] Schreiben Sie eine Funktion, die diese Kodierung berechnet, und auch die Umkehrfunktion für die Dekodierung. Lösung zu Aufgabe 4a: -- erzeugt aus einer Zeichenkette eine Liste von Tupeln der Form: -- (Häufigkeit des Zeichens, Zeichen) encode :: [Char] -> [(Int, Char)] encode [] = [] encode (x:xs) = [(laenge + 1, x)] ++ encode rest where laenge = length (takewhile (== x) xs) rest = drop laenge xs -- erzeugt aus einer Liste von Tupeln der Form: (Häufigkeit des Zeichens, Zeichen) -- eine Zeichenkette decode :: [(Int, Char)] -> [Char] decode [] = [] decode (x:xs) = (replicate (fst x) (snd x)) ++ decode xs Aufgabe 4b: Unter der Annahme, dass die Eingabekette keine Ziern enthält, kann man die komprimierte Fassung kompakter als Kette "4ab3a" darstellen. Erweitern Sie die vorige Aufgabe auf diese Darstellung. Lösung zu Aufgabe 4b: --Eine Variante der Lauflaengenkodierung, die eine Zeichenkette liefert. encodestr :: String -> String encodestr "" = "" encodestr (c:cs) = show (length block) ++ [c] ++ encodestr rest where block = takewhile (== c) (c:cs) rest = dropwhile (== c) cs --Die entsprechende Funktion zur Dekodierung. decodestr :: String -> String decodestr "" = "" decodestr str = replicate (read num) c ++ decodestr xs where num = takewhile (`elem` ['0'..'9']) str (c:xs) = dropwhile (`elem` ['0'..'9']) str Alternativlösung: auf encode und decode aufbauen und nur die zusätzliche Übersetzung in eine Zeichenkette dazugeben (siehe Datei uebung4.hs). 9
Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zu Übung 9 -
Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zu Übung 9 - Dozent: Prof. Dr. G. Rote Tutoren: J. Fleischer, T. Haimberger, N. Lehmann, C. Pockrandt, A. Steen 10.01.2012 Ziele
MehrAlgorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zur Übungsklausur -
Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zur Übungsklausur - Punkte: A1: 30, A2: 20, A3: 20, A4: 20, A5: 10, A6: 20 Punkte: /120 12.02.2012 Hinweis: Geben Sie bei allen
MehrAlgorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zu Übung 3 -
Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zu Übung 3 - Dozent: Prof. Dr. G. Rote Tutoren: J. Fleischer, T. Haimberger, N. Lehmann, C. Pockrandt, A. Steen 01.11.2011 Ziele
MehrFunktionale Programmierung ALP I. Funktionen höherer Ordnung SS Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda
ALP I SS 2011 Funktionstypen Funktionen haben einen Datentyp, der folgende allgemeine Form hat: functionname :: T 1 -> T 2, wobei T 1, T 2 wiederum beliebige Datentypen sind Beispiel: T 1 T 2 Der Datentyp
MehrAlgorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zu Übung 8 -
Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zu Übung 8 - Dozent: Prof. Dr. G. Rote Tutoren: J. Fleischer, T. Haimberger, N. Lehmann, C. Pockrandt, A. Steen 03.01.2012 Ziele
MehrFunktionale Programmierung mit Haskell
Funktionale Programmierung mit Haskell Dr. Michael Savorić Hohenstaufen-Gymnasium (HSG) Kaiserslautern Version 20120622 Überblick Wichtige Eigenschaften Einführungsbeispiele Listenerzeugung und Beispiel
MehrAlgorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zu Übung 1 -
Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zu Übung 1 - Dozent: Prof. Dr. G. Rote Tutoren: J. Fleischer, T. Haimberger, N. Lehmann, C. Pockrandt, A. Steen 18.10.2011 Ziele
MehrProgrammieren in Haskell Einstieg in Haskell
Programmieren in Haskell Einstieg in Haskell Peter Steffen Universität Bielefeld Technische Fakultät 24.10.2008 1 Programmieren in Haskell Was wir heute machen Umfrage: Wer hat den Hugs ausprobiert? Ausdrücke
MehrProgrammieren in Haskell
Programmieren in Haskell Wir steigen ein... Programmieren in Haskell 1 Was wir heute machen Umfrage: Wer hat den Hugs ausprobiert? Ausdrücke und Werte Datentypen Funktionen Aufgabe für diese Woche Programmieren
MehrWas bisher geschah Funktionale Programmierung in Haskell: Algebraische Datentypen Pattern Matching Polymorphie Typklassen Rekursive Datentypen:
Was bisher geschah Funktionale Programmierung in Haskell: Algebraische Datentypen Pattern Matching Polymorphie Typklassen Rekursive Datentypen: Peano-Zahlen, Listen, Bäume Rekursive Funktionen strukturelle
MehrTeillösung zum 7.Aufgabenblatt zur Vorlesung Informatik A
1 Teillösung zum 7.Aufgabenblatt zur Vorlesung Informatik A (Autor: Florian Brinkmeyer) 1 Pascalsches Dreieck Implementieren Sie die Rekursion zur Berechnung der Binomialkoezienten. Geben Sie die ersten
MehrKapitel 3: Eine einfache Programmiersprache. Programmieren in Haskell 1
Kapitel 3: Eine einfache Programmiersprache Programmieren in Haskell 1 Datentypen, Datentypdefinitionen data Instrument = Oboe HonkyTonkPiano Cello VoiceAahs data Musik = Note Ton Dauer Pause Dauer Musik
MehrDie Korrektheit von Mergesort
Die Korrektheit von Mergesort Christoph Lüth 11. November 2002 Definition von Mergesort Die Funktion Mergesort ist wie folgt definiert: msort :: [Int]-> [Int] msort xs length xs
MehrEinführung in die Informatik 2
Technische Universität München Fakultät für Informatik Prof. Tobias Nipkow, Ph.D. Lars Noschinski, Dr. Jasmin Blanchette, Dmitriy Traytel Wintersemester 2012/13 Lösungsblatt Endklausur 9. Februar 2013
MehrFunktionen höherer Ordnung
Eine Funktion wird als Funktion höherer Ordnung bezeichnet, wenn Funktionen als Argumente verwendet werden, oder wenn eine Funktion als Ergebnis zurück gegeben wird. Beispiel: twotimes :: ( a -> a ) ->
MehrProInformatik: Funktionale Programmierung. Punkte
ProInformatik: Funktionale Programmierung 27.7-22.8.2008, M. Knobelsdorf Probeklausur Ihre persönliche Klausurnummer: Vorname, Nachname: Aufgabe 1 2 3 4 5 6 7 8 Punkte 12 4 4 4 4 2 4 6 40 Erz. Punkte Zum
MehrGrundlegende Datentypen
Grundlegende Datentypen (Funktionale Programmierung) Prof. Dr. Oliver Braun Letzte Änderung: 18.03.2018 21:08 Grundlegende Datentypen 1/16 Typen in Haskell ist alles streng typisiert Haskell verfügt über
MehrStröme als unendliche Listen in Haskell
Ströme als unendliche Listen in Haskell Strom := Folge oder Liste von Daten, unbegrenzt viele Daten-Elemente. Ströme sind in Haskell als als (potentiell) unendliche Listen darstellbar und programmierbar
MehrGrundlegende Datentypen
Grundlegende Datentypen Funktionale Programmierung Prof. Dr. Oliver Braun Letzte Änderung: 22.10.2018 10:53 Grundlegende Datentypen 1/21 Typen in Haskell ist alles streng typisiert Haskell verfügt über
MehrGrundlegende Datentypen
Funktionale Programmierung Grundlegende Datentypen Fakultät für Informatik und Mathematik Hochschule München Letzte Änderung: 14.11.2017 15:37 Inhaltsverzeichnis Typen........................................
MehrPrüfung Funktionale Programmierung
Hochschule für angewandte Wissenschaften München Fakultät für Informatik und Mathematik Studiengruppe IF, IB, IC Sommersemester 2015 Prüfung Funktionale Programmierung Datum : 23.07.2015, 10:30 Uhr Bearbeitungszeit
MehrInformatik A WS 2007/08. Nachklausur
Informatik A WS 2007/08 Nachklausur 18.04.2008 Name:.............................. Matrikelnummer:.................. Tutor:.................. Bitte Zutreffendes ankreuzen: Hauptfach Bioinformatik Hauptfach
MehrHASKELL KAPITEL 2.1. Notationen: Currying und das Lambda-Kalkül
HASKELL KAPITEL 2.1 Notationen: Currying und das Lambda-Kalkül Bisheriges (Ende VL-Teil 1) weite :: (Float,Float) ->Float weite (v0, phi) = (square(v0)/9.81) * sin(2 * phi) (10, 30 ) smaller ::(Integer,
MehrFunktionale Programmierung Grundlegende Datentypen
Grundlegende Datentypen Prof. Dr. Oliver Braun Fakultät für Informatik und Mathematik Hochschule München Letzte Änderung: 06.11.2017 16:45 Inhaltsverzeichnis Typen........................................
MehrFunktionale Programmierung ALP I. Funktionen höherer Ordnung. Teil 2 SS 2013. Prof. Dr. Margarita Esponda. Prof. Dr.
ALP I Funktionen höherer Ordnung Teil 2 SS 2013 Funktionen höherer Ordnung Nehmen wir an, wir möchten alle Zahlen innerhalb einer Liste miteinander addieren addall:: (Num a) => [a -> a addall [ = 0 addall
MehrSo schreiben Sie ein Parser-Programm
Universität des Saarlandes Fachrichtung Informatik Programming Systems Lab Prof. Gert Smolka Proseminar Programmiersysteme WS 03/04 Höhere Funktionale Programmierung: Parser-Kombinatoren Matthias Berg
MehrWS 2012/2013. Robert Giegerich. 21. November 2012
WS 2012/2013 Robert AG Praktische Informatik 21. November 2012 Funktionen als Bürger erster Klasse Funktionen definieren kann man in jeder Programmiersprache. Eine funktionalen Programmiersprache erlaubt
MehrProgrammieren in Haskell
Programmieren in Haskell Syntax und Semantik von Haskell Programmieren in Haskell 1 Was wir heute (und nächstes mal) machen Datentypdefinitionen Wertdefinitionen, Variablenbindungen Musterbindungen Funktionsbindungen
MehrBeweis durch vollständige Induktion
Skriptteil zur Vorlesung: Proinformatik - Funktionale Programmierung Dr. Marco Block-Berlitz 4.Juli 009 Beweis durch vollständige Induktion Die fünf Peano-Axiome Grundlage für die vollständige Induktion
MehrEinführung in die funktionale Programmierung
Einführung in die funktionale Programmierung Prof. Dr. Manfred Schmidt-Schauÿ Künstliche Intelligenz und Softwaretechnologie 26. Oktober 2006 Haskell - Einführung Syntax Typen Auswertung Programmierung
MehrProgrammieren in Haskell
Programmieren in Haskell Wir steigen ein... Programmieren in Haskell 1 Was wir heute machen Umfrage: Wer hat den Hugs ausprobiert? Ausdrücke und Werte Datentypen Funktionen Aufgabe für s Wochenende Programmieren
MehrParadigmen der Programmierung
SS 11 Prüfungsklausur 25.07.2011 Aufgabe 5 (6+9 = 15 Punkte) a) Bestimmen Sie jeweils den Typ der folgenden Haskell-Ausdrücke: ( 1, 2 :"3", 4 < 5) :: (Char, String, Bool) [(last, tail), (head, take 5)]
MehrGrundlagen der Programmierung 2 (2.B)
Grundlagen der Programmierung 2 (2.B) Prof. Dr. Manfred Schmidt-Schauß Künstliche Intelligenz und Softwaretechnologie 5. Mai 2010 Listenausdrücke, Listen-Komprehensionen; (list comprehensions) Analog zu
MehrGliederung. Algorithmen und Datenstrukturen I. Listen in Haskell: Listen in Haskell: Listen in Haskell. Datentyp Liste Strings Listenkomprehension
Gliederung Algorithmen und Datenstrukturen I D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg 1 Winter 2009/10, 16. Oktober 2009, c
MehrProgrammieren in Haskell
Programmieren in Haskell Syntax und Semantik von Haskell Programmieren in Haskell 1 Was wir heute (und nächstes mal) machen Datentypdefinitionen Wertdefinitionen, Variablenbindungen Musterbindungen Funktionsbindungen
MehrGrundlagen der Programmierung 2 B
Grundlagen der Programmierung 2 B Haskell: Listen-Komprehensionen Prof. Dr. Manfred Schmidt-Schauß Sommersemester 2017 Listenausdrücke, Listen-Komprehensionen Analog zu Mengenausdrücken, aber Reihenfolge
MehrFunktionale Programmierung. ALP I Lambda-Kalkül. Teil III SS Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda
ALP I Lambda-Kalkül Teil III SS 2011 Parser Hilfsfunktionen: Die break-funktion ist eine Funktion Höherer Ordnung, die eine Liste beim ersten Vorkommen einer Bedingung in zwei Listen spaltet. break ::
MehrMusterlösung zur 2. Aufgabe der 4. Übung
Musterlösung zur 2. Aufgabe der 4. Übung Da viele von Euch anscheinend noch Probleme mit dem Entfalten haben, gibt es für diese Aufgabe eine Beispiellösung von uns. Als erstes wollen wir uns noch einmal
MehrPrüfung Funktionale Programmierung
Hochschule für angewandte Wissenschaften München Fakultät für Informatik und Mathematik Studiengruppe IF, IB, IC Sommersemester 2014 Prüfung Funktionale Programmierung Datum : 16.07.2014, 12:30 Uhr Bearbeitungszeit
MehrTutoraufgabe 1 (Auswertungsstrategie):
Prof. aa Dr. J. Giesl Programmierung WS12/13 M. Brockschmidt, F. Emmes, C. Otto, T. Ströder Tutoraufgabe 1 (Auswertungsstrategie): Gegeben sei das folgende Haskell-Programm: absteigend :: Int - > [ Int
MehrGrundlagen der Programmierung 2 (2.B)
Grundlagen der Programmierung 2 (2.B) Prof. Dr. Manfred Schmidt-Schauÿ Künstliche Intelligenz und Softwaretechnologie 11. Juni 2008 Reduktionsregel zum case case-reduktion (case (c t 1... t n ) of... (c
MehrEinführung in die Informatik 2
Technische Universität München Fakultät für Informatik Prof. Tobias Nipkow, Ph.D. Manuel Eberl, Lars Hupel, Lars Noschinski Wintersemester 2014/15 Lösungsblatt Endklausur 13. Februar 2015 Einführung in
MehrPraktische Informatik 3: Funktionale Programmierung Vorlesung 5 vom : Funktionen Höherer Ordnung I
Rev. 2766 1 [33] Praktische Informatik 3: Funktionale Programmierung Vorlesung 5 vom 11.11.2014: Funktionen Höherer Ordnung I Christoph Lüth Universität Bremen Wintersemester 2014/15 2 [33] Fahrplan Teil
MehrProgrammieren in Haskell Programmiermethodik
Programmieren in Haskell Programmiermethodik Peter Steffen Universität Bielefeld Technische Fakultät 12.01.2011 1 Programmieren in Haskell Bisherige Themen Was soll wiederholt werden? Bedienung von hugs
MehrHausaufgaben. zur Vorlesung. Vollständige Induktion. 1. Beweist folgende Formeln (zu beweisen ist nur die Gleichheit mit dem. i=1 (4 + i)!
WS 015/1 Hausaufgaben zur Vorlesung Vollständige Induktion 1. Beweist folgende Formeln zu beweisen ist nur die Gleichheit mit dem! -Zeichen : a 5 + + 7 + 8 + + 4 + n n 4 + i! nn+9 b 1 + + 9 + + n 1 n 1
MehrProgrammieren in Haskell Einführung
Programmieren in Haskell Einführung Peter Steffen Universität Bielefeld Technische Fakultät 17.10.2008 1 Programmieren in Haskell Veranstalter Dr. Peter Steffen Raum: M3-124 Tel.: 0521/106-2906 Email:
MehrFahrplan. Inhalt. Ähnliche Funktionen der letzten Vorlesung. Muster der primitiven Rekursion. Ähnliche Funktionen der letzten Vorlesung
Fahrplan Teil I: Funktionale Programmierung im Kleinen Praktische Informatik 3: Funktionale Programmierung Vorlesung 5 vom 11.11.2014: Funktionen Höherer Ordnung I Christoph Lüth Universität Bremen Wintersemester
MehrWS 2013/2014. Robert Giegerich. 11. Dezember 2013
WS 2013/2014 Robert AG Praktische Informatik 11. Dezember 2013 höherer Ordnung Worum geht es heute? In Haskell gibt es, die als Argument haben oder als Ergebnis liefern. Diese nennt man höherer Ordnung.
MehrFunktionale Programmierung und Typtheorie
Funktionale Programmierung und Typtheorie 5. Fortgeschrittene Konzepte 5.1 Komprehensionen 5.2 Partielle Applikationen 5.3 Strikte und nichtstrikte Funktionen 5.4 Unendliche Datenstrukturen und verzögerte
MehrPraktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom : Typvariablen und Polymorphie
Rev. 2749 1 [28] Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom 04.11.2014: Typvariablen und Polymorphie Christoph Lüth Universität Bremen Wintersemester 2014/15 2 [28] Fahrplan Teil
MehrEinführung in Haskell
Einführung in Haskell Axel Stronzik 21. April 2008 1 / 43 Inhaltsverzeichnis 1 Allgemeines 2 / 43 Inhaltsverzeichnis 1 Allgemeines 2 Funktions- und Typdefinitionen 2 / 43 Inhaltsverzeichnis 1 Allgemeines
MehrFrage, Fragen und nochmals Fragen
Frage, Fragen und nochmals Fragen Berthold Hoffmann Universität Bremen and DFKI Bremen hof@informatik.uni-bremen.de In diesem Text stehen einige Fragen, die man sich zu den Folien der Veranstaltung Funktionales
MehrGrundlagen der Programmierung 2. Unendliche Listen und Ströme(B)
Grundlagen der Programmierung 2 Unendliche Listen und Ströme(B) Prof. Dr. Manfred Schmidt-Schauÿ Künstliche Intelligenz und Softwaretechnologie 17. Mai 2006 Beispiel: scanl, scanr scanl berechnet das foldl
MehrPraktische Informatik 3: Funktionale Programmierung Vorlesung 5 vom : Funktionen Höherer Ordnung I
16:02:05 2017-01-17 1 [38] Praktische Informatik 3: Funktionale Programmierung Vorlesung 5 vom 15.11.2016: Funktionen Höherer Ordnung I Christoph Lüth Universität Bremen Wintersemester 2016/17 PI3 WS 16/17
MehrProgrammieren in Haskell
Programmieren in Haskell Programmiermethodik Programmieren in Haskell 1 Was wir heute machen Spezifikation Strukturelle Rekursion Strukturelle Induktion Programmieren in Haskell 2 Spezifikation sort [8,
MehrEinführung in die Informatik 2
Technische Universität München Fakultät für Informatik Prof. Tobias Nipkow, Ph.D. Lars Hupel, Lars Noschinski, Dr. Jasmin Blanchette Wintersemester 2013/14 Abschlussklausur 21. Februar 2014 Einführung
MehrTutoraufgabe 1 (Auswertungsstrategie):
Prof. aa Dr. M. Müller C. Aschermann, J. Hensel, J. Protze, P. Reble Allgemeine ˆ Die Hausaufgaben sollen in Gruppen von je 3 Studierenden aus der gleichen Kleingruppenübung (Tutorium) bearbeitet werden.
MehrWS 2013/2014. Robert Giegerich. 11. Dezember 2013
WS 2013/2014 Robert AG Praktische Informatik 11. Dezember 2013 höherer Ordnung Worum geht es heute? In Haskell gibt es, die als Argument haben oder als Ergebnis liefern. Diese nennt man höherer Ordnung.
MehrFunktionale Programmierung Mehr funktionale Muster
Mehr funktionale Muster Prof. Dr. Oliver Braun Fakultät für Informatik und Mathematik Hochschule München Letzte Änderung: 07.12.2017 06:56 Inhaltsverzeichnis Pattern Matching..................................
Mehr: Funktionen höherer Ordnung. III.6 Funktionale Programmiertechniken - 1 -
. Prinzipien der funktionalen Programmierung 2. Deklarationen 3. Ausdrücke 4. Muster (Patterns) 5. Typen und Datenstrukturen 6. Funktionale Programmiertechniken : Funktionen höherer Ordnung III.6 Funktionale
Mehr1 Übersicht Induktion
Universität Koblenz-Landau FB 4 Informatik Prof. Dr. Viorica Sofronie-Stokkermans Dipl.-Inform. Markus Bender 0.11.01 (v1.3) 1 Übersicht Induktion 1.1 Allgemeines Unter einem induktiven Vorgehen versteht
MehrALP I. Funktionale Programmierung
ALP I Funktionale Programmierung Zusammengesetzte Datentypen in Haskell WS 2012/2013 Zusammengesetzte Datentypen Tupel List String Zusammengesetzte Datentypen Tupel-Datentyp Ein Tupel ist eine Ansammlung
Mehr13 Berechenbarkeit und Aufwandsabschätzung
13 Berechenbarkeit und Aufwandsabschätzung 13.1 Berechenbarkeit Frage: Gibt es für jede Funktion, die mathematisch spezifiziert werden kann, ein Programm, das diese Funktion berechnet? Antwort: Nein! [Turing
MehrListen und Listenfunktionen. Grundlagen der Programmierung 2 A (Listen) Listen und Listenfunktionen. Listen? Haskell: Listen
Listen und Listenfunktionen Grundlagen der Programmierung 2 A (Listen) Haskell: Listen Prof. Dr. Manfred Schmidt-Schauß Listen modellieren Folgen von gleichartigen, gleichgetypten Objekten. Ausdruck im
MehrMonoide. Funktionale Programmierung. Prof. Dr. Oliver Braun Letzte Änderung: :54. Monoide 1/16
Monoide Funktionale Programmierung Prof. Dr. Oliver Braun Letzte Änderung: 09.10.2018 06:54 Monoide 1/16 Abstraktion gleichartige Strukturen sollten abstrahiert werden Beispiel: Collections in Haskell
MehrProgrammierung und Modellierung mit Haskell
Funktionen höherer Ordnung Elementare HO-Funktionen Programmierung und Modellierung mit Haskell Funktionen höherer Ordnung Martin Hofmann Steffen Jost LFE Theoretische Informatik, Institut für Informatik,
MehrEinführung in die Informatik 2 5. Übung
Technische Universität München WS 2014/15 Institut für Informatik 07.11.2014 Prof. Tobias Nipkow, Ph.D. Abgabe: 14.11.2014 L. Noschinski, L. Hupel, Dr. J. Blanchette, M. Eberl Einführung in die Informatik
MehrProgrammieren in Haskell Das Haskell Typsystem
Programmieren in Haskell Das Haskell Typsystem Peter Steffen Robert Giegerich Universität Bielefeld Technische Fakultät 22.01.2010 1 Programmieren in Haskell Belauscht... Lisa Lista: Ohne Typen keine korrekten
MehrLösung: InfA - Übungsblatt 07
Lösung: InfA - Übungsblatt 07 Michele Ritschel & Marcel Schilling 23. Dezember 2008 Verwendete Abkürzungen: Beweis, vollständige Induktion, IA: Induktionsanfang/Induktionsanker, IS: Induktionsschritt/Induktionssprung,
MehrUnendliche Listen und Bäume
Funktionale Programmierung Unendliche Listen und Bäume Helga Karafiat, Steffen Rüther Übersicht Grundlage: Lazy Evaluation Konstruktion von unendlichen Strukturen Verwendung von unendlichen Listen Unendliche
MehrGrundlagen der Programmierung 2 A (Listen)
Grundlagen der Programmierung 2 A (Listen) Haskell: Listen Prof. Dr. Manfred Schmidt-Schauß Sommersemester 2017 Listen und Listenfunktionen Listen modellieren Folgen von gleichartigen, gleichgetypten Objekten.
MehrFunktionale Programmierung. Monoide. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München
Funktionale Programmierung Monoide Fakultät für Informatik und Mathematik Hochschule München Letzte Änderung: 03.12.2018 07:53 Inhaltsverzeichnis Abstraktion..................................... 1 Eine
MehrEinführung in die Informatik 2 2. Übung
Technische Universität München WS 2014/15 Institut für Informatik 17.10.2014 Prof. Tobias Nipkow, Ph.D. Abgabe: 24.10.2014 L. Noschinski, L. Hupel, Dr. J. Blanchette, M. Eberl Einführung in die Informatik
MehrFunktionale Programmierung. Das Funktionale Quiz. Das Funktionale Quiz. Das Funktionale Quiz
Funktionale Programmierung Das Funktionale Quiz 31.5.2005 Nenne eine Gemeinsamkeit zwischen Typklassen und OO-Klassen Das Funktionale Quiz Das Funktionale Quiz Nenne einen Unterschied zwischen Typklassen
MehrWS 2011/2012. Robert Giegerich. October 17, 2012
in in WS 2011/2012 Robert AG Praktische Informatik October 17, 2012 Sprechstunden in GZI-Arbeitsraum (V2-240) Tutoren-Sprechstunden (V2-228) http://www.techfak.uni-bielefeld.de/ags/pi/ lehre/audiws12/#ueb
MehrProgrammierparadigmen
in Haskell Programmierparadigmen in Haskell D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg Sommer 2011, 4. April 2011, c 2011 D.Rösner
MehrGrundprinzipien der funktionalen Programmierung
Grundprinzipien der funktionalen Programmierung Funktionen haben keine Seiteneffekte Eine Funktion berechnet einen Ausgabewert der nur von den Eingabewerten abhängt: 12 inputs + output 46 34 2 Nicht nur
MehrDefinieren Sie eine Funktion circlearea zur Berechnung der Fläche eines Kreises mit gegebenen Radius (Float).
Haskell Funktionen Definieren Sie eine Funktion circlearea zur Berechnung der Fläche eines Kreises mit gegebenen Radius (Float). circlearea :: Float -> Float circlearea radius = 2 * pi * radius^2 Definieren
MehrTypklassen. Natascha Widder
Typklassen Natascha Widder 19.11.2007 Motivation Typklassen fassen Typen mit ähnlichen Operatoren zusammen ermöglichen überladenen Funktionen Definition Typklassen Deklarationsschema class Name Platzhalter
MehrGrundlagen der Programmierung 2 (2.A)
Grundlagen der Programmierung 2 (2.A) Prof. Dr. Manfred Schmidt-Schauß Künstliche Intelligenz und Softwaretechnologie 5. Mai 2011 Listen und Listenfunktionen Listen modellieren Folgen von gleichartigen,
MehrCrashkurs Haskell Mentoring WiSe 2016/17. Anja Wolffgramm Freie Universität Berlin
Crashkurs Haskell Mentoring WiSe 2016/17 Anja Wolffgramm Freie Universität Berlin 02/11/2016 , Inhalt Kommandozeile Haskell installieren & starten Ein 1. Haskell-Programm Funktionsdefinition Primitive
MehrFunktionale Programmierung mit Haskell. Jan Hermanns
Funktionale Programmierung mit Haskell Jan Hermanns 1 Programmiersprachen imperativ deklarativ konventionell OO logisch funktional Fortran Smalltalk Prolog Lisp C Eiffel ML Pascal Java Haskell 2 von Neumann
MehrWas bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):
Was bisher geschah deklarative Programmierung funktional: Programm: Menge von Termgleichungen, Term Auswertung: Pattern matsching, Termumformungen logisch: Programm: Menge von Regeln (Horn-Formeln), Formel
MehrWS 2011/2012. Georg Sauthoff November 2011
WS 2011/2012 Georg 1 AG Praktische Informatik 22. November 2011 1 gsauthof@techfak.uni-bielefeld.de Vorstellung der abgaben aus den Tutorien. Sieb-Beispiel Siehe Tafel (Auswertungsbeispiel) Sieb-Beispiel
MehrTheorembeweiserpraktikum SS 2016
Institut für Programmstrukturen und Datenorganisation Lehrstuhl Programmierparadigmen Am Fasanengarten 5 76131 Karlsruhe http://pp.ipd.kit.edu/ Theorembeweiserpraktikum SS 2016 http://pp.ipd.kit.edu/lehre/ss2016/tba
MehrAufgabe 1 Basiswissen zur Vorlesung (8 Punkte)
Matrikelnummer: 1 Aufgabe 1 Basiswissen zur Vorlesung (8 Punkte) Kreuzen Sie an, ob die folgenden Aussagen richtig oder falsch sind. Bewertung: keine Antwort: 0 Punkte richtige Antwort: +0.5 Punkte falsche
Mehr1 - FortProg ist: [ ] objekt-orientiert; [ ] funktional; [ ] logisch; [ ] manchmal nicht auszuhalten
1 - FortProg ist: [ ] objekt-orientiert; [ ] funktional; [ ] logisch; [ ] manchmal nicht auszuhalten Java-1. a), e) Java-2. --- gestrichen --- Java-3. keine Antwort ist richtig Java-4. a) Java-5. a), b)
MehrProgrammieren in Haskell Abstrakte Datentypen
Programmieren in Haskell Abstrakte Datentypen Peter Steffen Universität Bielefeld Technische Fakultät 09.01.2009 1 Programmieren in Haskell Einführung Man unterscheidet zwei Arten von Datentypen: konkrete
MehrProgrammierung WS18/19 Übungsblatt 9 (Abgabe Freitag, den um 12 Uhr)
Prof. aa Dr. J. Giesl S. Dollase, M. Hark, D. Korzeniewski Aufgabe 2 (Datenstrukturen in Haskell): (2 + 1 + 2 + 2.5 + 3.5 = 11 Punkte) In dieser Aufgabe geht es darum, arithmetische Ausdrücke auszuwerten.
MehrFunktionale Programmierung. ALP I Lambda-Kalkül. Teil IVb WS 2012/2013. Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda
ALP I Lambda-Kalkül Teil IVb WS 2012/2013 λ-kalkül-parser Hilfsfunktionen: Die break-funktion ist eine Funktion höherer Ordnung, die eine Liste beim ersten Vorkommen einer Bedingung in zwei Listen spaltet.
MehrPraktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom : Typvariablen und Polymorphie
16:02:01 2017-01-17 1 [37] Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom 08.11.2016: Typvariablen und Polymorphie Christoph Lüth Universität Bremen Wintersemester 2016/17 PI3 WS 16/17
MehrWS 2011/2012. Georg Sauthoff 1. October 18, 2011
in in WS 2011/2012 Georg 1 AG Praktische Informatik October 18, 2011 1 gsauthof@techfak.uni-bielefeld.de Neue Übungsgruppen in neue Übungsgruppen neue Tutoren Sprechstunden in GZI-Arbeitsraum (V2-240)
MehrALP I Induktion und Rekursion
ALP I Induktion und Rekursion WS 2012/2013 Vollständige Induktion (Mafi I) Die Vollständige Induktion ist eine mathematische Beweistechnik, die auf die Menge der natürlichen Zahlen spezialisiert ist. Vorgehensweise:
MehrProgrammierung und Modellierung mit Haskell
Programmierung und Modellierung mit Haskell Teil 6: Funktionen höherer Ordnung Steffen Jost LFE Theoretische Informatik, Institut für Informatik, Ludwig-Maximilians Universität, München 14. Mai 2018 Steffen
Mehr