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