Deklarative Programmierung Sibylle Schwarz Westsächsische Hochschule Zwickau Dr. Friedrichs-Ring 2a, RII 263 http://wwwstud.fh-zwickau.de/~sibsc/ [email protected] WS 2009/2010 Motivation .. there are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult. Tony Hoare, 1980 ACM Turing Award Lecture Einordnung der LV in die Informatik Informatik Lehre von Darstellung und Verarbeitung von Information Anteil der Teilgebiete: I theoretische Grundlagen: Prädikatenlogik, λ-Kalkül I technische Informatik I praktische Informatik: Programmierung (z.B. deklarativ) I angewandte Informatik Programmierung deklarativ (beschreibend) Programm: Repräsentation eines Problems Programmelemente: Ausdrücke Programmierung: Modellierung der Aufgabe Ausführung: Lösung des beschriebenen Problems durch Umformung von Ausdrücken imperativ zustandsorientiert (von-Neumann-Typ) Programm: Repräsentation eines Algorithmus Programmelemente: Ausdrücke und Anweisungen Programmierung: Modellierung eines Verfahrens zur Lösung einer Aufgabe Ausführung des Lösungsverfahrens durch schrittweise Zustandsänderungen (Speicherbelegung) Programmierstil We are all shaped by the tools we use, in particular: the formalisms we use shape our thinking habits, for better or for worse, and that means that we have to be very careful in the choice of what we learn and teach, for unlearning is not really possible. (Many years ago, if I could use a new assistant, one prerequisite would be No prior exposure to FORTRAN", and at high schools in Siberia, the teaching of BASIC was not allowed.) Edsger W. Dijkstra aus E. W. Dijkstra Archive http://www.cs.utexas.edu/~EWD/ Modellierung von Aufgaben Modell: I Menge von strukturierten Objekten mit I Eigenschaften (einstellige Relationen) und I Beziehungen (mehrstellige Relationen, Funktionen) Modellierung: Beschreibung der Struktur, Eigenschaften und Beziehungen der Objekte in einer Sprache. verschiedene Möglichkeiten, z.B: I Diagramm (graphische Darstellung) I Ausdrücke: Terme, logische Formeln (Zeichenkette, Baumstruktur) I Programmiersprache (Zeichenkette, Baumstruktur) Deklarative Programmierung Grundidee: Jedes Programm ist ein mathematisches Objekt mit einer bekannten wohldefinierten Semantik funktionale Programmierung (Haskell) Programm = Menge von Funktions-Definitionen (Gleichungen zwischen Termen) Ausdruck Ausführung Termersetzung (Auswertung des Ausdruckes) logische Programmierung (Prolog) Programm = Menge logischer Formeln (Horn-Klauseln) Ausführung SLD-Resolution funktional-logische Programmierung (Mercury) Kombination funktionaler und logischer Konzepte Constraint-Programmierung Programm = Menge logischer Formeln (Gleichungen) Ausführung Constraint-Löser Organistation der Lehrveranstaltung PTI891 I 2 Vorlesungen aller 2 Wochen I 1 Praktikum aller 2 Wochen (Prüfungsvorleistung) I alternative Prüfungsleistung Präsentation / Vortrag: andere deklarative Sprachen (Prinzipien, Praktikum-Beispiele, Anwendungen, Vergleich mit in LV vorgestellten Sprachen) I I I I I funktional (OCAML) funktional-logisch (Curry) deklarative Konzepte in imperativen Sprachen (z.B. C# , OpenQuark) SAT-Solver Constraint-Solver Funktionale Programmierung Idee: Programm besteht aus I einer Menge von Funktionsdefinitionen (Termgleichungen) I einem Ausdruck Vorteile: I I I deklarativ: Jedes funktionale Programm beschreibt ein Problem, nicht dessen Lösung Funktionen sind Daten (ermöglicht Funktionen höherer Ordnung) Rein funktionale Programme sind zustandsund damit nebenwirkungsfrei, daher I I I I Korrektheit einfach nachprüfbar (Verifikation) einfache modulare Konstruktion einfach parallelisierbar Programm repräsentiert seine Semantik (ausführbare Spezifikation, geeignet für rapid Prototyping) Geschichte ab ca. 1930 ab ca. 1950 ab ca. 1960 ab ca. 1970 ab 1987 Alonzo Church John McCarthy Peter Landin John Backus Robin Milner David Turner λ-Kalkül LISP ISWIM FP ML Miranda Haskell Warum Haskell? I deklarativ, Nähe zum (mathematischen) Modell I keine Nebenwirkungen (klare Semantik) I Funktionen sind Daten (Funktionen höherer Ordnung) I starkes Typsystem I Typklassen I lazy evaluation (ermöglicht Rechnen mit unendlichen Datenstrukturen) I kompakte Darstellung (kurze Programme) I Modulsystem Beispiele Ausdruck 7 hat den Wert 7 Ausdruck 3 * 7 + 2 hat den Wert ? Ausdruck = Term (Baumstruktur) rekursive Berechnung des Wertes durch Termersetzung Beispiel verdoppeln :: Int -> Int verdoppeln x = x + x (Typdeklaration) (Funktionsdefinition) Ausdruck verdoppeln 3 hat I den Typ Int I den Wert 6 Ausdruck verdoppeln (3 * (verdoppeln 3)) - 5 hat I den Typ Int I den Wert ? Ausdruck verdoppeln hat I den Typ Int -> Int I den Wert x 7→ x + x (mathematische Notation) Entwicklung von Haskell-Programmen Entwicklungsumgebungen: I http://leksah.org/ I http://eclipsefp.sourceforge.net/ I http://www.haskell.org/visualhaskell/ Real Programmers (http://xkcd.com/378/) I Quelltext im Editor emacs Foo.hs I Interpreter ghci Foo.hs I Interpreter: Ausdrücke auswerten I Editor: speichern, Interpreter: neu laden (:r)