Einführung in die Funktionale Programmierung mit Haskell

Größe: px
Ab Seite anzeigen:

Download "Einführung in die Funktionale Programmierung mit Haskell"

Transkript

1 Typsysteme Typisierung Polymorphie Typinferenz Einführung in die Funktionale Programmierung mit Haskell Typsysteme & Typinferenz LFE Theoretische Informatik, Institut für Informatik, Ludwig-Maximilians Universität, München 12. Juni 2013

2 Typsysteme Typisierung Polymorphie Typinferenz Planung Klausur: h Vorläufige Planung: Mi Vorlesung Do Vorlesung Fr Übung 17. Apr Apr Apr Apr Apr Apr Mai Mai Mai Mai Mai Mai Mai Mai Mai Mai Mai Mai Mai Mai Mai Jun Jun Jun Jun Jun Jun Jun Jun Jun Jun Jun Jun Jul Jul Jul Jul Jul Jul Jul Jul Jul 13 Sollumfang: 3+2 Raumbuchung: Termine, davon 3 Feiertage 4 Übung nachholen 6 Entfällt 1 Klausurtermin = 20V + 12Ü

3 Typsysteme Typisierung Polymorphie Typinferenz Typprüfung Wir haben bisher behauptet: Das statische Typsystem von Haskell prüft während dem Kompilieren alle Typen: Keine Typfehler und keine Typprüfung zur Laufzeit Kompiler findet bereits viele Programmierfehler Kompiler kann besser optimieren Well-typed programs can t go wrong! R. Milner Heute klären wir: Was genau sind Typfehler? Was ist der Unterschied zwischen getypten und ungetypten Sprachen? Wie bestimmt man den Typ eines Programmes?

4 Typsysteme Typisierung Polymorphie Typinferenz Typfehler Offensichtlich machen folgende Ausdrücke keinen Sinn: "Hello" * True a False && (\x -> "error") (*) 1 (+) (\f -> f 42) 69 if 3 * x then 42 else "nothing" Ist dies wirklich offensichtlich? Wie formalisieren wir die Intuition, welche Ausdrücke korrekt sind? Wie ist das in anderen Sprachen?

5 Typsysteme Typisierung Polymorphie Typinferenz Typsysteme in der Praxis In der Praxis gibt es durchaus unterschiedliche Ansätze zum Einsatz von Typsystemen in der Programmierung. Was passiert bei der Auswertung von (\f -> f 42) 69? Keine Typprüfung: 69 wird als Sprungaddresse interpretiert. Systemabsturz oder schwere Betriebssystem-Ausnahme möglich. Dynamische Typprüfung: Werte tragen zur Laufzeit Typ-Markierung Ganzzahl, Funktion,... Da 69 keine Funktion ist, wird eine Ausnahme im Laufzeitsystem geworfen. Statische Typprüfung: Der Übersetzer weigert sich, ein Programm mit Typfehlern zu übersetzen. Es kommt nie zu derartigen Laufzeitfehlern.

6 Typsysteme Typisierung Polymorphie Typinferenz Typsysteme in der Praxis Unterschiedliche Ansätze zum Einsatz von Typsystemen: Keine Typprüfung: Assembler Schnelle Ausführung; Viel Freiheit für Programmierer Keinerlei Sicherheit; Schwere Fehler möglich Dynamische Typprüfung: LISP, Scheme, BASIC, Skriptsprachen: JavaScript, Python Viel Freiheit für Programmierer Ständige Typrüfung zur Laufzeit verlangsamt Ausführung Statische Typprüfung: Haskell, SML, Ocaml, Scala, Eingeschränkt: C, Java Kompiler schliesst viele Fehler von vorn herein aus Eingeschränkte Freiheit beim Programmieren; Langwierige Fehlermeldung nerven beim Kompilieren

7 Programmausdrücke Zur Vereinfachung betrachten wir nur ein Haskell-Fragment. Der λ-kalkül (1936, Alonzo Church( )) beschreibt den funktionalen Kern von Haskell. Ein Programmausdruck e im Lambda-Kalkül ist: e ::= x Variable foo c Konstante e 1 e 2 Anwendung sqrt 5.0 λx.e Funktionsabstraktion (\x -> e) (e wie expression, engl. für Ausdruck ) Der Einfachheit verwenden wir die Haskell-Syntax Weitere Haskell-Ausdrücke werden nach Bedarf hinzugenommen Infix-Operatoren schreiben wir hier meist in präfix Notation, also (+) 2 7 anstatt 2 + 7

8 Typausdrücke Ein Typausdruck A is definiert durch: A, B ::= α β... Typvariable a, b Int Double String... Basistyp A B Funktionstyp Int -> Bool Wir beschränken uns auf Grund- und Funktionstypen; also keine Listen, keine Typklassen, etc. Funktionstypen sind weiterhin implizit rechts-geklammert: A B C = A (B C) (A B) C Eventuell verwenden wir Abkürzungen für Basistypen I, D, S,... anstatt Int, Double, String,....

9 Typzuweisung Eine Typzuweisung e::a ist ein Paar, bestehend aus einem Programmausdruck e und einen Typausdruck A, interpretiert als Aussage e hat Typ A 4 :: Int wahr true :: String falsch 3.3 :: a falsch \x -> x - 1 :: Int-> Int wahr \x y -> x :: a -> b -> a wahr \x y -> y :: a -> b -> a falsch z (x + 0) :: Bool??? Typzuweisungs-Aussagen können wahr oder falsch sein In der Literatur wird oft e::a anstatt e::a geschrieben Der Typausdruck z (x + 0) enthält unbekannte, freie Variablen x und z, deren Typ wir nicht kennen

10 Typkontext Ein Typ(isierungs)kontext Γ ist eine endliche Menge von Typzuweisungen Γ = {x 1 ::A 1,... x n ::A n } (n 0) wobei die Typvariablen x i paarweise verschieden sein müssen. (engl. typing context/environment) {x::bool, y::int Int} gültig {z::int Bool, x::int} gültig {h::int Bool, h::int} ungültig Γ ist endliche Abbildung von Variablen x auf Typen Γ(x) Die Reihenfolge der Typzuweisungen in Γ ist unbedeutend Wir schreiben Γ, x::a um x::a in Γ einzufügen; falls x dom(γ) dann ist Γ, x::a undefiniert

11 Typisierung Ein Typurteil ist eine Aussage der Form: Unter der Annahme, dass Variablen die in Γ angegebenen Typen haben, hat Ausdruck e den Typ A (engl. typing judgement) Wir schreiben kurz Γ e::a für Ausdruck e den Typ A in Kontext Γ. Formal ist : eine dreistellige Relation zwischen Typkontexten, Ausdrücken, und Typen. Beispiele: {x::int} \y (+) x y : Int Int gültig {x::bool} \y (+) x y : Int Int ungültig {y : α} \x y : β α gültig

12 Typregeln Ein Typurteil ist nur dann gültig, wenn es durch Typregeln hergeleitet werden kann. Typregeln haben immer die Form: P 1... P n K (Name der Typregel) Dabei sind P 1... P n die Prämissen der Typregel und K die Konklusion. Sind alle Prämissen gültig, dann auch die Konklusion. P i und K sind in der Regel Typurteile Typregeln ohne Prämissen heißen Axiome Z.B. für jede Konstante c gibt es ein Typaxiom.

13 Typregel Var Der Typ einer Variablen ist durch den Kontext gegeben: (x::a) Γ Γ x::a (Var) Da Γ als endliche Abbildung aufgefasst werden kann, können wir diese Typregel auch äquivalent kurz schreiben durch: Γ x::γ(x) (Var) Beispiele: {x::double} x::double gültig {x::double, y::int, z::bool} y::int gültig {x::double, y::int, z::bool} y::double falscher Typ {} x::double ungebundene Variable

14 Typregel Const Für jede Konstante eines jeden Basistypen definieren wir ein Axiom (Regel ohne Prämisse), welches die Konstante erkennt: Γ True::Bool (True) Γ False::Bool (False) Dabei ist der Kontext Γ hier beliebig, d.h. wir definieren ein Axiomenschema für jedes Γ. Mehrere Konstanten fassen wir mit folgenden Schemen zusammen: c ist eine Integer Konstante c ist eine Double Konstante Γ c::int Γ c::double (Int) (Double) Es ist sowohl {} 5::Int als auch {} 5::Double herleitbar. Dies ist unproblematisch so lange wir Typklassen ignorieren.

15 Typregel Funktionsanwendung Anwendung einer Funktion e 1 mit Typ A B auf Argument e 2 von Typ A liefert ein Ergebnis des Typs B: Γ e 1 ::A B Γ e 1 e 2 ::B Γ e 2 ::A (App) Diese Regel ist nicht anwendbar, falls: e 1 nicht von einem Funktionstypen ist e 2 nicht von Typ A ist, d.h. nicht im Definitionsbereich liegt. Beispiel: {x::bool Bool, y::bool} x::bool Bool {x::bool Bool, y::bool} y::bool {x::bool Bool, y::bool} xy::bool (App)

16 Beispiel Funktionsanwendung Γ e 1 :: A B Γ e 1 e 2 :: B Γ e 2 :: A (App) Zur Anwendung der allgemeinen Typregel werden Metavariablen gemäß Kontext, Ausdruck und Typ instanziiert: Γ \z (+) z x::int Int Γ ( ) 2 y::int Γ ( \z (+) z x ) ( ( ) 2 y ) (App) :: Int... ist z.b. herleitbar für Γ = {x::int, y :: Int}. Alternative Schreibweise in Infix-Notation: Γ \z z + x :: Int Int Γ ( \z z + x ) ( 2 y ) :: Int Γ 2 y :: Int (App)

