Einführung in Funktionale Programmierung Typisierung

Größe: px
Ab Seite anzeigen:

Download "Einführung in Funktionale Programmierung Typisierung"

Transkript

1 Einführung in Funktionale Programmierung Typisierung PD Dr. David Sabel WS 2015/16 Stand der Folien: 19. November 2015

2 Motivation Typen Typisierungsverfahren Ziele des Kapitels Warum typisieren? Typisierungsverfahren für Haskell bzw. KFPTS+seq für parametrisch polymorphe Typen Iteratives Typisierungsverfahren Milnersches Typisierungsverfahren D. Sabel EFP WS 2015/16 Typisierung 2/106

3 Motivation Typen Typisierungsverfahren Übersicht D. Sabel EFP WS 2015/16 Typisierung 3/106

4 Motivation Typen Typisierungsverfahren Motivation Warum ist ein Typsystem sinnvoll? Für ungetypte Programme können dynamische Typfehler auftreten Fehler zur Laufzeit sind Programmierfehler Starkes und statisches Typsystem = keine Typfehler zu Laufzeit Typen als Dokumentation Typen bewirken besser strukturierte Programme Typen als Spezifikation in der Entwurfsphase D. Sabel EFP WS 2015/16 Typisierung 4/106

5 Motivation Typen Typisierungsverfahren Motivation (2) Minimalanforderungen: Die Typisierung sollte zur Compilezeit entschieden werden. Korrekt getypte Programme erzeugen keine Typfehler zur Laufzeit. D. Sabel EFP WS 2015/16 Typisierung 5/106

6 Motivation Typen Typisierungsverfahren Motivation (2) Minimalanforderungen: Die Typisierung sollte zur Compilezeit entschieden werden. Korrekt getypte Programme erzeugen keine Typfehler zur Laufzeit. Wünschenswerte Eigenschaften: Typsystem schränkt wenig oder gar nicht beim Programmieren ein Compiler kann selbst Typen berechnen = Typinferenz D. Sabel EFP WS 2015/16 Typisierung 5/106

7 Motivation Typen Typisierungsverfahren Motivation (3) Es gibt Typsysteme, die diese Eigenschaften nicht erfüllen: Z.B. Simply-typed Lambda-Calculus: Getypte Sprache ist nicht mehr Turing-mächtig, da dieses Typsystem erzwingt, dass alle Programme terminieren Erweiterungen in Haskells Typsystem: Typisierung / Typinferenz ist unentscheidbar. U.U. terminiert der Compiler nicht!. Folge: mehr Vorsicht/Anforderungen an den Programmierer. D. Sabel EFP WS 2015/16 Typisierung 6/106

8 Motivation Typen Typisierungsverfahren Naiver Ansatz Naive Definition von korrekt getypt : Ein KFPTS+seq-Programm ist korrekt getypt, wenn es keine dynamischen Typfehler zur Laufzeit erzeugt. D. Sabel EFP WS 2015/16 Typisierung 7/106

9 Motivation Typen Typisierungsverfahren Naiver Ansatz Naive Definition von korrekt getypt : Ein KFPTS+seq-Programm ist korrekt getypt, wenn es keine dynamischen Typfehler zur Laufzeit erzeugt. Funktioniert nicht gut, denn Die dynamische Typisierung in KFPTS+seq ist unentscheidbar! D. Sabel EFP WS 2015/16 Typisierung 7/106

10 Motivation Typen Typisierungsverfahren Unentscheidbarkeit der dynamischen Typisierung Sei tmencode eine KFPTS+seq-Funktion, die sich wie eine universelle Turingmaschine verhält: Eingabe: Turingmaschinenbeschreibung und Eingabe für die TM Ausgabe: True, falls die Turingmaschine anhält Beachte: tmencode ist in KFPTS+seq definierbar und nicht dynamisch ungetypt (also dynamisch getypt) (Haskell-Programm auf der Webseite) D. Sabel EFP WS 2015/16 Typisierung 8/106

11 Motivation Typen Typisierungsverfahren Unentscheidbarkeit der dynamischen Typisierung (2) Für eine TM-Beschreibung b und Eingabe e sei s := if tmencode b e then case Bool Nil of {True True; False False} else case Bool Nil of {True True; False False} Es gilt: s ist genau dann dynamisch ungetypt, wenn die Turingmaschine b auf Eingabe e hält. Daher: Wenn wir dynamische Typisierung entscheiden könnten, dann auch das Halteproblem Satz Die dynamische Typisierung von KFPTS+seq-Programmen ist unentscheidbar. D. Sabel EFP WS 2015/16 Typisierung 9/106

12 Typen Motivation Typen Typisierungsverfahren Syntax von polymorphen Typen: T ::= T V T C T 1... T n T 1 T 2 wobei T V Typvariable, T C Typkonstruktor Sprechweisen: Ein Basistyp ist ein Typ der Form T C, wobei T C ein nullstelliger Typkonstruktor ist. Ein Grundtyp (oder alternativ monomorpher Typ) ist ein Typ, der keine Typvariablen enthält. Beispiele: Int, Bool und Char sind Basistypen. [Int] und Char -> Int sind keine Basistypen aber Grundtypen. [a] und a -> a sind weder Basistypen noch Grundtypen. D. Sabel EFP WS 2015/16 Typisierung 10/106

13 Motivation Typen Typisierungsverfahren Typen (2) Wir verwenden für polymorphe Typen die Schreibweise mit All-Quantoren: Sei τ ein polymorpher Typ mit Vorkommen der Variablen α 1,..., α n Dann ist α 1,..., α n.τ der all-quantifizierte Typ für τ. Da Reihenfolge egal, verwenden wir auch X.τ wobei X Menge von Typvariablen Später: Allquantifizierte Typen dürfen kopiert und umbenannt werden, Typen ohne Quantor dürfen nicht umbenannt werden! D. Sabel EFP WS 2015/16 Typisierung 11/106

14 Motivation Typen Typisierungsverfahren Typsubstitutionen Eine Typsubstitution ist eine Abbildung einer endlichen Menge von Typvariablen auf Typen, Schreibweise: σ = {α 1 τ 1,..., α n τ n }. Formal: Erweiterung auf Typen: σ E : Abbildung von Typen auf Typen σ E (T V ) := σ(t V ), falls σ die Variable T V abbildet σ E (T V ) := T V, falls σ die Variable T V nicht abbildet σ E (T C T 1... T n ) := T C σ E (T 1 )... σ E (T n ) σ E (T 1 T 2 ) := σ E (T 1 ) σ E (T 2 ) Wir unterscheiden im folgenden nicht zwischen σ und der Erweiterung σ E! D. Sabel EFP WS 2015/16 Typisierung 12/106

15 Motivation Typen Typisierungsverfahren Semantik eines polymorphen Typs Grundtypen-Semantik für polymorphe Typen: sem(τ) := {σ(τ) σ(τ) ist Grundtyp, σ ist Substitution} Entspricht der Vorstellung von schematischen Typen: Ein polymorpher Typ ist ein Schema für eine Menge von Grundtypen D. Sabel EFP WS 2015/16 Typisierung 13/106

16 Motivation Typen Typisierungsverfahren Typregeln Bekannte Regel: s :: T 1 T 2, t :: T 1 (s t) :: T 2 Problem: Man muss richtige Instanz raten, z.b. map :: (a -> b) -> [a] -> [b] not :: Bool -> Bool Typisierung von map not: Vor Anwendung der Regel muss der Typ von map instanziiert werden mit σ = {a Bool, b Bool} Statt σ zu raten, kann man σ berechnen: Unifikation D. Sabel EFP WS 2015/16 Typisierung 14/106

17 Motivation Typen Typisierungsverfahren Unifikationsproblem Definition Ein Unifikationsproblem auf Typen ist gegeben durch eine Menge Γ von Gleichungen der Form τ 1 = τ 2, wobei τ 1 und τ 2 polymorphe Typen sind. Eine Lösung eines Unifikationsproblem Γ auf Typen ist eine Substitution σ (bezeichnet als Unifikator), so dass σ(τ 1 ) = σ(τ 2 ) für alle Gleichungen τ 1 = τ 2 des Problems. Eine allgemeinste Lösung (allgemeinster Unifikator, mgu = most general unifier) von Γ ist ein Unifikator σ, so dass gilt: Für jeden anderen Unifikator ρ von Γ gibt es eine Substitution γ so dass ρ(x) = γ σ(x) für alle x FV (Γ). D. Sabel EFP WS 2015/16 Typisierung 15/106

18 Motivation Typen Typisierungsverfahren Unifikationsalgorithmus Datenstruktur: Γ = Multimenge von Gleichungen Multimenge Menge mit mehrfachem Vorkommen von Elementen Γ Γ sei die disjunkte Vereinigung von zwei Multimengen Γ[τ/α] ist definiert als {s[τ/α] = t[τ/α] (s = t) Γ}. Algorithmus: Wende Schlussregeln (s.u.) solange auf Γ an, bis Fail auftritt, oder keine Regel mehr anwendbar ist D. Sabel EFP WS 2015/16 Typisierung 16/106

19 Motivation Typen Typisierungsverfahren Unifikationsalgorithmus: Schlussregeln Fail-Regeln: Fail1 Γ {(T C 1 τ 1... τ n ) = (T C 2 τ 1... τ m)} Fail wenn T C 1 T C 2 Fail2 Γ {(T C 1 τ 1... τ n ) = (τ 1 τ 2)} Fail Fail3 Γ {(τ 1 τ 2) = (T C 1 τ 1... τ n )} Fail D. Sabel EFP WS 2015/16 Typisierung 17/106

20 Motivation Typen Typisierungsverfahren Unifikationsalgorithmus: Schlussregeln (2) Dekomposition: Decompose1 Γ {T C τ 1... τ n = T C τ 1... τ n} Γ {τ 1 = τ 1,..., τ n = τ n} Decompose2 Γ {τ 1 τ 2 = τ 1 τ 2} Γ {τ 1 = τ 1, τ 2 = τ 2} D. Sabel EFP WS 2015/16 Typisierung 18/106

21 Motivation Typen Typisierungsverfahren Unifikationsalgorithmus: Schlussregeln (3) Orientierung, Elimination: Orient Γ {τ 1 = α} Γ {α = τ 1 } wenn τ 1 keine Typvariable und α Typvariable Elim Γ {α = α} Γ wobei α Typvariable D. Sabel EFP WS 2015/16 Typisierung 19/106

22 Motivation Typen Typisierungsverfahren Unifikationsalgorithmus: Schlussregeln (4) Einsetzung, Occurs-Check: Γ {α = τ} Solve Γ[τ/α] {α = τ} wenn Typvariable α nicht in τ vorkommt, aber α kommt in Γ vor OccursCheck Γ {α = τ} Fail wenn τ α und Typvariable α kommt in τ vor D. Sabel EFP WS 2015/16 Typisierung 20/106

23 Motivation Typen Typisierungsverfahren Beispiele Beispiel 1: {(a b) = Bool Bool}: Decompose2 {(a b) = Bool Bool} {a = Bool, b = Bool} D. Sabel EFP WS 2015/16 Typisierung 21/106

24 Motivation Typen Typisierungsverfahren Beispiele Beispiel 1: {(a b) = Bool Bool}: Decompose2 {(a b) = Bool Bool} {a = Bool, b = Bool} Beispiel 2: {[d] = c, a [a] = Bool c}: {[d] = c, a [a] = Bool c} D. Sabel EFP WS 2015/16 Typisierung 21/106

25 Motivation Typen Typisierungsverfahren Beispiele Beispiel 1: {(a b) = Bool Bool}: Beispiel 2: {[d] Decompose2 {(a b) = Bool Bool} {a = Bool, b = Bool} = c, a [a] = Bool c}: Decompose2 {[d] = c, a [a] = Bool c} {[d] = c, a = Bool, [a] = c} D. Sabel EFP WS 2015/16 Typisierung 21/106

26 Motivation Typen Typisierungsverfahren Beispiele Beispiel 1: {(a b) = Bool Bool}: Beispiel 2: {[d] Decompose2 {(a b) = Bool Bool} {a = Bool, b = Bool} = c, a [a] = Bool c}: Decompose2 {[d] = c, a [a] = Bool c} {[d] = c, a = Bool, [a] = c} Orient {[d] = c, a = Bool, c = [a]} D. Sabel EFP WS 2015/16 Typisierung 21/106

