Was bisher geschah I Deklarative vs. imperative Programmierung I Deklarative Programmierung: funktionale, logische, funktional-logische, Constraint-Programmierung Funktionale Programmierung in Haskell I Algebraische Datentypen I Rekursive Funktionen I Rekursive Datentypen und Pattern Matching Peano-Zahlen I strukturelle Induktion 37 Datentyp Liste (polymorph) data List a = Nil | Cons { head :: a, tail :: List a} oder kürzer data [a] = [] | a : [a] Pattern Matching: f :: [a] -> ... f xs = case xs of [] -> ... (x : xss) -> ... Beispiel: append :: [a] -> [a] -> [a] append xs ys = case xs of [] -> ys (x : xss) -> x : (append xss ys) 38 Strukturelle Induktion über Listen zum Nachweis von Eigenschaften wie z.B. I append xs [] = xs I append ist assoziativ, d.h append xs (append ys zs) = append (append xs ys) zs Länge der Eingabeliste len :: [a] -> len xs = case [] (x : xss) Int xs of -> 0 -> 1 + len xss Strukturelle Induktion zum Nachweis von len ( append xs ys ) = len xs + len ys 39 Mehr Beispiele Summe aller Elemente der Eingabeliste sum :: [Int] -> Int sum xs = case xs of [] -> ... (x : xss) -> ... jedes Element der Eingabeliste verdoppeln doubles doubles [] ( y :: [Int] -> [Int] xs = case xs of -> [] : ys ) -> ... : (doubles ys) Strukturelle Induktion zum Nachweis von sum ( doubles xs ) = 2 * ( sum xs ) 40 Sortierte Listen (aufsteigend geordnet) is_monoton :: [Int] -> Bool is_monoton xs = case xs of [] -> True [ _ ] -> True (x : y : ys) -> x <= y && is_monoton (y : ys) sortiertes Einfügen: insert :: Int -> [Int] -> [Int] insert y xs = case xs of [] -> ... ( x : xs ) -> if ... then ... else ... Strukturelle Induktion zum Nachweis von Aus is_monoton xs folgt is_monoton ( insert x xs ) 41