17 Beispiel Funktionsanwendung Γ e 1 :: A B Γ e 1 e 2 :: B Γ e 2 :: A (App) Zur Anwendung der allgemeinen Typregel werden Metavariablen gemäß Kontext, Ausdruck und Typ instanziiert: Γ \z (+) z x::int Int Γ ( ) 2 y::int Γ ( \z (+) z x ) ( ( ) 2 y ) (App) :: Int... ist z.b. herleitbar für Γ = {x::int, y :: Int}. Alternative Schreibweise in Infix-Notation: Γ \z z + x :: Int Int Γ ( \z z + x ) ( 2 y ) :: Int Γ 2 y :: Int (App)

18 Typregel Funktionsabstraktion Die Typregel für anonyme Funktionsabstraktion lautet: Γ, x::a e::b Γ \x e :: A B (Abs) Hat der Programmausdruck e den Typ B unter der Annahme x : A, so hat der Programmausdruck \x e den Typ A B Man nennt e den Funktionsrumpf der Funktion \x e, im Funktionsrumpf kommt die abstrahierte Variable x frei vor, in dem Programmausdruck \x e gebunden. Man sagt auch Lambda \ bindet die darauf folgende Variable

19 Typherleitung Eine Typherleitung / Typbeweis ist ein endlicher Baum, wobei alle die Blätter Typaxiome sind; alle Knoten derart Instanzen von Typregeln sind, dass die Beschriftung des Knotens die Konklusion ist, und die Kinder des Knotens die Prämissen sind. Die Beschriftung des Wurzelknotens ist die hergeleitete Aussage. Eine Typaussage ist herleitbar, wenn sie eine Herleitung hat. Eine Typherleitung ist letztendlich nur eine verkette Anwendung von Typregeln.

20 Beispiel Herleitungsbaum Eine Herleitung als Baum dargestellt: Var Var {x::α, f ::α β} f :: α β {x::α, f ::α β} x :: α App {x::α, f ::α β} f x :: β Abs {x::α} \f f x :: (α β) β Abs {} \x (\f f x) :: α (α β) β Den Namen der angewendeten Regel schreiben wir an den rechten Rand, damit man besser nachvollziehen kann, was gemacht wurde. In Haskell könnten wir anstatt \x (\f f x) auch einfach \x f f x schreiben, doch unsere Typregel Abs haben wir der Einfachheit halber nur für ein Argument definiert was ja keinen Unterschied macht!

21 Beispiel Herleitungen Eine Herleitung in linearer Schreibweise: 1 {x::α, f ::α β} f ::α β Var 2 {x::α, f ::α β} x::α Var 3 {x::α, f ::α β} f x::β App(1, 2) 4 {x::α} \f f x::(α β) β Abs(3) 5 {} \x (\f f x)::α (α β) β Abs(4) Bei dieser Schreibweise müssen wir alle Zeilen nummerieren. Bei jeder Regelanwendung listen wir dann die verwendeten Prämissen der Reihe nach auf. Erstellt werden Herleitungen normalerweise von unten nach oben, gelesen werden sie aber meist von oben nach unten.

22 Kontexterweiterung Eine Typaussage bleibt gültig, wenn wir den Typisierungkontext erweitern. Bsp: {x::α} \f f x :: (α β) β {x::α, y::γ} \f f x :: (α β) β {f ::Int Bool, x::α, y::γ} \f f x :: (α β) β Lemma (Kontexterweiterung/Abschwächung) Wenn Γ Γ und Γ e : A herleitbar ist, dann auch Γ e : A. Beweisbar durch Induktion über die Länge der Herleitung. Daraus leiten wir folgende strukturelle Typregel ab: Γ Γ Γ e : A Γ e : A (Weak) Die Regel ist jederzeit anwendbar, da sie unabhängig von e ist.

23 Einführung in die Funktionale Programmierung mit Haskell Typsysteme & Typinferenz LFE Theoretische Informatik, Institut für Informatik, Ludwig-Maximilians Universität, München 19. Juni 2013

24 Typregeln Wdh. Ein Typurteil ist nur dann gültig, wenn es durch Typregeln hergeleitet werden kann. Typregeln haben immer die Form: P 1... P n K (Name der Typregel) Dabei sind P 1... P n die Prämissen der Typregel und K die Konklusion. Sind alle Prämissen gültig, dann auch die Konklusion. P i und K sind in der Regel Typurteile Typregeln ohne Prämissen heißen Axiome Z.B. für jede Konstante c gibt es ein Typaxiom.

25 Bisher behandelte Typregeln Wdh Folgende Typregeln wurden bisher in der Vorlesung behandelt: Γ x :: Γ(x) c ist eine Integer Konstante Γ c :: Int Γ e 1 :: A B Γ e 2 :: A Γ e 1 e 2 :: B Γ, x::a e :: B Γ \x e :: A B (Var) (Int) (App) (Abs)

26 Typherleitung Beispiel An der Tafel konstruieren wir eine Typherleitung für das Typurteil: { (+)::Int Int Int, z::α } (+) 4 ( (\x -> 1) z ) :: Int

27 Weakening Wdh Wir hatten gesehen, dass folgende Typregel zulässig ist, da Kontexterweiterungen harmlos sind: Γ Γ Γ e : A Γ e : A (Weak) Intuitiv: Es schadet nie, mehr zu wissen als nötig Eine Typregel ist zulässig (engl. admissible), wenn deren Hinzunahme keine neuen Herleitungen ermöglicht. D.h. die Regel kann Herleitungen lediglich vereinfachen.

28 Exchange Da wir Typkontexte als Mengen von Typzuweisungen definiert haben, ist die Reihenfolge der Typannahmen bedeutungslos. Dies können wir ebenfalls durch eine zulässige Regel ausdrücken: Γ, x::a, y::b, e :: C Γ, y::b, x::a, e :: C (Exchange)

29 Kontraktion Mehrfachverwendung von Variablen ist harmlos: Γ, x::a, y::a e :: C Γ, z::a e[z/x, z/y] :: C (Contraction) Termsubstitution: e[z/x, z/y] bezeichnet den Term e, bei den alle freie Vorkommen von x und y ersetzt werden.

30 Termsubstitution: Wir definieren Substitution für Terme wir folgt: x[e 0 /x] := e 0 y[e 0 /x] := y (e 1 e 2 )[e 0 /x] := e 1 [e 0 /x] e 2 [e 0 /x] (\y -> e 1 )[e 0 /x] := \x -> e 1 [e 0 /x] falls y / FV(e 0 ) (\x -> e 1 )[e 0 /x]:= \x -> e 0 (\y -> e 1 )[e 0 /x]:= \y -> (e 1 [y /y])[e 0 /x] für y eine frische Variable Bei Substitutionen muss man aufpassen, dass freie Variablen nicht versehentlich eingefangen werden: Wir schreiben kurz e 0 [e 1 /x, e 2 /y] für ( e 0 [e 1 /x] ) [e 2 /y], d.h. mehrere Substitution arbeiten wir von links nach rechts ab.

31 Strukturelle Typregeln Üblicherweise gelten diese drei strukturellen Typregeln implizit, wenn nichts anderes angegeben wurde. Zusätzliche Annahmen sind harmlos: Γ Γ Γ e : A Γ e : A (Weak) Reihenfolge der Annahmen ist bedeutungslos: Γ, x::a, y::b, e :: C Γ, y::b, x::a, e :: C (Exchange) Eine Variable kann mehrfach verwendet werden: Γ, x::a, y::a e :: C z / FV(e) (Contraction) Γ, z::a e[z/x, z/y] :: C

32 Bisher behandelte Typregeln II Übung 7 behandelte Typregeln für Bildung von Paaren und deren Elimination durch Pattern-Matching so wie if-then-else Ausdrücke: Γ e 1 :: A Γ e 2 :: B Γ (e 1, e 2 ) :: (A, B) (Pair-Intro) Γ e 1 :: (B, C) Γ, x::b, y::c e 2 :: A (Pair-Elim) Γ let (x, y) = e 1 in e 2 :: A Γ e 1 : Bool Γ e 2 : A Γ e 3 : A Γ if e 1 then e 2 else e 3 : A (Cond) Dabei wurden neue Programm- und Typ-ausdrücke eingeführt.

33 Typregeln Paare Neue Programmausdrücke: (e 1, e 2 ) Paar-Introduktion let (x, y) = e 1 in e 2 Paar-Elimination Neuer Typausdruck: (A, B) Neue Typregeln: Γ e 1 :: A Γ e 2 :: B Γ (e 1, e 2 ) :: (A, B) (Pair-Intro) Γ e 1 :: (B, C) Γ, x::b, y::c e 2 :: A (Pair-Elim) Γ let (x, y) = e 1 in e 2 :: A Bedeutung: Typ eines Paares ist das Produkt der Typen der Einzelteile

34 Curry-Howard-Isomorphismus Beobachtung Regeln treten of in Paaren auf: zur Einführung eines Typs und zu Elimination eines Typs Abs/App, Pair-Intro/Pair-Elim Dies ist sehr ähnlich zur mathematischen Beweisführung im Hilbert-Stil, welche ebenfalls Herleitungsbäume verwendet. Curry-Howard-Isomorphismus Ein Typ kann als logische Formel aufgefasst werden. Gibt es einen Programmausdruck zu einem Typ, so ist die entsprechende logische Formel intuitionistisch beweisbar. Typ A B entspricht der logischen Implikation, Typ (A, B) entspricht dem logischen und, usw. Beobachtet durch Curry & Feys (1958) und Howard (1969) Anwendung Übertragung von Erkenntnissen zwischen Fachgebieten, Konstruktion von Beweisassistenten, Automatische Programmextraktion aus intuitionistischen Beweisen