27 Motivation Typen Typisierungsverfahren Beispiele Beispiel 1: {(a b) = Bool Bool}: Beispiel 2: {[d] Decompose2 {(a b) = Bool Bool} {a = Bool, b = Bool} = c, a [a] = Bool c}: Decompose2 {[d] = c, a [a] = Bool c} {[d] = c, a = Bool, [a] = c} Orient {[d] = c, a = Bool, c = [a]} Solve {[d] = [a], a = Bool, c = [a]} D. Sabel EFP WS 2015/16 Typisierung 21/106

28 Motivation Typen Typisierungsverfahren Beispiele Beispiel 1: {(a b) = Bool Bool}: Beispiel 2: {[d] Decompose2 {(a b) = Bool Bool} {a = Bool, b = Bool} = c, a [a] = Bool c}: Decompose2 {[d] = c, a [a] = Bool c} {[d] = c, a = Bool, [a] = c} Orient {[d] = c, a = Bool, c = [a]} Solve {[d] = [a], a = Bool, c = [a]} Solve {[d] = [Bool], a = Bool, c = [Bool]} D. Sabel EFP WS 2015/16 Typisierung 21/106

29 Motivation Typen Typisierungsverfahren Beispiele Beispiel 1: {(a b) = Bool Bool}: Beispiel 2: {[d] Decompose2 {(a b) = Bool Bool} {a = Bool, b = Bool} = c, a [a] = Bool c}: Decompose2 {[d] = c, a [a] = Bool c} {[d] = c, a = Bool, [a] = c} Orient {[d] = c, a = Bool, c = [a]} Solve {[d] = [a], a = Bool, c = [a]} Solve {[d] = [Bool], a = Bool, c = [Bool]} Decompose1 {d = Bool, a = Bool, c = [Bool]} D. Sabel EFP WS 2015/16 Typisierung 21/106

30 Motivation Typen Typisierungsverfahren Beispiele Beispiel 1: {(a b) = Bool Bool}: Beispiel 2: {[d] Decompose2 {(a b) = Bool Bool} {a = Bool, b = Bool} = c, a [a] = Bool c}: Decompose2 {[d] = c, a [a] = Bool c} {[d] = c, a = Bool, [a] = c} Orient {[d] = c, a = Bool, c = [a]} Solve {[d] = [a], a = Bool, c = [a]} Solve {[d] = [Bool], a = Bool, c = [Bool]} Decompose1 {d = Bool, a = Bool, c = [Bool]} Der Unifikator ist {d Bool, a Bool, c [Bool]}. D. Sabel EFP WS 2015/16 Typisierung 21/106

31 Motivation Typen Typisierungsverfahren Beispiele (2) Beispiel 3: {a = [b], b = [a]} OccursCheck Solve {a = [b], b = [a]} {a = [[a]], b = [a]} Fail D. Sabel EFP WS 2015/16 Typisierung 22/106

32 Motivation Typen Typisierungsverfahren Beispiele (2) Beispiel 3: {a = [b], b = [a]} OccursCheck Solve {a = [b], b = [a]} {a = [[a]], b = [a]} Fail Beispiel 4: {a [b] = a c d} Decompose2 {a [b] = a c d} {a = a, [b] = c d} Elim {[b] = c d} Fail2 Fail D. Sabel EFP WS 2015/16 Typisierung 22/106

33 Motivation Typen Typisierungsverfahren Eigenschaften des Unifikationsalgorithmus Der Algorithmus endet mit Fail gdw. es keinen Unifikator für die Eingabe gibt. Der Algorithmus endet erfolgreich gdw. es einen Unifikator für die Eingabe gibt. Das Gleichungssystem Γ ist dann von der Form {α 1 = τ 1,..., α n = τ n }, wobei α i paarweise verschiedene Typvariablen sind und kein α i in irgendeinem τ j vorkommt. Der Unifikator kann dann abgelesen werden als σ = {α 1 τ 1,..., α n τ n }. Liefert der Algorithmus einen Unifikator, dann ist es ein allgemeinster Unifikator. σ allgemeinst bedeutet: jede andere Lösung ist abgedeckt, d.h ist spezieller als σ, genauer: kann durch weitere Einsetzung aus σ erzeugt werden. D. Sabel EFP WS 2015/16 Typisierung 23/106

34 Motivation Typen Typisierungsverfahren Eigenschaften des Unifikationsalgorithmus (2) Man braucht keine alternativen Regelanwendungen auszuprobieren! Der Algorithmus kann deterministisch implementiert werden. Der Algorithmus terminiert für jedes Unifikationsproblem auf Typen. Ausgabe: Fail oder der allgemeinste Unifikator D. Sabel EFP WS 2015/16 Typisierung 24/106

35 Motivation Typen Typisierungsverfahren Eigenschaften des Unifikationsalgorithmus (3) Die Typen in der Resultat-Substitution können exponentiell groß werden. Der Unifikationsalgorithmus kann aber so implementiert werden, dass er Zeit O(n log n) benötigt. Man muss Sharing dazu beachten; Dazu eine andere Solve-Regel benutzen. Die Typen in der Resultat-Substitution haben danach Darstellungsgröße O(n). Das Unifikationsproblem (d.h. die Frage, ob eine Menge von Typgleichungen unifizierbar ist) ist P-complete. D.h. man kann im wesentlichen alle PTIME-Probleme als Unifikationsproblem darstellen: Interpretation ist: Unifikation ist nicht effizient parallelisierbar. D. Sabel EFP WS 2015/16 Typisierung 25/106

36 Typisierungsverfahren Wir betrachten nun die polymorphe Typisierung von KFPTSP+seq-Ausdrücken Wir verschieben zunächst: Typisierung von Superkombinatoren D. Sabel EFP WS 2015/16 Typisierung 26/106

37 Typisierungsverfahren Wir betrachten nun die polymorphe Typisierung von KFPTSP+seq-Ausdrücken Wir verschieben zunächst: Typisierung von Superkombinatoren Nächster Schritt: Wie müssen die Typisierungsregeln aussehen? D. Sabel EFP WS 2015/16 Typisierung 26/106

38 Anwendungsregel mit Unifikation s :: τ 1, t :: τ 2 (s t) :: σ(α) wenn σ allgemeinster Unifikator für τ 1 = τ 2 α ist und α neue Typvariable ist. D. Sabel EFP WS 2015/16 Typisierung 27/106

39 Anwendungsregel mit Unifikation Beispiel: s :: τ 1, t :: τ 2 (s t) :: σ(α) wenn σ allgemeinster Unifikator für τ 1 = τ 2 α ist und α neue Typvariable ist. map :: (a b) [a] [b], not :: Bool Bool (map not) :: σ(α) wenn σ allgemeinster Unifikator für (a b) [a] [b] = (Bool Bool) α ist und α neue Typvariable ist. D. Sabel EFP WS 2015/16 Typisierung 27/106

40 Anwendungsregel mit Unifikation Beispiel: s :: τ 1, t :: τ 2 (s t) :: σ(α) wenn σ allgemeinster Unifikator für τ 1 = τ 2 α ist und α neue Typvariable ist. map :: (a b) [a] [b], not :: Bool Bool (map not) :: σ(α) wenn σ allgemeinster Unifikator für (a b) [a] [b] = (Bool Bool) α ist und α neue Typvariable ist. Unifikation ergibt {a Bool, b Bool, α [Bool] [Bool]} Daher: σ(α) = [Bool] [Bool] D. Sabel EFP WS 2015/16 Typisierung 27/106

41 Typisierung mit Bindern Wie typisiert man eine Abstraktion λx.s? Typisiere den Rumpf s Sei s :: τ Dann erhält λx.s einen Funktionstyp τ 1 τ Was hat τ 1 mit τ zu tun? τ 1 ist der Typ von x Wenn x im Rumpf s vorkommt, brauchen wir τ 1 bei der Berechnung von τ! D. Sabel EFP WS 2015/16 Typisierung 28/106

42 Typisierung mit Bindern (2) Informelle Regel für die Abstraktion: Typisierung von s unter der Annahme x hat Typ τ 1 ergibt s :: τ λx.s :: τ 1 τ Woher erhalten wir τ 1? D. Sabel EFP WS 2015/16 Typisierung 29/106

43 Typisierung mit Bindern (2) Informelle Regel für die Abstraktion: Typisierung von s unter der Annahme x hat Typ τ 1 ergibt s :: τ λx.s :: τ 1 τ Woher erhalten wir τ 1? Nehme allgemeinsten Typ an für x, danach schränke durch die Berechnung von τ den Typ ein. Beispiel: λx.(x True) Typisiere (x True) beginnend mit x :: α Typisierung muss liefern α = Bool α Typ der Abstraktion λx.(x True) :: (Bool α ) α. D. Sabel EFP WS 2015/16 Typisierung 29/106

44 Typisierung von Ausdrücken Erweitertes Regelformat: Bedeutung: A s :: τ, E Gegeben eine Menge A von Typ-Annahmen. Dann kann für den Ausdruck s der Typ τ und die Typgleichungen E hergeleitet werden. In A kommen nur Typ-Annahmen für Konstruktoren, Variablen, Superkombinatoren vor. In E sammeln wir Gleichungen, sie werden erst später unifiziert. D. Sabel EFP WS 2015/16 Typisierung 30/106

45 Typisierung von Ausdrücken (2) Herleitungsregeln schreiben wir in der Form Voraussetzung(en) Konsequenz A 1 s 1 :: τ 1, E 1... A k s k :: τ k, E K A s :: τ, E D. Sabel EFP WS 2015/16 Typisierung 31/106

46 Typisierung von Ausdrücken (2) Vereinfachung: Konstruktoranwendungen (c s 1... s n ) werden während der Typisierung wie geschachtelte Anwendungen (((c s 1 )...) s n )) behandelt. D. Sabel EFP WS 2015/16 Typisierung 32/106

47 Typisierungsregeln für KFPTS+seq Ausdrücke (1) Axiom für Variablen: (AxV) A {x :: τ} x :: τ, D. Sabel EFP WS 2015/16 Typisierung 33/106

48 Typisierungsregeln für KFPTS+seq Ausdrücke (1) Axiom für Variablen: (AxV) A {x :: τ} x :: τ, Axiom für Konstruktoren: (AxK) A {c :: α1... α n.τ} c :: τ[β 1 /α 1,..., β n /α n ], wobei β i neue Typvariablen sind Beachte: Jedesmal wird ein neu umbenannter Typ verwendet! D. Sabel EFP WS 2015/16 Typisierung 33/106

49 Typisierungsregeln für KFPTS+seq Ausdrücke (2) Axiom für Superkombinatoren, deren Typ schon bekannt ist: (AxSK) A {SK :: α1... α n.τ} SK :: τ[β 1 /α 1,..., β n /α n ], wobei β i neue Typvariablen sind Beachte: Jedesmal wird ein neu umbenannter Typ verwendet! D. Sabel EFP WS 2015/16 Typisierung 34/106

50 Typisierungsregeln für KFPTS+seq Ausdrücke (3) Regel für Anwendungen: (RApp) A s :: τ 1, E 1 und A t :: τ 2, E 2 A (s t) :: α, E 1 E 2 {τ 1 = τ 2 α} wobei α neue Typvariable D. Sabel EFP WS 2015/16 Typisierung 35/106

51 Typisierungsregeln für KFPTS+seq Ausdrücke (3) Regel für Anwendungen: (RApp) A s :: τ 1, E 1 und A t :: τ 2, E 2 A (s t) :: α, E 1 E 2 {τ 1 = τ 2 α} wobei α neue Typvariable Regel für seq: (RSeq) A s :: τ 1, E 1 und A t :: τ 2, E 2 A (seq s t) :: τ 2, E 1 E 2 D. Sabel EFP WS 2015/16 Typisierung 35/106

52 Typisierungsregeln für KFPTS+seq Ausdrücke (4) Regel für Abstraktionen: A {x :: α} s :: τ, E (RAbs) A λx.s :: α τ, E wobei α eine neue Typvariable D. Sabel EFP WS 2015/16 Typisierung 36/106

