P .L an d in

Werbung
Monika Sturm
Sommersemester 2013
TU Dresden
Monika Sturm
1
1. Einführung
FUNKTIONALE PROGRAMMIERUNG
UND
TYPTHEORIE
LV Funktionale Programmierung und Typtheorie
Monika Sturm
http://lat.inf.tu-dresden.de/teaching/ss2013/FPT/
2
1. Einführung
Die Lehrveranstaltung wird in den Studiengängen Bachelor Informatik, Master
Informatik und Diplom Informatik angeboten. Die mündliche Prüfung erfolgt
unter den Bedingungen, die in den Prüfungsordnungen festgeschrieben sind.
Informationen zur Lehrveranstaltung
Vorlesung
Mittwoch, 4. DS, INF/E06
Übung
Donnerstag, 3. DS, INF/E06
Lehrbeauftragte
Dr. Monika Sturm
INF/3023, [email protected]
Organisation
LV Funktionale Programmierung und Typtheorie
Monika Sturm
7. Monaden
6. Verifikation und Programmtransformation
5. Fortgeschrittene Konzepte
4. Polymorphie und Typinferenz
3. Grundkonzepte und Datenstrukturen
2.3 Curry-Howard-Isomorphismus
2.2 Getypter Lambda–Kalkül
2.1 Ungetypter Lambda–Kalkül
2. Lambda–Kalkül
1.2 Entwicklung von Programmiersprachen
1.1 Geschichte der Typtheorie
1. Einführung
Gliederung der Vorlesung
LV Funktionale Programmierung und Typtheorie
3
1. Einführung
Monika Sturm
• Beweise als Programme (Terme des getypten λ-Kalküls)
⇒ Korrespondenz zwischen Aussagen und Typen.
⇒ Curry-Howard-Isomorphismus
• Es existiert ein Isomorphismus zwischen Beweisen (des natürlichen Schliessens) und Termen des getypten λ-Kalküls.
• Was versteht man unter intuitionistischer Logik? Was versteht man unter
einem getypten λ-Term?
• sowie zwischen Beweisen mittels intuitionistischer Logik und Termen des
getypten λ-Kalküls.
4
1. Einführung
• zwischen dem Beweis eines Satzes und dem Berechnen einer Funktion,
(Beachte: Ein funktionales Programm berechnet eine Funktion.)
Es existieren Zusammenhänge
LV Funktionale Programmierung und Typtheorie
Monika Sturm
• Untersuchung getypter Sprachen hinsichtlich ihrer Ausdrucksstärke und
Flexibilität.
• Zusammenhang von Propositionen und Mengenkonstruktionen als CurryHoward-Isomorphismus (Aussagen = Typen).
• P. Landin: die nächsten 700 Programmiersprachen sind Erweiterungen des
λ-Kalküls.
• Typisierung des λ-Kalküls in mehreren Stufen, Church’s Theory of Types.
• Einführung von Typen in der Mengenlehre, Vermeidung von paradoxen
Konstruktionen (1908 Theory of Types von Russell).
• Programmieren und mathematisches Beweisen fallen zusammen.
5
1. Einführung
• Typtheorie = funktionale Programmiersprache mit ausdrucksstarken Typen
Zum Inhalt der Vorlesung
LV Funktionale Programmierung und Typtheorie
Monika Sturm
• Typtheorie wird angewendet bei der Konzeption von Sprachen, die zur
Formulierung mathematischer Aussagen und Theorien entwickelt werden.
• Zeitraum 1960 – 1990 : AUTOMATH (de Bruijn), polymorpher λ-Kalkül
(Girard, Reynolds), Martin–Löf–Typtheorie, polymorphes Typsystem und
automatische Typinferenz (Paulson, Milner).
• Zeitraum 1936 – 1940 : ungetypter Lambda–Kalkül (Church, 1940) eignete
sich nicht als Grundlage für die Beschreibung mathematischer Aussagen,
notwendige Erweiterung mit Typen führte zur Definition des einfach getypten Lambda–Kalküls.
6
1. Einführung
• Zeitraum 1910 – 1950 : erste Arbeiten durch Russel, Schönfinkel, Church
und Henkin zu getypten Sprachen und Funktionen höherer Ordnung.
Entwicklung der Typtheorie
LV Funktionale Programmierung und Typtheorie
Monika Sturm
• eine Aussage ist entweder wahr oder falsch, ein Drittes gibt es nicht.
7
1. Einführung
• im Gegensatz zum Intuitionismus gilt der Satz vom ausgeschlossenen Dritten (tertium non datur) als gegeben,
• ist eine formale Logik,
• umfaßt die Aussagen- und Prädikatenlogik,
Klassische Logik
Entwicklung der Typtheorie
LV Funktionale Programmierung und Typtheorie
Monika Sturm
• Aus der Herleitung läßt sich ein Programm ableiten.
• nur für berechenbare Funktionen kann man ⊢ ∀x.∃y.R(x, y) zeigen.
• nur für entscheidbare Prädikate kann man ⊢ ∀x.P (x) ∨ ¬P (x) zeigen und
• Existenz- und Disjunktionseigenschaft gelten für die intuitionistische Herleitbarkeit,
Intuitionistische Logik
• zwischen berechenbaren und nicht-berechenbaren Funktionen wird nicht
unterschieden.
8
1. Einführung
• zwischen entscheidbaren und unentscheidbaren Prädikaten wird nicht unterschieden,
• Existenz- und Disjunktionseigenschaft gelten nicht,
Klassische Logik
LV Funktionale Programmierung und Typtheorie
Monika Sturm
WANN IST EINE AUSSAGE BEWEISBAR?
• Intuitionistische Logik
WANN IST EINE AUSSAGE WAHR?
• Klassische Logik
Zentrale Fragestellungen in der Logik
LV Funktionale Programmierung und Typtheorie
9
1. Einführung
Monika Sturm
• Zentrales Anliegen der funktionalen Programmierung und ihrer Sprachen
ist es, etwas von der Eleganz, Klarheit und Präzision aus der Welt der
Mathematik in die Welt der Programmierung einfließen zu lassen.
• Funktionale Programmiersprachen werden auch in der Praxis zunehmend
an Bedeutung gewinnen. Unter ihrem Einsatz läßt sich die Produktivität
in der Softwareherstellung steigern.
• Es ist sinnvoll, in der Ausbildung von Informatikern, Sprachen und Konzepte unterschiedlicher Sprachparadigmen zu präsentieren. Dadurch werden Studenten in die Lage versetzt, unterschiedliche Denkweisen für die
Lösung von Problemen einzubringen.
10
1. Einführung
• Funktionale Programmierung und imperative Programmierung unterscheiden sich in ihrer Herangehensweise bei der Erstellung von Software.
Merkmale der funktionalen Programmierung
LV Funktionale Programmierung und Typtheorie
Monika Sturm
• Ein Typ definiert eine Menge von gleichartigen Objekten und eine Menge
von Operationen, die auf diese Objekte anwendbar sind.
• In Haskell wie in anderen Programmiersprachen wird diese Intuition
mithilfe eines Typsystems formalisiert.
• Objekte verschiedener Mengen haben unterschiedliche Eigenschaften und
für die Objekte verschiedener Mengen sind unterschiedliche Operationen
sinnvoll.
11
1. Einführung
• Objekte, die im Programm eine Rolle spielen und die mit einer Programmiersprache manipuliert werden, unterteilt man intuitv in disjunkte Mengen, z. B. ganze Zahlen, Listen, Bäume und Funktionen.
Typsystem und Typ (umgangssprachlich)
LV Funktionale Programmierung und Typtheorie
Monika Sturm
• Henk P. Barendregt. Lambda Calculi with Types. In: S. Abramsky, Dov M.
Gabbay and T.S.E. Maibaum, Handbook of Logic in Computer Science;
Vol. 1: Background - Mathematical Structures, 1992.
ISBN 0-19-853735-2
• Benjamin Pierce. Types and Programming Languages. The MIT Press,
2002. ISBN 0-262-16209-1
• Roger Hindley. Basic Simple Type Theory. Cambridge University Press,
1997.
ISBN 0-521-46518-4
12
1. Einführung
• Peter Andrews. Classical Type Theory. In: Alan Robinson und Andrei
Voronkov, Handbook of Automated Reasoning; Elsevier, 2001.
ISBN 0-262-18223-8
Literatur zur Typtheorie
LV Funktionale Programmierung und Typtheorie
Monika Sturm
• der λ-Kalkül, auf dessen Grundlage funktionale Sprachen wie ML oder
Haskell konzipiert werden.
• die Turingmaschine, verwandt mit imperativen Sprachen wie Pascal oder
C und
Zwei bekannte Modelle sind
• Andererseits müssen sie einfach sein, um Sätze und Beweise nicht unnötig
komplex werden zu lassen.
• Formale Modelle müssen einerseits ausreichend mächtig sein, damit Programmiersprachen auf sie zurückgeführt werden können. Zu beachten:
Mächtigkeit im Sinne von Berechenbarkeit.
13
1. Einführung
Um effizient mit Programmiersprachen umgehen zu können, werden sie im
Zusammenhang mit formalen Modellen betrachtet.
Programmiersprachen
LV Funktionale Programmierung und Typtheorie
Monika Sturm
• deklarative Programmiersprachen, in denen Programme eher Problembeschreibungen als Anweisungen darstellen
(lat. declarare = erklären).
• imperative Programmiersprachen, in denen Programme aus einer Folge
von Befehlen an den Rechner bestehen
(lat. imperare = befehlen) und
Auf der Basis ihrer Konzepte klassifiziert man bei höheren Programmiersprachen
14
1. Einführung
Grundsätzlich werden Assemblersprachen und höhere Programmiersprachen
unterschieden.
Programmiersprachen
LV Funktionale Programmierung und Typtheorie
Monika Sturm
• objektorientierten Sprachen
(Smalltalk, Eiffel, C++ , C# u.a.)
• konventionellen Sprachen
(Pascal, Modula-2, Ada u.a.)
15
1. Einführung
Die imperativen Programmiersprachen unterteilt man weiterhin in die sogenannten
Imperative Programmiersprachen
LV Funktionale Programmierung und Typtheorie
Monika Sturm
• funktional-logischen Sprachen (Babel, Escher, Curry, Oz u. a.) führte.
In den letzten Jahren gab es außerdem viele Bestrebungen zur Integration
dieser beiden Klassen deklarativer Sprachen, die unter anderem zu den
sogenannten
• Logik–Sprachen, deren bekanntester Vertreter Prolog ist.
16
1. Einführung
• funktionalen Sprachen (Lisp, ML, Miranda, Haskell, Gofer u.a.) sowie
die
Zu den deklarativen Sprachen zählen die
Deklarative Programmiersprachen
LV Funktionale Programmierung und Typtheorie
Monika Sturm
• Hauptkontrollstruktur Rekursion
• Berechnung Manipulation von Werten
• Basis mathematische Theorie
. . . von deklarativen Sprachen
• Hauptkontrollstruktur Iteration (WHILE-Schleife)
17
1. Einführung
• Berechnung Programme als Abfolge von lokalen Speichertransformationen (Wertzuweisungen)
(Die Wertzuweisung x := x + 3 bewirkt die lokale Modifikation der Speicherzelle, die der Variablen x zugeordnet ist.)
• Basis Prinzip des von Neumann-Rechners
. . . von imperativen Sprachen
Merkmale
LV Funktionale Programmierung und Typtheorie
Monika Sturm
• Aufruf negierte Formel
• Programm Menge von Formeln
18
1. Einführung
• Berechnung Widerlegen von Formeln mittels Unifikation und Resolution
• Basis Hornklausellogik
. . . von logischen Sprachen
• Aufruf Applikation der Funktion auf Eingabewerte
• Programm Menge von Funktionsdefinitionen
• Berechnung Ersetzen von Termen nach bestimmten Regeln
• Basis λ-Kalkül von Church
. . . von funktionalen Sprachen
Merkmale
LV Funktionale Programmierung und Typtheorie
Monika Sturm
• Einsatz von Typisierung und Typinferenz zur effizienten Zielcodegenerierung.
• algebraische, polymorphe, abstrakte Datentypen,
• Auswertung der Programme über Termreduktion,
• Funktionen höherer Ordnung,
• Handhabung von Funktionen über (partielle) Applikation, Abstraktion
und Rekursion,
• Elemente funktionaler Programme sind Funktionen,
19
1. Einführung
• Variablen nach imperativer Sicht existieren nicht und damit keine Seiteneffekte, Grundlage für eine referentielle Transparenz
Merkmale funktionaler Programmierung
LV Funktionale Programmierung und Typtheorie
Monika Sturm
• klare mathematische Basis, Verifizierbarkeit, Sicherheit
• Möglichkeit zur parallelen Auswertung
• referentielle Transparenz
• Einsatz beim Rapid Prototyping
• Vorteile bei der Spezifikation von Software
• kürzere, modulare Programme
• problembezogene Programmierung, nicht maschinenorientiert
Vorteile funktionaler Programmierung
LV Funktionale Programmierung und Typtheorie
20
1. Einführung
Monika Sturm
• Crew-Scheduling bei LUFTHANSA
• Programmierung hochdynamischer Web-Server
• Telefon-Switches bei Ericsson
Aktuelle Beispiele (entsprechend von Veröffentlichungen)
Anwendung funktionaler Sprachen
LV Funktionale Programmierung und Typtheorie
21
1. Einführung
Monika Sturm
John Backus hielt anläßlich der Verleihung des Turing Awards an ihn eine
ACM Turing Award Lecture. Den Turing Award erhielt er vor allem für seinen Beitrag bei der Entwicklung der Programmiersprache Fortran. In seinem
Vortrag verweist er auf die großen Nachteile konventioneller (imperativer)
Sprachen und orientiert auf die Möglichkeiten unter Anwendung funktionaler Programmiersprachen.
(vollständiger Artikel in Comm. ACM, 21(8):613 - 641, 1978)
22
1. Einführung
Can Programming Be Liberated from the van Neumann Style?
A Functional Style and Its Algebra of Programs
J. Backus (Turing Award, 1977)
LV Funktionale Programmierung und Typtheorie
Monika Sturm
– neuer Dialekt: Clojure (direkte Compilierung in Java-Code)
– allerdings mit verschiedenen imperativen Konzepten, dass man funktionale Programmierung damit nicht lernen kann.
– es existieren unzählige Dialekte (z.B. Common Lisp, endgültiger Standard 1994; Scheme endgültiger Standard 2007;)
– vor allem in der Künstlichen Intelligenz noch heute weit verbreitet
– Entwicklung um 1960 durch John McCarthy (MIT),
• Lisp
• Basis ist der λ-Kalkül, der in den 1930er Jahren durch Alonzo Church
entwickelt wurde. Die Lehrveranstaltung beschäftigt sich insbesondere mit
verschiedenen getypten λ-Kalkülen.
23
1. Einführung
Zur Geschichte der funktionalen Programmierung und der
Entwicklung ihrer Sprachen
LV Funktionale Programmierung und Typtheorie
Monika Sturm
– neu: Konzept des Pattern Matching
– in den 1980er Jahren von Rod Burstall und David McQueen entwickelt
• HOPE
– neuere Entwicklungen: OCaml, Alice ML, F#
– SML - Standard ML, letzte Standardisierung 1997
– enthält ein eingeschränktes Zuweisungskonzept
– strenge Typbindung ohne die Notwendigkeit von Deklarationen
– Hintergrund: System LCF (zum automatischen Beweisen)
24
1. Einführung
– Mitte der 1970er Jahre Entwicklung durch Michael Gordon, Robin Milner u.a. (Edinburgh)
• ML (MetaLanguage)
LV Funktionale Programmierung und Typtheorie
1. Einführung
Monika Sturm
– Argumente der Funktionen werden in Haskell nur dann und nur soweit ausgewertet, wie sie gebraucht werden (Lazy Evaluation).
25
– In Haskell können Fallunterscheidungen in Funktionsdefinitionen durch
Pattern Matching erfolgen.
– Haskell ist streng typgebunden, Typdeklarationen sind nicht explizit
gefordert.
– Haskell besitzt ein polymorphes Typsystem.
– Haskell ist rein funktional, besitzt keine Wertzuweisung.
– Ende der 1980er Jahre von Paul Hudak, Philip Wadler u.a. entwickelt,
um die Aktivitäten zu bündeln und eine Vereinheitlichung zu erreichen.
• Haskell
– neu: Auswertungsstrategie Lazy Evaluation
– in den 1980er Jahren von David Turner entwickelt
• Miranda
LV Funktionale Programmierung und Typtheorie
Monika Sturm
– Multiparadigmen Sprache
• Scala
– sehr gute Unterstützung zur parallelen und verteilten Programmierung
• Erlang
– nicht-strikt, stark und statisch getypt, polymorphe Typen, higher-order
Funktionen, pure Sprache
• Clean
26
1. Einführung
Unbedingt erwähnt werden sollten folgende relativ neuen funktionalen Sprachen:
LV Funktionale Programmierung und Typtheorie
Monika Sturm
27
1. Einführung
• Compiler GHCi bzw. GHC, Webseite http://www.haskell.org/ghc
• wichtige Kommandos:
: load <filename> lädt die angebene Funktion
: reload
lädt die geänderte Funktion
: type <filename> typisiert das File
: ?
listet die Kommandos
: quit
verläßt das System hugs
• Aufruf mit hugs
• weitere Informationen unter http://www.haskell.org/hugs
• Haskell Users’ Gofer System (abgekürzt: Hugs)
• alle Infos auf der Webseite:http://www.haskell.org/
Einfache Benutzung von Haskell
LV Funktionale Programmierung und Typtheorie
Monika Sturm
Was anstelle von Wie!
• Im Vordergrund funktionaler Programmierung steht das
• Die angenehmen mathematischen Eigenschaften erleichtern eine Implementierung auf parallelen Rechnerarchitekturen.
• Sie sind einer mathematischen Behandlung einfacher zugänglich (Basis für
Korrektheitsbeweise, Verifikation und Analyse von Programmeigenschaften).
28
1. Einführung
• Funktionale Programme sind kürzer, einfacher zu verstehen und besitzen ein höheres Abstraktionsniveau als korrespondierende imperative Programme. Das Abstraktionsniveau ist nahe der Ebene von reinen Problemspezifikationen.
Zusammenfassung
LV Funktionale Programmierung und Typtheorie
Monika Sturm
• H. P. Barendregt. Lambda Calculi with Types. In: Abramsky, S.; Gabbay,
Dov.M.; Maibaum, T.S.E.: Handbook of Logic in Computer Science. Vol.
1: Background - Mathematical Structures, 1992.
29
1. Einführung
• H. P. Barendregt. The Lambda Calculus - Its Syntax and Semantics.
Studies in logics and the foundations of mathematics, Vol. 103. Elsevier
Science Publishers B.V., 1985.
Literatur zum Lambda–Kalkül
LV Funktionale Programmierung und Typtheorie
Monika Sturm
• P. Hudak. Conception, Evolution, and Application of Functional Programming Languages
ACM Computing Surveys, Vol.21, No.3, September 1989.
• P. Harrison, A. Field. Functional Programming,
Addison-Wesley, 1988.
• Paul Hudak. The Haskell School of Expression,
Cambridge University Press, 2000. ISBN 0-521-64408-9
• Richard Bird. Introduction to Functional Programming using Haskell,
2nd edition, Prentice Hall, 1998. ISBN 0-13-484346-0
30
1. Einführung
• Simon Thompson. Haskell - The Craft of Functional Programming, 2nd
edition, Addison-Wesley, 1999. ISBN 0-201-34275-8
Literatur zu funktionalen Sprachen
LV Funktionale Programmierung und Typtheorie
Monika Sturm
• http://lat.inf.tu-dresden.de/teaching/ss2013/FPT/
(Achtung: auf dieser Seite befinden sich sowohl das Lehrmaterial wie auch
alle aktuellen Informationen.)
• http://www.haskell.org
31
1. Einführung
Der bereits existierenden Vielfalt von funktionalen Programmiersprachen wurde eine Sprache entgegengestellt, die alle bewährten Konzepte inkorporiert und
als gemeinsame Basis für weitere Forschungsarbeiten im Bereich funktionaler
Programmiersprachen dienen soll. Haskell unterstützt eine enorme Breite
von Konzepten und zeichnet sich durch ein mächtiges Typsystem und eine
saubere Modellierung von interaktiven Ein- und Ausgaben aus.
Haskell–Compiler wurden in Yale, Glasgow und Göteborg entwickelt und
sind frei verfügbar.
Zielstellung der Entwicklung von Haskell
LV Funktionale Programmierung und Typtheorie
Monika Sturm
filter p []
= []
filter p (x:l) = x : ( filter p l ), p x
= filter p l, not ( p x )
quicksort []
= []
quicksort (x:l) = quicksort ( filter ( <x ) l ) ++
[x] ++
quicksort ( filter ( >=x ) l )
(Der Klassiker)
Beispiele - Quicksort-Algorithmus in Haskell
LV Funktionale Programmierung und Typtheorie
32
1. Einführung
Monika Sturm
PROCEDURE Quicksort;
PROCEDURE sort (L,R: CARDINAL);
VAR i, j, w, x, k : CARDINAL;
BEGIN
i:= L; j:= R; k:= (L+R) DIV 2;
x:= a[k];
REPEAT
WHILE a[i] < x DO i:= i+1 END;
WHILE a[j] > x DO j:= j-1 END;
IF i<= j THEN
w:= a[i]; a[i]:= a[j]; a[j]:= w;
i:= i+1; j:= j-1;
END
UNTIL i > j;
IF L < j THEN sort(L,j) END;
IF R > i THEN sort(i,R) END;
END sort;
BEGIN
sort(1,n)
END Quicksort;
Beispiele - Quicksort-Algorithmus in Modula 2
LV Funktionale Programmierung und Typtheorie
33
1. Einführung
:: (Ord a) => [a]->[a]->[a]
[] bs
= bs
as@(a:_) []
= as
as@(a:as’) bs@(b:bs’)
| a <= b
= a: my_merge as’ bs
| otherwise = b: my_merge as bs’
Monika Sturm
my_append :: [a]->[a]->[a]
my_append ys = fold (:) ys
(curryfiziert)
-- zwei Listen werden verkettet ([1,2],[3,4] -> [1,2,3,4])
my_merge
my_merge
my_merge
my_merge
-- zwei Listen werden gemischt und dabei sortiert
-- ([1,3,5],[2,4]) -> [1,2,3,4,5]
Beispiele zur Motivation
LV Funktionale Programmierung und Typtheorie
34
1. Einführung
Herunterladen