35 Typregel Konditional Neuer Programmausdruck: if e 1 then e 2 else e 3 Neue Typregel: Γ e 1 :: Bool Γ e 2 :: A Γ e 3 :: A Γ if e 1 then e 2 else e 3 :: A (Cond) Bedeutung: Bedingung muss Typ Bool haben Zweige müssen vom gleichen Typ wie Gesamtausdruck sein

36 Safety = Progress + Preservation Eine Typherleitung ist ein formaler Beweis, dass ein Typausdruck einen bestimmten Typ hat. Was nutzt das? Wir behaupteten: Well-typed programs can t go wrong Dies beweist man üblicherweise in 2 Schritten: Progress Jeder wohl-typisierte Programmausdruck ist entweder ein Wert oder er kann weiter ausgewertet werden. Preservation Auswertung verändert den Typ eines Programmausdrucks nicht. Für diese Beweise müssten wir Substitutionsmodell durch Auswerteregeln formalisieren, wie z.b. Operationale Semantik e 1 [e 2 /x] v (\x -> e 1 ) e 2 v ( -App)

37 Beweisidee: Solche Beweise werden üblicherweise mit Induktion über die Länge der Typherleitung geführt: Um zu zeigen, dass if e 1 then e 2 else e 3 ausgewertet werden kann, darf man annehmen dann, dass e 1 zu einem Wert ausgewertet werden kann, da die Typherleitung für Γ e 1 : Bool ja ein Schritt kleiner sein muss; usw. e 1 True e 2 v if e 1 then e 2 else e 3 v Γ e 1 :: Bool Γ e 2 :: A Γ e 3 :: A Γ if e 1 then e 2 else e 3 :: A ( -If-T) (Cond) Auswerteregeln und Typregeln müssen übereinstimmen. Auswerteregeln und Implementation müssen übereinstimmen.

38 Typsysteme Typisierung Polymorphie Typinferenz Typsubstitutionen Prinzipale Typisierung Inferenzprobleme Polymorphie Wie wir wissen, können Ausdrücke mehr als einen Typ haben, z.b. für den Programmausdruck f x sind herleitbar: {x::int, f ::Int Int} f x :: Int {x::bool, f ::Bool Int} f x :: Int {x::α, f ::α α} f x :: α {x::α, f ::α β} f x :: β Letzte hier die allgemeinste Typisierung (engl. principal typing): jede andere Typisierung von f x erhält man daraus durch Einsetzen von Typen für die Typvariablen α und β (Instanziierung). {x::α, f ::α β}[bool/α, Int/β] f x :: β[bool/α, Int/β] Man kann beweisen: Allgemeinste Typisierung eines Ausdrucks ist bis auf Umbenennung von Typvariablen eindeutig.

39 Typsysteme Typisierung Polymorphie Typinferenz Typsubstitutionen Prinzipale Typisierung Inferenzprobleme Typsubstitutionen Eine Typsubstitution σ ist eine endliche Abbildung von Typvariablen α auf Typausdrücke A. σ 1 = [Bool/α, Int/β] = [Bool/α, Int/β, γ/γ] = [Bool/α, Int/β, γ/γ, δ/δ]... σ 2 = [β/α, (β Bool)/β, Int/γ] σ 3 = [γ/α, δ/β] σ 4 = [β/α, α/β] Für die Anwendung Aσ einer Substitution σ auf Typen A gilt z.b.: Int σ = Int (A B)σ = Aσ Bσ α[bool/α, Int/β] = Bool Da bei uns alle Typvariablen frei sind, gibt es keine vergleichbaren Probleme wir bei der Termsubstitution.

40 Typsysteme Typisierung Polymorphie Typinferenz Typsubstitutionen Prinzipale Typisierung Inferenzprobleme Instanziierung Wir definieren die Anwendung einer einer Substitution σ auf einen Typkontext Γ punktweise: Beispiel (Γσ)(x) := (Γ(x))σ {x::int, y::α β, z::α}[γ/α, Int/β, Bool/γ] = {x::int, y::bool Int, z::bool} Es ist beweisbar, dass Typurteile unter Substitution gültig bleiben: Lemma (Typerhaltung unter Substitution) Wenn Γ e :: A, dann Γσ e :: Aσ. Wir leiten daraus erneut eine zulässige Typregel ab: Γ e :: A Γσ e :: Aσ (subst)

41 Typsysteme Typisierung Polymorphie Typinferenz Typsubstitutionen Prinzipale Typisierung Inferenzprobleme Substitutionskomposition Die Komposition σσ zweier Substitutionen definieren wir wieder von links nach rechts: A(σ 1 σ 2 ) := (Aσ 1 )σ 2 Eine Komposition können wir oft vereinfachen: α[(α β)/α][int/α, Bool/β] = (α β)[int/α, Bool/β] = Int Bool β[(α β)/α][int/α, Bool/β] = β[int/α, Bool/β] = Bool [(α β)/α][int/α, Bool/β] = [(Int Bool)/α, Bool/β] Komposition ist assoziativ, σ 1 (σ 2 σ 3 ) = (σ 1 σ 2 )σ 3, aber nicht kommutativ σ 1 σ 2 σ 2 σ 1 Als neutrales Element der Komposition haben wir die leere Identitätssubstitution id = []. Es gilt id σ = σ und σ id = σ.

42 Typsysteme Typisierung Polymorphie Typinferenz Typsubstitutionen Prinzipale Typisierung Inferenzprobleme Prinzipale Typisierung Eine Typisierung Γ e :: A eines Ausdrucks e ist die allgemeinste oder auch prinzipal Typisierung, falls es für jede Typisierung Γ e :: A von e eine Substitution σ gibt, so dass A = Aσ und Γ Γσ. {x::α, f ::α β} f x :: β prinzipal {x::int, f ::Int Int} f x :: Int σ = [Int/α, Int/β] {x::α, f ::α β, y::γ} f x :: β σ = id {x::γ, f ::γ β} f x :: β σ = [γ/α] (auch prinzipal) Mann kann beweisen, dass jeder Programmausdruck unserer eingeschränkten Sprache eine prinzipale Typisierung hat! Für volles Haskell gilt dies aber nicht mehr. Die Berechnung einer prinzipalen Typisierung für einen Programmausdruck ist oft unentscheidbar. unentscheidbar: kein Verfahren mit endlicher Laufzeit bekannt

43 Typsysteme Typisierung Polymorphie Typinferenz Typsubstitutionen Prinzipale Typisierung Inferenzprobleme Monomorphismus Einschränkung In Haskell ist die Suche nach allgemeinen Typen grundsätzlich eingeschränkt: > :t show show :: Show a => a -> String > let f1 = show f1 :: () -> String > let f2 x = show x f2 :: Show a => a -> String > let f3 = \x -> show x f3 :: () -> String Option NoMonomorphismRestriction erweitert die Suche: > :set -XNoMonomorphismRestriction > let f4 = show f4 :: Show a => a -> String

44 Typsysteme Typisierung Polymorphie Typinferenz Typsubstitutionen Prinzipale Typisierung Inferenzprobleme Monomorphismus Einschränkung Diese Option hat aber auch weitere Nachteile: lentwo = (len,len) where len = Data.List.genericLength xs Für den Typ lentwo :: Num t => [b] -> (t, t) muss die Länge nur einmal berechnet werden, aber für den Typ lentwo :: (Num a, Num b) => [c] -> (a,b) muss die Länge zwei Mal berechnet werden, da die grundlegenden Operationen (z.b. Addition) ja anders implementiert sein könnten. Wenn man Typsignaturen explizit angibt, dann braucht man die Option ohnehin nicht, da Haskell dann einfach nur den gegeben Typ prüft.

45 Typsysteme Typisierung Polymorphie Typinferenz Typsubstitutionen Prinzipale Typisierung Inferenzprobleme Polymorphe Rekursion Polymorphe Rekursion bezeichnet rekursive Aufrufe mit anderem Typ; genauer: polymorphe Typparameter werden anders instantiiert. Polymorphe Rekursion ist sehr problematisch für Typinferenz. Es wurde bewiesen, dass Typinferenz für polymorphe Rekursion unentscheidbar ist. Beispiel data PowerList a = Zero a Succ (PowerList (a,a)) pl1 = Succ $ Succ $ Succ $ Zero (((1,2),(3,4)),((5,6),(7,8))) pllength :: PowerList a -> Int -- GHC cannot infer this type! pllength (Zero _ ) = 1 pllength (Succ pl) = 2 * pllength pl Im Rumpf der Definition für pllength :: PowerList a -> Int findet ein rekursiver Aufruf mit Typ PowerList (a,a) -> Int statt.

46 Typsysteme Typisierung Polymorphie Typinferenz Typsubstitutionen Prinzipale Typisierung Inferenzprobleme Rank N-Types Die Spracherweiterungen um GADTs und Rank N-Types bereiten der Typinferenz ebenfalls Probleme Beide Themen gehen jedoch über den Rahmen der Vorlesung heraus. Rank N-Types sind Typen, bei denen Quantoren für Typvariablen mitten im Typ auftauchen, und nicht nur wie bisher ganz vorne. Pathologisches Beispiel -- foo :: (forall a. a) -> b foo :: (forall a. a -> a) -> (b -> b) foo x = x x > (foo (foo id)) Keine der beiden Typsignaturen kann von GHC inferiert werden. foo hat keinen prinzipalen Typ.