53 Typisierungsregeln für KFPTS+seq Ausdrücke (5) Typisierung eines case: Prinzipien case T yp s of { (c 1 x 1,1... x 1,ar(c1 )) t 1 ;... ; (c m x m,1... x m,ar(cm)) t m } Die Pattern und der Ausdruck s haben gleichen Typ. Der Typ muss auch zum Typindex am case passen (Haskell hat keinen Typindex an case ) Die Ausdrücke t 1,..., t n haben gleichen Typ, und dieser Typ ist auch der Typ des ganzen case-ausdrucks. D. Sabel EFP WS 2015/16 Typisierung 37/106

54 Typisierungsregeln für KFPTS+seq Ausdrücke (6) (RCase) Regel für case: A s :: τ, E für alle i = 1,..., m: A {x i,1 :: α i,1,..., x i,ar(ci ) :: α i,ar(ci )} (c i x i,1... x i,ar(ci) ) :: τ i, E i für alle i = 1,..., m: A {x i,1 :: α i,1,..., x i,ar(ci ) :: α i,ar(ci )} t i :: τ i, E i A wobei E = E m case T yp s of { (c 1 x 1,1... x 1,ar(c1 )) t 1 ;... ; (c m x m,1... x m,ar(cm)) t m } E i m E i m {τ = τ i } m i=1 i=1 i=1 und α i,j, α neue Typvariablen sind :: α, E i=1 {α = τ i } D. Sabel EFP WS 2015/16 Typisierung 38/106

55 Instanz der Case-Regel für Bool A s :: τ, E A True :: τ 1, E 1 A False :: τ 2, E 2 A t 1 :: τ 1, E 1 A t 2 :: τ 2, E 2 (RCase) A (case Bool s of {True t 1 ; False t 2 }) :: α, E wobei E = E E 1 E 2 E 1 E 2 {τ = τ 1, τ = τ 2 } {α = τ 1, α = τ 2 } und α i,j, α neue Typvariablen sind D. Sabel EFP WS 2015/16 Typisierung 39/106

