Funktionale Programmierung - Grundlagen -

Ähnliche Dokumente
Kapitel 5: Applikative Programmierung

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

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

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

18 Höhere Ableitungen und Taylorformel

Programmierparadigmen

x y f : R 2 R 3, Es gilt: Bild f = y : wobei x,y R Kern f = 0 (wird auf der nächsten Folie besprochen)

Kapitel VI. Euklidische Geometrie

Partitionen II. 1 Geometrische Repräsentation von Partitionen

2 Mengen und Abbildungen

Theoretische Grundlagen des Software Engineering

Induktive Definitionen

Surjektive, injektive und bijektive Funktionen.

Kapitel 1.3. Normalformen aussagenlogischer Formeln und die Darstellbarkeit Boolescher Funktionen durch aussagenlogische Formeln

5. Mathematik Olympiade 1. Stufe (Schulolympiade) Klasse 8 Saison 1965/1966 Aufgaben und Lösungen

Matrizen, Determinanten, lineare Gleichungssysteme

Entwicklung eines korrekten Übersetzers

Geometrie. 1 Vektorielle analytische Geometrie der Ebene, Kegelschnitte

Theoretische Grundlagen des Software Engineering

WS 2008/09. Diskrete Strukturen

Theoretische Informatik. Reguläre Sprachen und Automaten

Rekursive Funktionen Basisfunktionen

ALP I Rekursive Funktionen

4 Lineare Algebra (Teil 2): Quadratische Matrizen

9.2. DER SATZ ÜBER IMPLIZITE FUNKTIONEN 83

ÜBUNGSBLATT 11 LÖSUNGEN MAT121/MAT131 ANALYSIS II FRÜHJAHRSSEMESTER 2011 PROF. DR. CAMILLO DE LELLIS

Zahlen in Haskell Kapitel 3

Differenzengleichungen

Mathematik für Informatiker I Mitschrift zur Vorlesung vom

Motivation. Formale Grundlagen der Informatik 1 Kapitel 19. Syntax & Semantik. Motivation - Beispiel. Motivation - Beispiel

Logic in a Nutshell. Christian Liguda

Konjunktive und disjunktive Normalformen

Stetige Funktionen, Binomischer Lehrsatz

2.5 Aufgabe Aufgabe Aufgabe Aufgabe 8

Rekursiv aufzählbare Sprachen

14. Zur algebraischen Behandlung von Widerstandsschaltungen

Lösungsvorschlag zu den Hausaufgaben der 8. Übung

ALP I Einführung in Haskell

Interpreter - Gliederung

Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie

00. Einiges zum Vektorraum R n

Erfüllbarkeit und Allgemeingültigkeit

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

Tutorübung 5. Analysis 2 für Lehramt TU Dortmund, Sommersemester 2014

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

Thema14 Der Satz über inverse Funktionen und der Satz über implizite Funktionen

Programmiersprachen und Übersetzer

4. Vektorräume und Gleichungssysteme

Tutorium - Haskell in der Schule. Ralf Dorn - Dennis Buchmann - Felix Last - Carl Ambroselli

Grundprinzipien der funktionalen Programmierung

Algorithmen mit konstantem Platzbedarf: Die Klasse REG

Programmierkurs Java

Gleitspiegelung und Verkettungen von Spiegelung und Parallelverschiebung

Funktionale Programmierung Teil 2 Methodik: Spezifikation, Implementierung, Verifikation

Großübung zu Einführung in die Programmierung

1 Σ endliches Terminalalphabet, 2 V endliche Menge von Variablen (mit V Σ = ), 3 P (V (Σ ΣV )) {(S, ε)} endliche Menge von Regeln,

Grundlagen der Mengenlehre

Stetigkeit von Funktionen

Der Zwei-Quadrate-Satz von Fermat

Kapitel 5: Abstrakte Algorithmen und Sprachkonzepte. Elementare Schritte

Fachhochschule Nordwestschweiz (FHNW) Hochschule Technik Lösungen Serie 10 (Lineare Abbildungen)

Mathematik 3 für Informatik

Syntax von LOOP-Programmen

Kapitel III. Stetige Funktionen. 14 Stetigkeit und Rechenregeln für stetige Funktionen. 15 Hauptsätze über stetige Funktionen

5.4 Die Prädikatenlogik 1.Stufe als Semantikformalismus

Lösungen zum Aufgabenblatt Nr. 1: Konstruktion der reellen Zahlen

2. Universelle Algebra

Funktionale Programmierung

Java Einführung Operatoren Kapitel 2 und 3