47 Typsysteme Typisierung Polymorphie Typinferenz Unifikation Zusammenfassung Typinferenz Typinferenz berechnet zu jedem Ausdruck den allgemeinsten Typ (bzw. Fehlermeldung, falls der Ausdruck keinen Typ hat). Beispiel Der prinzipale Typ einer Funktionsanwendung e 1 e 2 muss aus den prinzipalen Typen von e 1 und e 2 berechnet werden: {} e 1 :: (Int β) (γ β) {x::α} e 2 :: α Double {x::int} e 1 e 2 :: γ Double Beide Prämissen müssen mit [Int/α, Double/β] instanziiert werden, welche die allgemeinste Lösung der Gleichung Int β = α Double ist. Dazu müssen wir also Typgleichung lösen können.

48 Typsysteme Typisierung Polymorphie Typinferenz Unifikation Zusammenfassung Unifikation Eine Substitution σ ist allgemeiner als σ, falls es eine Substitution τ gibt mit σ = στ. Die speziellere Substitution σ ist also eine Instanz von σ. Zum Lösen von Typgleichungen verwenden wir Unifikation: Ein Unifikator zweier Typen A und A ist eine Substitution σ, so dass Aσ = A σ. Der allgemeinste Unifikator von A und A ist die allgemeinste Substitution σ, so dass Aσ = A σ. Beispiel: (α β) = (Int β) für diese Typgleichung ist [Int/α, Int/β] ein Unifikator. Die Substitution [Int/α] ist der allgemeinste Unifikator.

49 Typsysteme Typisierung Polymorphie Typinferenz Unifikation Zusammenfassung Robinson s Unifikationsalgorithmus Der Unifikationsalgorithmus unify arbeitet auf einer Menge E = {A 1 = B 1,..., A n = B n } von Typgleichungen und liefert allgemeinste Substitution σ, so dass A i σ = B i σ für alle i gilt oder einen Typfehler. Algorithmus unify: 1 unify({}) = id - -Fertig 2 unify({a = A} E) = unify(e) - -redundante Gleichung 3 unify({a A = B B } E) = unify({a = B, A = B } E) 4 unify({α = B} E) = unify({b = α} E) = falls α in B erwähnt wird: Fehlermeldung Zirkulär, sonst berechne Komposition σ unify(eσ) für σ = [B/α] 5 In allen andern Fällen: Fehlermeldung Typfehler z.b. wenn (Int = Bool) oder (Int = α β) E sind.

50 Typsysteme Typisierung Polymorphie Typinferenz Unifikation Zusammenfassung Beispiele Unifikation Nur Variablen: unify{α = β, β = γ} = [β/α]unify{β = γ} = [β/α][γ/β]unify{} = [β/α][γ/β]id = [β/α][γ/β] = [γ/α, γ/β] Typkonstruktorkonflikt: unify{int α = α Double} = unify{int = α, α = Double} = [Int/α]unify{Int = Double} = Error: Typfehler Zirkulärer Typ: unify{β = β, α = α Double} = unify{α = α Double} = Error: Zirkulär

51 Typsysteme Typisierung Polymorphie Typinferenz Unifikation Zusammenfassung Typinferenzalgorithmus I infer Γ (e) = (A, σ) nimmt einen Ausdruck e in Typkontext Γ und liefert den allgemeinsten Typ A von e samt der allgemeinsten Instanziierung σ von Γ, so dass Γσ e :: A. 1 infer Γ (x) = wenn x::a Γ dann (A, id) sonst Fehlermeldung Ungebundene Variable 2 infer Γ (c) = (A, id) wobei A der Typ der Konstanten c ist. 3 infer Γ (\x -> e) = Für eine frische Typvariable α berechne zuerst infer Γ,x::α (e) = (B, σ) Damit gilt (Γσ, x::ασ) e :: B und wir liefern (ασ B, σ)

52 Typsysteme Typisierung Polymorphie Typinferenz Unifikation Zusammenfassung Typinferenzalgorithmus II Applikation infer Γ (e) = (A, σ) nimmt einen Ausdruck e in Typkontext Γ und liefert den allgemeinsten Typ A von e samt der allgemeinsten Instanziierung σ von Γ, so dass Γσ e :: A. 4 infer Γ (e 1 e 2 ) = Wir berechnen zuerst infer Γ (e 1 ) = (C, σ 1 ) und infer Γ (e 2 ) = (A, σ 2 ). Für eine frische Typvariable β berechne σ 3 = unify{cσ = A β}. Damit gilt Γσ 1 σ 2 σ 3 e 1 :: Aσ 3 βσ 3 und wir liefern (βσ 3, σ 1 σ 2 σ 3 ) zurück. Dieser Algorithmus geht auf mehrere Personen zurück: Ursprung bei Curry & Feys (1958) Erweitert und Allgemeinheit bewiesen bei Hindley (1969) Milner zeigte 1979 unabhängig das Geliche wie Hindley Erweitert unf Vollstänsigkeit bewiesen von Damas (1982)

53 Typsysteme Typisierung Polymorphie Typinferenz Unifikation Zusammenfassung Zusammenfassung Well-typed programs can t go wrong Typisierung in Form von Typurteilen: Γ e::a. Kontrolle eines Typs durch Typherleitung. Robin Milner Eine Typherleitung hat eine Baum-Struktur. Wenn alle Blätter Axiome sind, dann ist die Herleitung ein Beweis. Typinferenz beruht auf Unifikation. Prinzipale Typen in vielen Sprache berechenbar.

Grundlagen der Programmierung 3 A

Grundlagen der Programmierung 3 A Grundlagen der Programmierung 3 A Typen, Typberechnung und Typcheck Prof. Dr. Manfred Schmidt-Schauß Sommersemester 2017 Haskell, Typen, und Typberechnung Ziele: Haskells Typisierung Typisierungs-Regeln

Mehr

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Überladung und Konversion in Haskell. Typisierung in Haskell

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Überladung und Konversion in Haskell. Typisierung in Haskell Haskell, Typen, und Typberechnung Grundlagen der Programmierung 3 A Typen, Typberechnung und Typcheck Prof. Dr Manfred Schmidt-Schauß Ziele: Haskells Typisierung Typisierungs-Regeln Typ-Berechnung Sommersemester

Mehr

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Einige andere Programmiersprachen. Typisierung in Haskell

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Einige andere Programmiersprachen. Typisierung in Haskell Haskell, Typen, und Typberechnung Grundlagen der Programmierung 3 A Typen, Typberechnung und Typcheck Prof. Dr. Manfred Schmidt-Schauß Ziele: Haskells Typisierung Typisierungs-Regeln Typ-Berechnung Milners

Mehr

1. Typen 1.1 Typsicherheit 1.2 Typprüfung

1. Typen 1.1 Typsicherheit 1.2 Typprüfung 1. Typen 1.1 Typsicherheit 1.2 Typprüfung Ein Typsystem ist ein praktikables, syntaktisches Verfahren, mit dem man die Abwesenheit gewisser Laufzeit-Eigenschaften eines Programms beweisen kann, indem man

Mehr

Der einfach getypter Lambda-Kalkül

Der einfach getypter Lambda-Kalkül Der einfach getypter Lambda-Kalkül Typprüfung und Typinferenz Tobias Nipkow und Steffen Smolka Technische Universität München 1 Einleitung 2 Explizit getypter λ-kalkül 3 Implizit getypter λ-kalkül Statische

Mehr

Haskell, Typen und Typberechnung

Haskell, Typen und Typberechnung Kapitel 5 Haskell, Typen und Typberechnung 5.1 Typisierung in Haskell In diesem Kapitel sind die Typisierungsmethoden in Haskell beschrieben, wobei auch kurz auf die Typisierung in anderen Programmiersprachen

Mehr

Formale Methoden der Softwaretechnik 1 Vorlesung vom : Grundlage von Isabelle

Formale Methoden der Softwaretechnik 1 Vorlesung vom : Grundlage von Isabelle 1 Formale Methoden der Softwaretechnik 1 Vorlesung vom 16.11.09: Grundlage von Isabelle Christoph Lüth, Lutz Schröder Universität Bremen Wintersemester 2009/10 2 Fahrplan Teil I: Grundlagen der Formalen

Mehr

Haskell, Typen und Typberechnung

Haskell, Typen und Typberechnung Kapitel 3 Haskell, Typen und Typberechnung 3.1 Typisierung in Haskell In diesem Kapitel sind die Typisierungsmethoden in Haskell beschrieben, wobei auch kurz auf die Typisierung in anderen Programmiersprachen

Mehr

Haskell, Typen und Typberechnung

Haskell, Typen und Typberechnung Kapitel 5 Haskell, Typen und Typberechnung 5.1 Typisierung in Haskell In diesem Kapitel sind die Typisierungsmethoden in Haskell beschrieben, wobei auch kurz auf die Typisierung in anderen Programmiersprachen

Mehr

Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom : Typvariablen und Polymorphie

Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom : Typvariablen und Polymorphie 16:02:01 2017-01-17 1 [37] Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom 08.11.2016: Typvariablen und Polymorphie Christoph Lüth Universität Bremen Wintersemester 2016/17 PI3 WS 16/17

Mehr

Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):

Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell): Was bisher geschah deklarative Programmierung funktional: Programm: Menge von Termgleichungen, Term Auswertung: Pattern matsching, Termumformungen logisch: Programm: Menge von Regeln (Horn-Formeln), Formel

Mehr

Funktionale Programmierung Grundlegende Datentypen

