430 likes | 651 Views
Modellierung und Programmierung 1 . Theoretische Grundlagen der funktionalen ProgrammierungOperationale Semantik des ?-Kalkls (Fortsetzung der letzten VO)Einfhrung in die funktionale Programmierung mit HaskellBestandteile von Haskell-ProgrammenArbeitsumgebung, Haskell-SystemeDatentypen in Ha
E N D
1. 15.04.2012 Modellierung und Programmierung 1 Professur für Angewandte Telematik / e-Business
Institut für Informatik
Universität Leipzig
Stiftungsprofessur der DTAG
info@ebus.informatik.uni-leipzig.de
www.lpz-ebusiness.de
+49 (341) 97 323 30
2. Modellierung und Programmierung 1 Theoretische Grundlagen der funktionalen Programmierung
Operationale Semantik des ?-Kalküls (Fortsetzung der letzten VO)
Einführung in die funktionale Programmierung mit Haskell
Bestandteile von Haskell-Programmen
Arbeitsumgebung, Haskell-Systeme
Datentypen in Haskell
Funktionen in Haskell
Professur für Angewandte Telematik/e-Business Inhalt der heutigen Vorlesung 2
3. Theoretische Grundlagen
der funktionalen Programmierung:
Das ?-Kalkül
4. Operationale Semantik des ?-Kalküls Die Bedeutung einer ?-Abstraktion ändert sich nicht, wenn wir ihre formalen Parameter konsistent umbenennen, d.h. alle gebundenen Vorkommen des Parameters ebenfalls umbenennen:
(?x. × x 2) ? a-Konversion ?(?y. × y 2)
formal
?x.e ? a-Konversion ??y.e[y/x] wenn y nicht frei in e ist
a-Konversion ist manchmal unerlässlich, um Namenskollisionen und somit fehlerhafte Reduktionen zu vermeiden. 4 Professur für Angewandte Telematik/e-Business a-Konversion
5. Operationale Semantik des ?-Kalküls 5 Professur für Angewandte Telematik/e-Business a-Konversion. Beispiel
6. Operationale Semantik des ?-Kalküls Der Kern des ?-Kalküls bietet keine Konstanten (wie 1, “Hallo", True) oder vorde?nierte Funktionen (wie +, *).
d-Reduktion
eine Reduktion einiger vorde?nierter Funktionen
(+ x y) ? x _+_ y
(* x y) ? x _*_ y
(and False e) ? False
(and True e) ? e
etc.
Operationen wie _+_ sind direkt auf der Zielmaschine ausführbar. 6 Professur für Angewandte Telematik/e-Business d-Reduktion
7. ?-Kalkül ? Haskell Das ?-Kalkül mit der operationalen Semantik (a-Konversion, ß-Reduktion und d-Reduktion) ist ausreichend, um als Zielsprache für alle funktionalen Programmiersprachen zu dienen.
Haskell istein syntaktisch angereichertes ?-Kalkül. 7 Professur für Angewandte Telematik/e-Business
8. Einführung in die funktionale
Programmierung mit Haskell
9. Motivation „The clarity and economy of expression that the language of functional programming permits is often very impressive, and, but for human inertia, functional programming can be expected to have a brilliant future, the more so because today's computers admit quite efficient implementations of functional programming languages.“
Eine Prognose von Dijkstra 9 Professur für Angewandte Telematik/e-Business
10. Übersetzungsschema funktionaler Sprachen Programme in funktionalen Sprachen werden als Terme aufgefasst. Sie können durch einen Interpreter ausgeführt werden.
Vor der Interpretation werden sie einer Vorverarbeitung oder Übersetzung unterworfen, die sie in eine für die Interpretation geeignete interne Darstellung überführt und zugleich wichtige Konsistenzeigenschaften (u.a. Typkonsistenz) des Programms feststellt. 10 Professur für Angewandte Telematik/e-Business
11. Statische und dynamische Programm-eigenschaften Unterscheidung von statischen und dynamischen Eigenschaften eines Programms:
statisch: Eigenschaften, die in der Vorverarbeitung ohne Ausführung des Programms festgestellt werden.
Bei funktionalen Sprachen: Typkonsistenz.
dynamisch: Alle Eigenschaften, die erst bei Vorliegen eines aktuellen Ausdrucks als Eingabe festgestellt werden, etwa das Terminieren einer Programmausführung. 11 Professur für Angewandte Telematik/e-Business
12. Übersetzungsschema funktionaler Sprachen 12 Professur für Angewandte Telematik/e-Business Verknüpfung zum ?-Kalkül
13. Übersetzungsschema von Haskell-Programmen 13 Professur für Angewandte Telematik/e-Business
14. Haskell Systeme Hugs = Haskell User’s Gofer System; Gofer = Good for equational reasoning
Die am weitesten verbreitete Haskell-Implementierung
Gut geeignet für Lehre und Prototyp-Entwicklung
Verfügbar unter: www.haskell.org./hugs
Start in der Kommandozeile mit hugs 14 Professur für Angewandte Telematik/e-Business Der Hugs-Interpreter
15. Haskell Systeme Der am weitesten verbreitete Compiler.
Sehr umfangreiches System, viele Erweiterungen.
Besitzt auch Interpreter-Frontend. Weitgehend Hugs-kompatibel.
Verfügbar im Web unter: www.haskell.org./ghc/
Start in der Kommandozeile mit ghci 15 Professur für Angewandte Telematik/e-Business Der Glasgow-Haskell Compiler GHC
16. Auswerten von Ausdrücken in Hugs/GHCI Einen Ausdruck auszuwerten bedeutet, ihn zu einem Wert zu reduzieren.
Ein Haskell-Interpreter (hugs/ghci) erwartet als Eingabe einen auszuwertenden Ausdruck.
Die Eingabeaufforderung „>“ bedeutet, dass das System dazu bereit ist, Ausdrücke auszuwerten. 16 Professur für Angewandte Telematik/e-Business
17. Die Standard-Bibliothek „Prelude“ In der Bibliotheksdatei Prelude.hs ist eine große Menge von Standard-Funktionen vorde?niert.
Neben den üblichen numerischen Funktionen gehören dazu u.a. auch viele nützliche Funktionen für die Verarbeitung von Listen. > head [1,2,3,4,5]
1
> [1,2,3,4,5] !! 2
3
> length [1,2,3,4,5]
5
> tail [1,2,3,4,5]
[2,3,4,5]
> sum [1,2,3,4,5]
15
> [1,2,3] ++ [4,5]
[1,2,3,4,5] 17
18. Haskell Skripte Genau wie die Funktionen von „Prelude.hs“ kann man auch eigene, neue Funktionen de?nieren.
Neue Haskell-Funktionen werden in einem Skript definiert - eine Textdatei, die eine Folge von Funktionsde?nitionen enthält.
Als Konvention verwenden Haskell-Skripte das Suf?x .hs im Dateinamen.
Bei der Entwicklung eines Skripts arbeitet man typischerweise mit zwei Fenstern: in einem Fenster wird das Skript mit einem Editor entwickelt, im anderen Fenster läuft der Hugs-Interpreter. 18 Professur für Angewandte Telematik/e-Business
19. Layout-Regeln für Haskell-Skripte a = b + c
where
b = 1
c = 2
d = a * 2 19 Professur für Angewandte Telematik/e-Business
20. Anforderungen an Namen Funktionen und Funktionsargumenten müssen mit einem Kleinbuchstaben beginnen:
Schlüsselwörter sind von Haskell reserviert und können nicht als Funktionsnamen bzw. Namen für Funktionsargumente verwendet werden
case class data default deriving do else if import in in?x in?xl in?xr instance let module newtype of then type where
Kommentare
20 Professur für Angewandte Telematik/e-Business
21. Fehler 21 Professur für Angewandte Telematik/e-Business Typische Fehlermeldungen in Hugs
22. Nützliche Hugs-Befehle 22 Professur für Angewandte Telematik/e-Business
23. Datentypen in Haskell
24. Datentypen in Haskell Typen sind Mengen von Objekten, die den gleichen Aufbau besitzen.
Ein Typ de?niert
eine Menge von gleichartigen Objekten (Wertevorrat, „Domain“) und
Operationen, die auf diese Objekte anwendbar sind.
Beispiel
Der Datentyp Bool enthält zwei logische Werte False und True.
Der Typ Bool -> Bool beinhaltet alle Funktionen mit Parameter Bool und Ergebnis Bool, z.B. die Negationsfunktion
:type not
not :: Bool -> Bool
Die Notation x :: a (x ist vom Typ a) wird vom Haskell-Compiler eingesetzt, um anzuzeigen, dass das Objekt x den Typ a besitzt. 24 Professur für Angewandte Telematik/e-Business
25. Typen in Haskell Jeder wohlgeformte Ausdruck in Haskell besitzt einen Typ. Dieser Typ kann in Haskell zur Übersetzungszeit automatisch ausgerechnet werden. Das Verfahren heißt Typinferenz. Typinferenz 25 Professur für Angewandte Telematik/e-Business
26. Typen in Haskell Haskell-Programme sind typsicher (type safe); es können keine Typfehler zur Zeit der Programmausführung auftreten.
Alle Typfehler werden unter Haskell zur Übersetzungszeit gefunden. Dadurch werden Programme sicherer und schneller, da Typchecks zur Laufzeit nicht mehr benötigt werden.
Typkorrektheit bedeutet nicht, dass ein Programm überhaupt keine Fehler mehr hat. Typsicherheit 26 Professur für Angewandte Telematik/e-Business
27. Grundlegende Typen in Haskell Bool - Wahrheitswerte
True , False
Char - Zeichen
'a', ‘B', ‘7', '_', '\n‘
String - Zeichenketten (Listen von Zeichen)
"", "foo“
Int - Ganze Zahlen mit festgelegter Stellenzahl
minBound :: Int
-2147483648
maxBound :: Int
2147483647
Integer - Ganze Zahlen mit beliebiger Genauigkeit
Float - Gleitkommazahlen (einfache Genauigkeit)
27 Professur für Angewandte Telematik/e-Business
28. Listentypen Eine Liste ist eine Folge von Werten des selben Typs:
[ False , True , False ] :: [ Bool ]
[ ’a’, ’b’, ’c’, ’d’ ] :: [ Char ]
Listenlänge (length) = die Anzahl der Elemente in einer Liste.
length [] -- leere Liste
0
length [ False , True ]
2
Der Typ einer Liste sagt nichts über deren Länge aus:
[ False , True ] :: [ Bool ]
[ False , True , False ] :: [ Bool ]
Die Elemente einer Liste können von beliebigem Typ sein.
Zum Beispiel sind auch Listen von Listen möglich:
[ [ ’a’ ], [ ’b’, ’c’ ] ] :: [ [ Char ] ] 28 Professur für Angewandte Telematik/e-Business
29. Listentypen Leere Liste: [ ]
Anhängen eines Elements vor einer Liste: Operator „:“
Verkettung von Listen: Operator „++“
Konstruieren von Listen 29 Professur für Angewandte Telematik/e-Business
30. Listentypen Es gibt mehrere Möglichkeiten, Listen auf komprimierte Weise zu beschreiben:
Für Elementtypen, die Aufzählungstypen sind:
[n..m]
bedeutet eine Liste [n,n+1,...,m]
z.B.: [1..5] bedeutet [1,2,3,4,5]
Listenkomprehensionen
Konstruktion neuer Listen aus bereits vorhandenen Listen.
Konstruieren von Listen 30 Professur für Angewandte Telematik/e-Business
31. Listentypen Eine Mengenkomprehension erlaubt es, neue Mengen aus bereits gegebenen Mengen zu konstruieren.
31 Professur für Angewandte Telematik/e-Business Eine Listenkomprehensionen erlaubt es, neue Listen aus bereits vorhandenen Listen zu konstruieren.
32. Listentypen Ein Generator beschreibt, wie nacheinander die Werte für eine Laufvariable - hier x - erzeugt werden.
Für alle vom Generator gelieferten Laufvariablenwerte wird das Ergebnis des Resultatausdrucks in der neuen Liste gesammelt.
Eine Listenkomprehension kann mehrere mit Kommas getrennte Generatoren besitzen: Listenkomprehensionen: Bestandteile 32 Professur für Angewandte Telematik/e-Business
33. Listentypen Beispiel einer Listenkomprehension 33 Professur für Angewandte Telematik/e-Business
34. Listentypen Listenkomprehension ist oft eine geeignete Technik, um Funktionen zu definieren.
Beispiele
Listenkomprehensionen in Funktionen 34 Professur für Angewandte Telematik/e-Business
35. Tupel-Typen Ein Tupel ist eine Folge von Werten mit (möglicherweise) unterschiedlichen Typen:
(False , True ) :: (Bool , Bool )
(False , ’a’, True ) :: (Bool , Char , Bool )
Der Typ eines Tupels legt fest, wie viele Komponenten es besitzt:
(False,True) :: (Bool,Bool)
(False,True,False) :: (Bool,Bool,Bool)
Die Komponenten eines Tupels können alle beliebige unterschiedliche Typen besitzen:
('a',(False, ‘b')) :: (Char,(Bool,Char))
(True,['a', 'b']) :: (Bool,[Char])
35 Professur für Angewandte Telematik/e-Business
36. Listentypen vs. Tupel-Typen [ T ] ist der Typ von Listen, die Elemente des Typs T enthalten. 36 Professur für Angewandte Telematik/e-Business (T1 , T2 , . . . , Tn ) ist der Typ eines Tupels, dessen i-te Komponente den Typ Ti besitzt. Der Typ einer Liste sagt nichts über die Anzahl der Elemente aus. Der Typ eines Tupels legt die Anzahl der Elemente fest.
37. Funktionen in Haskell
38. Beispiel: Sieb des Eratosthenes 1. Nimm die aktuelle Liste aller Zahlen.[ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 · · ·]
Die erste Zahl in dieser Liste ist eine Primzahl. Markiere alle Vielfache dieser Zahl2 [ 3 4 5 6 7 8 9 10 11 12 13 14 15 · · ·]
und entferne sie aus der Liste2 [ 3 5 7 9 11 13 15 · · ·]
weiter mit 1 1. Idee 38 Professur für Angewandte Telematik/e-Business
39. Beispiel: Sieb des Eratosthenes 1. Nimm die aktuelle Liste aller Zahlen.2 [ 3 5 7 9 11 13 15 · · ·]
Die erste Zahl in dieser Liste ist eine Primzahl. Markiere alle Vielfache dieser Zahl2 3 [ 5 7 9 11 13 15 · · ·]
und entferne sie aus der Liste2 3 [ 5 7 11 13 · · ·]
weiter mit 1 1. Idee 39 Professur für Angewandte Telematik/e-Business
40. Beispiel: Sieb des Eratosthenes Wie sieht die Liste aller Primzahlen aus? 2. Suche nach einer Abstraktion 40 Professur für Angewandte Telematik/e-Business
41. Beispiel: Sieb des Eratosthenes 2. Suche nach einer Abstraktion 41 Professur für Angewandte Telematik/e-Business
42. Beispiel: Sieb des Eratosthenes 3. Anwenden der Abstraktion für die Lösung 42 Professur für Angewandte Telematik/e-Business
43. Beispiel: Sieb des Eratosthenes Folgende Haskell-Funktionen werden im Texteditor definiert:
Die Funktion sieve sucht Primzahlen nach dem Eratosthenes-Algorithmus.
Die Funktion primes ruft die bereits bekannte Funktion sieve auf.
4. Implementierung der Lösung 43 Professur für Angewandte Telematik/e-Business
44. Beispiel: Sieb des Eratosthenes Die Lösung kann durch einen Interpreter in der Konsole ausgeführt werden. Bevor die bereits definierte Funktion primes gestartet werden kann, soll das entsprechende Skript geladen werden. 5. Anwendung der Lösung 44 Professur für Angewandte Telematik/e-Business