Kapitel 1.3. Normalformen aussagenlogischer Formeln. Mathematische Logik (WS 2010/11) Kapitel 1.3: Normalformen 1 / 1

Klausur Formale Systeme Fakultät für Informatik 2. Klausur zum WS 2010/2011

3.3 Eigenwerte und Eigenräume, Diagonalisierung

Formale Semantik. λ Typenlogik. Tutorium WiSe 2013/ November Sitzung: Folien freundlicherweise bereitgestellt von Andreas Bischoff

Funktionale Programmierung ALP I. Funktionen höherer Ordnung. Teil 2 SS Prof. Dr. Margarita Esponda. Prof. Dr.

Programmieren in Haskell

4.4 Taylorentwicklung

Ergänzungen zur Analysis I

klar. Um die zweite Bedingung zu zeigen, betrachte u i U i mit u i = 0. Das mittlere -Zeichen liefert s

Caputo fraktionale Differentialgleichungen. 1 Riemann Liouville fraktionale Differentialgleichungen

Grundlagen der Programmierung 2 (1.C)

Übungen zur Vorlesung MATHEMATIK II

Lösungsvorschläge Blatt Z1

Probeklausur: Programmierung WS04/05

Aufgaben für die 6. Übung zur Vorlesung Mathematik 2 für Informatiker: Analysis Sommersemester 2010

Mathematik II Frühlingsemester 2015 Kap. 9: Funktionen von mehreren Variablen 9.2 Partielle Differentiation

Diskrete Verteilungen

Gruppentheorie und Symmetrie in der Chemie

5 Logische Programmierung

Aufgaben zum Vorkurs Mathematik: Allgemeine Übungsaufgaben

4. Differentialgleichungen

Lineare Algebra 1. Detlev W. Hoffmann. WS 2013/14, TU Dortmund

3. Grundlagen der Linearen Programmierung

Simulation von Zufallsvariablen und Punktprozessen

I. Aussagenlogik. Aussagenlogik untersucht Verknüpfungen wie "und", "oder", "nicht", "wenn... dann" zwischen atomaren und komplexen Sätzen.

9 Die Normalverteilung

Effizienz in Haskell

Handout zu Beweistechniken

Automaten, Spiele, und Logik

TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK

Hackenbusch und Spieltheorie

Transkript:

Funktionale Programmierung - Grundlagen - λ Logische und funktionale Programmierung - Universität Potsdam - M. Thomas - Funkt. Programmierung Gundlagen - IX.1 λ-ausdrücke 1) Variablen: x, y, z,...v,v 1,... 2) Applikationen: (E 1 E 2 ) Bsp. (sum(m, n)) bezeichnet m+n 3) Abstraktionen: (λv.e) Bsp. λx.sum(x,1) Inkrementierfunktion in BNF: < λ-ausdruck> ::= <Variable> (< λ-ausdruck> <(λ-ausdruck)> λ<variable>.< λ-ausdruck>)> Logische und funktionale Programmierung - Universität Potsdam - M. Thomas - Funkt. Programmierung Gundlagen - IX.2 1

Vereinbarungen zur Notation Unterstrichene Bezeichnungen stehen für λ-teilausdrücke Bsp. 1 steht für den λ-ausdruck, der den Wert 1 repräsentiert. Funktionen werden linksassoziativ ausgewertet: E 1 E 2... E n steht für (...((E 1 E 2 ) E 3 )...E n ) λv.e 1... E n steht für (λv.(e 1... E n )) λv 1...V n.e steht für (λv 1.(...(λV n.(e)...)) Bsp. λx.y.add y x bezeichnet (λx. λy.((add y)x))) E[E /V] steht für das Ergebnis einer textuellen Ersetzung (Substitution) jeder freien Variablen V in E durch E. Logische und funktionale Programmierung - Universität Potsdam - M. Thomas - Funkt. Programmierung Gundlagen - IX.3 Frei und gebundene Variablen (λx.y x)(λy.x y) gebunden frei Eine Substitution E[E /V] wird genau dann als gültig bezeichnet, wenn keine freie Variable in E zu einer gebundenen Variablen in E[E /V] wird. Logische und funktionale Programmierung - Universität Potsdam - M. Thomas - Funkt. Programmierung Gundlagen - IX.4 2