56 Instanz der Case-Regel für Listen A s :: τ, E A Nil :: τ 1, E 1 A {x 1 :: α 1, x 2 :: α 2 } Cons x 1 x 2 :: τ 2, E 2 A t 1 :: τ 1, E 1 A {x 1 :: α 1, x 2 :: α 2 } t 2 :: τ 2, E 2 (RCase) A (case List s of { (Nil t 1 ; (Cons x 1 x 2 t 2 }) :: α, E wobei E = E E 1 E 2 E 1 E 2 {τ = τ 1, τ = τ 2 } {α = τ 1, α = τ 2 } und α i,j, α neue Typvariablen sind D. Sabel EFP WS 2015/16 Typisierung 40/106

57 Typisierungsalgorithmus für KFPTS+seq-Ausdrücke Sei s ein geschlossener KFPTS+seq-Ausdruck, wobei die Typen für alle in s benutzten Superkombinatoren und Konstruktoren bekannt sind. (d.h. diese Typen sind schon berechnet) 1 Starte mit Anfangsannahme A, die Typen für die Konstruktoren und die Superkombinatoren enthält. 2 Leite A s :: τ, E mit den Typisierungsregeln her. 3 Löse E mit Unifikation. 4 Wenn die Unifikation mit Fail endet, ist s nicht typisierbar; Andernfalls: Sei σ ein allgemeinster Unifikator von E, dann gilt s :: σ(τ). D. Sabel EFP WS 2015/16 Typisierung 41/106

58 Optimierung Zusätzliche Regel, zum zwischendrin Unifizieren: Typberechnung: A s :: τ, E (RUnif) A s :: σ(τ), E σ wobei E σ das gelöste Gleichungssystem zu E ist und σ der ablesbare Unifikator ist D. Sabel EFP WS 2015/16 Typisierung 42/106

59 Wohlgetyptheit Definition Ein KFPTS+seq Ausdruck s ist wohl-getypt, wenn er sich mit obigem Verfahren typisieren lässt. (Typisierung von Superkombinatoren kommt noch) D. Sabel EFP WS 2015/16 Typisierung 43/106

60 Beispiele: Typisierung von (Cons True Nil) Typisierung von Cons True Nil Starte mit: Anfangsannahme: A 0 = {Cons :: a.a [a] [a], Nil :: a.[a], True :: Bool} (RApp) A 0 (Cons True) :: τ 1, E 1, A 0 Nil :: τ 2, E 2 A 0 (Cons True Nil) :: α 4, E 1 E 2 {τ 1 = τ 2 α 4 } D. Sabel EFP WS 2015/16 Typisierung 44/106

61 Beispiele: Typisierung von (Cons True Nil) Typisierung von Cons True Nil Starte mit: Anfangsannahme: A 0 = {Cons :: a.a [a] [a], Nil :: a.[a], True :: Bool} (RApp) (AxK) A 0 (Cons True) :: τ 1, E 1, A0 Nil :: [α 3 ], A 0 (Cons True Nil) :: α 4, E 1 {τ 1 = [α 3 ] α 4 } D. Sabel EFP WS 2015/16 Typisierung 44/106

62 Beispiele: Typisierung von (Cons True Nil) Typisierung von Cons True Nil Starte mit: Anfangsannahme: A 0 = {Cons :: a.a [a] [a], Nil :: a.[a], True :: Bool} (RApp) (RApp) A 0 Cons :: τ 3, E 3, A 0 True :: τ 4, E 4 A 0 (Cons True) :: α 2, {τ 3 = τ 4 α 2 } E 3 E 4, (AxK) A 0 Nil :: [α 3 ], A 0 (Cons True Nil) :: α 4, {τ 3 = τ 4 α 2 } E 3 E 4 {α 2 = [α 3 ] α 4 } D. Sabel EFP WS 2015/16 Typisierung 44/106

63 Beispiele: Typisierung von (Cons True Nil) Typisierung von Cons True Nil Starte mit: Anfangsannahme: A 0 = {Cons :: a.a [a] [a], Nil :: a.[a], True :: Bool} (RApp) (RApp) (AxK) A0 Cons :: α 1 [α 1 ] [α 1 ],, A 0 True :: τ 4, E 4 A 0 (Cons True) :: α 2, {α 1 [α 1 ] [α 1 ] = τ 4 α 2 } E 4, (AxK) A 0 Nil :: [α 3 ], A 0 (Cons True Nil) :: α 4, {α 1 [α 1 ] [α 1 ] = τ 4 α 2 } E 4 {α 2 = [α 3 ] α 4 } D. Sabel EFP WS 2015/16 Typisierung 44/106

64 Beispiele: Typisierung von (Cons True Nil) Typisierung von Cons True Nil Starte mit: Anfangsannahme: A 0 = {Cons :: a.a [a] [a], Nil :: a.[a], True :: Bool} (AxK) A0 Cons :: α 1 [α 1 ] [α 1 ],, (AxK) A 0 True :: Bool, (RApp) (RApp) A 0 (Cons True) :: α 2, {α 1 [α 1 ] [α 1 ] = Bool α 2 }, (AxK) A 0 Nil :: [α 3 ], A 0 (Cons True Nil) :: α 4, {α 1 [α 1 ] [α 1 ] = Bool α 2 } {α 2 = [α 3 ] α 4 } D. Sabel EFP WS 2015/16 Typisierung 44/106

65 Beispiele: Typisierung von (Cons True Nil) Typisierung von Cons True Nil Starte mit: Anfangsannahme: A 0 = {Cons :: a.a [a] [a], Nil :: a.[a], True :: Bool} (AxK) A0 Cons :: α 1 [α 1 ] [α 1 ],, (AxK) A 0 True :: Bool, (RApp) (RApp) A 0 (Cons True) :: α 2, {α 1 [α 1 ] [α 1 ] = Bool α 2 }, (AxK) A 0 Nil :: [α 3 ], A 0 (Cons True Nil) :: α 4, {α 1 [α 1 ] [α 1 ] = Bool α 2, α 2 = [α 3 ] α 4 } D. Sabel EFP WS 2015/16 Typisierung 44/106

66 Beispiele: Typisierung von (Cons True Nil) Typisierung von Cons True Nil Starte mit: Anfangsannahme: A 0 = {Cons :: a.a [a] [a], Nil :: a.[a], True :: Bool} (AxK) A0 Cons :: α 1 [α 1 ] [α 1 ],, (AxK) A 0 True :: Bool, (RApp) (RApp) A 0 (Cons True) :: α 2, {α 1 [α 1 ] [α 1 ] = Bool α 2 }, (AxK) A 0 Nil :: [α 3 ], A 0 (Cons True Nil) :: α 4, {α 1 [α 1 ] [α 1 ] = Bool α 2, α 2 = [α 3 ] α 4 } Löse {α 1 [α 1] [α 1] = Bool α 2, α 2 = [α 3] α 4} mit Unifikation D. Sabel EFP WS 2015/16 Typisierung 44/106

67 Beispiele: Typisierung von (Cons True Nil) Typisierung von Cons True Nil Starte mit: Anfangsannahme: A 0 = {Cons :: a.a [a] [a], Nil :: a.[a], True :: Bool} (AxK) A0 Cons :: α 1 [α 1 ] [α 1 ],, (AxK) A 0 True :: Bool, (RApp) (RApp) A 0 (Cons True) :: α 2, {α 1 [α 1 ] [α 1 ] = Bool α 2 }, (AxK) A 0 Nil :: [α 3 ], A 0 (Cons True Nil) :: α 4, {α 1 [α 1 ] [α 1 ] = Bool α 2, α 2 = [α 3 ] α 4 } Löse {α 1 [α 1] [α 1] = Bool α 2, α 2 = [α 3] α 4} mit Unifikation Ergibt: σ = {α 1 Bool, α 2 ([Bool] [Bool]), α 3 Bool, α 4 [Bool]} D. Sabel EFP WS 2015/16 Typisierung 44/106

68 Beispiele: Typisierung von (Cons True Nil) Typisierung von Cons True Nil Starte mit: Anfangsannahme: A 0 = {Cons :: a.a [a] [a], Nil :: a.[a], True :: Bool} (AxK) A0 Cons :: α 1 [α 1 ] [α 1 ],, (AxK) A 0 True :: Bool, (RApp) (RApp) A 0 (Cons True) :: α 2, {α 1 [α 1 ] [α 1 ] = Bool α 2 }, (AxK) A 0 Nil :: [α 3 ], A 0 (Cons True Nil) :: α 4, {α 1 [α 1 ] [α 1 ] = Bool α 2, α 2 = [α 3 ] α 4 } Löse {α 1 [α 1] [α 1] = Bool α 2, α 2 = [α 3] α 4} mit Unifikation Ergibt: σ = {α 1 Bool, α 2 ([Bool] [Bool]), α 3 Bool, α 4 [Bool]} Daher (Cons True Nil) :: σ(α 4) = [Bool] D. Sabel EFP WS 2015/16 Typisierung 44/106

69 Beispiele: Typisierung von λx.x Typisierung von λx.x Starte mit: Anfangsannahme: A 0 = (RAbs) A 0 {x :: α} x :: τ, E A 0 (λx.x) :: α τ, E D. Sabel EFP WS 2015/16 Typisierung 45/106

70 Beispiele: Typisierung von λx.x Typisierung von λx.x Starte mit: Anfangsannahme: A 0 = (AxV) A0 {x :: α} x :: α, (RAbs) A 0 (λx.x) :: α α, D. Sabel EFP WS 2015/16 Typisierung 45/106

71 Beispiele: Typisierung von λx.x Typisierung von λx.x Starte mit: Anfangsannahme: A 0 = (AxV) A0 {x :: α} x :: α, (RAbs) A 0 (λx.x) :: α α, Nichts zu unifizieren, daher (λx.x) :: α α D. Sabel EFP WS 2015/16 Typisierung 45/106

72 Beispiele: Typisierung von Ω Typisierung von (λx.(x x)) (λy.(y y)) Starte mit: Anfangsannahme: A 0 = (RApp) (λx.(x x)) :: τ 1, E 1, (λy.(y y)) :: τ 2, E 2 (λx.(x x)) (λy.(y y)) :: α 1, E 1 E 2 {τ 1 = τ 2 α 1 } D. Sabel EFP WS 2015/16 Typisierung 46/106

73 Beispiele: Typisierung von Ω Typisierung von (λx.(x x)) (λy.(y y)) Starte mit: Anfangsannahme: A 0 = (RApp) (RAbs) {x :: α 2 } (x x) :: τ 1, E 1 (λx.(x x)) :: α 2 τ 1, E 1, (λy.(y y)) :: τ 2, E 2 (λx.(x x)) (λy.(y y)) :: α 1, E 1 E 2 {τ 1 = τ 2 α 1 } D. Sabel EFP WS 2015/16 Typisierung 46/106

74 Beispiele: Typisierung von Ω Typisierung von (λx.(x x)) (λy.(y y)) Starte mit: Anfangsannahme: A 0 = (RApp) {x :: α 2 } x :: τ 3, E 3, {x :: α 2 } x :: τ 4, E 4, {x :: α 2 } (x x) :: α 3, {τ 3 = τ 4 α 3 } E 3 E 4 (λx.(x x)) :: α 2 α 3, {τ 3 = τ 4 α 3 } E 3 E 4, (λy.(y y)) :: τ 2, E 2 (λx.(x x)) (λy.(y y)) :: α 1, {τ 3 = τ 4 α 3 } E 3 E 4 E 2 {α 3 = τ 2 α 1 } (RApp) (RAbs) D. Sabel EFP WS 2015/16 Typisierung 46/106

75 Beispiele: Typisierung von Ω Typisierung von (λx.(x x)) (λy.(y y)) Starte mit: Anfangsannahme: A 0 = (RApp) (RApp) (RAbs) (AxV) {x :: α2 } x :: α 2,, {x :: α 2 } x :: τ 4, E 4, {x :: α 2 } (x x) :: α 3, {α 2 = τ 4 α 3 } E 4 (λx.(x x)) :: α 2 α 3, {α 2 = τ 4 α 3 } E 4, (λy.(y y)) :: τ 2, E 2 (λx.(x x)) (λy.(y y)) :: α 1, {α 2 = τ 4 α 3 } E 4 E 2 {α 3 = τ 2 α 1 } D. Sabel EFP WS 2015/16 Typisierung 46/106

76 Beispiele: Typisierung von Ω Typisierung von (λx.(x x)) (λy.(y y)) Starte mit: Anfangsannahme: A 0 = (AxV) {x :: α2 } x :: α 2,, (AxV) {x :: α 2 } x :: α 2,, (RApp) (RAbs) (RApp) {x :: α 2 } (x x) :: α 3, {α 2 = α 2 α 3 } (λx.(x x)) :: α 2 α 3, {α 2 = α 2 α 3 }, (λy.(y y)) :: τ 2, E 2 (λx.(x x)) (λy.(y y)) :: α 1, {α 2 = α 2 α 3 } E 2 {α 3 = τ 2 α 1 } D. Sabel EFP WS 2015/16 Typisierung 46/106

77 Beispiele: Typisierung von Ω Typisierung von (λx.(x x)) (λy.(y y)) Starte mit: Anfangsannahme: A 0 = (AxV) {x :: α2 } x :: α 2,, (AxV) {x :: α 2 } x :: α 2,, (RApp) (RAbs) {x :: α 2 } (x x) :: α 3, {α 2 = α 2 α 3 } (λx.(x x)) :: α 2 α 3, {α 2 = α 2 α 3 }..., (λy.(y y)) :: τ 2, E 2 (RApp) (λx.(x x)) (λy.(y y)) :: α 1, {α 2 = α 2 α 3 } E 2 {α 3 = τ 2 α 1 } D. Sabel EFP WS 2015/16 Typisierung 46/106

78 Beispiele: Typisierung von Ω Typisierung von (λx.(x x)) (λy.(y y)) Starte mit: Anfangsannahme: A 0 = (AxV) {x :: α2 } x :: α 2,, (AxV) {x :: α 2 } x :: α 2,, (RApp) (RAbs) {x :: α 2 } (x x) :: α 3, {α 2 = α 2 α 3 } (λx.(x x)) :: α 2 α 3, {α 2 = α 2 α 3 }..., (λy.(y y)) :: τ 2, E 2 (RApp) (λx.(x x)) (λy.(y y)) :: α 1, {α 2 = α 2 α 3 } E 2 {α 3 = τ 2 α 1 } Man sieht schon: Die Unifikation schlägt fehl, wegen: α 2 = α 2 α 3 Daher: (λx.(x x)) (λy.(y y)) ist nicht typisierbar! Beachte: (λx.(x x)) (λy.(y y)) ist nicht dynamisch ungetypt aber nicht wohl-getypt D. Sabel EFP WS 2015/16 Typisierung 46/106

79 Beispiele: Typisierung eines Ausdrucks mit SKs (1) Annahme: map und length sind bereits typisierte Superkombinatoren. Wir typisieren: t := λxs.case List xs of {Nil Nil; (Cons y ys) map length ys} Als Anfangsannahme benutzen wir: A 0 = {map :: a, b.(a b) [a] [b], length :: a.[a] Int, Nil :: a.[a] Cons :: a.a [a] [a] } D. Sabel EFP WS 2015/16 Typisierung 47/106

80 Beispiele: Typisierung eines Ausdrucks mit SKs (2) Herleitungsbaum: (RCase) (RAbs) (AxK) B 8, (AxV) B 9 (RApp) B 6, (AxV) B 7 (AxV) B 3, (AxK) B 4, (RApp) Beschriftungen: B 5 (AxSK) (RApp), (AxK) B 10, (RApp) B 2 B 1 B 14, (AxSK) B 15 B 12, (AxV) B 13 B 11 B 1 = A 0 t :: α 1 α 13, {α 5 [α 5] [α 5] = α 3 α 6, α 6 = α 4 α 7, (α 8 α 9) [α 8] [α 9] = ([α 10] Int) α 11, α 11 = α 4 α 12, α 1 = [α 2], α 1 = α 7, α 13 = [α 14], α 13 = α 12, } B 2 = A 0 {xs :: α 1} case List xs of {Nil Nil; (Cons y ys) map length ys} :: α 13, {α 5 [α 5] [α 5] = α 3 α 6, α 6 = α 4 α 7, (α 8 α 9) [α 8] [α 9] = ([α 10] Int) α 11, α 11 = α 4 α 12, α 1 = [α 2], α 1 = α 7, α 13 = [α 14], α 13 = α 12, } D. Sabel EFP WS 2015/16 Typisierung 48/106

81 Beispiele: Typisierung eines Ausdrucks mit SKs (3) Herleitungsbaum: (RCase) (RAbs) (AxK) B 8, (AxV) B 9 (RApp) B 6, (AxV) B 7 (AxV) B 3, (AxK) B 4, (RApp) Beschriftungen: B 5 (AxSK) (RApp), (AxK) B 10, (RApp) B 2 B 1 B 14, (AxSK) B 15 B 12, (AxV) B 13 B 11 B 3 = A 0 {xs :: α 1} xs :: α 1, B 4 = A 0 {xs :: α 1} Nil :: [α 2], B 5 = A 0 {xs :: α 1, y :: α 3, ys :: α 4} (Cons y ys) :: α 7, {α 5 [α 5] [α 5] = α 3 α 6, α 6 = α 4 α 7} B 6 = A 0 {xs :: α 1, y :: α 3, ys :: α 4} (Cons y) :: α 6, {α 5 [α 5] [α 5] = α 3 α 6} B 7 = A 0 {xs :: α 1, y :: α 3, ys :: α 4} ys :: α 4, B 8 = A 0 {xs :: α 1, y :: α 3, ys :: α 4} Cons :: α 5 [α 5] [α 5], B 9 = A 0 {xs :: α 1, y :: α 3, ys :: α 4} y :: α 3, B 10 = A 0 {xs :: α 1} Nil :: [α 14], D. Sabel EFP WS 2015/16 Typisierung 49/106

82 Beispiele: Typisierung eines Ausdrucks mit SKs (4) Herleitungsbaum: (RCase) (RAbs) (AxK) B 8, (AxV) B 9 (RApp) B 6, (AxV) B 7 (AxV) B 3, (AxK) B 4, (RApp) Beschriftungen: B 5 (AxSK) (RApp), (AxK) B 10, (RApp) B 2 B 1 B 14, (AxSK) B 15 B 12, (AxV) B 13 B 11 B 11 = A 0 {xs :: α 1, y :: α 3, ys :: α 4} (map length) ys :: α 12, {(α 8 α 9) [α 8] [α 9] = ([α 10] Int) α 11, α 11 = α 4 α 12} B 12 = A 0 {xs :: α 1, y :: α 3, ys :: α 4} (map length) :: α 11, {(α 8 α 9) [α 8] [α 9] = ([α 10] Int) α 11} B 13 = A 0 {xs :: α 1, y :: α 3, ys :: α 4} ys :: α 4, B 14 = A 0 {xs :: α 1, y :: α 3, ys :: α 4} map :: (α 8 α 9) [α 8] [α 9], B 15 = A 0 {xs :: α 1, y :: α 3, ys :: α 4} length :: [α 10] Int, D. Sabel EFP WS 2015/16 Typisierung 50/106

83 Beispiele: Typisierung eines Ausdrucks mit SKs (5) Beschriftung unten: B 1 = A 0 t :: α 1 α 13, {α 5 [α 5] [α 5] = α 3 α 6, α 6 = α 4 α 7, (α 8 α 9) [α 8] [α 9] = ([α 10] Int) α 11, α 11 = α 4 α 12, α 1 = [α 2], α 1 = α 7, α 13 = [α 14], α 13 = α 12, } D. Sabel EFP WS 2015/16 Typisierung 51/106

84 Beispiele: Typisierung eines Ausdrucks mit SKs (5) Beschriftung unten: B 1 = A 0 t :: α 1 α 13, {α 5 [α 5] [α 5] = α 3 α 6, α 6 = α 4 α 7, (α 8 α 9) [α 8] [α 9] = ([α 10] Int) α 11, α 11 = α 4 α 12, α 1 = [α 2], α 1 = α 7, α 13 = [α 14], α 13 = α 12, } Löse mit Unifikation: {α 5 [α 5] [α 5] = α 3 α 6, α 6 = α 4 α 7, (α 8 α 9) [α 8] [α 9] = ([α 10] Int) α 11, α 11 = α 4 α 12, α 1 = [α 2], α 1 = α 7, α 13 = [α 14], α 13 = α 12} D. Sabel EFP WS 2015/16 Typisierung 51/106

85 Beispiele: Typisierung eines Ausdrucks mit SKs (5) Beschriftung unten: B 1 = A 0 t :: α 1 α 13, {α 5 [α 5] [α 5] = α 3 α 6, α 6 = α 4 α 7, (α 8 α 9) [α 8] [α 9] = ([α 10] Int) α 11, α 11 = α 4 α 12, α 1 = [α 2], α 1 = α 7, α 13 = [α 14], α 13 = α 12, } Löse mit Unifikation: {α 5 [α 5] [α 5] = α 3 α 6, α 6 = α 4 α 7, (α 8 α 9) [α 8] [α 9] = ([α 10] Int) α 11, α 11 = α 4 α 12, α 1 = [α 2], α 1 = α 7, α 13 = [α 14], α 13 = α 12} Ergibt: σ = {α 1 [[α 10]], α 2 [α 10], α 3 [α 10], α 4 [[α 10]], α 5 [α 10], α 6 [[α 10]] [[α 10]], α 7 [[α 10]], α 8 [α 10], α 9 Int, α 11 [[α 10]] [Int], α 12 [Int], α 13 [Int], α 14 Int} Damit erhält man t :: σ(α 1 α 13 ) = [[α 10 ]] [Int]. D. Sabel EFP WS 2015/16 Typisierung 51/106

86 Bsp.: Typisierung von Lambda-geb. Variablen (1) Die Funktion const ist definiert als const :: a -> b -> a const x y = x Typisierung von λx.const (x True) (x A ) Anfangsannahme: A 0 = {const :: a, b.a b a, True :: Bool, A :: Char}. D. Sabel EFP WS 2015/16 Typisierung 52/106

87 Bsp.: Typisierung von Lambda-geb. Variablen (2) A 1 x :: α 1, (AxK) A 1 True :: Bool (AxK)A 1 const :: α 2 α 3 α 2,, (RApp) A 1 (x True) :: α 4, E 1 (RApp) (RApp) (RAbs) (AxV) A 1 const (x True) :: α 5, E 2 (AxV) A 1 x :: α 1, (AxK) A 1 A :: Char, (RApp) A 1 const (x True) (x A ) :: α 7, E 4 A 0 λx.const (x True) (x A ) :: α 1 α 7, E 4 A 1 (x A ) :: α 6, E 3 wobei A 1 = A 0 {x :: α 1} und: E 1 = {α 1 = Bool α 4} E 2 = {α 1 = Bool α 4, α 2 α 3 α 2 = α 4 α 5} E 3 = {α 1 = Char α 6} E 4 = {α 1 = Bool α 4, α 2 α 3 α 2 = α 4 α 5, α 1 = Char α 6, α 5 = α 6 α 7} D. Sabel EFP WS 2015/16 Typisierung 53/106

88 Bsp.: Typisierung von Lambda-geb. Variablen (2) A 1 x :: α 1, (AxK) A 1 True :: Bool (AxK)A 1 const :: α 2 α 3 α 2,, (RApp) A 1 (x True) :: α 4, E 1 (RApp) (RApp) (RAbs) (AxV) A 1 const (x True) :: α 5, E 2 (AxV) A 1 x :: α 1, (AxK) A 1 A :: Char, (RApp) A 1 const (x True) (x A ) :: α 7, E 4 A 0 λx.const (x True) (x A ) :: α 1 α 7, E 4 A 1 (x A ) :: α 6, E 3 wobei A 1 = A 0 {x :: α 1} und: E 1 = {α 1 = Bool α 4} E 2 = {α 1 = Bool α 4, α 2 α 3 α 2 = α 4 α 5} E 3 = {α 1 = Char α 6} E 4 = {α 1 = Bool α 4, α 2 α 3 α 2 = α 4 α 5, α 1 = Char α 6, α 5 = α 6 α 7} Die Unifikation schlägt fehl, da Char Bool D. Sabel EFP WS 2015/16 Typisierung 53/106

89 Bsp.: Typisierung von Lambda-geb. Variablen (3) In Haskell: Main> \x -> const (x True) (x A ) <interactive>:1:23: Couldn t match expected type Char against inferred type Bool Expected type: Char -> b Inferred type: Bool -> a In the second argument of const, namely (x A ) In the expression: const (x True) (x A ) D. Sabel EFP WS 2015/16 Typisierung 54/106

90 Bsp.: Typisierung von Lambda-geb. Variablen (3) In Haskell: Main> \x -> const (x True) (x A ) <interactive>:1:23: Couldn t match expected type Char against inferred type Bool Expected type: Char -> b Inferred type: Bool -> a In the second argument of const, namely (x A ) In the expression: const (x True) (x A ) Beispiel verdeutlicht: Lambda-gebundene Variablen sind monomorph getypt! Das gleiche gilt für case-pattern gebundene Variablen D. Sabel EFP WS 2015/16 Typisierung 54/106

91 Bsp.: Typisierung von Lambda-geb. Variablen (3) In Haskell: Main> \x -> const (x True) (x A ) <interactive>:1:23: Couldn t match expected type Char against inferred type Bool Expected type: Char -> b Inferred type: Bool -> a In the second argument of const, namely (x A ) In the expression: const (x True) (x A ) Beispiel verdeutlicht: Lambda-gebundene Variablen sind monomorph getypt! Das gleiche gilt für case-pattern gebundene Variablen Daher spricht man auch von let-polymorphismus, da nur let-gebundene Variablen polymorph sind. KFPTS+seq hat kein let, aber Superkombinatoren, die wie (ein eingeschränktes rekursives) let wirken D. Sabel EFP WS 2015/16 Typisierung 54/106

92 Rekursive Superkombinatoren Definition (direkt rekursiv, rekursiv, verschränkt rekursiv) Sei SK eine Menge von Superkombinatoren Für SK i, SK j SK sei SK i SK j gdw. SK j den Superkombinator SK i im Rumpf benutzt. + : transitiver Abschluss von ( : reflexiv-transitiver Abschluss) SK i ist direkt rekursiv wenn SK i SK i gilt. SK i ist rekursiv wenn SK i + SK i gilt. SK 1,..., SK m sind verschränkt rekursiv, wenn SK i + SK j für alle i, j {1,..., m} D. Sabel EFP WS 2015/16 Typisierung 55/106

93 Typisierung von nicht-rekursiven Superkombinatoren Nicht-rekursive Superkombinatoren kann man wie Abstraktionen typisieren Notation: A T SK :: τ, bedeutet: unter Annahme A kann man SK mit Typ τ typisieren D. Sabel EFP WS 2015/16 Typisierung 56/106

94 Typisierung von nicht-rekursiven Superkombinatoren Nicht-rekursive Superkombinatoren kann man wie Abstraktionen typisieren Notation: A T SK :: τ, bedeutet: unter Annahme A kann man SK mit Typ τ typisieren Typisierungsregel für (geschlossene) nicht-rekursive SK: (RSK1) A {x 1 :: α 1,..., x n :: α n } s :: τ, E A T SK :: X.σ(α 1... α n τ) wenn σ Lösung von E, SK x 1... x n = s die Definition von SK und SK nicht rekursiv ist, und X die Typvariablen in σ(α 1... α n τ) D. Sabel EFP WS 2015/16 Typisierung 56/106

95 Beispiel: Typisierung von (.) (.) f g x = f (g x) A 0 ist leer, da keine Konstruktoren oder SK vorkommen. A 1 g :: α 2,, (AxV) A 1 x :: α 3, (AxV)A 1 f :: α 1,, (RApp) A 1 (g x) :: α 5, {α 2 = α 3 α 5 } A 1 (f (g x)) :: α 4, {α 2 = α 3 α 5, α 1 = α 5 α 4 } (RApp) (RSK1) (AxV) T (.) :: X.σ(α 1 α 2 α 3 α 4 ) wobei A 1 = {f :: α 1, g :: α 2, x :: α 3 } Unifikation ergibt σ = {α 2 α 3 α 5, α 1 α 5 α 4 }. Daher: σ(α 1 α 2 α 3 α 4) = (α 5 α 4) (α 3 α 5) α 3 α 4 Jetzt kann man X = {α 3, α 4, α 5 } berechnen, und umbenennen: (.) :: a, b, c.(a b) (c a) c b D. Sabel EFP WS 2015/16 Typisierung 57/106

96 Typisierung von rekursiven Superkombinatoren Sei SK x 1... x n = e und SK kommt in e vor, d.h. SK ist rekursiv Warum kann man SK nicht ganz einfach typisieren? D. Sabel EFP WS 2015/16 Typisierung 58/106

97 Typisierung von rekursiven Superkombinatoren Sei SK x 1... x n = e und SK kommt in e vor, d.h. SK ist rekursiv Warum kann man SK nicht ganz einfach typisieren? Will man den Rumpf e typisieren, so muss man den Typ von SK kennen! D. Sabel EFP WS 2015/16 Typisierung 58/106

98 Idee des Iterativen Typisierungsverfahrens Gebe SK zunächst den allgemeinsten Typ (d.h. eine Typvariable) und typisiere den Rumpf unter Benutzung dieses Typs Man erhält anschließend einen neuen Typ für SK Mache mit neuem Typ weiter Stoppe, wenn neuer Typ = alter Typ Dann hat man eine konsistente Typannahme gefunden; Vermutung: auch eine ausreichend allgemeine (allgemeinste?) Allgemeinster Typ: Typ T so dass sem(t ) = {alle Grundtypen}. Das liefert der Typ α (bzw. quantifiziert α.α) D. Sabel EFP WS 2015/16 Typisierung 59/106

99 Iteratives Typisierungsverfahren Regel zur Berechnung neuer Annahmen: (SKRek) A {x 1 :: α 1,..., x n :: α n } s :: τ, E A T SK :: σ(α 1... α n τ) wenn SK x 1... x n = s die Definition von SK, σ Lösung von E Genau wie RSK1, aber in A muss es eine Annahme für SK geben. D. Sabel EFP WS 2015/16 Typisierung 60/106

100 Iteratives Typisierungsverfahren: Vorarbeiten (1) Wegen verschränkter Rekursion: Abhängigkeitsanalyse der Superkombinatoren Berechnung der starken Zusammenhangskomponenten im Aufrufgraph Sei die Äquivalenzrelation passend zu, dann sind die starken Zusammenhangskomponenten gerade die Äquivalenzklassen zu. Jede Äquivalenzklasse wird gemeinsam typisiert Typisierung der Gruppen entsprechend der -Ordnung modulo. D. Sabel EFP WS 2015/16 Typisierung 61/106

101 Iteratives Typisierungsverfahren: Vorarbeiten (2) Beispiel: f x y = if x<=1 then y else f (x-y) (y + g x) g x = if x==0 then (f 1 x) + (h 2) else 10 h x = if x==1 then 0 else h (x-1) k x y = if x==1 then y else k (x-1) (y+(f x y)) Der Aufrufgraph (nur bzgl. f,g,h,k ) ist g h f k Die Äquivalenzklassen (mit Ordnung) sind {h} + {f, g} + {k}. D. Sabel EFP WS 2015/16 Typisierung 62/106

102 Iteratives Typisierungsverfahren: Der Algorithmus Iterativer Typisierungsalgorithmus Eingabe: Menge von verschränkt rekursiven Superkombinatoren SK 1,..., SK m wobei kleinere SK s schon typisiert 1 Anfangsannahme A enthält Typen der Konstruktoren und der bereits bekannten Superkombinatoren. D. Sabel EFP WS 2015/16 Typisierung 63/106

103 Iteratives Typisierungsverfahren: Der Algorithmus Iterativer Typisierungsalgorithmus Eingabe: Menge von verschränkt rekursiven Superkombinatoren SK 1,..., SK m wobei kleinere SK s schon typisiert 1 Anfangsannahme A enthält Typen der Konstruktoren und der bereits bekannten Superkombinatoren 2 A 0 := A {SK 1 :: α 1.α 1,..., SK m :: α m.α m} und j = 0.. D. Sabel EFP WS 2015/16 Typisierung 63/106

104 Iteratives Typisierungsverfahren: Der Algorithmus Iterativer Typisierungsalgorithmus Eingabe: Menge von verschränkt rekursiven Superkombinatoren SK 1,..., SK m wobei kleinere SK s schon typisiert 1 Anfangsannahme A enthält Typen der Konstruktoren und der bereits bekannten Superkombinatoren 2 A 0 := A {SK 1 :: α 1.α 1,..., SK m :: α m.α m} und j = 0. 3 Verwende für jeden Superkombinator SK i (mit i = 1,..., m) die Regel (SKRek) und Annahme A j, um SK i zu typisieren.. D. Sabel EFP WS 2015/16 Typisierung 63/106

105 Iteratives Typisierungsverfahren: Der Algorithmus Iterativer Typisierungsalgorithmus Eingabe: Menge von verschränkt rekursiven Superkombinatoren SK 1,..., SK m wobei kleinere SK s schon typisiert 1 Anfangsannahme A enthält Typen der Konstruktoren und der bereits bekannten Superkombinatoren 2 A 0 := A {SK 1 :: α 1.α 1,..., SK m :: α m.α m} und j = 0. 3 Verwende für jeden Superkombinator SK i (mit i = 1,..., m) die Regel (SKRek) und Annahme A j, um SK i zu typisieren. 4 Wenn die m Typisierungen erfolgreich, d.h. für alle i: A j T SK i :: τ i Dann allquantifiziere: SK 1 :: X 1.τ 1,..., SK m :: X m.τ m Setze A j+1 := A {SK 1 :: X 1.τ 1,..., SK m :: X m.τ m}. D. Sabel EFP WS 2015/16 Typisierung 63/106

106 Iteratives Typisierungsverfahren: Der Algorithmus Iterativer Typisierungsalgorithmus Eingabe: Menge von verschränkt rekursiven Superkombinatoren SK 1,..., SK m wobei kleinere SK s schon typisiert 1 Anfangsannahme A enthält Typen der Konstruktoren und der bereits bekannten Superkombinatoren 2 A 0 := A {SK 1 :: α 1.α 1,..., SK m :: α m.α m} und j = 0. 3 Verwende für jeden Superkombinator SK i (mit i = 1,..., m) die Regel (SKRek) und Annahme A j, um SK i zu typisieren. 4 Wenn die m Typisierungen erfolgreich, d.h. für alle i: A j T SK i :: τ i Dann allquantifiziere: SK 1 :: X 1.τ 1,..., SK m :: X m.τ m Setze A j+1 := A {SK 1 :: X 1.τ 1,..., SK m :: X m.τ m} 5 Wenn A j A j+1, dann gehe mit j := j + 1 zu Schritt (3). Anderenfalls, d.h. wenn A j = A j+1, war A j konsistent. D. Sabel EFP WS 2015/16 Typisierung 63/106

107 Iteratives Typisierungsverfahren: Der Algorithmus Iterativer Typisierungsalgorithmus Eingabe: Menge von verschränkt rekursiven Superkombinatoren SK 1,..., SK m wobei kleinere SK s schon typisiert 1 Anfangsannahme A enthält Typen der Konstruktoren und der bereits bekannten Superkombinatoren 2 A 0 := A {SK 1 :: α 1.α 1,..., SK m :: α m.α m} und j = 0. 3 Verwende für jeden Superkombinator SK i (mit i = 1,..., m) die Regel (SKRek) und Annahme A j, um SK i zu typisieren. 4 Wenn die m Typisierungen erfolgreich, d.h. für alle i: A j T SK i :: τ i Dann allquantifiziere: SK 1 :: X 1.τ 1,..., SK m :: X m.τ m Setze A j+1 := A {SK 1 :: X 1.τ 1,..., SK m :: X m.τ m} 5 Wenn A j A j+1, dann gehe mit j := j + 1 zu Schritt (3). Anderenfalls, d.h. wenn A j = A j+1, war A j konsistent. Ausgabe: Allquantifizierte polymorphen Typen der SK i aus der konsistenten Annahme. Sollte irgendwann ein Fail in der Unifikation auftreten, dann sind SK 1,..., SK m nicht typisierbar. D. Sabel EFP WS 2015/16 Typisierung 63/106

108 Eigenschaften des Algorithmus Die berechneten Typen pro Iterationsschritt sind eindeutig bis auf Umbenennung. = bei Terminierung liefert der Algorithmus eindeutige Typen. Pro Iteration werden die neuen Typen spezieller (oder bleiben gleich). D.h. Monotonie bzgl. der Grundtypensemantik: sem(t j ) sem(t j+1 ) Bei Nichtterminierung gibt es keinen polymorphen Typ. Grund: Monotonie und man hat mit größten Annahmen begonnen. Das iterative Verfahren berechnet einen größten Fixpunkt (bzgl. der Grundtypensemantik): Menge wird solange verkleinert, bis sie sich nicht mehr ändert. D.h. es wird der allgemeinste polymorphe Typ berechnet D. Sabel EFP WS 2015/16 Typisierung 64/106

109 Beispiele: length (1) length xs = case List xs of{nil 0; (y : ys) 1 + length ys} Annahme: A = {Nil :: a.[a], (:) :: a.a [a] [a], 0, 1 :: Int, (+) :: Int Int Int} 1.Iteration: A 0 = A {length :: α.α} (RCase) (SKRek) (a) A 0 {xs :: α 1 } xs :: τ 1, E 1 (b) A 0 {xs :: α 1 } Nil :: τ 2, E 2 (c) A 0 {xs :: α 1, y :: α 4, ys :: α 5 } (y : ys) :: τ 3, E 3 (d) A 0 {xs :: α 1 } 0 :: τ 4, E 4 (e) A 0 {xs :: α 1, y :: α 4, ys :: α 5 }} (1 + length ys) :: τ 5, E 5 A 0 {xs :: α 1 } (case List xs of{nil 0; (y : ys) 1 + length xs}) :: α 3, E 1 E 2 E 3 E 4 E 5 {τ 1 = τ 2, τ 1 = τ 3, α 3 = τ 4, α 3 = τ 5 } A 0 T length :: σ(α 1 α 3 ) wobei σ Lösung von E 1 E 2 E 3 E 4 E 5 {τ 1 = τ 2, τ 1 = τ 3, α 3 = τ 4, α 3 = τ 5 } D. Sabel EFP WS 2015/16 Typisierung 65/106

110 Beispiele: length (2) (a): (AxV) A 0 {xs :: α 1 } xs :: α 1, D.h τ 1 = α 1 und E 1 = (b): (AxK) A 0 {xs :: α 1 } Nil :: [α 6 ], D.h. τ 2 = [α 6 ] und E 2 = (c) (AxK) A 0 (RApp) (RApp) (:) :: α 9 [α 9 ] [α 9 ],, (AxV) A 0 y :: α 4, A 0 ((:) y) :: α 8, {α 9 [α 9 ] [α 9 ] = α 4 α 8 }, (AxV) A 0 ys :: α 5, A 0 (y : ys) :: α 7, {α 9 [α 9 ] [α 9 ] = α 4 α 8, α 8 = α 5 α 7 } wobei A 0 = A 0 {xs :: α 1, y :: α 4, ys :: α 5 } D.h. τ 3 = α 7 und E 3 = {α 9 [α 9 ] [α 9 ] = α 4 α 8, α 8 = α 5 α 7 } D. Sabel EFP WS 2015/16 Typisierung 66/106

111 Beispiele: length (3) (d) (AxK) A 0 {xs :: α 1 } 0 :: Int, D.h. τ 4 = Int und E 4 = (e) (AxK) (RApp) (RApp) A 0 (+) :: Int Int Int,, (AxK) A (AxSK) 0 1 :: Int, A 0 length :: α 13,, (AxV) A 0 (ys) :: α 5, A 0 ((+) 1) :: α 11, {Int Int Int = Int α 11 }, (RApp) A 0 (length ys) :: α 12, {α 13 = α 5 α 12 } A 0 (1 + length ys) :: α 10, {Int Int Int = Int α 11, α 13 = α 5 α 12, α 11 = α 12 α 10 } wobei A 0 = A 0 {xs :: α 1, y :: α 4, ys :: α 5 } D.h. τ 5 = α 10 und E 5 = {Int Int Int = Int α 11, α 13 = α 5 α 12, α 11 = α 12 α 10} D. Sabel EFP WS 2015/16 Typisierung 67/106

112 Beispiele: length (3) Zusammengefasst: wobei σ Lösung von A 0 T length :: σ(α 1 α 3) {α 9 [α 9] [α 9] = α 4 α 8, α 8 = α 5 α 7, Int Int Int = Int α 11, α 13 = α 5 α 12, α 11 = α 12 α 10, α 1 = [α 6], α 1 = α 7, α 3 = Int, α 3 = α 10} Die Unifikation ergibt als Unifikator {α 1 [α 9], α 3 Int, α 4 α 9, α 5 [α 9], α 6 α 9, α 7 [α 9], α 8 [α 9] [α 9], α 10 Int, α 11 Int Int, α 12 Int, α 13 [α 9] Int} daher σ(α 1 α 3) = [α 9] Int A 1 = A {length :: α.[α] Int} Da A 0 A 1 muss man mit A 1 erneut iterieren. 2.Iteration: Ergibt den gleichen Typ, daher war A 1 konsistent. D. Sabel EFP WS 2015/16 Typisierung 68/106

113 Iteratives Verfahren ist allgemeiner als Haskell Beispiel g x = 1 : (g (g c )) A = {1 :: Int, Cons :: a.a [a] [a], c :: Char} A 0 = A {g :: α.α} (und A 0 = A 0 {x :: α 1 }): (AxSK) A 0 g :: α 8,, (AxK) A 0 c :: Char,, (AxK) A 0 Cons :: α 5 [α 5 ] [α 5 ],, (AxK) A (AxSK) 0 1 :: Int, A 0 g :: α 6,, (RApp) A 0 (g c ) :: α 7, {α 8 = Char α 7 } (RApp) A 0 (Cons 1) :: α 3, α 5 [α 5 ] [α 5 ] = Int α (RApp) 3, A 0 (g (g c )) :: α 4, {α 8 = Char α 7, α 6 = α 7 α 4 } (RApp) A 0 Cons 1 (g (g c )) :: α 2, {α 8 = Char α 7, α 6 = α 7 α 4, α 5 [α 5 ] [α 5 ] = Int α 3, α 3 = α 4 α 2 } (SKRek) A 0 T g :: σ(α 1 α 2 ) = α 1 [Int] wobei σ = {α 2 [Int], α 3 [Int] [Int], α 4 [Int], α 5 Int, α 6 α 7 [Int], α 8 Char α 7 } die Lösung von {α 8 = Char α 7, α 6 = α 7 α 4, α 5 [α 5 ] [α 5 ] = Int α 3, α 3 = α 4 α 2 } ist. D.h. A 1 = A {g :: α.α [Int]}. Nächste Iteration zeigt: A 1 ist konsistent. D. Sabel EFP WS 2015/16 Typisierung 69/106

114 Iteratives Verfahren ist allgemeiner als Haskell (2) Beachte: Für die Funktion g kann Haskell keinen Typ herleiten: Prelude> let g x = 1:(g(g c )) <interactive>:1:13: Couldn t match expected type [t] against inferred type Char Expected type: Char -> [t] Inferred type: Char -> Char In the second argument of (:), namely (g (g c )) In the expression: 1 : (g (g c )) D. Sabel EFP WS 2015/16 Typisierung 70/106

115 Iteratives Verfahren ist allgemeiner als Haskell (2) Beachte: Für die Funktion g kann Haskell keinen Typ herleiten: Prelude> let g x = 1:(g(g c )) <interactive>:1:13: Couldn t match expected type [t] against inferred type Char Expected type: Char -> [t] Inferred type: Char -> Char In the second argument of (:), namely (g (g c )) In the expression: 1 : (g (g c )) Aber: Haskell kann den Typ verifizieren, wenn man ihn angibt: let g::a -> [Int]; g x = 1:(g(g c )) Prelude> :t g g :: a -> [Int] Grund: Wenn Typ vorhanden, führt Haskell keine Typinferenz durch, sondern verifiziert nur die Annahme. g wird im Rumpf wie bereits typisiert behandelt. D. Sabel EFP WS 2015/16 Typisierung 70/106

116 Bsp.: Mehrere Iterationen sind nötig (1) g x = x : (g (g c )) A = {Cons :: a.a [a] [a], c :: Char}. A 0 = A {g :: α.α} (AxSK) A 0 g :: α 8,, (AxK) A 0 c :: Char,, (AxK) A 0 Cons :: α 5 [α 5 ] [α 5 ],, (AxV) A (AxSK) 0 x :: α 1, A 0 g :: α 6,, (RApp) A 0 (g c ) :: α 7, {α 8 = Char α 7 } (RApp) A 0 (Cons x) :: α 3, α 5 [α 5 ] [α 5 ] = α 1 α (RApp) 3, A 0 (g (g c )) :: α 4, {α 8 = Char α 7, α 6 = α 7 α 4 } (RApp) A 0 Cons x (g (g c )) :: α 2, {α 8 = Char α 7, α 6 = α 7 α 4, α 5 [α 5 ] [α 5 ] = α 1 α 3, α 3 = α 4 α 2 } (SKRek) A 0 T g :: σ(α 1 α 2 ) = α 5 [α 5 ] wobei σ = {α 1 α 5, α 2 [α 5 ], α 3 [α 5 ] [α 5 ], α 4 [α 5 ], α 6 α 7 [α 5 ], α 8 Char α 7 } die Lösung von {α 8 = Char α 7, α 6 = α 7 α 4, α 5 [α 5 ] [α 5 ] = α 1 α 3, α 3 = α 4 α 2 } ist. D.h. A 1 = A {g :: α.α [α]}. D. Sabel EFP WS 2015/16 Typisierung 71/106

117 Bsp.: Mehrere Iterationen sind nötig (2) Da A 0 A 1 muss eine weitere Iteration durchgeführt werden. Sei A 1 = A 1 {x :: α 1 }: (AxSK) A 1 g :: α 8 [α 8],, (AxK) A 1 c :: Char,, (AxK) A 1 Cons :: α 5 [α 5] [α 5],, (AxV) A (AxSK) 1 x :: α 1, A 1 g :: α 6 [α 6],, (RApp) A 1 (g c ) :: α 7, {α 8 [α 8] = Char α 7} A 1 (Cons x) :: α 3, α 5 [α 5] [α 5] = α 1 α (RApp) 3, A 1 (g (g c )) :: α 4, {α 8 [α 8] = Char α 7, α 6 [α 6] = α 7 α 4} A 1 Cons x (g (g c )) :: α 2, {α 8 [α 8] = Char α 7, α 6 [α 6] = α 7 α 4α 5 [α 5] [α 5] = α 1 α 3, α 3 = α 4 α 2} (RApp) (RApp) (SKRek) A 1 T g :: σ(α 1 α 2) = [Char] [[Char]] wobei σ = {α 1 [Char], α 2 [[Char]], α 3 [[Char]] [[Char]], α 4 [[Char]], α 5 [Char], α 6 [Char], α 7 [Char], α 8 Char} die Lösung von {α 8 [α 8] = Char α 7, α 6 [α 6] = α 7 α 4, α 5 [α 5] [α 5] = α 1 α 3, α 3 = α 4 α 2} ist. Daher ist A 2 = A {g :: [Char] [[Char]]}. D. Sabel EFP WS 2015/16 Typisierung 72/106

118 Bsp.: Mehrere Iterationen sind nötig (3) Da A 1 A 2 muss eine weitere Iteration durchgeführt werden: Sei A 2 = A 2 {x :: α 1 }: (AxSK) A 2 g :: [Char] [[Char]],, (AxK) A 2 c :: Char,, (AxK) A 2 Cons :: α5 [α5] [α5],, (AxV) A (AxSK) 2 x :: α1, A 2 g :: [Char] [[Char]],, (RApp) A 2 (g c ) :: α7, {[Char] [[Char]] = Char α7} A 2 (Cons x) :: α3, α5 [α5] [α5] = α1 (RApp) α3, A 2 (g (g c )) :: α4, {[Char] [[Char]] = Char α7, [Char] [[Char]] = α7 α4} A 2 Cons x (g (g c )) :: α2, {[Char] [[Char]] = Char α7, [Char] [[Char]] = α7 α4α5 [α5] [α5] = α1 α3, α3 = α4 α2} (RApp) (RApp) (SKRek) A2 T g :: σ(α1 α2) wobei σ die Lösung von {[Char] [[Char]] = Char α7, [Char] [[Char]] = α7 α4, α5 [α5] [α5] = α1 α3, α3 = α4 α2} ist. Unifikation: g ist nicht typisierbar. [Char] [[Char]] = Char α 7,... [Char] = Char, [[Char]] = α 7,... F ail D. Sabel EFP WS 2015/16 Typisierung 73/106

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

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. 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

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

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

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

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

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

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 26. Oktober 2006 Haskell - Einführung Syntax Typen Auswertung Programmierung

Mehr

Grundlagen der Programmierung 2. Operationale Semantik

Grundlagen der Programmierung 2. Operationale Semantik Grundlagen der Programmierung 2 Operationale Semantik Prof. Dr. Manfred Schmidt-Schauÿ Künstliche Intelligenz und Softwaretechnologie 29. April 2009 Semantik von Programmiersprachen Semantik = Bedeutung

Mehr

Unifikation. T eine Menge von Termen. σ(t) einelementig ist. Definition: Unifikator. Eine Substitution σ ist Unifikator von T, falls

Unifikation. T eine Menge von Termen. σ(t) einelementig ist. Definition: Unifikator. Eine Substitution σ ist Unifikator von T, falls Unifikation Definition: Unifikator T eine Menge von Termen Eine Substitution σ ist Unifikator von T, falls σ(t) einelementig ist Logik für Informatiker, SS 06 p.12 Unifikation Definition: Unifikator T

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

Programmierung und Modellierung

Programmierung und Modellierung Programmierung und Modellierung Typüberprüfung und Typinferenz Martin Wirsing in Zusammenarbeit mit Moritz Hammer SS 2009 2 Inhalt Kap. 5 Typüberprüfung und Typinferenz 1. Typaussagen 2. Typisierungsaxiome

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

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

Adressen. Praktikum Funktionale Programmierung Organisation und Überblick. Termine WWW

Adressen. Praktikum Funktionale Programmierung Organisation und Überblick. Termine WWW Adressen Adressen, Termine Studienleistung Praktikum Funktionale Programmierung Organisation und Überblick Dr. David Sabel Büro und Email Raum 216, Robert-Mayer-Str. 11-15 sabel@ki.informatik.uni-frankfurt.de

Mehr

Praktikum Funktionale Programmierung Organisation und Überblick

Praktikum Funktionale Programmierung Organisation und Überblick Praktikum Funktionale Programmierung Organisation und Überblick Dr. David Sabel Sommersemester 2013 Stand der Folien: SoSe 2013 Adressen Organisatorisches Software Projekt Adressen, Termine Studienleistung

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

LR: Syntax. Semantik und Analyse von Funktionalen Programmen (SAFP): LR: Reduktions-Regeln. LR: Reduktions-Regeln

LR: Syntax. Semantik und Analyse von Funktionalen Programmen (SAFP): LR: Reduktions-Regeln. LR: Reduktions-Regeln LR: Syntax Semantik und Analyse von Funktionalen Programmen (SAFP): KFPT mit Sharing und Striktheisanalyse: LR Prof. Dr. Manfred Schmidt-Schauß SAFP; WS 2014/15 E ::= V (c E 1... E ar(c) ) (seq E 1 E 2

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

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

Semantik und Analyse von Funktionalen Programmen (SAFP):

Semantik und Analyse von Funktionalen Programmen (SAFP): Semantik und Analyse von Funktionalen Programmen (SAFP): KFPT mit Sharing und Striktheisanalyse: LR Prof. Dr. Manfred Schmidt-Schauß SAFP; WS 2014/15 Stand der Folien: 5. Februar 2015 LR: Syntax E ::=

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

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

Theoretische Informatik II

Theoretische Informatik II Vorlesung Theoretische Informatik II Bernhard Beckert Institut für Informatik Wintersemester 2007/2008 B. Beckert Theoretischen Informatik II: WS 2007/08 1 / 179 Dank Diese Vorlesungsmaterialien basieren

Mehr

Programmieren in Haskell Das Haskell Typsystem

Programmieren in Haskell Das Haskell Typsystem Programmieren in Haskell Das Haskell Typsystem Peter Steffen Robert Giegerich Universität Bielefeld Technische Fakultät 22.01.2010 1 Programmieren in Haskell Belauscht... Lisa Lista: Ohne Typen keine korrekten

Mehr

Listen und Listenfunktionen. Grundlagen der Programmierung 2 A (Listen) Listen und Listenfunktionen. Listen? Haskell: Listen

Listen und Listenfunktionen. Grundlagen der Programmierung 2 A (Listen) Listen und Listenfunktionen. Listen? Haskell: Listen Listen und Listenfunktionen Grundlagen der Programmierung 2 A (Listen) Haskell: Listen Prof. Dr. Manfred Schmidt-Schauß Listen modellieren Folgen von gleichartigen, gleichgetypten Objekten. Ausdruck im

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

Kapitel 5: λ-kalkül und Laziness

Kapitel 5: λ-kalkül und Laziness Funktionale Programmierung (WS2005/2006) 5/1 Kapitel 5: λ-kalkül und Laziness Lernziele dieses Kapitels 1. Syntax des einfachen, ungetypten λ-kalküls Symbolische Manipulation von λ-ausdrücken in Haskell,

Mehr

Grundlegende Datentypen

Grundlegende Datentypen Funktionale Programmierung Grundlegende Datentypen Fakultät für Informatik und Mathematik Hochschule München Letzte Änderung: 14.11.2017 15:37 Inhaltsverzeichnis Typen........................................

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

1 Einführung. 2 Typ-0- und Typ-1-Sprachen. 3 Berechnungsmodelle. 4 Unentscheidbarkeit. 5 Unentscheidbare Probleme. 6 Komplexitätstheorie

1 Einführung. 2 Typ-0- und Typ-1-Sprachen. 3 Berechnungsmodelle. 4 Unentscheidbarkeit. 5 Unentscheidbare Probleme. 6 Komplexitätstheorie 1 Einführung 2 Typ-0- und Typ-1-Sprachen 3 Berechnungsmodelle 4 Unentscheidbarkeit 5 Unentscheidbare Probleme 6 Komplexitätstheorie WS 11/12 155 Überblick Zunächst einmal definieren wir formal den Begriff

Mehr

Einführung IMP-Syntax Reduktionssemantik Maschinen-Semantik. Teil IV. Semantik imperativer Sprachen

Einführung IMP-Syntax Reduktionssemantik Maschinen-Semantik. Teil IV. Semantik imperativer Sprachen Teil IV Semantik imperativer Sprachen 201 1. Einführung Alternativen zur Beschreibung der Semantik: natürliche Sprache (bisher, unpräzise) operational Reduktionssemantik (vgl. Haskell-Semantik in Kap.

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

Das Lösen einer Anfrage mit Backtracking

Das Lösen einer Anfrage mit Backtracking Das Lösen einer Anfrage mit Backtracking Beispiel aus Clocksin Mellish S.14/15?- likes(mary,x), likes(john,x). () 1 / 17 Das Lösen einer Anfrage mit Backtracking Beispiel aus Clocksin Mellish S.14/15?-

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

Grundlagen der Programmierung 2 (2.A)

Grundlagen der Programmierung 2 (2.A) Grundlagen der Programmierung 2 (2.A) Prof. Dr. Manfred Schmidt-Schauß Künstliche Intelligenz und Softwaretechnologie 5. Mai 2011 Listen und Listenfunktionen Listen modellieren Folgen von gleichartigen,

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

Klausur Programmierung WS 2002/03

Klausur Programmierung WS 2002/03 Klausur Programmierung WS 2002/03 Prof. Dr. Gert Smolka, Dipl. Inf. Thorsten Brunklaus 14. Dezember 2002 Leo Schlau 45 Vor- und Nachname Sitz-Nr. 4711 007 Matrikelnummer Code Bitte öffnen Sie das Klausurheft

Mehr

Adressen. Praktikum Funktionale Programmierung Organisation und Überblick. Termine. Studienleistung

Adressen. Praktikum Funktionale Programmierung Organisation und Überblick. Termine. Studienleistung Adressen Adressen, Termine Studienleistung Praktikum Funktionale Programmierung Organisation und Überblick Dr. David Sabel Büro und Email Raum 216, Robert-Mayer-Str. 11-15 sabel@ki.informatik.uni-frankfurt.de

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

Einführung in die Funktionale Programmierung mit Haskell

Einführung in die Funktionale Programmierung mit Haskell Typsysteme Typisierung Polymorphie Typinferenz Einführung in die Funktionale Programmierung mit Haskell Typsysteme & Typinferenz LFE Theoretische Informatik, Institut für Informatik, Ludwig-Maximilians

Mehr

Beispiele: (Funktionen auf Listen) (3) Bemerkungen: Die Datenstrukturen der Paare (2) Die Datenstrukturen der Paare

Beispiele: (Funktionen auf Listen) (3) Bemerkungen: Die Datenstrukturen der Paare (2) Die Datenstrukturen der Paare Beispiele: (Funktionen auf Listen) (3) Bemerkungen: 5. Zusammenhängen der Elemente einer Liste von Listen: concat :: [[a]] -> [a] concat xl = if null xl then [] else append (head xl) ( concat (tail xl))

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

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

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

Grundlagen der Programmierung 2 A (Listen)

Grundlagen der Programmierung 2 A (Listen) Grundlagen der Programmierung 2 A (Listen) Haskell: Listen Prof. Dr. Manfred Schmidt-Schauß Sommersemester 2017 Listen und Listenfunktionen Listen modellieren Folgen von gleichartigen, gleichgetypten Objekten.

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

Ralf Möller, TUHH. Beim vorigen Mal: Heute: Prädikatenlogik: Algorithmus für Erfüllbarkeitsproblem. Lernziele: Beweisverfahren für Prädikatenlogik

Ralf Möller, TUHH. Beim vorigen Mal: Heute: Prädikatenlogik: Algorithmus für Erfüllbarkeitsproblem. Lernziele: Beweisverfahren für Prädikatenlogik Ralf Möller, TUHH Beim vorigen Mal: Heute: Prädikatenlogik: Algorithmus für Erfüllbarkeitsproblem Lernziele: Beweisverfahren für Prädikatenlogik Danksagung Bildmaterial: S. Russell, P. Norvig, Artificial

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

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

Modellierungsmethoden der Informatik Kapitel 2: Logikkalküle

Modellierungsmethoden der Informatik Kapitel 2: Logikkalküle smethoden der Informatik Kapitel 2: Logikkalküle Prädikatenlogik 1. Stufe Norbert Fuhr Gudrun Fischer 29.11.2005 Organisatorisches Organisatorisches Klausur Termin: 20.2.2006, 13-15 Uhr, Audimax Anmeldung

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

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 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

1 Einführung. 2 Typ-0- und Typ-1-Sprachen. 3 Berechnungsmodelle. 4 Unentscheidbarkeit. 5 Unentscheidbare Probleme. 6 Komplexitätstheorie

1 Einführung. 2 Typ-0- und Typ-1-Sprachen. 3 Berechnungsmodelle. 4 Unentscheidbarkeit. 5 Unentscheidbare Probleme. 6 Komplexitätstheorie 1 Einführung 2 Typ-0- und Typ-1-Sprachen 3 Berechnungsmodelle 4 Unentscheidbarkeit 5 Unentscheidbare Probleme 6 Komplexitätstheorie 139 Unentscheidbarkeit Überblick Zunächst einmal definieren wir formal

Mehr

- Theorie der uninterpretierten

- Theorie der uninterpretierten Theorie der uninterpretierten Funktionen Entscheidungsverfahren mit Anwendungen in der Softwareverifikation STEPHAN FALKE INSTITUT FÜR THEORETISCHE INFORMATIK (ITI) 0 KIT 13. Universität Mai 2013 des S.

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

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

Modellierungsmethoden der Informatik Kapitel 2: Logikkalküle

Modellierungsmethoden der Informatik Kapitel 2: Logikkalküle smethoden der Informatik Kapitel 2: Logikkalküle Prädikatenlogik 1. Stufe Norbert Fuhr Gudrun Fischer 29.11.2005 Organisatorisches Organisatorisches Klausur Termin: 20.2.2006, 13-15 Uhr, Audimax Anmeldung

Mehr

WS 2011/2012. RobertGiegerich. November 12, 2013

WS 2011/2012. RobertGiegerich. November 12, 2013 WS 2011/2012 Robert AG Praktische Informatik November 12, 2013 Haskell-Syntax: Ergänzungen Es gibt noch etwas bequeme Notation für Fallunterscheidungen, die wir bisher nicht benutzt haben. Bisher kennen

Mehr

WS 2011/2012. RobertGiegerich. November 12, 2013

WS 2011/2012. RobertGiegerich. November 12, 2013 WS 2011/2012 Robert AG Praktische Informatik November 12, 2013 Haskell-Syntax: Ergänzungen Es gibt noch etwas bequeme Notation für Fallunterscheidungen, die wir bisher nicht benutzt haben. Bisher kennen

Mehr

Vorsemesterkurs Informatik

Vorsemesterkurs Informatik Stand der Folien: 31. März 2011 Vorsemesterkurs Informatik Sommersemester 2011 Grundlagen der Programmierung in Haskell SoSe 2011 Übersicht 1 Ausdrücke und Typen 2 Funktionen 3 Rekursion 4 Listen 5 Paare

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

Funktionale Programmierung Teil 2 Methodik: Spezifikation, Implementierung, Verifikation

Funktionale Programmierung Teil 2 Methodik: Spezifikation, Implementierung, Verifikation Grundlagen der Programm- und Systementwicklung Funktionale Programmierung Teil 2 Methodik: Spezifikation, Implementierung, Verifikation Technische Universität München Institut für Informatik Software &

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

Abschnitt 3: Mathematische Grundlagen

Abschnitt 3: Mathematische Grundlagen Abschnitt 3: Mathematische Grundlagen 3. Mathematische Grundlagen 3.1 3.2 Induktion und Rekursion 3.3 Boolsche Algebra Peer Kröger (LMU München) Einführung in die Programmierung WS 14/15 48 / 155 Überblick

Mehr

Tableaukalkül für Aussagenlogik

Tableaukalkül für Aussagenlogik Tableaukalkül für Aussagenlogik Tableau: Test einer Formel auf Widersprüchlichkeit Fallunterscheidung baumförmig organisiert Keine Normalisierung, d.h. alle Formeln sind erlaubt Struktur der Formel wird

Mehr

Abschnitt 11: Korrektheit von imperativen Programmen

Abschnitt 11: Korrektheit von imperativen Programmen Abschnitt 11: Korrektheit von imperativen Programmen 11. Korrektheit von imperativen Programmen 11.1 11.2Testen der Korrektheit in Java Peer Kröger (LMU München) in die Programmierung WS 16/17 931 / 961

Mehr

Funktionale Programmierung mit Haskell

Funktionale Programmierung mit Haskell Funktionale Programmierung mit Haskell Dr. Michael Savorić Hohenstaufen-Gymnasium (HSG) Kaiserslautern Version 20120622 Überblick Wichtige Eigenschaften Einführungsbeispiele Listenerzeugung und Beispiel

Mehr

Deklarative Semantik

Deklarative Semantik 7. Deklarative Semantik 7-1 Deklarative Semantik Bisher: Prolog als Programmiersprache. Operationale Semantik : Wie wird ein Programm ausgeführt? Welche Antworten werden berechnet? Jetzt: Prolog als logischer

Mehr

Praktische Informatik 3: Einführung in die Funktionale Programmierung Vorlesung vom 10.11.2010: Rekursive Datentypen

Praktische Informatik 3: Einführung in die Funktionale Programmierung Vorlesung vom 10.11.2010: Rekursive Datentypen Rev. 1152 1 [23] Praktische Informatik 3: Einführung in die Funktionale Programmierung Vorlesung vom 10.11.2010: Rekursive Datentypen Christoph Lüth & Dennis Walter Universität Bremen Wintersemester 2010/11

Mehr

Programmieren in Haskell. Stefan Janssen. Strukturelle Rekursion. Universität Bielefeld AG Praktische Informatik. 10.

Programmieren in Haskell. Stefan Janssen. Strukturelle Rekursion. Universität Bielefeld AG Praktische Informatik. 10. Universität Bielefeld AG Praktische Informatik 10. Dezember 2014 Wiederholung: Schema: f :: [σ] -> τ f [] = e 1 f (a : as) = e 2 where s = f as wobei e 1 und e 2 Ausdrücke vom Typ τ sind und e 2 die Variablen

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

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

Funktionale Programmierung. Das Funktionale Quiz. Das Funktionale Quiz. Das Funktionale Quiz

Funktionale Programmierung. Das Funktionale Quiz. Das Funktionale Quiz. Das Funktionale Quiz Funktionale Programmierung Das Funktionale Quiz 31.5.2005 Nenne eine Gemeinsamkeit zwischen Typklassen und OO-Klassen Das Funktionale Quiz Das Funktionale Quiz Nenne einen Unterschied zwischen Typklassen

Mehr

Die Korrektheit von Mergesort

Die Korrektheit von Mergesort Die Korrektheit von Mergesort Christoph Lüth 11. November 2002 Definition von Mergesort Die Funktion Mergesort ist wie folgt definiert: msort :: [Int]-> [Int] msort xs length xs

Mehr

Logik-Grundlagen. Syntax der Prädikatenlogik

Logik-Grundlagen. Syntax der Prädikatenlogik Logik-Grundlagen X 1 :...: X k : ( A 1 A 2... A m B 1 B 2... B n ) Logische und funktionale Programmierung - Universität Potsdam - M. Thomas - Prädikatenlogik III.1 Syntax der Prädikatenlogik Prädikat:

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

Theoretische Grundlagen der Informatik

Theoretische Grundlagen der Informatik Theoretische Grundlagen der Informatik Vorlesung am 17.November 2011 INSTITUT FÜR THEORETISCHE 0 KIT 17.11.2011 Universität des Dorothea Landes Baden-Württemberg Wagner - Theoretische und Grundlagen der

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

Algorithmische Bioinformatik 1

Algorithmische Bioinformatik 1 Algorithmische Bioinformatik 1 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

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

2. Beweisen mit Gleichungen: Gleichungslogik und Termersetzung

2. Beweisen mit Gleichungen: Gleichungslogik und Termersetzung 2. Beweisen mit Gleichungen: Gleichungslogik und Termersetzung Gleichungstheorien Gleichungslogik: Syntax und Semantik von Termen und Gleichungen Grundlagen der Termersetzung: Substitution, Unifikation

Mehr

Berechenbarkeitstheorie 19. Vorlesung

Berechenbarkeitstheorie 19. Vorlesung 1 Berechenbarkeitstheorie Dr. Institut für Mathematische Logik und Grundlagenforschung WWU Münster WS 15/16 Alle Folien unter Creative Commons Attribution-NonCommercial 3.0 Unported Lizenz. Erinnerung:

Mehr

Informatik III - WS07/08

Informatik III - WS07/08 Informatik III - WS07/08 Kapitel 5 1 Informatik III - WS07/08 Prof. Dr. Dorothea Wagner dwagner@ira.uka.de Kapitel 5 : Grammatiken und die Chomsky-Hierarchie Informatik III - WS07/08 Kapitel 5 2 Definition

Mehr

Vorsemesterkurs Informatik Sommersemester Aufgabenblatt Nr. 5A. Lösung zu Aufgabe 1 (Fehler in Haskell-Quelltext: Parsefehler)

Vorsemesterkurs Informatik Sommersemester Aufgabenblatt Nr. 5A. Lösung zu Aufgabe 1 (Fehler in Haskell-Quelltext: Parsefehler) Fachbereich Informatik und Mathematik Institut für Informatik Vorsemesterkurs Informatik Sommersemester 2017 Aufgabenblatt Nr. 5A zu Aufgabe 1 (Fehler in Haskell-Quelltext: Parsefehler) Laden Sie von der

Mehr

Reduktionssysteme und Termersetzungssysteme

Reduktionssysteme und Termersetzungssysteme Reduktionssysteme und Termersetzungssysteme Untersuchung von Berechnungen mittels Reduktionsregeln Simplifikation von: Datenstrukturen / Termen usw. Erkennen von gleichen Objekten durch Normalisierung

Mehr

Strukturelle Rekursion und Induktion

Strukturelle Rekursion und Induktion Kapitel 2 Strukturelle Rekursion und Induktion Rekursion ist eine konstruktive Technik für die Beschreibung unendlicher Mengen (und damit insbesondere für die Beschreibung unendliche Funktionen). Induktion

Mehr

n 1. Der Begriff Informatik n 2. Syntax und Semantik von Programmiersprachen - 1 -

n 1. Der Begriff Informatik n 2. Syntax und Semantik von Programmiersprachen - 1 - n 1. Der Begriff Informatik n 2. Syntax und Semantik von Programmiersprachen I.2. I.2. Grundlagen von von Programmiersprachen. - 1 - 1. Der Begriff Informatik n "Informatik" = Kunstwort aus Information

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

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

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

Einführung in Haskell und seine Werkzeuge

Einführung in Haskell und seine Werkzeuge Einführung in Haskell und seine Werkzeuge PD Dr. David Sabel Goethe-Universität Frankfurt am Main 29. September 2015 Funktionale Programmiersprachen Programm = Menge von Funktionsdefinitionen Ausführung

Mehr

Programmieren in Haskell

Programmieren in Haskell Programmieren in Haskell Programmiermethodik Programmieren in Haskell 1 Was wir heute machen Spezifikation Strukturelle Rekursion Strukturelle Induktion Programmieren in Haskell 2 Spezifikation sort [8,

Mehr

Grundlagen der Programmierung 2 (1.B)

Grundlagen der Programmierung 2 (1.B) Grundlagen der Programmierung 2 (1.B) Prof. Dr. Manfred Schmidt-Schauß Künstliche Intelligenz und Softwaretechnologie 20. April 2011 Aufrufhierarchie und Rekursive Definitionen f, g, f i seien Haskell-definierte

Mehr

Algorithmische Bioinformatik 1

Algorithmische Bioinformatik 1 Algorithmische Bioinformatik 1 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

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

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen - 1 -

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen - 1 - 1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen I.2. I.2. Grundlagen von von Programmiersprachen. - 1 - 1. Der Begriff Informatik "Informatik" = Kunstwort aus Information und Mathematik

Mehr