Funktionale Programmierung Grundlegende Datentypen Grundlegende Datentypen Prof. Dr. Oliver Braun Fakultät für Informatik und Mathematik Hochschule München Letzte Änderung: 06.11.2017 16:45 Inhaltsverzeichnis Typen........................................

Mehr

Lösungen zum Aufgabenblatt 10 Logik und modelltheoretische Semantik

Lösungen zum Aufgabenblatt 10 Logik und modelltheoretische Semantik Lösungen zum Aufgabenblatt 10 Logik und modelltheoretische Semantik Universität München, CIS, SS 2013 Hans Leiß Abgabetermin: Do, 4.7.2013, 16 Uhr, in meinem Postfach Aufgabe 10.1 Vereinfache die folgenden

Mehr

Verarbeitung unendlicher Datenstrukturen Jetzt können wir z.b. die unendliche Liste aller geraden Zahlen oder aller Quadratzahlen berechnen:

Verarbeitung unendlicher Datenstrukturen Jetzt können wir z.b. die unendliche Liste aller geraden Zahlen oder aller Quadratzahlen berechnen: Verarbeitung unendlicher Datenstrukturen Jetzt können wir z.b. die unendliche Liste aller geraden Zahlen oder aller Quadratzahlen berechnen: take 1 0 ( f i l t e r ( fn x => x mod 2=0) nat ) ; val it =

Mehr

Tag 3. Funktionen. Num erfüllen, haben wir... ja, was nun eigentlich? Bei

Tag 3. Funktionen. Num erfüllen, haben wir... ja, was nun eigentlich? Bei Tag 3 Funktionen Heute werden wir den wichtigsten Typ (oder die wichtigste Klasse von Typen) in Haskell überhaupt genau unter die Lupe nehmen: Funktionen, die wir ansatzweise schon am letzten Tag kennengelernt

Mehr

Beweise und Typen. 9.1 Formalisierung und Beweis

Beweise und Typen. 9.1 Formalisierung und Beweis 120 9. Beweise und Typen 9 Beweise und Typen Dieses Kapitel ist zweigeteilt. Als erstes wenden wir uns dem Thema zu, wie wir Eigenschaften von funktionalen Programmen beweisen können. Aufwandsabschätzungen

Mehr

3 Exkurs: Der λ-kalkül

3 Exkurs: Der λ-kalkül 3 Exkurs: Der λ-kalkül Alonso Churchs λ-kalkül (ca. 1940) ist der formale Kern jeder funktionalen Programmiersprache. Der λ-kalkül ist eine einfache Sprache, mit nur wenigen syntaktischen Konstrukten und

Mehr

Workshop Einführung in die Sprache Haskell

Workshop Einführung in die Sprache Haskell Workshop Einführung in die Sprache Haskell Nils Rexin, Marcellus Siegburg und Alexander Bau Fakultät für Informatik, Mathematik und Naturwissenschaften Hochschule für Technik, Wirtschaft und Kultur Leipzig

Mehr

Einführung in die funktionale Programmierung

Einführung in die funktionale Programmierung Einführung in die funktionale Programmierung Prof. Dr. Manfred Schmidt-Schauÿ Künstliche Intelligenz und Softwaretechnologie 17. Oktober 2006 Einführung in Haskell: Syntax, Reduktionen, Kernsprachen Haskell,

Mehr

Funktionale Programmierung Einführung

Funktionale Programmierung Einführung Einführung Prof. Dr. Oliver Braun Fakultät für Informatik und Mathematik Hochschule München Letzte Änderung: 13.09.2017 15:29 Inhaltsverzeichnis Was ist imperative Programmierung.......................

Mehr

Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom : Typvariablen und Polymorphie

Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom : Typvariablen und Polymorphie Rev. 2749 1 [28] Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom 04.11.2014: Typvariablen und Polymorphie Christoph Lüth Universität Bremen Wintersemester 2014/15 2 [28] Fahrplan Teil

Mehr

3 Terme und Algebren 3.1 Terme

3 Terme und Algebren 3.1 Terme 3 Terme und Algebren 3.1 Terme Mod - 3.1 In allen formalen Kalkülen benutzt man Formeln als Ausdrucksmittel. Hier betrachten wir nur ihre Struktur - nicht ihre Bedeutung. Wir nennen sie Terme. Terme bestehen

Mehr

Kapitel 6: Typprüfung

Kapitel 6: Typprüfung Ludwig Maximilians Universität München Institut für Informatik Lehr- und Forschungseinheit für Datenbanksysteme Skript zur Vorlesung Informatik I Wintersemester 2006 Vorlesung: Prof. Dr. Christian Böhm

Mehr

Funktionale Programmierung ALP I. λ Kalkül WS 2012/2013. Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda

Funktionale Programmierung ALP I. λ Kalkül WS 2012/2013. Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda ALP I λ Kalkül WS 2012/2013 Berechenbarkeit - inspiriert durch Hilbert's Frage - im Jahr 1900, Paris - Internationaler Mathematikerkongress Gibt es ein System von Axiomen, aus denen alle Gesetze der Mathematik

Mehr

Basiskonstrukte von Haskell

Basiskonstrukte von Haskell Basiskonstrukte von Haskell PD Dr. David Sabel Goethe-Universität Frankfurt am Main 29. September 2015 Basistypen und Operationen Ganzzahlen: Int = Ganzzahlen beschränkter Länge Integer = Ganzzahlen beliebiger

Mehr

Intuitionistische Lineare Logik

Intuitionistische Lineare Logik Lineare Logik Intuitionistische Lineare Logik Zusammenhang zur intuitionistischen Logik Termzuweisung und funktionale Interpretation Intuitionistische Lineare Logik Sinn und Zweck : Kontrolle über Ressourcen

Mehr

Entwicklung eines korrekten Übersetzers

Entwicklung eines korrekten Übersetzers Entwicklung eines korrekten Übersetzers für eine funktionale Programmiersprache im Theorembeweiser Coq Thomas Strathmann 14.01.2011 Gliederung 1 Einleitung

Mehr

GTI. Hannes Diener. 18. Juni. ENC B-0123,

