Deklarative Programmierung

Werbung
Was bisher geschah
I
deklarative Programmierung
I
I
I
funktionale Programmierung (Haskell):
I
I
I
I
funktional:
Programm: Menge von Termgleichungen, Term
Auswertung: Pattern matching, Termumformungen
logisch:
Programm: Menge von Regeln (Horn-Formeln), Formel
(Query)
Auswertung: Unifikation, Resolution
nebenwirkungsfrei
lazy evaluation (ermöglicht unendliche Datentypen)
kompakte Darstellung
Praktikum: ghci, Prelude, Typen, Hoogle
25
Wiederholung Auswertung
Normalform: nicht-reduzierbarer Ausdruck
Auswertung:
schrittweise Reduktion des Ausdruckes (Ersetzung der
Redexe),
bis Normalform erreicht ist (enthält keinen Redex)
Auswertungsstrategien:
innermost-Reduktion (strikt)
outermost-Reduktion (lazy)
Beispiel:
f :: Int -> Int
f 0 = 1
f (n + 1) = 2 * (f n) + 1
f 3
26
Haskell-Datentypen
einfache Datentypen, z.B.
Int
ganze Zahlen (feste Länge)
Integer ganze Zahlen (beliebige Länge)
Bool
Wahrheitswerte
Char
ASCII-Symbole
Konstruktion zusammengesetzter Datentypen:
I
(kartesisches) Produkt, z.B. Tupel
I
Vereinigung (Fallunterscheidung)
z.B. Aufzählungstypen True, False
I
Rekursion, z.B. Listen, Bäume
I
Potenz, Funktionen
27
Algebraische Datentypen
data Foo = Foo { bar :: Int, baz :: String }
deriving Show
Bezeichnungen:
I
data Foo ist Typname
I
Foo { .. } ist Konstruktor
I
bar, baz sind Komponenten
x :: Foo
x = Foo { bar = 3, baz = "hal" }
Mathematisch: Produkt
Foo = Int × String
28
Datentyp mit mehreren Konstruktoren
Beispiel (selbst definiert)
data T = A { foo :: Int }
| B { bar :: String }
deriving Show
Beispiel (in Prelude vordefiniert)
data Bool = False | True
data Ordering = LT | EQ | GT
Mathematisch: (disjunkte) Vereinigung
Bool = { False } ∪ { True }
29
Fallunterscheidung, Pattern Matching
data T = A { foo :: Int }
| B { bar :: String }
Fallunterscheidung:
f :: T -> Int
f x = case x of
A {} -> foo x
B {} -> length $ bar x
Pattern Matching (Bezeichner n,l werden lokal gebunden):
f :: T -> Int
f x = case x of
A { foo = n } -> n
B { bar = l } -> length l
30
Rekursive Datentypen: Peano-Zahlen
data Nat = Zero
| S Nat
Menge aller Peano-Zahlen
Addition
add :: Nat -> Nat -> Nat
add x Zero = x
add x ( S y ) = S ( add x y )
Beispiel:
add (S (S (S Zero ))) (S (S Zero)) =
S (S (S (S (S Zero))))
Ausführung der Berechnungsschritte (Tafel)
Nat ist mit dieser Addition
assoziativ, kommutativ, add Zero x = x
Nachweis durch strukturelle Induktion (Tafel)
Definition weiterer Operationen: Multiplikation, Potenz
31
Strukturelle Induktion
Induktive Definition strukturierter Daten (rekursive Datentypen):
IA: Basisfälle
IS: rekursive Fälle, Vorschrift zur Konstruktion
zusammengesetzter Daten
Induktive Definition von Funktionen über strukturierten Daten:
IA: Definition des Funktionswertes für Basisfälle
IS: Berechnung des Funktionswertes der
zusammengesetzten Daten aus den Funktionswerten
der Teile
Prinzip der strukturellen Induktion
zum Nachweis einer Aussage A über strukturierte Daten:
IA: Nachweis, dass A für alle Basisfälle gilt
I Hypothese (Voraussetzung): A gilt für Teildaten
IS:
I Behauptung: A gilt für aus Teildaten
zusammengesetzte Daten
I Induktionsbeweis: Nachweis, dass Behauptung
aus Hypothese folgt.
32
Strukturelle Induktion – Beispiele
N : Pni=0 i = n(n + 1)/2
I
∀n ∈
I
Jede Formel aus AL(P) hat wenigstens eine Teilformel.
I
+ und · auf
I
Die Länge der Verkettung zweier Listen ist die Summe der
Längen beider Listen.
I
inorder-Durchquerung jedes binären Suchbaumes ist
sortiert.
I
insert auf binären Suchbäumen erhält
Suchbaum-Eigenschaft.
N sind assoziativ, kommutativ
33
Herunterladen