Konvertierungsregeln α-regel Jede Abstraktion der Form λv.e kann zu λv E[V /V] konvertiert werden, vorausgesetzt, die Substitution von V in E durch V ist gültig. β-regel Jede Applikation der Form (λv.e 1 )E 2 kann zu E 1 [E 2 /V] konvertiert werden, vorausgesetzt, die Substitution von V in E 1 durch E 2 ist gültig. η-regel Jede Abstraktion der Form λv.(e V), in der V in E nur gebunden auftritt, kann zu E reduziert werden Logische und funktionale Programmierung - Universität Potsdam - M. Thomas - Funkt. Programmierung Gundlagen - IX.5 Gleichheit und Identität Zwei λ-ausdrücke nennen wir gleich, wenn sie mit einer Sequenz von Anwendungen der Konvertierungsregeln ineinander überführt werden können (vorwärts wie rückwärts). E 1 = E 2 Zwei λ-ausdrücke nennen wir identisch, wenn sie aus genau der gleichen Folge von Zeichen bestehen. E 1 E 2 Bsp. (λx.x)((λy.y)1) = 1 (λx. λy.add x y)3 4 = add 3 4 Logische und funktionale Programmierung - Universität Potsdam - M. Thomas - Funkt. Programmierung Gundlagen - IX.6 3

Repräsentation von Objekten LET true = λx. λy.x LET false = λx. λy.y LET not = λt.t false true Exemplarischer Nachweis üblicher Eigenschaften: not true = (λt.t false true) true (* Def. von not *) = true false true (* β-regel *) = (λx. λy.x) false true (* Def. von true *) = (λy.false) true (* β-regel *) = false (* β-regel *) Logische und funktionale Programmierung - Universität Potsdam - M. Thomas - Funkt. Programmierung Gundlagen - IX.7 Bedingte Ausdrücke: LET (E E 1 E 2 ) = (E E 1 E 2 ) es gilt: (true E 1 E 2 ) = true E 1 E 2 = (λx y.x) E 1 E 2 = E 1 Tupel: LET fst = λp.p true LET snd = λp.p false LET (E 1,E 2 ) = λf.f E 1 E 2 (false E 1 E 2 ) = false E 1 E 2 = (λx y.y) E 1 E 2 = E 2 es gilt: fst (E 1, E 2 ) = (λp.p true) (E 1, E 2 ) = (E 1, E 2 ) true = (λf.f E 1 E 2 ) true = true E 1 E 2 = (λx y.x) E 1 E 2 = E 1 LET (E 1, E 2,..., E n ) = (E 1,(E 2,(... (E n-1,e n )...))) Logische und funktionale Programmierung - Universität Potsdam - M. Thomas - Funkt. Programmierung Gundlagen - IX.8 4

Zahlen und arithmetische Operationen n-te Applikation: LET E 0 E = E LET E n E = E(E(...(E E )...)) n Es Zahlen: LET 0 = λf x.x LET 1 = λf x.f x LET 2 = λf x.f(f x)... LET n = λf x f n x arithmetische Operationen: LET suc λn f x.n f(f x) LET add λm n f x.m f (n f x) LET iszero = λn.n (λx. false) true Logische und funktionale Programmierung - Universität Potsdam - M. Thomas - Funkt. Programmierung Gundlagen - IX.9 Vorgängerfunktion Idee: der Vorgänger von n wird definiert, indem in der Repräsentation von n = (λf x. f n x) die erste Anwendung von f in f n entfernt wird. Hilfsfunktion prefn: n Anwendungen von prefn auf (true, x) sollen n-1 Anwendungen von f auf x ergeben, also (prefn f) n (true, x) = (false, f n-1 x) für n>0 LET prefn = λf p.(false, (fst p snd p (f (snd p) ))) Vorgängerfunktion pre: LET pre = λn f x.snd (n (prefn f) (true, x)) pre n f x = snd (n (prefn f) (true, x)) (*definition von pre*) = snd ((prefn f) n (true, x)) (*definition von n*) = snd (false, f n-1 x) (* n -anwendungen von prefn *) = f n-1 x Logische und funktionale Programmierung - Universität Potsdam - M. Thomas - Funkt. Programmierung Gundlagen - IX.10 5