GTI. Hannes Diener. 18. Juni. ENC B-0123, GTI Hannes Diener ENC B-0123, diener@math.uni-siegen.de 18. Juni 1 / 32 Als Literatur zu diesem Thema empfiehlt sich das Buch Theoretische Informatik kurzgefasst von Uwe Schöning (mittlerweile in der 5.

Mehr

Programmieren in Haskell Programmiermethodik

Programmieren in Haskell Programmiermethodik Programmieren in Haskell Programmiermethodik Peter Steffen Universität Bielefeld Technische Fakultät 12.01.2011 1 Programmieren in Haskell Bisherige Themen Was soll wiederholt werden? Bedienung von hugs

Mehr

Reelle Zahlen. Einzelzeichen. Bereiche. Aufzählungen. direkt zusammengesetzte Datentypen. einfache Datentypen: Zusammenfassung. kartesisches Produkt

Reelle Zahlen. Einzelzeichen. Bereiche. Aufzählungen. direkt zusammengesetzte Datentypen. einfache Datentypen: Zusammenfassung. kartesisches Produkt Werte Studiengang Informatik Universität Bremen Sommersemester 2006 (Vorlesung am 8. Mai 2006) Werte / Daten einfach direkt zusammengesetzt rekursiv zusammengesetzt Einfache Datentypen eingabaut Wahrheitswerte

Mehr

Funktionale Programmierung ALP I. λ Kalkül. Teil 2 WS 2012/2013. Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda

Funktionale Programmierung ALP I. λ Kalkül. Teil 2 WS 2012/2013. Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda ALP I λ Kalkül Teil 2 WS 2012/2013 Lokale Variablennamen Haskell: let x = exp1 in exp2 Lambda: λ exp1. exp2 Einfache Regel: Der Geltungsbereich eines Lambda-Ausdrucks erstreckt sich soweit wie möglich

Mehr

Allgemeine Hinweise: TECHNISCHE UNIVERSITÄT MÜNCHEN. Name Vorname Studiengang Matrikelnummer. Hörsaal Reihe Sitzplatz Unterschrift

Allgemeine Hinweise: TECHNISCHE UNIVERSITÄT MÜNCHEN. Name Vorname Studiengang Matrikelnummer. Hörsaal Reihe Sitzplatz Unterschrift TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK Lehrstuhl für Sprachen und Beschreibungsstrukturen WS 2008/09 Einführung in die Informatik 2 Klausur Prof. Dr. Helmut Seidl, T. M. Gawlitza, S. Pott,

Mehr

Praktische Informatik 3

Praktische Informatik 3 Praktische Informatik 3 Christian Maeder WS 03/04 Vorlesung vom 12.1.2004: Ein/Ausgabe in funktionalen Sprachen Vorlesung vom 12.1.2004: Ein/Ausgabe in funktionalen Sprachen 3 Inhalt Wo ist das Problem?

Mehr

Funktionale Programmiersprachen

Funktionale Programmiersprachen Funktionale Programmiersprachen An den Beispielen Haskell und Erlang Übersicht Programmiersprachen λ-kalkül Syntax, Definitionen Besonderheiten von funktionalen Programmiersprache, bzw. Haskell Objektorientierte

Mehr

Grundlagen der Theoretischen Informatik Musterlösungen zu ausgewählten Übungsaufgaben

Grundlagen der Theoretischen Informatik Musterlösungen zu ausgewählten Übungsaufgaben Dieses Dokument soll mehr dazu dienen, Beispiele für die formal korrekt mathematische Bearbeitung von Aufgaben zu liefern, als konkrete Hinweise auf typische Klausuraufgaben zu liefern. Die hier gezeigten

Mehr

Theoretische Informatik: Logik, M. Lange, FB16, Uni Kassel: 3.8 Aussagenlogik Der Sequenzen-Kalkül 99. Sequenzen

Theoretische Informatik: Logik, M. Lange, FB16, Uni Kassel: 3.8 Aussagenlogik Der Sequenzen-Kalkül 99. Sequenzen Theoretische Informatik: Logik, M. Lange, FB16, Uni Kassel: 3.8 Aussagenlogik Der Sequenzen-Kalkül 99 Sequenzen Zum Abschluss des Kapitels über Aussagenlogik behandeln wir noch Gentzens Sequenzenkalkül.

Mehr

Einführung in die Funktionale Programmierung mit Haskell

Einführung in die Funktionale Programmierung mit Haskell Einführung in die Funktionale Programmierung mit Haskell Rekursion LFE Theoretische Informatik, Institut für Informatik, Ludwig-Maximilians Universität, München 25. April 2013 Planung Achtung: Nächste

Mehr

Programmieren in Haskell

Programmieren in Haskell Programmieren in Haskell Wir steigen ein... Programmieren in Haskell 1 Was wir heute machen Umfrage: Wer hat den Hugs ausprobiert? Ausdrücke und Werte Datentypen Funktionen Aufgabe für diese Woche Programmieren

Mehr

Einführung in die Funktionale Programmierung mit Haskell

Einführung in die Funktionale Programmierung mit Haskell Wiederholung Listen II Funktionsdefinition Einführung in die Funktionale Programmierung mit Haskell List-Comprehension, Patterns, Guards LFE Theoretische Informatik, Institut für Informatik, Ludwig-Maximilians

Mehr

Kapitel 11. Prädikatenlogik Quantoren und logische Axiome

Kapitel 11. Prädikatenlogik Quantoren und logische Axiome Kapitel 11 Prädikatenlogik Im Kapitel über Aussagenlogik haben wir die Eigenschaften der Booleschen Operationen untersucht. Jetzt wollen wir das als Prädikatenlogik bezeichnete System betrachten, das sich

Mehr

1 Funktionale vs. Imperative Programmierung

1 Funktionale vs. Imperative Programmierung 1 Funktionale vs. Imperative Programmierung 1.1 Einführung Programme einer funktionalen Programmiersprache (functional programming language, FPL) bestehen ausschließlich aus Funktionsdefinitionen und Funktionsaufrufen.

Mehr

1 Inhalt der Vorlesung B-PS1

1 Inhalt der Vorlesung B-PS1 1 Inhalt der Vorlesung B-PS1 1.1 Tag 1 1.1.1 Vormittag Geschichte der Programmiersprachen Wie viele Programmiersprachen gibt es? https://en.wikipedia.org/wiki/list_of_programming_languages Esoterische

Mehr

Software Entwicklung 1

Software Entwicklung 1 Software Entwicklung 1 Annette Bieniusa AG Softech FB Informatik TU Kaiserslautern Überblick für heute Programmierparadigmen Imperative vs. deklarative Programmierung Beispiele Funktionale Programmierung

Mehr

Was Sie schon immer über funktionale Programmierung wissen wollten, aber bisher nicht zu fragen wagten

Was Sie schon immer über funktionale Programmierung wissen wollten, aber bisher nicht zu fragen wagten Programmieren in PPL Was Sie schon immer über funktionale Programmierung wissen wollten, aber bisher nicht zu fragen wagten PPL at a glance KIV ist im wesentlichen in PPL programmiert PPL (proof programming

Mehr

Die Komplement-Funktion

Die Komplement-Funktion Die Komplement-Funktion type IntMap α = [(Int, α)] compl :: [α] (Int, IntMap α) compl s = let n = (length s) 1 t = [0..n] g = zip t s g = filter (λ(i, _) notelem i (get t)) g in (n + 1, g ) Zum Beispiel:

Mehr

2.5 Listen. Kurzschreibweise: [42; 0; 16] Listen werden mithilfe von [] und :: konstruiert.

2.5 Listen. Kurzschreibweise: [42; 0; 16] Listen werden mithilfe von [] und :: konstruiert. 2.5 Listen Listen werden mithilfe von [] und :: konstruiert. Kurzschreibweise: [42; 0; 16] # let mt = [];; val mt : a list = [] # let l1 = 1::mt;; val l1 : int list = [1] # let l = [1;2;3];; val l : int

Mehr

Entwicklung korrekter Programme in Coq. Thomas Strathmann

Entwicklung korrekter Programme in Coq. Thomas Strathmann Entwicklung korrekter Programme in Coq Thomas Strathmann Überblick Teil 1 Was ist Coq? Theoretische Grundlagen Programmierung, Spezifikation, Beweise in

Mehr

Grundlagen der Programmierung 2 (1.A)

Grundlagen der Programmierung 2 (1.A) Grundlagen der Programmierung 2 (1.A) Einführung Prof. Dr. Manfred Schmidt-Schauß Sommersemester 2015 Grundlagen der Programmierung 2 Geplanter Inhalt der ersten Hälfte: Programmieren in Haskell Definitionen;

Mehr

Theorembeweiser und ihre Anwendungen

Theorembeweiser und ihre Anwendungen Theorembeweiser und ihre Anwendungen Prof. Dr.-Ing. Gregor Snelting Dipl.-Inf. Univ. Daniel Wasserrab Lehrstuhl Programmierparadigmen IPD Snelting Universität Karlsruhe (TH) IPD Snelting, Uni Karlsruhe

Mehr

Einführung in die Logik

Einführung in die Logik Einführung in die Logik Klaus Madlener und Roland Meyer 24. April 2013 Inhaltsverzeichnis 1 Aussagenlogik 1 1.1 Syntax................................. 1 1.2 Semantik............................... 3 1.3

Mehr

Wiederholung. Organisatorisches. VL-11: LOOP und WHILE Programme I. (Berechenbarkeit und Komplexität, WS 2017) Gerhard Woeginger

Wiederholung. Organisatorisches. VL-11: LOOP und WHILE Programme I. (Berechenbarkeit und Komplexität, WS 2017) Gerhard Woeginger Organisatorisches VL-11: LOOP und WHILE Programme I (Berechenbarkeit und Komplexität, WS 2017) Gerhard Woeginger Nächste Vorlesung: Mittwoch, November 29, 14:15 15:45 Uhr, Roter Hörsaal Webseite: http://algo.rwth-aachen.de/lehre/ws1718/buk.php

Mehr

Zentralübung zur Vorlesung Diskrete Strukturen (Prof. Esparza)

Zentralübung zur Vorlesung Diskrete Strukturen (Prof. Esparza) WS 2013/14 Zentralübung zur Vorlesung Diskrete Strukturen (Prof. Esparza) Dr. Werner Meixner Fakultät für Informatik TU München http://www14.in.tum.de/lehre/2013ws/ds/uebung/ 30. Oktober 2013 ZÜ DS ZÜ

Mehr

VL-11: LOOP und WHILE Programme I. (Berechenbarkeit und Komplexität, WS 2017) Gerhard Woeginger

VL-11: LOOP und WHILE Programme I. (Berechenbarkeit und Komplexität, WS 2017) Gerhard Woeginger VL-11: LOOP und WHILE Programme I (Berechenbarkeit und Komplexität, WS 2017) Gerhard Woeginger WS 2017, RWTH BuK/WS 2017 VL-11: LOOP und WHILE Programme I 1/46 Organisatorisches Nächste Vorlesung: Mittwoch,

Mehr

Aussagenlogik zu wenig ausdrucksstark für die meisten Anwendungen. notwendig: Existenz- und Allaussagen

Aussagenlogik zu wenig ausdrucksstark für die meisten Anwendungen. notwendig: Existenz- und Allaussagen Prädikatenlogik 1. Stufe (kurz: PL1) Aussagenlogik zu wenig ausdrucksstark für die meisten Anwendungen notwendig: Existenz- und Allaussagen Beispiel: 54 Syntax der Prädikatenlogik erster Stufe (in der

Mehr

Zahlen in Haskell Kapitel 3

Zahlen in Haskell Kapitel 3 Einführung in die Funktionale Programmiersprache Haskell Zahlen in Haskell Kapitel 3 FH Wedel IT-Seminar: WS 2003/04 Dozent: Prof. Dr. Schmidt Autor: Timo Wlecke (wi3309) Vortrag am: 04.11.2003 - Kapitel

Mehr

Hallo Haskell. (Funktionale Programmierung) Prof. Dr. Oliver Braun. Letzte Änderung: :08. Hallo Haskell 1/23

Hallo Haskell. (Funktionale Programmierung) Prof. Dr. Oliver Braun. Letzte Änderung: :08. Hallo Haskell 1/23 Hallo Haskell (Funktionale Programmierung) Prof. Dr. Oliver Braun Letzte Änderung: 18.03.2018 21:08 Hallo Haskell 1/23 Glasgow Haskell Compiler (GHC) der Haskell-Compiler ist der GHC Sie installieren ihn

Mehr

Kapitel 5. Mathematische Semantik. 1 Motivation

Kapitel 5. Mathematische Semantik. 1 Motivation Kapitel 5 Mathematische Semantik In diesem Kapitel werden wir nun eine weitere Technik zur Definition der Semantik einer Programmiersprache vorstellen: die mathematische bzw. denotationale Semantik. Außerdem

Mehr

Einführung in die Funktionale Programmierung mit Haskell

Einführung in die Funktionale Programmierung mit Haskell GHC Typen Funktionen Einführung in die Funktionale Programmierung mit Haskell Erste Schritte, Typen und Funktionen LFE Theoretische Informatik, Institut für Informatik, Ludwig-Maximilians Universität,

Mehr

Programmieren in Haskell Einstieg in Haskell

Programmieren in Haskell Einstieg in Haskell Programmieren in Haskell Einstieg in Haskell Peter Steffen Universität Bielefeld Technische Fakultät 24.10.2008 1 Programmieren in Haskell Was wir heute machen Umfrage: Wer hat den Hugs ausprobiert? Ausdrücke

Mehr

Kurseinheit 1 Einführung und mathematische Grundlagen Aussagenlogik

Kurseinheit 1 Einführung und mathematische Grundlagen Aussagenlogik Kurseinheit 1 Einführung und mathematische Grundlagen Aussagenlogik Fragen Seite Punkte 1. Was ist die Mathematische Logik? 3 2 2. Was sind die Aussagenlogik und die Prädikatenlogik? 5 4 3. Was sind Formeln,

Mehr

Semantik von Programmiersprachen SS 2017

Semantik von Programmiersprachen SS 2017 Lehrstuhl für Programmierparadigmen Denis Lohner Sebastian Ullrich denis.lohner@kit.edu sebastian.ullrich@kit.edu Semantik von Programmiersprachen SS 2017 http://pp.ipd.kit.edu/lehre/ss2017/semantik Lösungen

Mehr

Prädikatenlogiken. Mathematische Logik. Vorlesung 6. Alexander Bors. 30. März & 6. April A. Bors Logik

Prädikatenlogiken. Mathematische Logik. Vorlesung 6. Alexander Bors. 30. März & 6. April A. Bors Logik Mathematische Logik Vorlesung 6 Alexander Bors 30. März & 6. April 2017 1 Überblick 1 Formale Prädikatenlogiken erster Stufe (Quelle: Ziegler, pp. 3 24) 2 Erinnerung Letztes Mal haben wir begonnen, ein

Mehr

Programmieren in Haskell

Programmieren in Haskell Programmieren in Haskell Wir steigen ein... Programmieren in Haskell 1 Was wir heute machen Umfrage: Wer hat den Hugs ausprobiert? Ausdrücke und Werte Datentypen Funktionen Aufgabe für s Wochenende Programmieren

Mehr

Beispiel: Hamming-Folge Erzeuge eine Folge X = x 0,x 2,... mit folgenden Eigenschaften: 1. x i+1 > x i für alle i

Beispiel: Hamming-Folge Erzeuge eine Folge X = x 0,x 2,... mit folgenden Eigenschaften: 1. x i+1 > x i für alle i Beispiel: Hamming-Folge Erzeuge eine Folge X = x 0,x 2,... mit folgenden Eigenschaften: 1. x i+1 > x i für alle i FP-8.7 2. x 0 = 1 3. Falls x in der Folge X auftritt, dann auch 2x, 3x und 5x. 4. Nur die

Mehr

Grundprinzipien der funktionalen Programmierung

Grundprinzipien der funktionalen Programmierung Grundprinzipien der funktionalen Programmierung Funktionen haben keine Seiteneffekte Eine Funktion berechnet einen Ausgabewert der nur von den Eingabewerten abhängt: 12 inputs + output 46 34 2 Nicht nur

Mehr

Der λ-kalkül. Frank Huch. Sommersemester 2015

Der λ-kalkül. Frank Huch. Sommersemester 2015 Der λ-kalkül Frank Huch Sommersemester 2015 In diesem Skript werden die Grundlagen der Funktionalen Programmierung, insbesondere der λ-kalkül eingeführt. Der hier präsentierte Stoff stellt einen teil der

Mehr

Logik I. Symbole, Terme, Formeln

Logik I. Symbole, Terme, Formeln Logik I Symbole, Terme, Formeln Wie jede geschriebene Sprache basiert die Prädikatenlogik erster Stufe auf einem Alphabet, welches aus den folgenden Symbolen besteht: (a) Variabeln wie zum Beispiel v 0,v

Mehr

Logik. Logik. Vorkurs Informatik Theoretischer Teil WS 2013/ September Vorkurs Informatik - Theorie - WS2013/14

Logik. Logik. Vorkurs Informatik Theoretischer Teil WS 2013/ September Vorkurs Informatik - Theorie - WS2013/14 Logik Logik Vorkurs Informatik Theoretischer Teil WS 2013/14 30. September 2013 Logik > Logik > logische Aussagen Logik Logik > Logik > logische Aussagen Motivation Logik spielt in der Informatik eine

Mehr

Typ-Polymorphismus. November 12, 2014

Typ-Polymorphismus. November 12, 2014 Typ-Polymorphismus Universität Bielefeld AG Praktische Informatik November 12, 2014 Das Haskell Typ-System Wir beginnen mit einer Wiederholung des Bekannten: In allen Programmiersprachen sind Typ-Konzepte

Mehr

Substitution. Unifikation. Komposition der Substitution. Ausführung der Substitution

Substitution. Unifikation. Komposition der Substitution. Ausführung der Substitution Substitution Unifikation Ziel eines Widerspruchsbeweis: Widerspruch ja/nein Variablenbindung im Falle eines Widerspruchs Eine Substitution θ ist eine endliche Menge der Form {v 1 /t 1 v n /t n }, wobei

Mehr

Einführung in die Theoretische Informatik

Einführung in die Theoretische Informatik Technische Universität München Fakultät für Informatik Prof. Tobias Nipkow, Ph.D. Sascha Böhme, Lars Noschinski Sommersemester 2011 Lösungsblatt 9 25. Juli 2011 Einführung in die Theoretische Informatik

Mehr

Praktische Informatik 3: Funktionale Programmierung Vorlesung 11 vom : Monaden als Berechnungsmuster

Praktische Informatik 3: Funktionale Programmierung Vorlesung 11 vom : Monaden als Berechnungsmuster 16:02:16 2017-01-17 1 [30] Praktische Informatik 3: Funktionale Programmierung Vorlesung 11 vom 10.01.2017: Monaden als Berechnungsmuster Christoph Lüth Universität Bremen Wintersemester 2016/17 Frohes

Mehr

Einführung in die Programmierung mit Go

Einführung in die Programmierung mit Go Einführung in die Programmierung mit Go Teil 1: Grundlegende Konzepte Prof. Dr. Christoph Reichenbach Fachbereich 12 / Institut für Informatik 8. März 2015 Übersicht der Veranstaltung Sonderveranstaltung:

Mehr

Behauptung: Wenn f : A -> W und g: W -> V Funktionen sind, dann ist g. f: A->V eine Funktion

Behauptung: Wenn f : A -> W und g: W -> V Funktionen sind, dann ist g. f: A->V eine Funktion Algorithmen und Programmierung 2. Aufgabenblatt Aufgabe 2.1 a) Jedes Konto besitzt einen Betrag: total Es gibt Konten mit dem gleichen Betrag, aber nicht alle Beträge kommen vor: nicht injektiv und nicht

Mehr

Operationen auf Grammatiken

Operationen auf Grammatiken Operationen auf Grammatiken Ziel: Normalisierungen, Vereinfachungen, Elimination bestimmter Konstrukte Erzeugen eines Parsers Transformation G 1 G 2 mit L(G 1 ) = L(G 2 ) I.a. Parsebaum 1 (w) Parsebaum

Mehr

WS 2011/2012. Georg Sauthoff 1. November 11, 2011

WS 2011/2012. Georg Sauthoff 1. November 11, 2011 WS 2011/2012 Georg 1 AG Praktische Informatik November 11, 2011 1 gsauthof@techfak.uni-bielefeld.de Skripte sind nun fertig und gibt es in den Tutorien Sprechstunden Zusammenfassung -Kapitel Signatur zuerst

Mehr

Kapitel 3: Eine einfache Programmiersprache. Programmieren in Haskell 1

Kapitel 3: Eine einfache Programmiersprache. Programmieren in Haskell 1 Kapitel 3: Eine einfache Programmiersprache Programmieren in Haskell 1 Datentypen, Datentypdefinitionen data Instrument = Oboe HonkyTonkPiano Cello VoiceAahs data Musik = Note Ton Dauer Pause Dauer Musik

Mehr

Der untypisierte Lambda-Kalkül

Der untypisierte Lambda-Kalkül Der untypisierte Lambda-Kalkül Der Lambda-Kalkül wurde zur Beschreibung des mathematischen Begriffs Funktion entwickelt. Die Menge aller Lambda-Ausdrücke Exp ist folgendermaßen definiert: x Exp wenn x

Mehr

Resolutionskalkül. wird t als eine Menge K t von Klauseln geschrieben, welche die einzelnen Maxterme repräsentieren:

Resolutionskalkül. wird t als eine Menge K t von Klauseln geschrieben, welche die einzelnen Maxterme repräsentieren: Resolutionskalkül Ein Kalkül ist eine Kollektion von syntaktischen Umformungsregeln, die unter gegebenen Voraussetzungen aus bereits vorhandenen Formeln neue Formeln erzeugen. Der Resolutionskalkül besteht

Mehr

Überblick. 3. Mathematische Grundlagen 3.1 Mengen und Abbildungen 3.2 Induktion und Rekursion 3.3 Boolsche Algebra

Überblick. 3. Mathematische Grundlagen 3.1 Mengen und Abbildungen 3.2 Induktion und Rekursion 3.3 Boolsche Algebra Überblick 3. Mathematische Grundlagen 3.1 Mengen und Abbildungen 3.2 3.3 Boolsche Algebra Peer Kröger (LMU München) Einführung in die Programmierung WS 14/15 72 / 179 Beweisprinzip der vollständigen Induktion

Mehr

Kapitel 2: Multiplikative Funktionen. 3 Multiplikative Funktionen. Definition 2.1 (arithmetische Funktion, (vollständig) multiplikative Funktion)

Kapitel 2: Multiplikative Funktionen. 3 Multiplikative Funktionen. Definition 2.1 (arithmetische Funktion, (vollständig) multiplikative Funktion) Kapitel 2: Multiplikative Funktionen 3 Multiplikative Funktionen Definition 2.1 (arithmetische Funktion, (vollständig) multiplikative Funktion) (a) Eine Funktion α : Z >0 C heißt arithmetisch (oder zahlentheoretisch).

Mehr

Diskrete Strukturen Kapitel 2: Grundlagen (Beweise)

Diskrete Strukturen Kapitel 2: Grundlagen (Beweise) WS 2014/15 Diskrete Strukturen Kapitel 2: Grundlagen (Beweise) Hans-Joachim Bungartz Lehrstuhl für wissenschaftliches Rechnen Fakultät für Informatik Technische Universität München http://www5.in.tum.de/wiki/index.php/diskrete_strukturen_-_winter_14

Mehr

Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie wotawa@ist.tugraz.at

Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie wotawa@ist.tugraz.at Inhalt SWP Funktionale Programme (2. Teil) Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie wotawa@ist.tugraz.at Interpreter für funktionale Sprache

Mehr

Formale Systeme. Prädikatenlogik 2. Stufe. Prof. Dr. Bernhard Beckert WS 2009/2010 KIT INSTITUT FÜR THEORETISCHE INFORMATIK

Formale Systeme. Prädikatenlogik 2. Stufe. Prof. Dr. Bernhard Beckert WS 2009/2010 KIT INSTITUT FÜR THEORETISCHE INFORMATIK Formale Systeme Prof. Dr. Bernhard Beckert WS 2009/2010 KIT INSTITUT FÜR THEORETISCHE INFORMATIK KIT University of the State of Baden-Württemberg and National Large-scale Research Center of the Helmholtz

Mehr

Abstraktion mittels Polymorphie und Funktionen höherer Ordnung. Abschnitt 3.3. Polymorphie und Funktionen höherer Ordnung. Unterabschnitt 3.3.

Abstraktion mittels Polymorphie und Funktionen höherer Ordnung. Abschnitt 3.3. Polymorphie und Funktionen höherer Ordnung. Unterabschnitt 3.3. Abschnitt 3.3 Abstraktion mittels Polymorphie und Funktionen höherer Ordnung Überblick: Polymorphie und Funktionen höherer Ordnung Grundbegriffe der Typisierung Polymorphie als Abstraktionsmittel Typsysteme

Mehr

Praktische Informatik 3: Funktionale Programmierung Vorlesung 2 vom : Funktionen und Datentypen

Praktische Informatik 3: Funktionale Programmierung Vorlesung 2 vom : Funktionen und Datentypen Rev. 1843 1 [35] Praktische Informatik 3: Funktionale Programmierung Vorlesung 2 vom 23.10.2012: Funktionen und Datentypen Christoph Lüth Universität Bremen Wintersemester 2012/13 2 [35] Fahrplan Teil

Mehr

Praktische Informatik 3: Funktionale Programmierung Vorlesung 1 vom : Einführung

Praktische Informatik 3: Funktionale Programmierung Vorlesung 1 vom : Einführung 16:01:53 2017-01-17 1 [26] Praktische Informatik 3: Funktionale Programmierung Vorlesung 1 vom 18.10.2016: Einführung Christoph Lüth Universität Bremen Wintersemester 2016/17 PI3 WS 16/17 2 [26] Personal

Mehr

Kapitel 16. Cardelli-Typsystem. Wozu Typen und Typsysteme?

Kapitel 16. Cardelli-Typsystem. Wozu Typen und Typsysteme? Kapitel 16 Cardelli-Typsystem Wozu Typen und Typsysteme? Typen legen die möglichen Werte von Variablen fest Compiler können effizienten Code generieren bestimmte Laufzeitfehler werden garantiert verhindert

Mehr

Die Prädikatenlogik erster Stufe: Syntax und Semantik

Die Prädikatenlogik erster Stufe: Syntax und Semantik Die Prädikatenlogik erster Stufe: Syntax und Semantik 1 Mathematische Strukturen und deren Typen Definition 1.1 Eine Struktur A ist ein 4-Tupel A = (A; (R A i i I); (f A j j J); (c A k k K)) wobei I, J,

Mehr

Programmierung 1 (Wintersemester 2012/13) Lösungsblatt 1 (Kapitel 1)

Programmierung 1 (Wintersemester 2012/13) Lösungsblatt 1 (Kapitel 1) Fachrichtung 6.2 Informatik Universität des Saarlandes Tutorenteam der Vorlesung Programmierung 1 Programmierung 1 (Wintersemester 2012/13) Lösungsblatt 1 (Kapitel 1) Hinweis: Dieses Übungsblatt enthält

Mehr

Haskell und Python. pures Programmieren, Auswerten von Ausdrücken rekursives Programmieren, Typsystem. Python: Eine prozedurale Programmiersprache

Haskell und Python. pures Programmieren, Auswerten von Ausdrücken rekursives Programmieren, Typsystem. Python: Eine prozedurale Programmiersprache Haskell und Python Haskell: Eine funktionale Programmiersprache funktional, nicht-strikt, hat ein polymorphes und starkes Typsystem, flexible Datenstrukturen, gute Abstraktionseigenschaften, Ziele: pures

Mehr

Mathematische Grundlagen I Logik und Algebra

Mathematische Grundlagen I Logik und Algebra Logik und Algebra Dr. Tim Haga 21. Oktober 2016 1 Aussagenlogik Erste Begriffe Logische Operatoren Disjunktive und Konjunktive Normalformen Logisches Schließen Dr. Tim Haga 1 / 21 Präliminarien Letzte

Mehr

Effiziente Algorithmen 2

Effiziente Algorithmen 2 Effiziente Algorithmen 2 Dr. Hanjo Täubig Lehrstuhl für Effiziente Algorithmen (Prof. Dr. Ernst W. Mayr) Institut für Informatik Technische Universität München Sommersemester 2009 Übersicht Algorithmen

Mehr

FAKULTÄT FÜR INFORMATIK

FAKULTÄT FÜR INFORMATIK TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK Lehrstuhl für Sprachen und Beschreibungsstrukturen WS 2008/09 Einführung in die Informatik 2 Übungsblatt 10 Prof. Dr. Helmut Seidl, T. M. Gawlitza,

Mehr

Lösungen zum Übungsblatt 3: Softwareentwicklung I (WS 2006/07)

Lösungen zum Übungsblatt 3: Softwareentwicklung I (WS 2006/07) Prof. Dr. A. Poetzsch-Heffter Dipl.-Inform. J.O. Blech Dipl.-Inform. M.J. Gawkowski Dipl.-Inform. N. Rauch Technische Universität Kaiserslautern Fachbereich Informatik AG Softwaretechnik Lösungen zum Übungsblatt

Mehr

Inhalt. 1 Mathematik? 2 PROLOG-1: Aussagen und Mengen. 3 PROLOG-2: Funktionen. 4 PROLOG-3: Zahlenmengen und vollständige Induktion

Inhalt. 1 Mathematik? 2 PROLOG-1: Aussagen und Mengen. 3 PROLOG-2: Funktionen. 4 PROLOG-3: Zahlenmengen und vollständige Induktion Inhalt 1 Mathematik? 2 PROLOG-1: Aussagen und Mengen 3 PROLOG-2: Funktionen 4 PROLOG-3: Zahlenmengen und vollständige Induktion 5 PROLOG-4: Ungleichungen Daniel Weller (Inst. f. Diskr. Math.) PROLOG 2013

Mehr

ALP I Einführung in Haskell

ALP I Einführung in Haskell ALP I Einführung in Haskell WS 2012/2013 Was ist Haskell? Haskell ist eine rein Funktionale Programmiersprache mit einer nach Bedarf Auswertung-Strategie oder "Lazy Evaluation". Was bedeutet rein funktional?

Mehr

Berechnungsschemata: Funktion als Parameter abstrahiert Operation im Schema, wird bei Aufruf des Schemas konkretisiert

Berechnungsschemata: Funktion als Parameter abstrahiert Operation im Schema, wird bei Aufruf des Schemas konkretisiert 6. Funktionen als Daten, Übersicht Orthogonales Typsystem: Funktionen sind beliebig mit anderen Typen kombinierbar Notation für Funktionswerte (Lambda-Ausdruck): fn (z,k) => z*k Datenstrukturen mit Funktionen

Mehr

Der untypisierte Lambda-Kalkül als Programmiersprache

Der untypisierte Lambda-Kalkül als Programmiersprache Der untypisierte Lambda-Kalkül als Programmiersprache November 29, 2006 betreut von Prof. Tobias Nipkow Einführung In den 1930er Jahren von Alonzo Church und Stephen Kleene eingeführt Der Lambda-Kalkül

Mehr

WS 2011/2012. Robert Giegerich Dezember 2013

WS 2011/2012. Robert Giegerich Dezember 2013 WS 2011/2012 Robert 1 AG Praktische Informatik 11. Dezember 2013 1 robert@techfak.uni-bielefeld.de Vorschau Themen heute: Funktionen höherer Ordnung (Fortsetzung) künstliche Striktheit mehr zu fold für

Mehr