Deklarative Programmierung

Werbung
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
Herunterladen