Hilfsfolie zur Vorgängerfunktion LET prefn = λf p.(false, (fst p snd p (f (snd p) ))) (prefn f) n (true, x) = (prefn f)( (prefn f)( (prefn f)(... (prefn f (true, x))... ))) =.... n-mal (λf p.(false, snd p)(true, x)))... =.... (prefn f (false, x) )... =.... (false, f x) = (prefn f (false, f(f(f...(f x)...)))) = (false, f n-1 x) pre n f x = f n-1 x λf x. pre n f x = λf x.f n-1 x (*Leibnitz bzw. Extensionalität *) (* η-regel bzw. Def. von n-1 *) pre n = n-1 Logische und funktionale Programmierung - Universität Potsdam - M. Thomas - Funkt. Programmierung Gundlagen - IX.11 Rekursion Idee: mult m n = add n (add n (...(add n 0)...)) mult m n = (iszero m 0 add n (mult (pre m) n)) bzw. mult = λm n.(iszero m 0 add n (mult (pre m) n))!!! ungebunden!!! Lösung: Definiere einen zunächst ein Y mit der folgenden Eigenschaft: Y E = E (Y E) Def. E ist ein Fixpunkt von E, wenn E = E E Def. Fix heißt Fixpunktoperator, wenn Fix E = E (Fix E) E LET Y = λf. (λx. f(x x)) (λx. f(x x)) Logische und funktionale Programmierung - Universität Potsdam - M. Thomas - Funkt. Programmierung Gundlagen - IX.12 6

LET Y = λf. (λx. f(x x)) (λx. f(x x)) Die rekursiv definierte Multiplikationsfunktion: LET mult = Y multfn wobei LET multfn = λf m n.(iszero m 0 add n (f (pre m) n)) mult m n = (Y multfn) m n (*Def. von mult *) = multfn (Y multfn) m n (*Fix-Punkt-Eigenschaft von Y*) = multfn mult m n (*Def. von mult *) = (λf m n.(iszero m 0 add n (f (pre m) n))) mult m n = (iszero m 0 add n (mult (pre m) n)) (*β-regel*) Eine Gleichung der Form fktn x 1... x n = E wird rekursiv genannt, wenn fktn in E als freie Variable vorkommt. a) Schreibe die gewünschte Funktion als Gleichung der Form: fktn x 1... x n =... fktn... b) Definiere die Funktion durch: LET fktn = Y (λf x 1... x n.... f...) Logische und funktionale Programmierung - Universität Potsdam - M. Thomas - Funkt. Programmierung Gundlagen - IX.13 Repräsentation von Funktionen Im λ-kalkül gibt es zwei Varianten zur Repräsentation: a) (f x,... x n) ) (* gecurryt *) Bsp. add m n = m+n b) f (x 1,...,x n ) sum (m, n) = m+n LET curry = λf x 1 x 2. f (x 1, x 2 ) LET uncurry = λf p. f (fst p) (snd p) nun gilt: sum = uncurry add sum (m, n) = uncurry add (m, n) = (λf p. f (fst p)(snd p)) add (m, n) = add (fst (m, n)) (snd (m, n)) = add m n = m+n Logische und funktionale Programmierung - Universität Potsdam - M. Thomas - Funkt. Programmierung Gundlagen - IX.14 7

Church-Rosser-Theorem Wenn E 1 = E 2, dann existiert ein E, so dass E 1 E und E 2 E. 1) Folgerung: Zwei λ-ausdrücke können in beliebiger Reihenfolge ausgewerten werden. Beweis: Gelte E E 1 und E E 2 und E 1, E 2 sind Normalformen, dann folgt: E=E 1 und E=E 2 (* Def. der Gleichheit *) und damit E 1 =E 2. Hieraus folgt: E mit E 1 E und E 2 E. (* Church-Rosser *) Da E 1 und E 2 Normalformen sind, können höchstens α-reduktionen durchgeführt werden, um E zu erhalten. Daher müssen die Ausdrücke E 1 und E 2 bis auf die Namensgebung der gebundenen Variablen identisch sein. 2) Ähnlich kann gezeigt werden, dass mit m n auch m n folgen muss. Logische und funktionale Programmierung - Universität Potsdam - M. Thomas - Funkt. Programmierung Gundlagen - IX.15 Korollar zum Church-Rosser-Theorem (i) Wenn E eine Normalform hat, dann ex. E E mit E ist Normalform (ii) Wenn E eine Normalform hat und E=E, dann hat E eine Normalform (iii) Wenn E=E und sowohl E als auch E sind Normalformen, dann sind E und E identisch (außer α-reduktionen). Logische und funktionale Programmierung - Universität Potsdam - M. Thomas - Funkt. Programmierung Gundlagen - IX.16 8

Normalisierungs Theorem Wenn E eine Normalform hat, dann erhält man aus E eine Normalform, indem wiederholend die am weitesten links arbeitende β- oder η-reduktion angewendet wird (ggf. nach einer vorhergehenden α-reduktion). Logische und funktionale Programmierung - Universität Potsdam - M. Thomas - Funkt. Programmierung Gundlagen - IX.17 9